P&S2B
PES2B Document API Developer Portal
API 2.0.0 • ENGINE 1.10.0 • ESTÁVEL

Documentos fiscais transformados em dados estruturados

API para identificação e extração de informações de PDFs fiscais e contábeis, preparada para automações com n8n, Microsoft 365 e sistemas internos do grupo P&S2B.

DISPONIBILIDADE

Status da API

Abrir health check
StatusConsultando...
Versão2.0.0
Tempo de respostaConsultando...
Engine documental1.10.0

Última verificação: aguardando...

INTEGRAÇÃO

Primeiros passos

O consumo básico da API pode ser concluído em cinco etapas.

1

Solicite uma API Key à P&S2B.

2

Prepare o arquivo PDF que será processado.

3

Envie um POST multipart para /api/v1/pdf/extract.

4

Informe a chave no cabeçalho X-API-Key.

5

Utilize os dados estruturados retornados na automação.

ENDEREÇO

URL base

https://document.pes2b.com
SEGURANÇA

Autenticação

Os endpoints de processamento exigem uma API Key válida no cabeçalho X-API-Key.

X-API-Key: SUA_CHAVE
Importante: armazene a chave em credenciais do n8n ou em variáveis de ambiente. Nunca publique a chave em código-fonte, GitHub, prints ou workflows exportados.
MONITORAMENTO

Health checks

GET/api/v1/healthPúblico
GET/api/v1/infoPúblico
GET/openapi.jsonPúblico
OBSERVABILIDADE

Diagnóstico operacional

GET/api/v1/diagnosticsAPI Key

Retorna métricas acumuladas desde o último início do serviço, incluindo volume, sucesso, falhas, confiança, parsers ativos e tempo médio de processamento.

curl -X GET \
  'https://document.pes2b.com/api/v1/diagnostics' \
  -H 'X-API-Key: SUA_CHAVE'
CampoSignificado
processedDocumentsTotal de documentos contabilizados.
successfulDocumentsDocumentos processados com sucesso.
failedDocumentsDocumentos com falha.
successRateTaxa de sucesso entre 0 e 1.
blockedByConfidenceParsers bloqueados por confiança inferior ao mínimo.
unknownDocumentsDocumentos não identificados.
rejectedUploadsUploads rejeitados antes do processamento.
averageProcessingMsTempo médio de processamento em milissegundos.
byDocumentTypeQuantidade processada por tipo documental.
byConfidenceLevelQuantidade nos níveis HIGH, MEDIUM e LOW.
{
  "success": true,
  "message": "Diagnóstico operacional do serviço.",
  "requestId": "a1cb5279-4b56-442d-876c-bf4b1ae23aca",
  "data": {
    "service": "pes2b-document-service",
    "environment": "production",
    "engineVersion": "1.10.0",
    "uptimeSeconds": 104,
    "processedDocuments": 0,
    "successfulDocuments": 0,
    "failedDocuments": 0,
    "successRate": 1,
    "blockedByConfidence": 0,
    "unknownDocuments": 0,
    "rejectedUploads": 0,
    "averageProcessingMs": 0,
    "parsers": { "total": 7, "active": 7, "inactive": 0 },
    "byDocumentType": {},
    "byConfidenceLevel": { "HIGH": 0, "MEDIUM": 0, "LOW": 0 }
  },
  "errors": [],
  "warnings": [
    "As métricas são mantidas em memória e reiniciadas quando o serviço é reiniciado."
  ]
}
Limitação atual: as métricas são mantidas em memória. Reinícios e novos deploys zeram os contadores.
ENDPOINT PRINCIPAL

Processar PDF

POST/api/v1/pdf/extractAPI Key

Recebe um arquivo PDF no campo multipart file, identifica o tipo documental e devolve os dados encontrados em JSON. Para documentos compatíveis, a requisição pode informar um contexto esperado para validar CNPJ, competência e município.

Envie o arquivo como multipart/form-data. O nome do campo deve ser exatamente file. Os campos expected* são opcionais e não alteram chamadas existentes que enviam somente o PDF.
PROCESSAMENTO EM LOTE

Processar vários PDFs

POST/api/v1/pdf/extract-batchAPI Key

