https://api.engineapi.com.br/v1/nfce
Situação indeterminada
ConsulteGET /v1/nfce?situacao=indeterminada&page=1&limit=20 quando uma NFC-e tiver
chave de acesso e ainda não tiver desfecho terminal. Este filtro é exclusivo de status,
preserva o modelo 65 e informa situacao, updatedAt, proximaVerificacaoEm e o motivo.
Quais campos enviar? Este guia cobre os campos mais usados. A lista completa,
navegável por grupo (Identificação, Itens, Impostos, Pagamento…) e gerada direto do
contrato real, está no Catálogo de campos: NFC-e. Para
navegar por endpoint em vez de por documento, veja a
Referência da API.
Ponto de venda
Ideal para varejo e e-commerce com venda direta
QR Code incluso
Resposta inclui
qrCode para consulta do consumidorDANFCE em PDF
Download do cupom fiscal em PDF, gerado do XML autorizado
Emissor (
issuerId) é opcional no payload de NFC-e. Com um único emissor, pode
omitir; com dois ou mais, informe issuerId (UUID) para escolher o CNPJ; sem ele a API
responde 400. Ver Autenticação.Pré-requisitos
1
Empresa e certificado, como na NF-e
NFC-e usa o mesmo cadastro de emissor da NF-e: CNPJ (
POST /v1/companies), IE,
endereço completo e certificado digital A1. Ver Emissão de NF-e (seção
Pré-requisitos, no topo do guia).2
CSC: Código de Segurança do Contribuinte (obrigatório fora do sandbox)
Todo emissor real (fora do ambiente sandbox/homologação de testes) precisa ter
csc (o token) e cscId (o ID do token) cadastrados em Dashboard → Emissores →
(selecione o emissor) → aba NFC-e, antes de emitir. Gere/consulte o CSC no portal
da SEFAZ do seu estado (Contribuinte → NFC-e → Autorização de Uso do CSC). Sem ele, a
API responde 422 CSC_AUSENTE, nenhum número da sequência fiscal é consumido.
Emissores em sandbox (toda conta nova nasce assim) emitem normalmente sem CSC.Copie o código sem sujeira. O CSC entra byte a byte no hash do QR-Code:
um espaço no fim, uma quebra de linha do copiar-e-colar ou um caractere
invisível (espaço não separável, zero-width, BOM) mudam o hash e a SEFAZ
rejeita a nota com CStat 464: Código de Hash no QR-Code difere do
calculado. Por isso o cadastro recusa esses valores na entrada: csc
aceita só caracteres imprimíveis sem espaço, e cscId só de 1 a 6 dígitos
(é o cIdToken do leiaute). Se o 464 aparecer mesmo com o código limpo, o
par csc/cscId gravado não é o que a SEFAZ tem registrado para o seu
CNPJ. Confira no portal e regrave os dois juntos.Diferenças NF-e vs NFC-e
Emitir NFC-e
O item da NFC-e reusa o mesmo grupoibsCbs da NF-e (Reforma Tributária); os demais campos
são específicos.
Produto com redução de alíquota (alimento, medicamento, cesta básica, o
caso comum no varejo de NFC-e) precisa de
pNominal e pRedAliq além da
alíquota efetiva p em cada componente do ibsCbs. A regra é a mesma da
NF-e: ver IBS/CBS com redução de alíquota.
Com resolverTributacao: true o Cérebro Fiscal resolve isso sozinho.Campos de referência
pis/cofins e cest seguem exatamente as regras da NF-e (valores informados
vão para o documento; combinação sem efeito é recusada com 422, ver
PIS, COFINS e IPI). IPI não existe no
modelo 65 e ICMS-ST não é escrito: os campos ipi e
icms.baseCalculoST/aliquotaST/valorST são aceitos no contrato apenas para
poder recusar: com valor diferente de zero devolvem 422 IPI_NAO_SUPORTADO
e 422 ICMS_ST_NAO_SUPORTADO, em vez de emitir a NFC-e sem o dado.
Formas de Pagamento
Response de Sucesso
Envelopado em{ data, meta }, sem aninhamento nfce:
issuer/customer embutidos e sem xml/xmlPath/pdfPath/invoiceId/message
(caminho de arquivo interno / shape antigo, removido). status é "AUTHORIZED" (inglês,
mesmo enum de sempre). amount é string decimal ("89.9", sem zero à direita). qrCode é exclusivo da
NFC-e, não é coluna do banco, só existe na resposta da emissão (guarde-o no seu lado se
precisar reimprimir o cupom depois). Não há campos cupomUrl/xmlUrl, use
downloads.xml/downloads.pdf (mesmas rotas de download descritas abaixo).
Download do Cupom Fiscal
O DANFCE é retornado como PDF (Content-Type: application/pdf), não passa pelo
envelope {data,meta}, o corpo é o arquivo:
tpAmb), tributação (CST/CSOSN) e informações complementares saem do
documento, nunca de uma remontagem.
Quando o XML autorizado não está armazenado neste ambiente (por exemplo, emissão em
sandbox), a resposta é 409 com code: DANFE_INDISPONIVEL, nunca um documento
aproximado.
Download do XML
Cancelamento
{idOuChave} aceita o UUID (id da resposta de emissão) ou a chave de acesso
(44 dígitos numéricos) da NFC-e, mesmo contrato do cancelamento de NF-e.
Sempre escopado ao seu partner (usar id/chave de outro partner devolve o mesmo 404 de
“não existe”). O campo do corpo é justificativa (mínimo 15 caracteres), não motivo.
Fora do prazo: cStat 501
Se o cancelamento for solicitado após o prazo da UF, a SEFAZ rejeita e a engineAPI repassa o desfecho verbatim no corpo400:
AUTHORIZED. Não existe cancelamento extemporâneo de NFC-e
via API. O remédio legal é emitir uma NF-e de devolução com finNFe: 4, a
nota original em referenciadas e pagamento sem pagamento (forma: "90", valor
zero); a API aceita e valida essa finalidade antes de numerar. Veja também o catálogo
de Erros e respostas.
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/nfe/inutilizar (modelo 55):
o worker de emissão e o desfecho da SEFAZ são genéricos por modelo; só o endpoint muda.
Contingência offline (SEFAZ fora do ar)
Quando a SEFAZ da UF do emissor está indisponível, a engineAPI emite mesmo assim: a NFC-e é assinada em contingência offline (tpEmis 9), devolvida com XML, QR Code e
DANFCE para o PDV imprimir na hora, e transmitida automaticamente quando o autorizador
voltar. O caixa não para.
Isto vale para o PDV que alcança a engineAPI e não consegue chegar à SEFAZ, que é o
caso comum de indisponibilidade estadual. Um PDV sem nenhuma internet não é resolvido
por API na nuvem: se esse é o seu cenário, fale com o time antes de desenhar a integração.
Quando a contingência entra
Sem você fazer nada, em três situações:
Para desligar a contingência automática numa nota específica, envie
"contingencia": false. Nesse caso a emissão falha quando a SEFAZ estiver fora, e você
decide o que fazer.
Quando a SEFAZ não responde nem à consulta
No terceiro gatilho, a engineAPI só emite a segunda nota se a SEFAZ responder que a chave não existe. Existem dois outros desfechos, e eles importam para o seu caixa:
No caso do
503, a nota fica registrada com a chave original e a engineAPI a reconcilia
sozinha: quando a SEFAZ voltar, você recebe invoice.authorized ou invoice.rejected.
Para continuar vendendo na hora, emita a próxima venda com "contingencia": true: ela
sai em contingência offline com número próprio. O corpo do erro traz details.invoiceId,
details.accessKey, details.numero e details.serie para você registrar o ocorrido.
Emitir em contingência
justificativaContingencia é opcional e tem de 15 a 256 caracteres (é o xJust do
leiaute, impresso no documento fiscal). Fora dessa faixa a API responde
422 JUSTIFICATIVA_CONTINGENCIA_INVALIDA antes de consumir qualquer número. Sem o
campo, a engineAPI usa “Indisponibilidade do servico de autorizacao da SEFAZ da UF do
emitente”.
Resposta
statuséCONTINGENCIA_PENDENTE, nãoAUTHORIZED. O documento é legal e pode ser entregue ao consumidor, mas a SEFAZ ainda não o autorizou.protocolénull. Protocolo só existe depois da transmissão. Não trate a ausência como erro.- O 35º dígito da chave de acesso é
9(é otpEmis). O número fiscal é o mesmo de sempre, sem pulo na sequência.
qrCode e o PDF são do documento real assinado: imprima e entregue normalmente.
O QR de contingência segue o Manual de Padrões Técnicos do QR Code, versão 2. O
parâmetro p carrega chNFe|nVersao|tpAmb|dhEmi|vNF|vICMS|digVal|cIdToken|cHashQRCode,
com dhEmi e digVal em hexadecimal e o hash em SHA-1 (40 posições). A engineAPI lê esse
QR do XML assinado e confere o formato antes de devolver a nota: se vier fora do
padrão, a emissão é recusada em vez de sair um cupom que o consumidor não consegue
conferir. No sandbox o QR tem o mesmo formato, com valores de demonstração: programe o
seu leitor contra ele à vontade.
O que acontece depois
A engineAPI tenta transmitir a nota a cada 2 minutos enquanto a SEFAZ não responder, e avisa você por webhook em cada etapa:
Assine os eventos em Dashboard → Webhooks (ver Webhooks). Você
também pode consultar o estado a qualquer momento com
GET /v1/nfce/{id}.
Diferença para a NFe
A NF-e (modelo 55) usa SVC, a SEFAZ Virtual de Contingência: um autorizador alternativo que autoriza na hora. A NFC-e não tem SVC, e isso é regra da SEFAZ: SVC-AN e SVC-RS atendem só o modelo 55. Por isso a contingência da NFC-e é offline, com transmissão diferida. Para acompanhar a disponibilidade da SEFAZ antes de uma venda, useGET /v1/nfe/sefaz-status/{uf} (rota compartilhada entre os dois modelos, ver
Consultar o status da SEFAZ).
Veja também
- Emissão de NF-e: para vendas B2B com dados completos do destinatário.
- Webhooks: receba eventos de NFC-e em tempo real.
- Paginação: contrato de
page/limit/sortByusado emGET /v1/nfce.