Erros

HTTP, status da nota, cStat frequentes e tratamento.

Duas camadas. HTTP (antes da SEFAZ): campo error no JSON — o NFER barra payload inválido. SEFAZ (depois do /send): erro_cstat / erro_motivo na nota. Corrija o campo do body com PUT /v1/nfe/:id e chame /send de novo — mesmo número.

Formato HTTPjson
{
  "error": "VALIDATION_ERROR",
  "message": "Invalid request body",
  "details": {}
}

Códigos da API (`error`)

HTTPerrorQuando
400VALIDATION_ERRORPayload ou regra de negócio inválida
401UNAUTHORIZEDAPI Key ausente ou inválida
403FORBIDDENSem permissão
404NOT_FOUNDRecurso inexistente (ex.: certificado não cadastrado)
409CONFLICTCNPJ/número duplicado ou estado inconsistente
429TOO_MANY_REQUESTSRate limit — corpo traz retryAfter (segundos)
500CERTIFICATE_ERRORPFX inválido, senha errada ou certificado expirado
502SEFAZ_ERRORFalha SEFAZ em fluxo síncrono

Status da NF-e

statusSignificado
rascunhoCriada, ainda não enviada
processandoNa fila / worker em execução
autorizadaAutorizada (cStat 100)
denegadaDenegada pela SEFAZ
erroFalha / rejeição — pode reenviar
canceladaCancelada
inutilizadaFaixa de numeração inutilizada

Quando status = erro

Leia erro_cstat e erro_motivo no GET /v1/nfe/:id (ou erroCstat / erroMotivo no webhook nfe.erro). Exiba no ERP sem depender de chave de acesso. Os códigos são os oficiais da SEFAZ (cStat), não prefixos NFER.

Retransmitir nota com erro

Não existe /retransmitir. Corrija com PUT /v1/nfe/:id (mesmo body de POST /v1/nfe) e envie de novo com POST /v1/nfe/:id/send — mesmo id, mesmo número. Vale para erro e rascunho.

PerguntaResposta
Gera outro número?Não. Reusa numero + serie já gravados na nota.
Cria outra nota?Não. Mesmo id. Duplicate é outro endpoint e pega o próximo número.
O que corrigir antes?PUT /v1/nfe/:id com o body corrigido (NCM, CFOP, destinatário…). Não é PATCH.
cStat 656 (Consumo indevido)Não martelar /send. Espere ~1h, Consultar SEFAZ, só então um send.
denegadaNão retransmitir igual — é bloqueio fiscal (IE/CNPJ).
  1. Ver o motivo da rejeição

    GET notabash
    curl -s "$BASE/v1/nfe/$NFE_ID" -H "X-API-Key: $NFER_KEY" \
      | jq '{status, numero, serie, erro_cstat, erro_motivo}'
  2. Corrigir os dados

    No ERP, no painel, ou via PUT /v1/nfe/:id — NCM, CFOP, destinatário, etc., conforme erro_motivo. Mesmo body de POST /v1/nfe (substituição completa). Só rascunho / erro, modelo 55. Não crie outra nota.

    PUT nota (ex.: NCM)bash
    curl -s -X PUT "$BASE/v1/nfe/$NFE_ID" \
      -H "X-API-Key: $NFER_KEY" \
      -H "Content-Type: application/json" \
      -d '{ /* mesmo payload do POST, com ncm/cfop corrigidos */ }'
  3. Enviar de novo (mesmo número)

    Resposta 202. Mesmo id, mesmo numero/serie.

    POST sendbash
    curl -s -X POST "$BASE/v1/nfe/$NFE_ID/send" -H "X-API-Key: $NFER_KEY"

No painel: lista → botão Retransmitir (quando status = erro) ou menu ⋯ → Retransmitir para SEFAZ. Prefira Consultar SEFAZ antes se a última mensagem foi consumo indevido.

Rejeições SEFAZ (`cStat`)

Recorte para o ERP — não é o catálogo completo. A coluna Campo é o JSON do POST /v1/nfe (ou equivalente no cadastro). Em 108 / 109 / 584 o NFER tenta SVC sozinho (NF-e 55) — ver Conceitos.

Como usar esta tabela