Processa até 10 arquivos por requisição. Envie os PDFs no campo multipart files.

ENTRADA

Exemplo de requisição

curl -X POST \
  'https://document.pes2b.com/api/v1/pdf/extract' \
  -H 'X-API-Key: SUA_CHAVE' \
  -F 'file=@documento.pdf;type=application/pdf'
CampoTipoObrigatórioDescrição
filePDFSimDocumento a ser identificado e processado.
expectedCnpjTextoNãoCNPJ esperado. Quando informado, é comparado com o CNPJ extraído.
expectedCompetenceTextoNãoCompetência esperada em AAAA-MM ou MM/AAAA.
expectedMunicipalityIbgeTextoNãoCódigo IBGE esperado do município.
expectedUfTextoNãoUF esperada com duas letras.

Exemplo com validação de contexto

curl -X POST \
  'https://document.pes2b.com/api/v1/pdf/extract' \
  -H 'X-API-Key: SUA_CHAVE' \
  -F 'file=@dec-poa.pdf;type=application/pdf' \
  -F 'expectedCnpj=12.345.678/0001-90' \
  -F 'expectedCompetence=2026-07' \
  -F 'expectedMunicipalityIbge=4314902' \
  -F 'expectedUf=RS'
Validação parcial: somente os campos expected* enviados são comparados. Quando nenhum deles é informado, a resposta mantém o contrato anterior e não inclui validation.
SAÍDA

Resposta de sucesso

{
  "success": true,
  "documentType": "DECLARACAO_PGDAS",
  "engine": {
    "version": "1.10.0",
    "family": "SIMPLES_NACIONAL",
    "detector": "simples.detector",
    "parser": "declaracao",
    "parserVersion": "1.0.0",
    "schemaVersion": "1.0",
    "confidence": 1,
    "confidenceLevel": "HIGH",
    "minimumConfidence": 0.8,
    "parserExecuted": true,
    "parserBlocked": false
  },
  "pages": 2,
  "data": {
    "identificacao": {
      "empresa": "EMPRESA EXEMPLO LTDA.",
      "cnpj": "12.345.678/0001-90",
      "competencia": "06/2026"
    }
  },
  "warnings": [],
  "errors": [],
  "requestId": "00000000-0000-4000-8000-000000000001"
}

O objeto engine permite auditar detector, parser, versão, confiança e eventual bloqueio de segurança. Os campos de data variam conforme o documento.

Níveis de confiança: HIGH a partir de 0,90; MEDIUM a partir de 0,75; LOW abaixo de 0,75. O parser somente executa quando a confiança atinge o limite definido no registry.
MÓDULO FISCAL

Relatório do Simples Nacional

Para relatórios de apuração do Domínio Sistemas, a API pode retornar o resumo mensal, as apurações individuais e a consolidação por anexo.

Resumo mensal

Receita da competência, RBT12, faixa, valor do Simples e carga tributária efetiva.

Apurações

Atividade, anexo, seção, tratamento tributário, receita, alíquota efetiva e tributo.

Consolidação

Agrupamento das receitas e tributos por anexo, com alíquota média efetiva.

{
  "resumo": {
    "receitaBrutaMesNumero": 10238.00,
    "rbt12Numero": 122916.51,
    "faixaEnquadramento": "0,00 a 180.000,00",
    "valorSimplesRecolherNumero": 332.78,
    "cargaTributariaTotalNumero": 3.2504
  },
  "consolidacaoPorAnexo": [
    {
      "anexo": "I",
      "descricaoAnexo": "Comércio",
      "receitaTributadaNumero": 8378.00,
      "valorSimplesNumero": 221.18,
      "aliquotaMediaNumero": 2.64
    }
  ]
}
DECLARAÇÕES MUNICIPAIS

DEC Porto Alegre — Declaração Mensal de ISSQN

O documento DEC_POA_DECLARACAO_MENSAL pertence à família DECLARACAO_MUNICIPAL e utiliza o parser dec-poa. Além dos dados estruturados, a API separa fisicamente o PDF original em declaração, guia — quando existir — e recibo.

Identificação

CNPJ, razão social, inscrição municipal, competência e município.

Valores fiscais

