Skip to main content
A NFC-e (modelo 65) é o documento fiscal para vendas a consumidor final no varejo. Substitui o cupom fiscal e deve ser emitida no momento da venda. Endpoint base: https://api.engineapi.com.br/v1/nfce

Situação indeterminada

Consulte GET /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 consumidor

DANFCE 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 grupo ibsCbs 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:
Sem 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:
O documento é gerado a partir do XML autorizado da própria nota, no layout de cupom fiscal: ambiente (tpAmb), tributação (CST/CSOSN) e informações complementares saem do documento, nunca de uma remontagem.
Mudança de contrato (30/07/2026): esta rota devolvia text/html. Agora devolve application/pdf. Se você salvava a resposta como .html, passe a salvar como .pdf.
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.
O DANFCE de uma nota cancelada não traz carimbo de cancelamento. O PDF servido por GET /v1/nfce/pdf/{accessKey} é o documento gerado a partir do XML de autorização: ele não muda quando o cancelamento é homologado, porque o evento de cancelamento é um documento fiscal separado (o XML do evento, com o protocolo). Para provar que a nota foi cancelada, use o status do documento (CANCELED) ou o XML do evento, nunca a ausência de carimbo no DANFCE.
Prazo: 30 minutos contados da autorização de uso, desde que a mercadoria não tenha circulado. Esse é o prazo padrão nacional (Ajuste SINIEF 07/18) e é definido por UF; em Goiás, está fixado no art. 167-S-Q do RCTE-GO. É muito menor que o prazo da NF-e (24h): não assuma o mesmo prazo para os dois modelos.

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 corpo 400:
A nota permanece com status 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 a AUTHORIZED: sem inutilizar, esse número fica um gap permanente na sequência fiscal.
Este endpoint é exclusivo da NFC-e (modelo 65). Para NF-e (modelo 55), use POST /v1/nfe/inutilizar: mesmo contrato, mesmo motor por trás (o worker de emissão e o desfecho da SEFAZ são genéricos por modelo).
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:
O campo xml (XML de retorno da SEFAZ) é servido quando o motor fiscal o devolve: trate como opcional na sua integração, não como garantia contratual. protocol e message são os campos com prova de emissão real.
Quando a SEFAZ rejeita o pedido (qualquer 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:
Ramifique pelo campo success, não pelo status HTTP: rejeição da SEFAZ na inutilização não é 400. Ver também Erros e respostas.
Outros status possíveis (nenhum é “sempre 200”: só o desfecho da SEFAZ é):
O 500 de timeout é ambíguo de propósito (a SEFAZ pode ter homologado sem a resposta voltar a tempo). Nunca reenvie a mesma faixa sem cuidado: um reenvio comum pode colidir com uma inutilização que JÁ foi homologada (cStat 563, “já existe pedido”). Envie sempre com o header Idempotency-Key: <uuid> (suportado globalmente por todo POST/PUT/PATCH da API). Reenviar com a MESMA key repete o resultado já concluído (replay), sem reprocessar. Gere uma key nova só quando for de fato uma faixa diferente.
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 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

Três diferenças em relação à emissão normal, e cada uma importa para o seu código:
  • status é CONTINGENCIA_PENDENTE, não AUTHORIZED. 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 (é o tpEmis). O número fiscal é o mesmo de sempre, sem pulo na sequência.
O 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}.
O prazo é de 24 horas, contado da emissão. Passado esse prazo sem autorização, a nota fica em CONTINGENCIA_EXPIRADA, um estado terminal e visível (nunca some em silêncio), e a regularização passa a ser do contribuinte. A engineAPI nunca deixa de avisar, mas não pode transmitir fora do prazo.

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, use GET /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/sortBy usado em GET /v1/nfce.