Pular para o conteúdo

Códigos de status interno

A API do FazNota adota uma convenção de canal único de status: enquanto a aplicação processar a requisição (passar autenticação e parser), a resposta é sempre HTTP 200, e o resultado real fica em body.status (3 dígitos, 001–999).

Esse código distingue sucesso, pendência, erro de validação, rejeição da SEFAZ e erros internos. Apenas falhas estruturais (auth, rate limit, URL errada) retornam HTTP ≠ 200 — veja Estrutura de resposta para o detalhe.


Tabela completa

CódigoSignificadoQuando aparece
001Registrado. A operação foi recebida e está na fila para processamento.Resposta imediata de qualquer emissão/cancelamento/CC-e.
002Pendente de processamento. Na fila, ainda não começou.Polling do recibo logo após emissão.
003Em processo de emissão. Está sendo processada agora.Polling enquanto SEFAZ ainda não respondeu.
004Documento emitido. Status terminal de sucesso.Polling após autorização SEFAZ — data.sefaz.codigo 100, 120 (com alerta) ou 150 (fora de prazo). Veja Autorizada com alerta.
005Consulta realizada. Status para endpoints GET de listagem/busca.Listagens, buscas por documento/nome/referência.
010Documento cancelado. Status terminal após cancelamento.Polling após processamento de cancelamento.
050Duplicidade de numero-origem. A operação não criou nova nota; retorna o recibo da emissão original.Emissão com numero-origem já usado. Veja Idempotência.
500Recibo não existe. O recibo informado não está na base.GET /<recurso>/<recibo> com recibo inválido.
900Rejeição definitiva da SEFAZ — corrija o dado apontado em sefaz.mensagem e emita nova nota. (O processamento aparece como 003, não 900. Salvaguarda: se vier 900 com sefaz.codigo 217/105, é transitório — trate como pendente. Veja SEFAZ lenta ou instável.)Polling após SEFAZ recusar a nota (CST inválido, NCM errado, etc.).
999Erro interno. Erro de validação do payload OU erro inesperado. Veja data.erro.Imediatamente após qualquer requisição com erro.

Autorizada com alerta (cStat 120)

A partir de 05/10/2026 (NT 2026.002, “Autorização de Uso com Alerta”) a SEFAZ passa a devolver um terceiro código de autorização, 120 — “Autorizado o uso da NF-e, com alerta”. De início vale só para a NFC-e (modelo 65); a NF-e (55) pode adotar depois, e a API já trata os dois do mesmo jeito.

data.sefaz.codigodata.sefaz.mensagem (texto da SEFAZ)status
100Autorizado o uso da NF-e004
120Autorizado o uso da NF-e, com alerta004
150Autorizado o uso da NF-e, autorização fora de prazo004

Hoje a API não devolve o código e o texto de cada alerta em campo próprio: data.sefaz.mensagem traz o motivo geral da SEFAZ (o xMotivo). Os alertas vêm no protocolo de autorização (protNFe/infProt, pares cMsg/xMsg, até 5).

Códigos por tipo de operação

Emissão (POST)

Imediatamente após enviar uma emissão (NFe, NFCe, NFSe):

CódigoCenário
001OK, processando. Comece o polling.
050numero-origem duplicado; use o recibo retornado.
999Erro de validação (veja data.erro).

Consulta de recibo (GET)

Durante o polling do recibo:

CódigoCenárioAção
001Acabou de ser registrada.Aguarde, consulte novamente.
002Pendente.Aguarde, consulte novamente.
003Emitindo.Aguarde, consulte novamente.
004Emitida ✅Pegue data.sefaz.url-danfe e data.sefaz.url-xml. Vale para sefaz.codigo 100, 120 (autorizada com alerta) e 150.
010CanceladaNão emita de novo.
500Recibo inválido.Verifique se o recibo foi salvo corretamente.
900Rejeitada SEFAZ (definitiva)Corrija o dado indicado em data.sefaz.mensagem e emita nova nota. (O processamento em andamento aparece como 003, não 900. Salvaguarda: se vier 900 com data.sefaz.codigo 217/105, aguarde e consulte de novo, não reemita — veja SEFAZ lenta ou instável.)
999Erro interno.Cite meta.request_id no suporte.

Listagem (GET)

CódigoCenário
005OK. data traz a lista.
999Erro interno.

Cancelamento / Carta de correção (POST)

Imediatamente após enviar:

CódigoCenário
001OK, processando. Comece o polling em GET /<recurso>/cancelamento/{recibo} ou GET /<recurso>/correcao/{recibo}.
999Erro de validação.

Padrão para clientes

const TERMINAIS_SUCESSO = ['004', '010'];
const TERMINAIS_FALHA = ['500', '999']; // "900" tratado à parte — veja abaixo
const PENDENTES = ['001', '002', '003'];
const SEFAZ_CODIGO_TRANSITORIO = ['217', '105']; // SEFAZ lenta: não é rejeição definitiva
function classificar(json: { status: string; data?: { sefaz?: { codigo?: string } } }): 'sucesso' | 'falha' | 'pendente' {
const { status, data } = json;
if (status === '900') {
const codigoSefaz = data?.sefaz?.codigo;
// SEFAZ lenta/instável: ainda não é definitivo, continue consultando o mesmo recibo
if (codigoSefaz && SEFAZ_CODIGO_TRANSITORIO.includes(codigoSefaz)) return 'pendente';
return 'falha'; // rejeição real — corrija o dado e emita nova nota
}
if (TERMINAIS_SUCESSO.includes(status)) return 'sucesso';
if (TERMINAIS_FALHA.includes(status)) return 'falha';
if (PENDENTES.includes(status)) return 'pendente';
if (status === '050') return 'sucesso'; // duplicidade é retorno controlado
if (status === '005') return 'sucesso'; // consulta OK
return 'falha';
}