Receita, base, ISS próprio, retenções, imposto devido e total a recolher.

Recibo

Status de entrega, data/hora e autenticação da declaração.

Guia opcional

Código de arrecadação, vencimento, código de barras, imposto e valor a pagar.

Validação de contexto

Compara CNPJ, competência, código IBGE e UF quando o chamador informa os campos esperados.

PDFs separados

Retorna cada parte em Base64 com nome padronizado, pronta para arquivamento ou envio.

Estrutura dos dados

ObjetoCampos principais
data.companycnpj, razaoSocial, inscricaoMunicipal.
data.competenceyear, month, reference, display.
data.municipalityibgeCode, name, uf.
data.financialReceita, deduções, base, ISS próprio, retenções e totais.
data.receiptstatus, submittedAt, authentication.
data.guideDados da guia quando existente. Em declarações sem guia, pode ser null.

Validação opcional do contexto esperado

Quando a requisição contém campos expected*, a resposta inclui validation. Uma divergência não altera o HTTP por si só: o chamador deve verificar validation.valid e decidir se interrompe a automação.

{
  "validation": {
    "valid": true,
    "mismatches": []
  }
}
{
  "validation": {
    "valid": false,
    "mismatches": [
      {
        "field": "cnpj",
        "expected": "12345678000190",
        "actual": "98765432000110",
        "code": "CNPJ_MISMATCH"
      }
    ]
  }
}

Separação automática do PDF

O array documents contém as partes físicas geradas a partir do PDF original. A declaração e o recibo são esperados; a guia é opcional.

RoleQuando retornaConteúdo
DECLARACAOSempreUma ou mais páginas da declaração mensal.
GUIAQuando o PDF contém guiaGuia para pagamento de ISSQN.
RECIBOSempreRecibo de entrega da declaração mensal.

Os nomes seguem o padrão RAZAO_SOCIAL__CNPJ__MM-AAAA_sufixo.pdf, com sufixos declaracao, guia e recibo.

{
  "success": true,
  "documentType": "DEC_POA_DECLARACAO_MENSAL",
  "compound": true,
  "engine": {
    "family": "DECLARACAO_MUNICIPAL",
    "parser": "dec-poa",
    "confidence": 1,
    "confidenceLevel": "HIGH",
    "parserExecuted": true
  },
  "data": {
    "municipality": {
      "ibgeCode": "4314902",
      "name": "Porto Alegre",
      "uf": "RS"
    },
    "company": {
      "cnpj": "12345678000190",
      "razaoSocial": "EMPRESA EXEMPLO PORTO ALEGRE LTDA.",
      "inscricaoMunicipal": "123456-7-8"
    },
    "competence": {
      "year": 2026,
      "month": 7,
      "reference": "2026-07",
      "display": "07/2026"
    },
    "financial": {
      "servicesRevenue": 20000.00,
      "issOwn": 1000.00,
      "issWithheldFromThirdParties": 0.00,
      "totalTaxDue": 1000.00,
      "totalToCollect": 1000.00
    },
    "receipt": {
      "status": "ENTREGUE",
      "submittedAt": "2026-08-04T19:19:45-03:00",
      "authentication": "AA BB CC DD EE FF 00 11 22 33 44 55 66 77 88 99"
    },
    "guide": {
      "present": true,
      "collectionCode": "328300123456789",
      "dueDate": "2026-09-30",
      "generatedAt": "2026-09-02T11:10:00-03:00",
      "barcode": "816700000119 315934332026 609300430327 830012345678",
      "taxAmount": 1000.00,
      "amountToPay": 1110.00,
      "revenue": 20000.00
    }
  },
  "validation": {
    "valid": true,
    "mismatches": []
  },
  "documents": [
    {
      "role": "DECLARACAO",
      "suggestedSuffix": "declaracao",
      "fileName": "EMPRESA_EXEMPLO_PORTO_ALEGRE_LTDA__12345678000190__07-2026_declaracao.pdf",
      "pages": [1, 2],
      "file": {
        "fileName": "EMPRESA_EXEMPLO_PORTO_ALEGRE_LTDA__12345678000190__07-2026_declaracao.pdf",
        "mimeType": "application/pdf",
        "extension": "pdf",
        "size": 4200,
        "base64": "JVBERi0xLjcKLi4u"
      }
    },
    {
      "role": "GUIA",
      "suggestedSuffix": "guia",
      "fileName": "EMPRESA_EXEMPLO_PORTO_ALEGRE_LTDA__12345678000190__07-2026_guia.pdf",
      "pages": [3],
      "file": { "mimeType": "application/pdf", "extension": "pdf", "size": 13000, "base64": "JVBERi0xLjcKLi4u" }
    },
    {
      "role": "RECIBO",
      "suggestedSuffix": "recibo",
      "fileName": "EMPRESA_EXEMPLO_PORTO_ALEGRE_LTDA__12345678000190__07-2026_recibo.pdf",
      "pages": [4],
      "file": { "mimeType": "application/pdf", "extension": "pdf", "size": 5300, "base64": "JVBERi0xLjcKLi4u" }
    }
  ],
  "requestId": "00000000-0000-4000-8000-000000000101"
}
Declaração sem guia: o array documents retorna apenas DECLARACAO e RECIBO; não é criado um item GUIA artificial.
IDENTIFICAÇÃO

