Distribuição de documentos pelo ADN (Ambiente de Dados Nacional). As funções são expostas por
Nfse.
O ADN entrega ao contribuinte todo documento fiscal em que o CNPJ dele aparece (notas emitidas,
notas recebidas e eventos como o cancelamento) numa fila numerada por NSU, em lotes de até 50.
GET /contribuintes/DFe/{NSU} devolve os documentos depois do NSU pedido, então o next_nsu de
um lote é o NSU da próxima chamada. Para importar notas, guarde o último next_nsu e continue
dele.
O fim da fila pode chegar como 404 com NENHUM_DOCUMENTO_LOCALIZADO no corpo. Isso é sucesso
(status: :no_documents); um 404 sem esse status é :not_found. O status do processamento vem
do corpo: REJEICAO vira :rejected, com as mensagens de Erros.
Um documento do lote que não se consegue ler não derruba o lote nem trava o NSU: ele volta com
document: nil e o motivo em error (veja Nfse.DistributedDocument). Um item cujo NSU não é
inteiro volta do mesmo jeito, com error em {:invalid_nsu, valor}, e fica fora do next_nsu.
Um lote DOCUMENTOS_LOCALIZADOS sem nenhum NSU inteiro acima do pedido volta como
%Nfse.Error{kind: :unexpected, details: {:stalled_nsu, nsu}}: seguir o next_nsu dele pediria
o mesmo lote para sempre. stream_distribution/3 levanta esse erro como qualquer outro.
As chaves da resposta chegam em PascalCase (medido em produção em 25/10/2026) e a leitura aceita também camelCase.
O que não está confirmado
- a resposta de
GET /contribuintes/NFSe/{chave}/Eventos: o swagger só diz que devolve os eventos da chave, e a biblioteca assume o mesmo formato do lote da distribuição