POST https://api.engineapi.com.br/v1/nfe
Situação indeterminada
Uma resposta perdida depois da transmissão não significa rejeição. ConsulteGET /v1/nfe?situacao=indeterminada&page=1&limit=20 para listar NF-e com chave de acesso
sem desfecho terminal. O parâmetro não pode ser combinado com status; cada item traz
situacao, o status persistido, updatedAt, proximaVerificacaoEm e o motivo.
Quais campos enviar? Este guia cobre os campos mais usados. A lista completa,
navegável por grupo (Identificação, Destinatário, Itens, Impostos, Transporte,
Pagamento…) e gerada direto do contrato real, está no
Catálogo de campos: NF-e. Para navegar por endpoint
em vez de por documento, veja a Referência da API.
Este é o guia completo (todos os campos, regimes tributários, tratamento de
erros). Se você só quer o checklist rápido antes da 1ª emissão, veja Primeira
Emissão.
Pré-requisitos
1
Conta criada
Obtenha seu token via
POST /v1/auth/login ou uma API Key (ek_live_/ek_test_) no Dashboard.2
Empresa cadastrada
Cadastre o CNPJ emissor via
POST /v1/companies. Guarde o id retornado.3
Certificado digital enviado
Faça upload do
.pfx via POST /v1/companies/{id}/certificate (campo multipart file). Sem certificado, a emissão falha.4
Ambiente definido
Todo emissor nasce em homologação (
ambienteFiscal: 2). Ver Ambiente de testes para o estado real de ir pra produção.Notas em homologação (
ambienteFiscal: 2) são transmitidas para o SEFAZ de teste e não têm validade fiscal. Use para testar sem risco.Emissor (
issuerId) é opcional no payload de NF-e/NFC-e. Com um único emissor
cadastrado, pode omitir (a API usa o seu emissor). Com dois ou mais, informe
issuerId (UUID) para escolher o CNPJ; sem ele a API responde 400. Ver
Autenticação.Exemplos de Request
ICMS por Regime Tributário
O campoicms do item muda conforme o regime da empresa emissora:
Simples Nacional (CSOSN)
Simples Nacional (CSOSN)
Informe
origem e csosn.Lucro Real / Lucro Presumido (CST)
Lucro Real / Lucro Presumido (CST)
O emissor
crt: 3 não informa cst à mão: icms.cst no payload é recusado com
422 CST_NAO_SUPORTADO_NFE (o leiaute exige a modalidade da base de cálculo, campo
fora deste contrato). O caminho que autoriza é a emissão assistida:
"resolverTributacao": true no corpo da requisição, com o item trazendo só icms.origem.
O motor calcula CST, base, alíquota e valor a partir de NCM, CFOP, UF do emissor e
origem da mercadoria:Detalhe completo do cenário (pré-requisitos, resposta, XML, erros e limitações) em
Regime Normal.
Origem da mercadoria
Origem da mercadoria
Emissão assistida (Cérebro Fiscal): resolverTributacao
Emissão assistida (Cérebro Fiscal): resolverTributacao
Com
"resolverTributacao": true no corpo da requisição, itens sem tributação
manual (sem icms.csosn e sem ibsCbs) recebem CSOSN e o grupo IBS/CBS
(Reforma Tributária) resolvidos automaticamente. Requer feature de plano +
Issuer.fiscalBrainEnabled; sem isso, 403. Item não-resolvível → 422
com {index, motivo} por item e nada é emitido. icms.origem nunca é
opinado pelo Cérebro: sempre vem do seu payload (ausente = 0, nacional).
Este 422 é diferente da rejeição SEFAZ (sempre 400); ver
Erros e respostas.PIS, COFINS e IPI
O motor é passthrough: o que você informa é o que vai no documento, nada é calculado aqui. Quando uma combinação não pode ser escrita no documento com segurança, a emissão recusa com422 antes de consumir número fiscal (ver
Erros e respostas). Campo aceito e ignorado em silêncio não
existe nesta API.
PIS e COFINS (NF-e e NFC-e)
PIS e COFINS (NF-e e NFC-e)
Códigos fora dessas faixas (ex.:
57, 68, 76) não existem na tabela do
leiaute 4.00 e são recusados com 422. CST de 1 dígito é normalizado
("1" → "01").Omitir pis/cofins mantém o comportamento padrão (CST 99 com valores
zerados). Os valores informados também somam em vPIS/vCOFINS no total
da nota.IPI (só NF-e, modelo 55)
IPI (só NF-e, modelo 55)
cEnq (Código de Enquadramento Legal) é opcional: ausente, transmitimos
"999" (demais casos), o mesmo default do leiaute.A NFC-e (modelo 65) não tem grupo de IPI no leiaute: enviar ipi numa
NFC-e devolve 422 IPI_NAO_SUPORTADO em vez de emitir sem o imposto.IBS/CBS com redução de alíquota (Reforma Tributária)
IBS/CBS com redução de alíquota (Reforma Tributária)
O leiaute da NT 2025.002 separa dois números por componente
(IBS-UF, IBS-Município e CBS):
- a alíquota nominal, que é a que o documento grava em
pIBSUF/pIBSMun/pCBS; - a redução do
cClassTribmais a alíquota efetiva, que vão no grupogReddo documento.
pNominal e pRedAliq andam juntos, e p precisa ser igual a
pNominal × (1 − pRedAliq/100). Fora disso, a emissão recusa antes de
consumir número fiscal.Produto sem redução continua exatamente como antes: só p (nominal e
efetiva são o mesmo número), e o documento sai sem gRed.Com resolverTributacao: true você não precisa preencher nada disso: o
Cérebro Fiscal resolve nominal, redução e efetiva do NCM sozinho.CEST e ICMS-ST
CEST e ICMS-ST
cest tem 7 dígitos (ex.: "0100100"). Máscara é aceita e normalizada
("01.001.00" → 0100100); o que não fecha 7 dígitos → 422 CEST_INVALIDO.Os campos ANTIGOS de ICMS-ST (icms.baseCalculoST, aliquotaST,
valorST) nunca chegaram ao documento e continuam sem efeito:
informá-los com valor diferente de zero devolve 422 ICMS_ST_NAO_SUPORTADO
(tudo zero continua emitindo, o documento sai igual). O vocabulário que vale
é o do leiaute, e ele já emite na NF-e:- Simples Nacional pleno (
crt: 1):icms.csosn"201","202"ou"203", commodBCST,vBCST,pICMSSTevICMSST; no"201", tambémpCredSNevCredICMSSN(o crédito do artigo 23 da LC 123/2006, que sai da sua apuração). - Regime Normal e Simples com excesso de sublimite (
crt: 3/crt: 2):icms.cst"10","30"ou"70"com os mesmos campos de ST, mais o ICMS próprio nos códigos"10"e"70".
resolverTributacao: true) a recusa acontece antes
disso: basta o NCM do item estar arrolado no CEST (Convênio ICMS
142/2018) para o motor devolver 422 TRIBUTACAO_NAO_RESOLVIDA, mesmo sem
nenhum campo de ST no payload. Ver Regime Normal
para a lista de segmentos afetados.Campos de Referência
Nomes de campo divergentes deste contrato são rejeitados com400.
Raiz
Destinatário
Item
Documento referenciado
referenciadas é um array na raiz do corpo. Cada entrada tem chaveAcesso (44 dígitos, a
chave de acesso da NF-e/NFC-e original), obrigatória em finNFe: 2 (complementar), 3
(ajuste) e 4 (devolução):
finNFe: 3 (ajuste) e 4 (devolução) exigem também a forma de pagamento "90" (Sem
Pagamento): pagamentos: [{ "forma": "90", "valor": 0 }], única entrada e sem troco. A
forma "90" descreve uma operação sem contraprestação (remessa, bonificação, comodato,
devolução), e a conferência de soma dos pagamentos contra o total da nota não se aplica a
ela. Outra forma junto de "90", ou troco maior que zero, recusa com
422 SEM_PAGAMENTO_INVALIDO; na NFC-e a forma "90" é vedada
(422 SEM_PAGAMENTO_VEDADO_NFCE). Ver Erros e
Rejeições.finNFe: 4), cada item precisa informar documentoReferenciado.nItem (número do item na nota original, NT 2025.002-RTC VC03). A chave pode vir de referenciadas[0].chaveAcesso ou de documentoReferenciado.chaveAcesso. Uma devolução completa combina finNFe: 4, referenciadas apontando a nota original e a
forma de pagamento "90":
referenciadas hoje: só a chave de acesso (refNFe do leiaute), aceita para NF-e (55), NFC-e (65) e CF-e SAT (59).
Nota de papel, produtor rural, CT-e e cupom de ECF ainda não são suportados. Ver
Cobertura fiscal e Erros e
Rejeições.
Ciclo de vida da NF-e
Os estados possíveis de uma nota e as transições entre eles:Contingência SVC
Quando a SEFAZ do estado do emissor está fora do ar, a engineAPI reroteia automaticamente a transmissão para a SEFAZ Virtual de Contingência (SVC): você não aciona nada, não muda o payload, não escolhe rota. A mesma chamadaPOST /v1/nfe segue
funcionando; só muda, por baixo, qual webservice recebe a nota.
Zero campo novo no payload. Não existe (nem precisa existir) um campo do tipo
contingencia/forcarContingencia no corpo do POST /v1/nfe: a decisão é 100%
automática, calculada a cada emissão a partir do status real da SEFAZ da UF do emissor.POST /v1/nfe:
- Consulta o status da SEFAZ da UF do emissor (cache de 5 minutos).
- UP: transmite normal, nada muda.
- DOWN: reroteia para a SVC-AN ou a SVC-RS (o mapa por UF é definido pelo fisco; a engineAPI escolhe a rota certa automaticamente).
- Quando a SEFAZ da UF volta a ficar UP, a próxima emissão já transmite normal de novo, sem nenhuma ação sua.
Consultar o status da SEFAZ
Para monitorar disponibilidade antes de decidir se vale a pena reagendar um lote, use:GET /v1/nfe/sefaz-status (sem UF) devolve o mesmo formato para as 27 UFs de uma vez,
com o mesmo cache de 5 minutos. Ver também SEFAZ e Webservices.
Response de sucesso
Mesmo contrato de resposta nos dois caminhos de emissão (síncrono e fila), envelopado em{ data, meta }:
Emissão em lote
POST /v1/nfe/batch enfileira várias notas de uma vez. Cada item de notas[] segue
exatamente o mesmo contrato de POST /v1/nfe: mesmo schema, mesmos campos
obrigatórios, mesmas recusas. Não existe um “formato de lote” separado.
201: confirma o enfileiramento, não a autorização:
Regras do lote
São dois limites independentes: o de notas e o de tamanho do corpo. O que morder primeiro depende de quantos itens suas notas têm.Quantas notas cabem de verdade? Uma nota com 1 item ocupa ~1,3 kB de JSON;
com 10 itens, ~3,5 kB. Na prática: 50 notas de 1 item cabem folgado (~64 kB),
mas 50 notas de 10 itens somam ~175 kB e batem no
413. Se você emite notas
com muitos itens, use lotes menores; o corpo do 413 diz o tamanho enviado e
o limite.Consultando o desfecho
O201 é só o aceite na fila. O desfecho fiscal de cada nota vem de
GET /v1/nfe/queue (filtrável por status: PENDING, PROCESSING, DONE, FAILED):
lastError (texto) e resultData.error com o código estruturado
(code): o mesmo código que o endpoint singular devolveria para o mesmo payload. Recusa
determinística (ex.: CST_REGIME_INCOMPATIVEL, PAGAMENTO_DIVERGENTE,
CADASTRO_EMISSOR_INCOMPLETO, EMISSOR_INEXISTENTE) vai direto para FAILED, sem
retry: repetir não muda o desfecho, e nenhum número da sequência fiscal é consumido.
Corrija o payload e reenvie.
EMISSOR_INEXISTENTE cobre o caso de o emissor ser removido entre o
enfileiramento e o processamento: a nota falha na hora, sem gastar tentativas e
sem consumir número. Reenvie o lote apontando para um emissor válido.Cancelamento
Cancele uma NF-e autorizada em até 24 horas após a autorização. Prazo geral, também regulamentado por UF.idOuChave aceita o id (UUID) da NF-e ou a chave de acesso (44 dígitos). O campo
do corpo é justificativa (mínimo 15 caracteres); a rota aceita tanto JWT do painel
quanto x-api-key de integração.
Se o cancelamento for solicitado fora do prazo, a SEFAZ rejeita (cStat 501) e a engineAPI
repassa o desfecho verbatim no 400, mesmo formato descrito em
Tratamento de Erros abaixo.
Carta de Correção (CC-e)
AUTHORIZED; limite de 20 CC-e por nota. O corpo aceita
correcao (mínimo 15 caracteres). Assim como o cancelamento, aceita JWT ou x-api-key.
Inutilização
Inutilize uma faixa de numeração que nunca será usada. O caso típico é uma nota rejeitada de forma definitiva, que consome o número mas nunca chega aAUTHORIZED: sem
inutilizar, esse número fica um gap permanente na sequência fiscal.
O corpo é validado com mensagens de erro no padrão pt-BR do resto da API
(ex.: “Justificativa deve ter no mínimo 15 caracteres (exigência SEFAZ)”). Os campos numéricos aceitam
number ou string só-dígitos
("45"), mas rejeitam null, "", array e boolean com uma mensagem pt-BR acionável (nunca o
“Invalid input” genérico) e nunca coagem silenciosamente pra 0.
Quando a SEFAZ homologa a inutilização (cStat 102), a resposta vem HTTP 200 com
success true:
cStat diferente de 102), a engineAPI
NÃO traduz isso em 4xx: o desfecho vem no próprio corpo, ainda em HTTP 200, com
success false:
Mesmo motor por trás do
POST /v1/nfce/inutilizar (modelo 65):
o worker de emissão e o desfecho da SEFAZ são genéricos por modelo; só o endpoint muda.
Tratamento de Erros
Rejeição SEFAZ (400)
Quando a SEFAZ rejeita a nota (cStat de rejeição), a API responde HTTP 400 com o envelope de erro padrão (RFC 7807) carregandoerror.erros[], o
cStat/xMotivo verbatim da SEFAZ, sem tradução:
Webhook após emissão
A engineAPI dispara automaticamente um eventoinvoice.authorized quando a SEFAZ aprova:
Veja também
- Cancelar/Corrigir: cancelamento e Carta de Correção (ver acima).
- Erros e respostas: o envelope RFC 7807 completo.
- Webhooks: receba notificações automáticas em tempo real.
- Paginação: contrato de
page/limit/sortByusado emGET /v1/nfe.