Documentos reconhecidos

A API identifica automaticamente o tipo do PDF e seleciona o parser correspondente. Os campos variam conforme o documento e a qualidade do conteúdo extraído.

TipoIdentificadorDados principais
Declaração PGDAS-DDECLARACAO_PGDASCompetência, receitas, débito, número da declaração, recibo e tipo original/retificadora.
Recibo PGDAS-DRECIBO_PGDASNúmero do recibo, transmissão, CNPJ, competência, receita e débitos.
Guia DASDASEmpresa, CNPJ, competência, número do documento, valor e vencimento.
Extrato PGDAS-DEXTRATO_PGDASIdentificação do documento; parser detalhado ainda em evolução.
Relatório do SimplesRELATORIO_SIMPLESResumo, RBT12, apurações, consolidação por anexo e carga tributária.
Declaração de faturamentoDECLARACAO_FATURAMENTOPeríodo, faturamento mensal, total, emissão, responsável e validações.
Declaração + recibo no mesmo PDFCOMBINADO_DECLARACAO_RECIBO_PGDASSeparação automática em dois documentos estruturados.
DEC Porto Alegre — Declaração Mensal de ISSQNDEC_POA_DECLARACAO_MENSALEmpresa, competência, município, valores fiscais, recibo, guia opcional, validação de contexto e PDFs separados.
Documento não reconhecidoNAO_IDENTIFICADOMetadados técnicos e indicação para conferência manual.
REFERÊNCIA PRÁTICA

Exemplos de JSON por documento

Todos os exemplos abaixo utilizam dados fictícios e anonimizados. O envelope técnico real inclui também success, engine, pages, warnings, errors, text e requestId.