Webhook nfe.erro ou GET /v1/nfe/:id → leia erro_cstat → ache a linha → corrija o campo → PUT + /send no mesmo id. Não crie outra nota.
cStatSignificadoCampoO que fazer
100AutorizadaSucesso. Use chaveAcesso do webhook/GET.
108 / 109 / 584SEFAZ paralisada / instávelNFER tenta SVC (NF-e 55). Se ainda falhar, aguarde e /send de novo.
203Emissor não habilitado na UFempresa / A1Credenciar o software na SEFAZ da UF (ex.: Receita/PR). Comum em produção nova.
204 / 301 / 302 / 110Uso denegadoCNPJ / IEstatus=denegada. Regularizar na Receita. Não reenviar o mesmo payload.
206 / 539Duplicidade (chave ou número)numero / serieConsultar a nota existente ou alinhar a sequência (migração de emissor).
209IE do emitente inválidaempresa.ieCorrigir IE em Configurações → Dados Jurídicos.
213Certificado ≠ CNPJ emitenteA1Upload do .pfx do mesmo CNPJ-base da empresa que emite.
210 / 232IE do destinatário inválida ou ausentecustomer.ieContribuinte: IE válida. Sem IE: omitir (não contribuinte) ou "ISENTO". PUT e /send.
225Falha no schema XMLitens[].descricao, endereco, cMunDescrição preenchida, cMun 7 dígitos, endereço ≥ 2 chars. Muitos casos o NFER já barra com HTTP 400.
228dhEmi muito atrasada— (data da emissão)Não atrasar o /send depois de criar o rascunho. A janela varia por UF (poucos dias).
252Ambiente divergeempresa.environmentHomologação vs produção. PUT /v1/companies/:id com o environment certo.
274 / 275cMun dest. inexistente ou de outra UFcustomer.endereco.cMunIBGE 7 dígitos da mesma UF. Prefira UF+xMun ou CEP — o NFER resolve. PUT e /send.
778NCM inexistenteitens[].ncm8 dígitos vigentes na TIPI. PUT com o NCM certo e /send. Atualize o cadastro do produto.
590 / 591CST vs CSOSN vs CRTitens[].impostos / fiscalProfileIdSimples (CRT=1) = CSOSN. Regime normal (CRT=3) = CST. Ajuste o perfil ou impostos[] no PUT.
610Total da NF ≠ soma dos itensitens[] + valorFrete + pagamentos[]vNF = produtos − descontos + frete. Conferir no PUT.
611GTIN / cEAN inválidoitens[].eanOmita ean (SEM GTIN) ou envie um GTIN válido.
732 / 733CFOP vs UF destinoitens[].cfop / fiscalProfileIdMesma UF: 5xxx. Outra UF: 6xxx. Com perfil o NFER escolhe o CFOP.
806ICMS-ST sem CESTproduto / item CESTItem com ST precisa de CEST CONFAZ daquele NCM. PUT e /send.
865Pagamentos < totalpagamentos[].valorSoma = produtos − descontos + frete. O NFER costuma barrar no HTTP 400.
696Não contribuinte sem consumidor finalindFinal + customer.ieDest. sem IE exige indFinal=1. O NFER normaliza; envie 1 quando for consumidor final.
321 / 1048 / 1102Devolução sem ref. por itemitens[].nfeReferenciadachaveAcesso (44) + nItem = det/@nItem do XML original.
1010Ref. na raiz e no item juntosnfeReferenciadaEm devolução use só referência por item — sem NFref na raiz.
1072chave+nItem duplicadositens[].nfeReferenciadaNão repetir o mesmo par chaveAcesso/nItem em dois itens.
1020–1024 / 1104–1119IBS/CBS (RTC)itens[].impostos (RTC)CST/cClassTrib conforme NT vigente. Ver Conceitos.
391Dados de cartão/pagamentopagamentos[].formaForma coerente (ex. 03/04 cartão). Conferir indPres.
434 / 435Indicador de intermediadorindPresNão presencial (2/3/9): o NFER envia indIntermed=0 no XML (evita 434). Presencial: não manda intermediador.
656Consumo indevidoBloqueio ~1h por envios/consultas repetidos. Não martelar /send. Consultar SEFAZ, esperar, um send.
694cBenef obrigatório (PR/RS)item / perfil (cBenef)Código de benefício quando o CST/UF exigir.
703dhEmi no futuroRelógio do servidor. O NFER usa horário de Brasília no XML.
713tpEmis incompatível com SVCO fallback SVC do NFER já ajusta tpEmis 6 ou 7.
724Sem nome do destinatáriocustomer.nomeInformar nome (exceto NFC-e sem destinatário, quando permitido).
978hashCSRT divergeRESP_TEC (NFER)CSRT do software house no backend. Comum no PR — não vai no payload do ERP.

Catálogo oficial: Portal Nacional da NF-e — erros de validação. Um guia por código no blog NFER virá depois; esta tabela é o atalho do integrador.

Tratamento recomendado

CasoAção
429Aguarde retryAfter e reenvie
400 / validaçãoCorrija o payload — não reenvie igual
status=erro (SEFAZ)Leia erro_cstat; a tabela aponta o campo do JSON; PUT + /send no mesmo id
status=denegadaBloqueio fiscal — não reenviar igual; regularizar IE/CNPJ
CERTIFICATE_ERROR / cert 404Envie certificado A1 válido no painel
500 / timeout SEFAZBackoff (3s, 9s, 27s); o job já tem retry interno
processando longoWebhook ou poll 3–5s; não crie outra nota