API REST

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.

URL Base
https://app.luppaia.pt
Formato
multipart/form-data
application/json
Autenticação
Bearer lup_*
Endpoints
15 endpoints públicos

Fluxo típico

1
Gerar chave API
Em Definições → API & Integrações. Cada chave tem escopo para uma empresa específica.
2
Validar ligação
Chamar GET /api/v1/ping para confirmar que a chave é válida.
3
Ingerir o SAF-T
Enviar via POST /api/saft/ingest. Devolve importId via SSE.
4
Consultar resultados
Usar 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
Chave mostrada uma única vez. Após a criação, a chave não é recuperável. Guarde-a imediatamente.

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ódigoSignificadoCausa típica
200Sucesso
400Pedido inválidoFicheiro em falta, SAF-T corrompido, parâmetro obrigatório ausente
401Não autenticadoChave inválida, revogada ou ausente
403Acesso negadoO recurso não pertence à empresa da chave
404Não encontradoImport ou relatório inexistente
500Erro internoFalha de processamento; consultar campo details
{ "error": "Descrição do erro" }

Limites

EndpointTimeoutNota
/api/saft/ingest300 sStreaming SSE — suporta SAF-T até 150 MB+
/api/v1/decoder300 sAnálise Gemini de documentos AT
/api/v1/annex/generate300 sGeração DOCX pode ser demorada em SAFTs grandes
/api/v1/reconcile-bank120 sInclui IA para casos ambíguos
/api/v1/reconcile-third-party120 sInclui IA
/api/v1/cfo-insights120 sInclui geração de insights com IA
/api/v1/audit/invoice60 sPor ficheiro; processamento paralelo
RestantesResposta imediata (leitura de DB)
Ficheiros aceites nos endpoints de upload: máx 10 MB por ficheiro (excepção: SAF-T via /api/saft/ingest que suporta 150 MB+).

BaseLigação e ingest
GET/api/v1/pingVerificar ligação

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"
200
{ "status": "success", "message": "Autenticação bem-sucedida.", "timestamp": "2026-06-18T12:00:00.000Z" }
POST/api/saft/ingestImportar SAF-T
⏱ 300 s

Processa e armazena um SAF-T XML. Resposta em streaming (SSE). O evento final contém o importId.

Resposta em streaming. Consume o stream até ao evento type: "done" para obter o importId.

Modo A — FormData

CampoTipoDescrição
saft_fileFileobrigatórioSAF-T XML
frameworkstringopcionalNCRF-PE ou NCRF-ME. Default: NCRF-PE
saft_typestringopcionalFINAL ou INTERCALAR. Default: FINAL

Modo B — JSON (ficheiro já em Storage)

CampoTipoDescrição
filePathstringobrigatórioCaminho no bucket saft-files
frameworkstringopcionalNCRF-PE ou NCRF-ME
saft_typestringopcionalFINAL ou INTERCALAR
Evento SSE final
{ "type": "done", "importId": "uuid", "companyId": "uuid" }

ContaEmpresa e chaves API
GET/api/v1/companyDados da empresa

Devolve os dados públicos da empresa associada à chave API.

curl https://app.luppaia.pt/api/v1/company \
  -H "Authorization: Bearer lup_xxxx"
200
{
  "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"
  }
}
GET/api/v1/apikeysListar chaves API

Lista as chaves API activas da empresa. Útil para auditar o que está configurado. Inclui a chave que está a fazer o pedido.

200
{
  "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"
  }]
}

Imports & RelatóriosConsultar dados processados
GET/api/v1/importsListar imports SAF-T

Lista os últimos 50 imports SAF-T da empresa, ordenados do mais recente para o mais antigo.

200
{
  "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"
  }]
}
GET/api/v1/imports/:importIdStatus de um import

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"
200
{
  "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"
  }
}
GET/api/v1/reports/:importIdRelatório CFO completo

Devolve o relatório CFO completo de um import — findings de auditoria, resumo financeiro e balancete por rubrica.

Pré-requisito: O relatório tem de ter sido gerado na plataforma. Se ainda não foi calculado, este endpoint devolve 404 com instrução de como proceder.
200
{
  "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
    }
  }
}

AuditoriaSAF-T, facturas e notificações AT
POST/api/v1/tax-auditAuditoria fiscal SAF-T

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)