Declaração PGDAS-DDECLARACAO_PGDAS
{
  "success": true,
  "documentType": "DECLARACAO_PGDAS",
  "pages": 4,
  "data": {
    "identificacao": {
      "empresa": "EMPRESA EXEMPLO LTDA.",
      "cnpj": "12.345.678/0001-90",
      "competencia": "06/2026",
      "numeroDeclaracao": "12345678202606001"
    },
    "documento": {
      "tipo": "DECLARACAO_PGDAS",
      "tipoDeclaracao": "ORIGINAL",
      "ehRetificadora": false,
      "numeroRecibo": "01.23.45678.9012345-6"
    },
    "resumo": {
      "receitaBrutaMesNumero": 45000.00,
      "totalDebitoDeclaradoNumero": 2187.50
    }
  },
  "warnings": [],
  "errors": [],
  "requestId": "00000000-0000-4000-8000-000000000001"
}
Recibo PGDAS-DRECIBO_PGDAS
{
  "success": true,
  "documentType": "RECIBO_PGDAS",
  "data": {
    "identificacao": {
      "empresa": "EMPRESA EXEMPLO LTDA.",
      "cnpj": "12.345.678/0001-90",
      "competencia": "06/2026"
    },
    "documento": {
      "tipo": "RECIBO_PGDAS",
      "numeroDeclaracao": "12345678202606001",
      "numeroRecibo": "01.23.45678.9012345-6",
      "tipoDeclaracao": "ORIGINAL",
      "ehRetificadora": false
    },
    "datas": {
      "dataTransmissao": "15/07/2026",
      "horaTransmissao": "14:32:10",
      "dataTransmissaoISO": "2026-07-15T17:32:10.000Z"
    },
    "valores": {
      "receitaBrutaNumero": 45000.00,
      "totalDebitoDeclaradoNumero": 2187.50,
      "totalDebitoExigivelNumero": 2187.50
    }
  },
  "requestId": "00000000-0000-4000-8000-000000000002"
}
Guia DASDAS
{
  "success": true,
  "documentType": "DAS",
  "data": {
    "identificacao": {
      "empresa": "EMPRESA EXEMPLO LTDA.",
      "cnpj": "12.345.678/0001-90",
      "competencia": "06/2026"
    },
    "documento": {
      "tipo": "DAS",
      "numeroDocumento": "07.16.26123.4567890-1"
    },
    "datas": {
      "vencimento": "20/07/2026"
    },
    "valores": {
      "valorDocumento": "2.187,50"
    },
    "extras": {}
  },
  "requestId": "00000000-0000-4000-8000-000000000003"
}
Extrato PGDAS-DEXTRATO_PGDAS
{
  "success": true,
  "documentType": "EXTRATO_PGDAS",
  "data": {
    "identificacao": {},
    "documento": {
      "tipo": "EXTRATO_PGDAS"
    },
    "datas": {},
    "valores": {},
    "extras": {
      "mensagem": "Parser ainda não implementado."
    }
  },
  "warnings": [],
  "requestId": "00000000-0000-4000-8000-000000000004"
}
Transparência: o extrato já é reconhecido, mas a extração detalhada ainda não está implementada na versão atual.
Relatório do Simples NacionalRELATORIO_SIMPLES
{
  "success": true,
  "documentType": "RELATORIO_SIMPLES",
  "data": {
    "identificacao": {
      "empresa": "EMPRESA EXEMPLO LTDA.",
      "cnpj": "12.345.678/0001-90",
      "competencia": "06/2026"
    },
    "documento": {
      "tipo": "RELATORIO_SIMPLES"
    },
    "resumo": {
      "receitaBrutaMesNumero": 45000.00,
      "rbt12Numero": 480000.00,
      "faixaEnquadramento": "360.000,01 a 720.000,00",
      "valorSimplesRecolherNumero": 2187.50,
      "cargaTributariaTotalNumero": 4.8611
    },
    "apuracoes": [
      {
        "ordem": 1,
        "anexo": "III",
        "descricaoAnexo": "Prestação de Serviços",
        "receitaTributadaNumero": 45000.00,
        "aliquotaEfetivaNumero": 4.8611,
        "valorSimplesNumero": 2187.50
      }
    ],
    "consolidacaoPorAnexo": [
      {
        "anexo": "III",
        "receitaTributadaNumero": 45000.00,
        "valorSimplesNumero": 2187.50,
        "quantidadeApuracoes": 1,
        "aliquotaMediaNumero": 4.8611
      }
    ]
  },
  "requestId": "00000000-0000-4000-8000-000000000005"
}
Declaração de faturamentoDECLARACAO_FATURAMENTO
{
  "success": true,
  "documentType": "DECLARACAO_FATURAMENTO",
  "data": {
    "identificacao": {
      "empresa": "EMPRESA EXEMPLO LTDA.",
      "cnpj": "12.345.678/0001-90",
      "competencia": "06/2026"
    },
    "documento": {
      "tipo": "DECLARACAO_FATURAMENTO",
      "finalidade": "COMPROVACAO_FATURAMENTO_12_MESES"
    },
    "periodo": {
      "inicio": "07/2025",
      "fim": "06/2026"
    },
    "faturamento": {
      "meses": [
        { "competencia": "07/2025", "valorNumero": 38000.00 },
        { "competencia": "08/2025", "valorNumero": 40500.00 }
      ],
      "quantidadeMeses": 12,
      "totalNumero": 480000.00,
      "totalConfere": true
    },
    "emissao": {
      "data": "16/07/2026",
      "municipio": "Porto Alegre/RS"
    },
    "responsavel": {
      "nome": "RESPONSÁVEL EXEMPLO",
      "cpf": "***.***.***-**"
    },
    "assinatura": {
      "necessaria": true,
      "assinada": false,
      "tipoEsperado": "PADES"
    },
    "warnings": []
  },
  "requestId": "00000000-0000-4000-8000-000000000006"
}
Declaração e recibo combinadosCOMBINADO_DECLARACAO_RECIBO_PGDAS
{
  "success": true,
  "documentType": "COMBINADO_DECLARACAO_RECIBO_PGDAS",
  "compound": true,
  "documents": [
    {
      "role": "DECLARACAO",
      "suggestedSuffix": "DECLARACAO",
      "documentType": "DECLARACAO_PGDAS",
      "pages": 4,
      "data": { "documento": { "tipo": "DECLARACAO_PGDAS" } },
      "file": {
        "mimeType": "application/pdf",
        "extension": "pdf",
        "size": 182400,
        "base64": "JVBERi0xLjQKLi4u"
      }
    },
    {
      "role": "RECIBO",
      "suggestedSuffix": "RECIBO",
      "documentType": "RECIBO_PGDAS",
      "pages": 1,
      "data": { "documento": { "tipo": "RECIBO_PGDAS" } },
      "file": {
        "mimeType": "application/pdf",
        "extension": "pdf",
        "size": 48320,
        "base64": "JVBERi0xLjQKLi4u"
      }
    }
  ],
  "requestId": "00000000-0000-4000-8000-000000000007"
}
DEC Porto Alegre — Declaração Mensal de ISSQNDEC_POA_DECLARACAO_MENSAL
{
  "documentType": "DEC_POA_DECLARACAO_MENSAL",
  "data": {
    "company": { "cnpj": "12345678000190", "razaoSocial": "EMPRESA EXEMPLO LTDA." },
    "competence": { "reference": "2026-07", "display": "07/2026" },
    "municipality": { "ibgeCode": "4314902", "name": "Porto Alegre", "uf": "RS" },
    "financial": { "totalTaxDue": 1000.00, "totalToCollect": 1000.00 },
    "receipt": { "status": "ENTREGUE", "submittedAt": "2026-08-04T19:19:45-03:00" },
    "guide": { "present": true, "dueDate": "2026-09-30", "amountToPay": 1110.00 }
  },
  "validation": { "valid": true, "mismatches": [] },
  "documents": [
    { "role": "DECLARACAO", "pages": [1, 2], "fileName": "..._declaracao.pdf" },
    { "role": "GUIA", "pages": [3], "fileName": "..._guia.pdf" },
    { "role": "RECIBO", "pages": [4], "fileName": "..._recibo.pdf" }
  ]
}
EVOLUÇÃO DO PARSER

