Developers / Tratamento de Erros
Tratamento de Erros

Códigos HTTP

Toda emissão é síncrona: o POST já calcula os tributos, assina e transmite para a SEFAZ (ou provedor de NFS-e) na mesma chamada. Isso muda o que "erro" significa aqui -- e é o primeiro ponto de confusão de quem vem de uma API assíncrona.

⚠️
O código HTTP não diz se o documento foi autorizado. Ele diz só se a sua requisição foi bem-formada e autorizada. Uma rejeição da SEFAZ, um erro do provedor de NFS-e, ou uma falha do motor fiscal ainda voltam como 200 OK -- o resultado real está no campo status do corpo da resposta (AUTHORIZED / REJECTED / ERROR / PROCESSING). Trate status, não o código HTTP, como a fonte de verdade do que aconteceu com o documento.

Tabela de códigos

CódigoQuando acontece
200 Requisição processada -- inclui o caso de sucesso (AUTHORIZED) e também rejeição SEFAZ/provedor ou erro interno do motor (REJECTED/ERROR). Veja o campo status no corpo pra saber qual dos dois.
400 Corpo da requisição malformado (JSON inválido) ou campo obrigatório ausente/ inválido antes mesmo de chegar no motor fiscal -- ex.: falta emitente_documento, motivo de cancelamento com menos de 15 caracteres, chave_acesso ausente num encerramento de MDF-e.
401 Bearer token ausente, inválido, expirado ou revogado.
403 Seu contrato não tem o produto contratado (NF-e/CT-e/MDF-e/NFS-e), ou o contribuinte informado (emitente/prestador) não está ativo nesse contrato.
404 Transmissão, sessão ou documento não encontrado para o seu contrato -- inclui consultar um transmissao_id que não existe ou não é seu.
409 Conflito de estado -- ex.: contribuinte sem certificado digital A1 ativo, tentar cancelar um documento que ainda não foi autorizado, sessão de emissão conjunta já num estado terminal.
410 Link de sessão de Emissão Conjunta expirado.
500 Falha interna não tratada -- raro, fora do caminho normal de emissão.
💡
422 e 429 não são usados hoje nesta API: não há rate limiting por contrato (ver Limites da API), e validação de payload que falha vira 400, não 422.

Formato do corpo de erro

Para erros de pré-validação (400/401/403/ 404/409/410), o corpo é sempre {"detail": "<mensagem>"} -- um texto simples, sem código estruturado.

HTTP/1.1 409 Conflict
Content-Type: application/json

{
  "detail": "Contribuinte sem certificado digital A1 ativo."
}

Já numa resposta 200 de uma emissão que foi rejeitada ou falhou, o corpo é mais rico -- veja Erros da API pro formato completo do campo retorno_amigavel e Rejeições SEFAZ pro que vem dentro de detalhes.