Documentação / Erros e rejeições v1
API REST fiscal

Entenda validações, falhas operacionais e rejeições da SEFAZ com mensagens mais humanas.

Esta documentação descreve a versão pública atual da API fiscal da Contora, com base compartilhada de empresas, certificados, chaves, filas, webhooks e artefatos para NF-e, NFC-e, NFS-e, CT-e e MDF-e. NF-e, NFC-e e NFS-e operam em produção regular; CT-e e MDF-e em produção assistida e controlada.

Atualizado em .

Erros e rejeições

A API separa erros de validação, erros operacionais e rejeições fiscais. Quando a SEFAZ devolve uma rejeição conhecida, a camada de tradução tenta devolver uma mensagem mais humana para acelerar o suporte.

{
  "ok": false,
  "message": "Rejeição SEFAZ 533",
  "error": {
    "type": "sefaz_rejection",
    "details": {
      "status": "533",
      "reason": "Total da BC ICMS-ST difere do somatório dos itens",
      "hint": "Revise a base de cálculo ST item a item e o totalizador final da nota."
    }
  }
}

Tipos de erro da v1

authentication_error
Token ausente, inválido ou inativo.
validation_error
Payload inválido, parâmetro fora do enum ou campo obrigatório ausente.
business_rule_error
Regra operacional não atendida, como redelivery indevido ou documento em estado incompatível.
not_found
Empresa, documento ou endpoint não encontrado dentro do escopo do token.
internal_error
Falha inesperada no backend.
rate_limit_exceeded
A conta atingiu o teto de proteção contra rajada anormal (HTTP 429). Não é limite de plano. Respeite Retry-After e reenvie com backoff.
environment_mismatch
A chave pertence a homologação e a empresa/documento pertence a produção, ou vice-versa (HTTP 403). Para emitir homologação em uma empresa de produção com a mesma chave, habilite allows_homologation na empresa (veja Empresas).
subscription_overdue
A assinatura está vencida, suspensa ou cancelada para operações de escrita (HTTP 402).
quota_exceeded
O limite mensal do recurso foi atingido, como eventos fiscais, consultas CEP ou consultas CNPJ (HTTP 402).
plan_upgrade_required
O recurso solicitado não possui franquia no plano atual e exige troca de plano (HTTP 402).

Erros de payload e cadastro (antes de chegar à SEFAZ)

São a maior parte das falhas reais de integração. A nota nem chega a ser transmitida: a validação acontece no /build, devolve 422 com validation_error e não consome numeração nem gera risco de duplicidade. O rascunho continua lá para ser corrigido e reenviado.

Cadastro da empresa emissora

Mensagem
Causa provável & Dica de Resolução
A empresa emissora esta sem <campo> configurado.
Falta um dado obrigatório no cadastro da empresa — não no payload da nota. Os campos exigidos são legal_name, document, state_code, city_code, street, district, city_name e postal_code. Resolução: complete o cadastro em PATCH /v1/companies/{company} e reenvie o mesmo rascunho. O número do endereço fica fora da lista de propósito: endereço rural sem número é válido e vira S/N automaticamente.
O CNAE fiscal do emitente só vai na NF-e junto com a Inscrição Municipal.
O grupo do CNAE no XML só é aceito acompanhado da IM. Resolução: cadastre municipal_registration na empresa, ou remova o CNAE do cadastro se a empresa não tem inscrição municipal.

Documento

Mensagem
Causa provável & Dica de Resolução
Informe number no documento com valor maior que zero.
O número da nota não foi informado, veio zero ou veio como texto vazio. Resolução: informe number. Se você enviar número ou série no topo e dentro do payload, os dois valores precisam ser idênticos — a API não escolhe um deles em silêncio.
Informe nature_operation no payload.
Falta a natureza da operação (texto livre, ex.: Venda de mercadorias). Resolução: preencha nature_operation; é campo obrigatório do XML, não um rótulo interno.
Payload precisa ter ao menos um item.
items ausente ou vazio. Resolução: envie ao menos um item; nota sem item não existe no leiaute.
A soma de payments e menor que o valor total da NF-e.
Os pagamentos não cobrem o total do documento. Resolução: o excedente só vira troco quando houver pagamento em dinheiro (method: "01") que o cubra — caso contrário é erro de preenchimento, e a SEFAZ devolveria a Rejeição 869. Com billing (fatura/duplicata) a soma tem de bater exatamente.
payments[].number não existe.
Campo inventado no grupo de pagamento. Resolução: os campos aceitos são method, indicator, amount, description, paid_at, processed_document e card. A mensagem lista os válidos no próprio retorno.
O meio de pagamento 17 (PIX) exige o grupo payments[].card.
PIX e cartão compartilham o mesmo grupo no leiaute. Resolução: envie payments[].card com os dados da transação. A API bloqueia antes de transmitir justamente para evitar a Rejeição 391.