Como incluir um novo tipo de documento

Adicionar um documento não significa apenas criar uma expressão regular. O processo completo inclui amostras reais, regra de identificação, contrato de saída, parser, testes, documentação e validação no fluxo consumidor.

Exemplo: para incluir um Recibo de entrega do SPED, primeiro precisamos receber PDFs reais e anonimizados. O texto e o leiaute podem variar conforme o módulo — ECD, ECF, EFD ICMS/IPI, EFD-Contribuições ou outro — e também conforme a versão do programa.

Visão geral do processo

1

Reunir amostras. Separar preferencialmente de 3 a 5 PDFs do mesmo documento, incluindo variações de período, empresa e versão.

2

Definir o contrato de saída. Listar exatamente quais campos devem retornar e seus formatos.

3

Analisar o texto extraído. Verificar como o pdf-parse entrega títulos, rótulos e valores.

4

Criar a detecção. Incluir uma regra específica no detector, antes de regras mais genéricas.

5

Implementar o parser. Extrair e normalizar os campos sem misturar identificação com regra de negócio do n8n.

6

Registrar o parser. Associar o novo documentType ao módulo criado.

7

Criar testes automatizados. Validar identificação, campos obrigatórios, variações e documentos parecidos.

8

Atualizar contrato e documentação. OpenAPI, Swagger, exemplos JSON, Markdown e changelog.

9

