LUPPA API
A API do LUPPA permite integrar processamento de SAF-T, auditoria fiscal, reconciliação bancária e análise CFO directamente nas suas ferramentas e fluxos de trabalho. Todos os endpoints são autenticados por chave API com escopo por empresa.
application/json
Fluxo típico
GET /api/v1/ping para confirmar que a chave é válida.POST /api/saft/ingest. Devolve importId via SSE.GET /api/v1/reports/:importId após gerar o relatório na plataforma, ou chamar endpoints de análise directamente.Autenticação
Todas as chamadas requerem o cabeçalho Authorization:
Authorization: Bearer lup_xxxxxxxxxxxxxxxxxxxxxxxx
Cada chave está associada a uma única empresa. Todos os endpoints operam exclusivamente sobre os dados dessa empresa — não é possível aceder a dados de outras empresas com a mesma chave.
Erros
| Código | Significado | Causa típica |
|---|---|---|
| 200 | Sucesso | — |
| 400 | Pedido inválido | Ficheiro em falta, SAF-T corrompido, parâmetro obrigatório ausente |
| 401 | Não autenticado | Chave inválida, revogada ou ausente |
| 403 | Acesso negado | O recurso não pertence à empresa da chave |
| 404 | Não encontrado | Import ou relatório inexistente |
| 500 | Erro interno | Falha de processamento; consultar campo details |
{ "error": "Descrição do erro" }
Limites
| Endpoint | Timeout | Nota |
|---|---|---|
| /api/saft/ingest | 300 s | Streaming SSE — suporta SAF-T até 150 MB+ |
| /api/v1/decoder | 300 s | Análise Gemini de documentos AT |
| /api/v1/annex/generate | 300 s | Geração DOCX pode ser demorada em SAFTs grandes |
| /api/v1/reconcile-bank | 120 s | Inclui IA para casos ambíguos |
| /api/v1/reconcile-third-party | 120 s | Inclui IA |
| /api/v1/cfo-insights | 120 s | Inclui geração de insights com IA |
| /api/v1/audit/invoice | 60 s | Por ficheiro; processamento paralelo |
| Restantes | — | Resposta imediata (leitura de DB) |
/api/saft/ingest que suporta 150 MB+).Valida que a chave API é válida e o serviço está acessível. Use como healthcheck antes de iniciar pipelines.
curl https://app.luppaia.pt/api/v1/ping \ -H "Authorization: Bearer lup_xxxx"
{ "status": "success", "message": "Autenticação bem-sucedida.", "timestamp": "2026-06-18T12:00:00.000Z" }
Processa e armazena um SAF-T XML. Resposta em streaming (SSE). O evento final contém o importId.
type: "done" para obter o importId.Modo A — FormData
| Campo | Tipo | Descrição | |
|---|---|---|---|
| saft_file | File | obrigatório | SAF-T XML |
| framework | string | opcional | NCRF-PE ou NCRF-ME. Default: NCRF-PE |
| saft_type | string | opcional | FINAL ou INTERCALAR. Default: FINAL |
Modo B — JSON (ficheiro já em Storage)
| Campo | Tipo | Descrição | |
|---|---|---|---|
| filePath | string | obrigatório | Caminho no bucket saft-files |
| framework | string | opcional | NCRF-PE ou NCRF-ME |
| saft_type | string | opcional | FINAL ou INTERCALAR |
{ "type": "done", "importId": "uuid", "companyId": "uuid" }
Devolve os dados públicos da empresa associada à chave API.
curl https://app.luppaia.pt/api/v1/company \ -H "Authorization: Bearer lup_xxxx"
{ "status": "success", "data": { "id": "uuid", "name": "Empresa Exemplo Lda", "nif": "509123456", "cae": "69200", "address": "Rua Exemplo, 123", "city": "Lisboa", "postal_code": "1000-001", "email_contact": "geral@empresa.pt", "primary_color": "#4F46E5", "created_at": "2026-01-15T10:00:00.000Z" } }
Lista as chaves API activas da empresa. Útil para auditar o que está configurado. Inclui a chave que está a fazer o pedido.
{ "status": "success", "data": [{ "id": "uuid", "name": "Chave JANUS", "key_hint": "xxxx", // últimos 4 chars — identificação visual "created_at": "2026-01-15T10:00:00.000Z", "last_used_at": "2026-06-18T12:00:00.000Z" }] }
Lista os últimos 50 imports SAF-T da empresa, ordenados do mais recente para o mais antigo.
{ "status": "success", "data": [{ "import_id": "uuid", "company_name": "Empresa Exemplo Lda", "fiscal_year": "2025", "saft_type": "FINAL", // FINAL | INTERCALAR "framework": "NCRF-PE", // NCRF-PE | NC-ME "status": "completed", // completed | processing | error "error_message":null, "created_at": "2026-06-18T12:00:00.000Z" }] }
Devolve o status e metadados de um import específico. Use para polling após /api/saft/ingest.
curl https://app.luppaia.pt/api/v1/imports/{importId} \ -H "Authorization: Bearer lup_xxxx"
{ "status": "success", "data": { "import_id": "uuid", "company_name": "Empresa Exemplo Lda", "fiscal_year": "2025", "saft_type": "FINAL", "framework": "NCRF-PE", "status": "completed", "error_message":null, "created_at": "2026-06-18T12:00:00.000Z" } }
Devolve o relatório CFO completo de um import — findings de auditoria, resumo financeiro e balancete por rubrica.
{ "status": "success", "data": { "import_id": "uuid", "fiscal_year": "2025", "accounting_framework": "NCRF-PE", "audit": { "findings": [], // array de anomalias detectadas "executive_summary": "..." // parecer em Markdown }, "financial_summary": { "sales": 480000, "services": 0, "cmvmc": 210000, "fse": 95000, "staff": 180000, "net_income": 90000, "pre_tax_income": 95000, "current_tax": 5000 }, "balances": { "pl_sales": 480000, "bs_ac_cash": 12000, // ... bucket_id: amount por rubrica } } }
Análise 100% determinística — sem IA. Valida NIFs (checksum PT), detecta gaps de numeração e erros matemáticos em faturas.
Parâmetros (multipart/form-data)
| Campo | Tipo | Descrição | |
|---|---|---|---|
| saft_file | File | obrigatório | SAF-T XML |
{ "status": "success", "data": { "nif_empresa_auditada": "509123456", "risk_score": 42, // 0–100 "summary": "Analisadas 120 fichas...", "anomalies": [{ "type": "invalid_nif", // structure|sequence_gap|invalid_nif|math_error "description": "NIF 999999999 inválido", "severity": "high", // low|medium|high|critical "document_reference": "FT 2025/1042" }] } }
Auditoria multimodal de facturas PDF ou imagem. Verifica NIF, matrícula (combustíveis), cálculo de IVA e tributações autónomas. Processamento paralelo — resultados devolvidos directamente, sem persistência.
Parâmetros (multipart/form-data)
| Campo | Tipo | Descrição | |
|---|---|---|---|
| files | File[] | obrigatório | Uma ou mais facturas (PDF/imagem, máx 10 MB cada) |
{ "status": "success", "data": [{ "fileName": "fatura_001.pdf", "success": true, "findings": { "date": "2026-05-15", "doc_number": "FT 2026/1042", "supplier": "Fornecedor Exemplo Lda", "nif": "509123456", "net": 1000.00, "tax": 230.00, "total": 1230.00, "category": "Outros", "license_plate": null, "status": "success", // success|warning|critical "risk": null, "autonomous_tax_rate": 0, "autonomous_tax_amount":0 } }] }
Analisa notificações da Autoridade Tributária (PDF ou imagem) e extrai dados estruturados: tipo de documento, prazo, referência de pagamento e rascunho de email.
Parâmetros (multipart/form-data)
| Campo | Tipo | Descrição | |
|---|---|---|---|
| file | File | obrigatório | Notificação AT (PDF ou imagem, máx 10 MB) |
{ "status": "success", "data": { "docType": "Notificação de Liquidação", "taxType": "IVA", "summary": "Liquidação adicional de IVA — 2024-Q3.", "deadline": "2026-07-15", // YYYY-MM-DD ou null "payment": { "hasPayment": true, "entidade": "21", "referencia":"999 1234 5678", "valor": "1.250,00", "dataLimite":"2026-07-15" }, "emailDraft": { "subject": "Notificação AT — Liquidação IVA", "body": "Exmo(a) Sr(a)..." } } }
Cruza o SAF-T com o CSV do e-Fatura. Identifica faturas em falta e divergências de valor. 100% determinístico.
Parâmetros (multipart/form-data)
| Campo | Tipo | Descrição | |
|---|---|---|---|
| saft_file | File | obrigatório | SAF-T XML |
| efatura_file | File | obrigatório | CSV ou XLSX exportado do Portal das Finanças |
{ "status": "success", "data": { "nif_empresa_auditada": "509123456", "summary": { "total_faturas_analisadas": 340, "total_faturas_em_falta": 3, "total_faturas_divergentes": 1, "valor_iva_em_risco": 138.00, "valor_base_em_risco": 600.00 }, "missing_invoices": [], "divergent_invoices": [] } }
Motor determinístico em 4 camadas; IA apenas para resíduos genuinamente ambíguos.
Parâmetros (multipart/form-data)
| Campo | Tipo | Descrição | |
|---|---|---|---|
| saft_file | File | obrigatório | SAF-T XML |
| bank_statement_file | File | obrigatório | Extrato bancário (CSV ou XLSX) |
{ "status": "success", "data": { "summary": { "total_movimentos_banco": 87, "movimentos_reconciliados": 82, "valor_reconciliado": 124580.40, "movimentos_banco_pendentes": 5, "valor_banco_por_reconciliar": 1200.00, "faturas_pendentes": 9, "valor_faturas_por_reconciliar":4350.00 }, "unreconciled_bank_transactions": [], "unpaid_invoices": [] } }
Confronta saldos de terceiros no SAF-T com o extrato de conta-corrente do terceiro.
Parâmetros (multipart/form-data)
| Campo | Tipo | Descrição | |
|---|---|---|---|
| saft_file | File | obrigatório | SAF-T XML |
| third_party_file | File | obrigatório | Extrato de conta-corrente do terceiro (CSV ou XLSX) |
{ "status": "success", "data": { "summary": { "saldo_saft": 12450.00, "saldo_terceiro": 12680.00, "desvio": 230.00, "faturas_reconciliadas": 18, "faturas_em_falta_saft": 1, "faturas_em_falta_terceiro":0 }, "missing_in_saft": [], "missing_in_third_party": [] } }
Extrai métricas financeiras do SAF-T e gera observações de gestão. Para o relatório completo com findings de auditoria, use GET /api/v1/reports/:importId após processar na plataforma.
Parâmetros (multipart/form-data)
| Campo | Tipo | Descrição | |
|---|---|---|---|
| saft_file | File | obrigatório | SAF-T XML |
{ "status": "success", "data": { "financial_summary": { "total_rendimentos": 480000.00, "vendas_e_servicos": 475000.00, "total_gastos": 390000.00, "margem_bruta": 210000.00, "resultado_operacional":90000.00 }, "insights": ["A margem bruta de 44% está acima da média sectorial..."] } }
Gera o Anexo ao Relatório & Contas (NCRF-PE ou NC-ME) a partir de um import já processado. Devolve ficheiro Word (.docx) ou JSON estruturado.
/api/saft/ingest. O framework é lido automaticamente do import se não for fornecido.Parâmetros (application/json)
| Campo | Tipo | Descrição | |
|---|---|---|---|
| import_id | string | obrigatório | UUID do import SAF-T |
| config.fiscal_year | number | obrigatório | Ano fiscal (ex: 2025) |
| format | string | opcional | docx (default) ou json |
| framework | string | opcional | NCRF-PE ou NC-ME. Lido do import se omitido. |
| config.n_employees | number | opcional | Número de trabalhadores |
| config.has_financial_leasing | boolean | opcional | Existência de locações financeiras |
| config.has_subsidies | boolean | opcional | Existência de subsídios ao investimento |
| config.additional_notes | string | opcional | Notas adicionais ao anexo |
curl https://app.luppaia.pt/api/v1/annex/generate \ -H "Authorization: Bearer lup_xxxx" \ -H "Content-Type: application/json" \ -d '{"import_id":"uuid","format":"docx","config":{"fiscal_year":2025}}' \ --output Anexo_2025.docx
Binary DOCX — Content-Disposition: attachment; filename="Anexo_NCRF_PE_Empresa_2025.docx"
{ "status": "success", "data": { /* estrutura completa do anexo */ } }
Servidor MCP
O LUPPA disponibiliza um servidor MCP (Model Context Protocol) que expõe a API como ferramentas nativas para agentes de IA. O servidor corre via stdio e autentica-se com a mesma chave lup_*.
/api/reconcile (pipeline v2 completo com persistência em DB) em vez de /api/v1/reconcile-bank. Reconciliações via MCP ficam registadas como reconciliações reais.importId e link directo para análise.| Parâmetro | Tipo | |
|---|---|---|
| saft_file_path | string | obrigatório |
| api_key | string | obrigatório |
| company_id | string | opcional |
| framework | string | opcional |
| saft_type | string | opcional |
POST /api/v1/tax-audit.| Parâmetro | Tipo | |
|---|---|---|
| saft_file_path | string | obrigatório |
| api_key | string | obrigatório |
POST /api/v1/reconcile.| Parâmetro | Tipo | |
|---|---|---|
| saft_file_path | string | obrigatório |
| efatura_path | string | obrigatório |
| api_key | string | obrigatório |
| company_id | string | opcional |
/api/reconcile (pipeline v2).| Parâmetro | Tipo | |
|---|---|---|
| accounting_file_path | string | obrigatório |
| bank_statement_path | string | obrigatório |
| api_key | string | obrigatório |
| company_id | string | opcional |
| bank_name | string | opcional |