Itens

Mensagem
Causa provável & Dica de Resolução
Item N precisa de name, ncm e cfop.
Item sem os três campos que identificam a mercadoria. Resolução: preencha os três. O ncm precisa existir na tabela vigente, senão a SEFAZ devolve a Rejeição 778.
Item N precisa de quantity. / Item N precisa de unit_price.
Campo ausente, nulo ou vazio. Resolução: use exatamente quantity e unit_price. unit_value, valor_unitario, price e qtd não são aceitos como apelido — o preço unitário decide a base de cálculo, e adivinhar o campo seria adivinhar imposto.
Item N precisa de taxes.icms.code (CSOSN).
Empresa do Simples Nacional sem o CSOSN do item. Resolução: informe taxes.icms.code com o CSOSN (ex.: 102, 500). Empresa do regime normal usa CST, não CSOSN — o campo é o mesmo, o domínio muda com o regime.
Item N precisa de quantity > 0 e unit_price >= 0.
Quantidade zero ou negativa. Resolução: quantidade zero só é aceita na nota complementar (purpose: 2) e na nota de ajuste (purpose: 3), onde o complemento pode ser só de imposto. Numa venda, é quase sempre defeito da integração.

Mensagem que não parece uma validação? Retornos como Undefined array key "..." ou Return value must be of type DOMElement, null returned não são regra fiscal: são falha interna nossa, e o certo é a API ter devolvido uma mensagem dizendo qual campo faltou. Se aparecer, abra chamado com o public_id do documento — tratamos como defeito, não como configuração do seu payload.

Rejeições SEFAZ comuns e como resolver

🔍 Procurando por um código específico de rejeição?

Consulte nosso Dicionário Interativo de Rejeições SEFAZ & NFS-e Nacional com buscador instantâneo de códigos (865, 869, 778, 539, 204, 610, 388, 805, 972, X800, E0116, E0084) e payloads JSON prontos para autocorreção.

Muitas vezes, a API retorna com sucesso técnico, mas o processamento na SEFAZ resulta em uma rejeição regulatória. Abaixo listamos as rejeições mais recorrentes e como seu sistema deve tratá-las:

Código
Rejeição SEFAZ
Causa provável & Dica de Resolução
204
Duplicidade de NF-e
Você enviou uma nota com número/série idênticos a uma nota que já existe na base da SEFAZ. Resolução: incremente o número da nota (campo numero) ou consulte o rascunho anterior para obter o XML da nota homologada.
215
Falha no Schema XML
A estrutura gerada possui campos obrigatórios ausentes, formatos inválidos ou caracteres proibidos. Resolução: revise erros de validação exibidos no campo error.details.
539
Duplicidade com chave diferente
O número da nota já foi emitido, mas os dados da nota atual (como destinatário ou valores) diferem da nota original. Resolução: altere o número da nota para a sequência seguinte. Reenviar o mesmo número/série que a própria plataforma já autorizou antes não chega mais a dar esse erro: o dispatch com action: authorize confere isso localmente antes de falar com a SEFAZ e devolve o documento já autorizado na hora (HTTP 200, sem nova tentativa) — veja Resiliência e Idempotência.
704
Data-hora de emissão atrasada
A data/hora de emissão informada no payload diverge do relógio oficial da SEFAZ (frequentemente por fuso horário incorreto). Resolução: certifique-se de enviar a data em formato ISO 8601 com o offset do fuso brasileiro (ex: -03:00).
209, 230, 231, 554
Inscrição Estadual do emitente
Família de rejeições do cadastro estadual: IE inválida (209), não cadastrada na UF (230), não vinculada ao CNPJ (231) ou declarada como ISENTO indevidamente (554). Resolução: confira state_registration no cadastro da empresa contra o Sintegra/Cadastro de Contribuintes da UF. Não reenvie o mesmo payload: nenhuma dessas se resolve por retentativa, e a API bloqueia o reprocessamento delas de propósito.
732
CFOP interestadual com destino interno
Espelho da 733: o CFOP é de operação interestadual (série 6000), mas o destinatário está na mesma UF do emitente. Resolução: use CFOP da série 5000 para operação dentro da UF e 6000 para fora. A API deriva o idDest da UF do destinatário — o que precisa mudar é o CFOP do item.
275
Município do destinatário difere da UF
O código IBGE do município não pertence à UF informada. Resolução: o código tem 7 dígitos e os dois primeiros são o código da UF (ex.: 35 = SP, 33 = RJ). Confira recipient.address.city_code contra recipient.address.state_code.
321
Devolução sem documento referenciado
Nota de devolução (purpose: 4) precisa apontar a nota de origem. Resolução: informe a chave em referenced_documents. Quando a mensagem traz [nItem: N], a UF exige a referência por item, não só no cabeçalho — cada item devolvido carrega a chave da nota original.
778
NCM inexistente
O NCM do item não consta na tabela vigente na data de emissão. Resolução: a tabela muda periodicamente e códigos são extintos; confira o NCM atual do produto. [nItem:N] indica qual item está errado.
869
Valor do troco incorreto
O troco calculado não bate com a diferença entre pagamentos e total. Resolução: troco só existe com pagamento em dinheiro (method: "01") que cubra o excedente. Pagamento eletrônico acima do total não é troco — é erro de preenchimento. A API já bloqueia a maioria desses casos antes de transmitir.
486
Grupo de autorização ausente (BA e outras UF)
A UF exige a identificação do escritório de contabilidade autorizado a baixar o XML. Resolução: informe aut_xml com o CNPJ/CPF autorizado. Não havendo escritório, a própria SEFAZ da Bahia orienta usar o CNPJ 13.937.073/0001-56. A API já aplica um padrão por UF quando o campo vem vazio.
1026, 1115
IBS/CBS da reforma tributária
Grupo do IBS/CBS ausente (1115) ou com alíquota inválida para a UF (1026). Resolução: informe taxes.ibscbs no item, com cst de 3 dígitos e a classificação correspondente. As regras valem por data de competência — um payload que passava no mês anterior pode ser recusado depois da virada de vigência.
733
CFOP incompatível com o destino da operação
O CFOP indica operação interna, mas o destinatário está em outra UF (ou o inverso). Resolução: confira a UF da empresa emissora e do destinatário e use o CFOP correspondente à operação; não reenvie o mesmo rascunho sem corrigir o dado fiscal.

Rejeições do Sistema Nacional da NFS-e

A NFS-e pelo padrão nacional tem códigos próprios, no formato E0nnn, devolvidos pelo Sefin Nacional e não pela SEFAZ. Os mais recorrentes na integração:

Código
Rejeição
Causa provável & Dica de Resolução
E138
CNPJ não autorizado a usar o webservice do município
Apesar do texto ("não autorizado a realizar o serviço"), a recusa não é sobre o serviço prestado: a consulta de NFS-e por período, que não carrega código de serviço algum, recebe o mesmo E138. Resolução: o contribuinte precisa solicitar à prefeitura a liberação de acesso ao webservice de NFS-e para o CNPJ. Estar com o cadastro municipal ativo não concede esse acesso — no padrão Tinus ele é um pedido separado. Nenhuma alteração no payload contorna.
E50, E141
Inscrição municipal do prestador inválida ou ausente
O provedor municipal valida o formato da inscrição municipal antes de qualquer regra de negócio. Resolução: grave settings.municipal_registration como string, preservando os zeros à esquerda — em Currais Novos são 7 dígitos (0070483, não 70483), e o cadastro costuma exibi-la sem eles. E141 é a inscrição não informada.
E0039
Município não aderiu aos emissores públicos nacionais
Não é o payload nem o cadastro: o município não está parametrizado para emitir pelo padrão nacional, e nenhuma alteração no documento contorna isso. Resolução: a emissão desse município sai pelo layout do provedor municipal — fale com o suporte para habilitá-lo, e não reenvie a mesma nota pelo padrão nacional. Tentar em homologação também não resolve: o município que não aderiu costuma não ter convênio ativo nem na produção restrita. Quem responde é a parametrização do próprio município no Sistema Nacional, no campo aderenteEmissorNacional; aderenteAmbienteNacional em 1 diz apenas que ele recebe as notas, não que emite.
E0310
Código de tributação nacional inexistente
O service.national_tax_code tem 6 dígitos, mas não consta na lista nacional de serviços. Resolução: o código nacional não é o municipal sem os pontos — 14.01 corresponde a 140101, não a 140100. Use o código da lista nacional, com item, subitem e desdobramento.
E0312
Código não administrado pelo município
A combinação dos códigos nacional e municipal não está parametrizada para o emitente. Resolução: no Rio de Janeiro, prestadores não-MEI devem informar service.municipal_tax_code com 3 dígitos ou configurar settings.nfse_municipal_tax_code_default. Confirme o código municipal correto; ele não pode ser deduzido do nacional.
E0160
Situação no Simples Nacional divergente do cadastro
A situação declarada no documento não corresponde ao cadastro do Simples Nacional na competência. Resolução: confira o regime tributário da empresa (mei declara Optante MEI, simples declara Optante ME/EPP, os demais Não Optante) ou fixe a situação em settings.nfse_simples_nacional_option com 1, 2 ou 3.
E0712
Indicador de total de tributos indevido para ME/EPP
O prestador ME/EPP declara o percentual total de tributos do Simples Nacional, não o indicador. Resolução: informe service.total_tax_rate_sn no payload ou settings.nfse_total_tax_rate_sn no cadastro. Não é a alíquota de ISS: é a carga total da faixa do Simples na competência.
E0713
Grupo de tributos incompatível com prestador não optante
O documento declarou o indicador ou o percentual exclusivo do Simples para um prestador não optante. Resolução: informe service.approximate_tax_percentages com federal, state e municipal, de 0 a 100 e com ao menos um valor positivo. A plataforma gera o grupo pTotTrib e bloqueia a inconsistência antes do provedor.
E0120
Inscrição municipal não deve ser informada
O município não tem informações complementares registradas no CNC NFS-e para esta empresa neste ambiente, e nesse caso a inscrição municipal não entra no documento. Resolução: configure settings.nfse_municipal_registration_in_cnc = false no cadastro da empresa — ou, se a rejeição vier só de produção, settings.nfse_municipal_registration_in_cnc_producao = false, que preserva a homologação. O CNC é carregado por ambiente pelo município, e é comum o registro existir na produção restrita antes de existir em produção.
E0116
Prestador não encontrado no cadastro municipal do CNC
O Sistema Nacional não encontrou a combinação exata de município emissor, CNPJ/CPF e inscrição municipal. Resolução: consulte o CNC e grave settings.municipal_registration como string exatamente igual ao cadastro, preservando zeros à esquerda. A presença da tag de IM, sozinha, não garante a correspondência.
E0121
Dados do prestador informados na emissão própria
Quando o próprio prestador emite a DPS (tpEmit=1), o Sistema Nacional recupera nome e endereço do cadastro fiscal e não aceita que sejam enviados no documento. Resolução: não acrescente um bloco de emitente/prestador ao payload; a plataforma usa o cadastro da empresa e omite automaticamente os campos vedados.
E0188, E0206, E0207
Documento do tomador inválido ou não encontrado
CNPJ inválido (E0188), CPF inválido (E0206) ou CPF não encontrado no cadastro da Receita (E0207). Resolução: valide taker.document antes do envio.

Rejeições de NFS-e com leiaute municipal próprio

Alguns municípios não usam o padrão nacional e mantêm webservice e códigos próprios. Aqui a origem da rejeição é a prefeitura, não o Sefin Nacional — e cada uma tem vocabulário diferente para a mesma ideia.