Publicar e homologar. Executar testes, fazer deploy e validar uma chamada real antes de alterar o fluxo do n8n.

Arquivos normalmente alterados

ArquivoFinalidade
src/document/detectors/familias/<familia>.detector.jsReconhece o tipo documental pelas marcas textuais do PDF.
src/document/parsers/<grupo>/<documento>/parser.jsExtrai os campos e monta o objeto data.
src/document/parsers/registry.jsLiga o identificador retornado pelo detector ao parser correspondente.
src/document/helpers/Funções reutilizáveis para CNPJ, competência, datas, valores e normalização.
src/document/validators/Validação opcional do contexto esperado quando o tipo documental exigir conferência de empresa, competência ou município.
src/document/splitters/Separação física de PDFs compostos ou documentos que contenham múltiplas partes.
test/<documento>.test.jsGarante que futuras mudanças não quebrem o documento já suportado.
docs/openapi.json e docs-site/openapi.jsonDocumentam schemas, exemplos e respostas no Swagger.
docs-site/index.html e MarkdownExplicam o novo documento para quem integra com a API.

Exemplo: Recibo de entrega do SPED

O identificador deve ser específico para o módulo. Um nome possível seria RECIBO_SPED_ECD. Não é recomendável usar apenas RECIBO_SPED se os campos e marcas textuais forem diferentes entre ECD, ECF e EFD.

// document.detector.js — exemplo ilustrativo
if (
  normalized.includes('RECIBO DE ENTREGA DE ESCRITURAÇÃO CONTÁBIL DIGITAL') &&
  normalized.includes('IDENTIFICAÇÃO DO ARQUIVO') &&
  normalized.includes('HASH DA ESCRITURAÇÃO')
) {
  return 'RECIBO_SPED_ECD';
}
// registry.js
RECIBO_SPED_ECD: require(
  path.join(__dirname, 'sped', 'recibo-ecd')
)
// src/document/parsers/sped/recibo-ecd/parser.js
exports.parse = (text) => ({
  identificacao: {
    empresa: extrairEmpresa(text),
    cnpj: extrairCnpj(text),
    periodo: extrairPeriodo(text)
  },
  documento: {
    tipo: 'RECIBO_SPED_ECD',
    numeroRecibo: extrairNumeroRecibo(text),
    hashEscrituracao: extrairHash(text)
  },
  transmissao: {
    dataHora: extrairDataHora(text),
    situacao: extrairSituacao(text)
  },
  extras: {}
});

Contrato JSON sugerido

{
  "success": true,
  "documentType": "RECIBO_SPED_ECD",
  "pages": 1,
  "data": {
    "identificacao": {
      "empresa": "EMPRESA EXEMPLO LTDA.",
      "cnpj": "12.345.678/0001-90",
      "periodo": {
        "inicio": "01/01/2025",
        "fim": "31/12/2025"
      }
    },
    "documento": {
      "tipo": "RECIBO_SPED_ECD",
      "numeroRecibo": "ECD-EXEMPLO-000001",
      "hashEscrituracao": "HASH_ANONIMIZADO"
    },
    "transmissao": {
      "dataHora": "30/06/2026 18:42:10",
      "situacao": "RECEBIDA"
    },
    "extras": {}
  },
  "warnings": [],
  "errors": [],
  "requestId": "00000000-0000-4000-8000-000000000100"
}

Critérios mínimos de aceite

  • O novo PDF é identificado corretamente em todas as amostras de homologação.
  • Documentos semelhantes não são classificados como o novo tipo por engano.
  • Campos obrigatórios possuem testes automatizados.
  • Campos ausentes retornam null, sem inventar valores.
  • Datas, valores, CNPJ e competência seguem o padrão já adotado pela API.
  • O Swagger e o Markdown exibem um exemplo anonimizado.
  • O workflow consumidor trata o novo documentType antes da entrada em produção.
Importante: a inclusão no parser e a inclusão no fluxo do n8n são etapas diferentes. A API pode reconhecer e devolver o JSON corretamente, mas o workflow ainda precisa decidir onde salvar o arquivo, quais campos atualizar e quais ações executar.
AUTOMAÇÃO

Integração com n8n

1

Use o node HTTP Request.

2

