Arquitetura — NFS-e Inbound
O NFS-e Inbound captura automaticamente todas as Notas Fiscais de Serviço Eletrônicas (NFS-e) do padrão nacional (Lei Complementar 214/2025) emitidas contra o CNPJ da sua empresa, sem necessidade de consultar cada prefeitura. Este documento descreve o fluxo entre os atores envolvidos, os conceitos da arquitetura e os pontos de falha que sua integração deve tratar.
Para desenvolvedores cliente que estão decidindo como integrar (REST e webhook), entendendo o que esperar do sistema, ou avaliando diferenças em relação ao NF-e/CT-e Inbound da mesma plataforma.
Sumário
- Diagrama
- Atores
- Fluxo passo-a-passo
- Conceitos-chave
- Diferenças em relação a NF-e e CT-e
- Pontos de falha
- Garantias e limitações
Diagrama
Atores
- Prestador de serviço: empresa que presta o serviço e emite a NFS-e. Pode estar em qualquer município integrado ao padrão nacional. Não precisa ser cliente da NFE.io.
- SEFIN Nacional: Secretaria Especial da Fazenda Nacional. Autoriza a NFS-e, atribui a chave de acesso de 50 dígitos e publica o documento no ADN.
- ADN (Ambiente de Distribuição Nacional): sistema central onde todas as NFS-es ficam disponíveis para consulta pelos tomadores autenticados via certificado digital ICP-Brasil.
- NFE.io: faz o polling periódico no ADN em nome do seu CNPJ, baixa os XMLs, extrai metadados, persiste e dispara webhooks.
- Sistema do Tomador (seu sistema): recebe webhooks, consulta documentos via API REST e, opcionalmente, envia manifestações.
O cliente desta API é sempre o tomador do serviço (quem contrata e recebe). Quando você atua como prestador (emitindo NFS-e), use a API de emissão de NFS-e, não esta.
Fluxo passo-a-passo
- Cadastro inicial. Seu sistema ativa o NFS-e Inbound chamando
POST /v2/companies/inbound/nfsecomcompanyId,initialNsu,webhookUrle parâmetros opcionais de manifestação automática. - Polling autônomo. A NFE.io consulta o ADN a cada ~30 segundos usando o certificado digital ICP-Brasil cadastrado para a empresa. Você não precisa expor o certificado — ele fica seguro no servidor.
- Captura por lote. O ADN entrega lotes paginados por NSU (Número Sequencial Único). Cada documento recebe um NSU incremental, garantindo continuidade sem perda.
- Processamento. Para cada documento do lote, a NFE.io classifica o tipo (NFS-e autorizada, DPS, evento, CNC, EventRegistrationRequest), extrai metadados (prestador, tomador, valores, impostos), persiste o XML em blob storage e marca status
Processed. - Notificação. Um webhook HTTP POST é enviado ao endpoint configurado em
webhookUrl. O envelope traz o documento completo em JSON, sem necessidade de consulta adicional à API. - Consulta opcional. Seu sistema pode consultar a qualquer momento via
GET /v2/companies/{companyId}/inbound/nfse(com filtros amplos) ouGET .../inbound/nfse/{id}(detalhe), e baixar XML, PDF ou JSON literal do XML. - Manifestação opcional. Para sinalizar Ciência (
203202) ou Rejeição (203206) ao SEFIN, seu sistema enviaPOST .../by-access-key/{accessKey}/manifestations?eventCode=.... O processamento é assíncrono — o resultado retorna via webhookinbound.manifestation.submitted.
Conceitos-chave
- NSU (Número Sequencial Único): contador incremental do ADN por CNPJ, atribuído a cada documento. Funciona como cursor de paginação — a NFE.io guarda o último NSU processado e busca apenas o que vier depois.
- Chave de acesso (50 dígitos): identifica unicamente cada NFS-e no padrão nacional. Difere da chave NF-e/CT-e (44 dígitos) e do conceito municipal antigo. Usada em consultas idempotentes e em manifestações.
- DPS (Declaração de Prestação de Serviço): XML enviado pelo prestador antes da autorização. Você recebe DPS quando precisar de auditoria do pedido original — documentos com
type=Dpsno payload do webhook indicam essa situação. - NFS-e autorizada: XML após autorização do SEFIN, identificado por
type=serviceInvoiceno payload do webhook. É o documento principal que você consome. - Eventos (
type=Event): ações que modificam ou complementam uma NFS-e — cancelamento (101101), substituição (105102), confirmações por parte (203202tomador,202201prestador,204203intermediário), rejeições e atos de ofício. A lista canônica vem do XSDtiposEventos_v1.01.xsddo padrão nacional — veja Códigos de evento. - Manifestação binária: diferente da NF-e (4 tipos), o endpoint de manifestação da NFS-e padrão nacional aceita apenas os dois códigos do tomador — Confirmação (
203202) e Rejeição (203206). Códigos de prestador (202201) e intermediário (204203) existem no schema como eventos recebíveis, mas não são aceitos por este endpoint. - IBS e CBS: tributos da Reforma Tributária do Consumo (RTC) presentes no payload dentro de
document.taxes.ibsCbs. IBS é repartido entre UF e Município sobre a mesma base; CBS é federal. Para NFS-e pré-RTC sem o grupoIBSCBSno XML, o bloco vemnull.
Diferenças em relação a NF-e e CT-e
A NFE.io também oferece Inbound de NF-e (modelo 55) e CT-e (modelo 57) com arquitetura similar. As diferenças relevantes na decisão de integração:
| Aspecto | NFS-e Inbound | NF-e / CT-e Inbound |
|---|---|---|
| Origem dos documentos | SEFIN Nacional (ADN — federal unificado) | SEFAZ — Ambiente Nacional (estadual federado) |
| Frequência de polling | ~30 segundos | ~3 minutos |
| Chave de acesso | 50 dígitos | 44 dígitos |
| Certificado digital | Não exigido para o cliente (gerenciado pela NFE.io) | Exigido — você sobe certificado A1 da empresa |
| Tipos de manifestação | 2 (Ciência, Rejeição) | 4 (Ciência, Confirmação, Operação Não Realizada, Desconhecimento) |
| Vocabulário do webhook | Dotted: inbound.serviceInvoice.received | Snake legacy: issued_successfully, event_raised_successfully, input_event_raised_successfully |
| Payload tributário | Bloco document.taxes.ibsCbs para RTC | Sem bloco RTC (ICMS, IPI, PIS, COFINS apenas) |
| Paginação em listagem | REST clássico pageIndex / pageCount | OData $top / $skiptoken |
Você pode ativar os três subsistemas independentemente por CNPJ.
Pontos de falha
- ADN indisponível. O SEFIN Nacional pode retornar
429(rate limit) ou5xx. A NFE.io aplica backoff exponencial e exiberateLimitedUntilna empresa. Após 10 falhas consecutivas (MaxConsecutiveFailures=10), o polling entra em circuit breaker e a empresa é desativada. O campodeactivationReasoncarrega um dos quatro valores de certificado/autorização (CertificateExpired,CertificateRejected,CertificateNotFound,CompanyNotAuthorized) quando aplicável. Mitigação: reativar viaPOST .../maintenance/reactivateapós sanar a causa. - Certificado da empresa expirado ou rejeitado. Resulta em
deactivationReason=CertificateExpiredouCertificateRejected. Você é notificado via webhookinbound.company.deactivated. Mitigação: atualizar o certificado no painel e reativar. - Webhook do cliente fora do ar. A NFE.io retenta até 50 vezes em 24 horas com backoff exponencial e jitter de ±20%. Após exaurir, marca
webhookStatus=DefinitivelyFailed. O documento permanece consultável via API e o reenvio manual é feito porPOST .../{id}/resend-webhook. - Documento com XML corrompido na origem. Sinalizado via webhook
inbound.document.failed. O XML não fica armazenado. Casos recorrentes devem ser reportados ao suporte da NFE.io.
Garantias e limitações
- Sem perda de documentos: a paginação por NSU garante que toda NFS-e destinada ao CNPJ é capturada em ordem crescente. Falhas pontuais são recuperadas pelo reprocessamento do mesmo NSU.
- Idempotência: o par
(companyId, nsu)é único na base. Webhooks reentregues após falha temporária podem ser deduplicados por NSU ou pelodocument.id. - Histórico amplo: documentos ficam disponíveis no ADN desde a entrada em produção do padrão nacional. Configure
initialNsubaixo para sincronizar histórico completo na primeira ativação. - Captura não é manifestação: capturar a NFS-e não envia Ciência automaticamente. Você precisa habilitar
isAutomaticManifestationEnabledna empresa ou disparar manualmente via API/console. - Limites de paginação:
pageCount ≤ 100em listagens. Consultas comhasTotals=truesão mais lentas (envolvemcountno banco). Não cacheie URLs assinadas — elas expiram em 30 minutos. - CT-e ainda não tem bulk export. XML, PDF e CSV em massa estão disponíveis para NF-e e NFS-e via
shared-usage-api. CT-e está no roadmap.