Código
Rejeição
Causa provável & Dica de Resolução
E163
CTISS ausente ou inválido (Salvador)
Salvador exige o CTISS de 7 dígitos, que não é o item da lista de serviço. Resolução: informe service.municipal_tax_code com o CTISS completo (ex.: 1401001, do código 1401-0/01). O item no formato 14.01 ou 1401 não substitui esse campo. Salvador também exige service.nbs_code, com 9 dígitos.
E164
Data do RPS fora da janela (Salvador)
A data de emissão do RPS está fora do prazo de conversão que o município aceita. Resolução: reenvie com a data da prestação dentro do prazo. Não adianta retentar o mesmo RPS: a janela não volta a abrir.
260
CEP do tomador inválido
O município valida o CEP do tomador contra a base dos Correios. Resolução: envie taker.address.postal_code com 8 dígitos, só números, e confira se o CEP existe. CEP genérico de cidade costuma ser recusado.
P122
Retenção de ISS não permitida
O serviço se enquadra numa regra municipal que veda a retenção declarada. Resolução: remova service.iss_withheld (ou defina como false) para esse enquadramento. A regra citada na mensagem — no caso, a IN 8/2013 — indica qual dispositivo municipal bloqueou.
X800
Valor fora do padrão do schema
Erro de formato detectado no XSD antes de qualquer regra fiscal. A mensagem mostra o campo e o padrão esperado. Resolução: os dois casos mais comuns são cTribNac exigindo [0-9]{6} — 01.05 é recusado, o correto é 010500 sem pontuação — e cTribMun exigindo [0-9]{3}, onde 0104 tem um dígito a mais. Envie só dígitos, no comprimento exato.
X999
Erro de conexão com a prefeitura
Falha de comunicação com o webservice municipal — não é problema no seu payload. Resolução: nenhuma ação de integração. A plataforma reprocessa sozinha em janela crescente, e a nota volta a ser transmitida quando a prefeitura responder. Reenviar por conta própria só multiplica o risco de duplicidade.

Quando reenviar e quando não reenviar

A pergunta mais cara do suporte é sempre a mesma. O critério é a natureza da falha, não a pressa:

Situação
O que fazer
Indisponibilidade da SEFAZ ou da prefeitura (108, 109, X999, falha de conexão)
Não reenvie. A plataforma mantém o documento em fila e retransmite sozinha, com espera crescente. Antes de cada retentativa a NFS-e é consultada na prefeitura, então uma transmissão que chegou não vira nota duplicada.
Rejeição de cadastro (209, 230, 231, 554, 805)
Não reenvie o mesmo payload. Corrija o cadastro na Receita ou na SEFAZ primeiro; reenviar antes disso só repete a rejeição.
Erro de payload (422, validation_error)
Corrija e reenvie o mesmo rascunho. Nada foi transmitido e nenhuma numeração foi consumida.
Duplicidade (204, 539)
Consulte antes de decidir. Busque a chave e o protocolo da nota já existente; se ela é a nota certa, adote-a. Se não, avance a numeração — nunca reenvie o mesmo número esperando resultado diferente.

Validação preventiva de parâmetros fiscais

A API valida parâmetros fiscais antes do envio sempre que a incompatibilidade puder ser identificada com segurança. Dados que alteram a identidade fiscal do documento não são reescritos silenciosamente.

  • Série informada pelo integrador: A série recebida é preservada. Na NF-e normal, as faixas 890–899 e 900–999 são rejeitadas antes da criação do rascunho.
  • Modelo e emissão: nfe exige modelo 55, nfce exige modelo 65 e a API pública atual aceita apenas tpEmis=1.
  • Campos duplicados: se série ou número forem enviados no topo e no payload, os valores devem ser idênticos; a API não escolhe silenciosamente um deles.
  • Sem garantia artificial: Validação e transmissão não garantem autorização; a decisão final e as regras fiscais pertencem à SEFAZ ou prefeitura responsável.
  • Rastreabilidade: Rejeições e falhas ficam disponíveis no status, histórico de tentativas e eventos do documento.

Leitura prática

  • Erros 4xx tendem a indicar payload inválido ou regra de negócio não atendida.
  • Rejeições fiscais exigem revisão tributária ou estrutural do documento.
  • Falhas transitórias devem ser tratadas pelo fluxo assíncrono e pelos webhooks.

Roteiro rápido para suporte e integração

  1. Validar se o token, a empresa e o certificado estao corretos.
  2. Checar status, processing_status e requested_action.
  3. Ler last_error_code e last_error_message.
  4. Se houver retorno SEFAZ, revisar o código e a tradução amigavel.
  5. Conferir tentativas, eventos e webhooks no painel da conta.
  6. So reenviar quando a causa estiver entendida.