Método POST e URL https://document.pes2b.com/api/v1/pdf/extract.

3

Adicione o cabeçalho X-API-Key usando uma credencial segura.

4

Ative Send Body, selecione Form-Data e envie o binary no campo file.

5

Quando precisar validar o contexto, envie também expectedCnpj, expectedCompetence, expectedMunicipalityIbge e expectedUf.

6

Para documentos separados, percorra documents, converta file.base64 em binário e utilize role para decidir o destino.

DEC POA como subfluxo reutilizável

Na homologação do grupo P&S2B, o workflow PES2B | Declarações Municipais | Interpretar PDF recebe o PDF em binary.pdf, chama a API com contexto esperado e devolve um item por documento, com o arquivo em binary.file.

Entrada do subfluxo
json.system = "DEC_POA"
json.expected.cnpj = "12345678000190"
json.expected.competence = "2026-07"
json.expected.municipality.ibgeCode = "4314902"
json.expected.municipality.uf = "RS"
binary.pdf = PDF original

Saída com guia
item 1: role = DECLARACAO | binary.file
item 2: role = GUIA       | binary.file
item 3: role = RECIBO     | binary.file

Saída sem guia
item 1: role = DECLARACAO | binary.file
item 2: role = RECIBO     | binary.file
Responsabilidade: a API identifica, valida, interpreta e separa. O fluxo principal decide arquivamento, SharePoint, envio ao cliente, controle operacional e demais regras de negócio.
ENGINE 1.10.0

Arquitetura, testes e observabilidade

A engine foi organizada para crescer por famílias documentais sem concentrar toda a lógica em um único detector ou parser.

Detecção por família

Regras ponderadas identificam o documento, registram regras encontradas e calculam confiança real.

Registry central

Cada parser declara família, versão, status, schema e confiança mínima.

Parser modular

Cada documento possui index.js, parser.js, schema.js e rules.js.

Qualidade automatizada

Fixtures anonimizadas e testes unitários, de contrato e end-to-end protegem os formatos homologados. A homologação DEC POA foi concluída com 101 testes automatizados aprovados.

Logs estruturados

Eventos JSON registram requestId, documento, confiança, parser, duração e motivo de falha.

Métricas operacionais

O endpoint de diagnóstico consolida volume, taxa de sucesso, tempo médio e níveis de confiança.

Validadores de contexto

Comparam dados esperados e extraídos sem acoplar regras de negócio ao parser.

Splitters documentais

Separam fisicamente PDFs compostos e devolvem partes em Base64 com nomes padronizados.

Compatibilidade: o campo público documentType foi preservado. As informações novas foram acrescentadas ao objeto engine, mantendo os workflows existentes do n8n.
AUDITORIA

Rastreabilidade

Registre o requestId retornado pela API. Ele permite localizar a execução nos logs e facilita o diagnóstico de falhas.

Nos workflows do n8n, grave o identificador na lista de logs junto ao nome do arquivo, empresa, competência e tipo documental.
DIAGNÓSTICO

Códigos de erro

HTTPSituaçãoAção recomendada
400Arquivo ausente, inválido ou parâmetros incorretos.Confira o multipart e o campo file.
401API Key ausente ou inválida.Revise o cabeçalho X-API-Key.
413Arquivo excede o limite permitido.Reduza o PDF ou divida o lote.
422Conteúdo não processável.Confirme se o arquivo é PDF válido e legível.
500Falha interna no processamento.Registre o requestId e consulte os logs.
RECURSOS

Downloads

Arquivos oficiais para integração, testes e versionamento técnico.

EVOLUÇÃO

Versionamento

A API pública está na versão 2.0.0 e utiliza rotas /api/v1. A engine documental está na versão 1.10.0. Alterações incompatíveis no contrato público serão publicadas em uma nova versão de rota; melhorias internas compatíveis evoluem a versão da engine.

BOAS PRÁTICAS

Segurança

  • Não exponha a API Key no navegador ou em repositórios.
  • Use HTTPS em todas as chamadas.
  • Evite armazenar PDFs sensíveis fora dos ambientes autorizados.
  • Registre somente os dados necessários para auditoria.
  • Faça rotação da API Key quando houver suspeita de exposição.