# `Nfse.Adn`
[🔗](https://github.com/ideia4it/nfse/blob/v0.1.0/lib/nfse/adn.ex#L1)

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

---

*Consult [api-reference.md](api-reference.md) for complete listing*