CampoTipoDescrição
saft_fileFileobrigatórioSAF-T XML
200
{
  "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"
    }]
  }
}
POST/api/v1/audit/invoiceAuditoria de facturas
⏱ 60 s
✦ IA

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)

CampoTipoDescrição
filesFile[]obrigatórioUma ou mais facturas (PDF/imagem, máx 10 MB cada)
200
{
  "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
    }
  }]
}
POST/api/v1/decoderDescodificador AT
⏱ 300 s
✦ IA

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)

CampoTipoDescrição
fileFileobrigatórioNotificação AT (PDF ou imagem, máx 10 MB)
200
{
  "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)..."
    }
  }
}

Reconciliaçãoe-Fatura, bancária e terceiros
POST/api/v1/reconcileSAF-T vs e-Fatura

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)

CampoTipoDescrição
saft_fileFileobrigatórioSAF-T XML
efatura_fileFileobrigatórioCSV ou XLSX exportado do Portal das Finanças
200
{
  "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": []
  }
}
POST/api/v1/reconcile-bankReconciliação bancária
⏱ 120 s
✦ IA para ambíguos

Motor determinístico em 4 camadas; IA apenas para resíduos genuinamente ambíguos.

Parâmetros (multipart/form-data)

CampoTipoDescrição
saft_fileFileobrigatórioSAF-T XML
bank_statement_fileFileobrigatórioExtrato bancário (CSV ou XLSX)
200
{
  "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":               []
  }
}
POST/api/v1/reconcile-third-partyReconciliação de terceiros
⏱ 120 s
✦ IA

Confronta saldos de terceiros no SAF-T com o extrato de conta-corrente do terceiro.

Parâmetros (multipart/form-data)

CampoTipoDescrição
saft_fileFileobrigatórioSAF-T XML
third_party_fileFileobrigatórioExtrato de conta-corrente do terceiro (CSV ou XLSX)
200
{
  "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": []
  }
}

Análise & DocumentosCFO insights e Anexos
POST/api/v1/cfo-insightsAnálise CFO rápida
⏱ 120 s
✦ IA

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)

CampoTipoDescrição
saft_fileFileobrigatórioSAF-T XML
200
{
  "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..."]
  }
}
POST/api/v1/annex/generateGerar Anexo NCRF
⏱ 300 s

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.

Pré-requisito: O SAF-T deve ter sido ingerido via /api/saft/ingest. O framework é lido automaticamente do import se não for fornecido.

Parâmetros (application/json)

CampoTipoDescrição
import_idstringobrigatórioUUID do import SAF-T
config.fiscal_yearnumberobrigatórioAno fiscal (ex: 2025)
formatstringopcionaldocx (default) ou json
frameworkstringopcionalNCRF-PE ou NC-ME. Lido do import se omitido.
config.n_employeesnumberopcionalNúmero de trabalhadores
config.has_financial_leasingbooleanopcionalExistência de locações financeiras
config.has_subsidiesbooleanopcionalExistência de subsídios ao investimento
config.additional_notesstringopcionalNotas 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
200 (format=docx)
Binary DOCX — Content-Disposition: attachment; filename="Anexo_NCRF_PE_Empresa_2025.docx"
200 (format=json)
{ "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_*.

Nota sobre luppa_reconcile_bank: Esta ferramenta chama /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.
luppa_ingest_saft
Importa SAF-T a partir de caminho local. Devolve importId e link directo para análise.
ParâmetroTipo
saft_file_pathstringobrigatório
api_keystringobrigatório
company_idstringopcional
frameworkstringopcional
saft_typestringopcional
luppa_tax_audit
Auditoria fiscal determinística. Equivale a POST /api/v1/tax-audit.
ParâmetroTipo
saft_file_pathstringobrigatório
api_keystringobrigatório
luppa_reconcile_efatura
Reconciliação SAF-T vs e-Fatura. Equivale a POST /api/v1/reconcile.
ParâmetroTipo
saft_file_pathstringobrigatório
efatura_pathstringobrigatório
api_keystringobrigatório
company_idstringopcional
luppa_reconcile_bank
Reconciliação bancária completa com persistência. Chama /api/reconcile (pipeline v2).
ParâmetroTipo
accounting_file_pathstringobrigatório
bank_statement_pathstringobrigatório
api_keystringobrigatório
company_idstringopcional
bank_namestringopcional