Atualizado em .
Antes da primeira emissão
csc_id e csc_token cadastrados na empresa para formar o QR Code da NFC-e.homologacao; produção exige chave e empresa de produção.IBS/CBS — Reforma Tributária
Quando a regra vigente exigir IBS/CBS, informe o grupo por item em items[].taxes.ibscbs. A API valida a estrutura e calcula os valores usando a base do item após desconto.
"ibscbs": {
"cst": "000",
"classification_code": "000001",
"state_rate": 0.1,
"municipal_rate": 0,
"cbs_rate": 0.9
}
O escopo cobre a tributação regular (CST 000), a redução de alíquota (CST 200) e a imunidade / não incidência (CST 410), com 37 cClassTrib liberados em NFC-e pela tabela oficial do IT 2025.002 v1.60 — o par, a vigência, o tipo de alíquota e a permissão para o modelo são validados por ela. Um código aceito em NF-e pode ser vedado em NFC-e; a decisão é da tabela. Na redução, o percentual vem do cClassTrib e não do payload. Classificações que exigem grupos ainda não implementados são bloqueadas com a indicação de qual grupo falta. Confirme as alíquotas aplicáveis à operação com a regra fiscal vigente. A plataforma não aplica defaults tributários fictícios.
Exemplo completo
curl --request POST \
--url https://fiscal.contora.com.br/api/v1/nfe/drafts \
--header 'Authorization: Bearer SEU_TOKEN' \
--header 'Content-Type: application/json' \
--header 'X-Company-Document: CNPJ_SEM_MASCARA' \
--header 'Idempotency-Key: venda-1002-nfce' \
--data '{
"document_type": "nfce",
"series": 1,
"number": 1002,
"payload": {
"nature_operation": "Venda ao consumidor",
"operation_type": "saida",
"consumer_final": true,
"presence_indicator": 1,
"items": [{
"code": "SKU-1",
"name": "Produto de demonstração",
"ncm": "22030000",
"cfop": "5102",
"unit": "UN",
"quantity": 1,
"unit_price": 10.00,
"taxes": {
"icms": {"code": "102", "origin": 0},
"pis": {"code": "49", "aliquot": 0},
"cofins": {"code": "49", "aliquot": 0}
}
}],
"payments": [{"method": "01", "indicator": 0, "amount": 10.00}]
}
}'
102 é CSOSN e serve ao exemplo de Simples Nacional/MEI. Empresas de regime normal devem informar CST compatível, como 00, e a alíquota aplicável.
Destinatário e diferenças para NF-e
recipient com CPF/CNPJ e nome.billing, fatura e duplicatas são exclusivos da NF-e modelo 55 e são rejeitados na NFC-e.payments[].amount precisa ser ao menos igual ao total calculado do cupom.payments for maior que o total, o excedente vira vTroco automaticamente — desde que coberto por pagamento(s) em dinheiro (method: "01"). Veja a seção de pagamento e troco na doc de NF-e.tpEmis = 9). Assine localmente, imprima o DANFCE PDF no PDV na hora sem travar a venda e conte com sincronização automática em segundo plano a cada 2 minutos.infRespTec) automático: assim como na NF-e, o grupo
infRespTec e o cálculo do hashCSRT são injetados automaticamente no XML
a partir do cadastro global da conta. Veja Responsável técnico e CSRT
e o Guia para SaaS Multi-CNPJ.
Contingência Off-line (tpEmis = 9) no PDV
Quando a SEFAZ estadual estiver indisponível ou houver oscilação de conectividade, a frente de caixa não pode parar. A API Fiscal Contora oferece suporte nativo e automatizado à emissão em contingência off-line para a NFC-e (modelo 65).
1. Criar o rascunho em contingência
Ao criar a NFC-e, inclua o bloco contingency com mode: 9 e uma justificativa explicativa em reason (mínimo de 15 caracteres):
curl --request POST \
--url https://fiscal.contora.com.br/api/v1/nfe/drafts \
--header 'Authorization: Bearer SEU_TOKEN' \
--header 'Content-Type: application/json' \
--header 'X-Company-Document: CNPJ_SEM_MASCARA' \
--data '{
"document_type": "nfce",
"series": 1,
"number": 1003,
"payload": {
"model": 65,
"nature_operation": "Venda ao consumidor",
"contingency": {
"mode": 9,
"reason": "Indisponibilidade de comunicacao com a SEFAZ estadual"
},
"consumer_final": true,
"presence_indicator": 1,
"items": [{
"code": "PROD-01",
"name": "Item Varejo",
"ncm": "21069090",
"cfop": "5102",
"unit": "UN",
"quantity": 1,
"unit_price": 20.00,
"taxes": {
"icms": {"code": "102", "origin": 0},
"pis": {"code": "49", "aliquot": 0},
"cofins": {"code": "49", "aliquot": 0}
}
}],
"payments": [{"method": "01", "amount": 20.00}]
}
}'
2. Assinar localmente e gerar o DANFCE imediatamente
Chame o endpoint /build com {"sign": true}. A API assina o XML usando o certificado A1 da empresa, calcula a chave de acesso em contingência (com tpEmis = 9), gera o hash do QR Code offline com o CSC e disponibiliza o PDF do DANFCE:
curl --request POST \
--url https://fiscal.contora.com.br/api/v1/nfe/drafts/{draft_id}/build \
--header 'Authorization: Bearer SEU_TOKEN' \
--header 'Content-Type: application/json' \
--data '{"sign": true}'
Baixe o PDF imediatamente pelo endpoint de artefatos para impressão no cupom fiscal:
curl --request GET \
--url https://fiscal.contora.com.br/api/v1/nfe/drafts/{draft_id}/artifacts/pdf_danfe \
--header 'Authorization: Bearer SEU_TOKEN' \
--output cupom-nfce.pdf
fiscal:sync-contingency-nfce) executado a cada 2 minutos que monitora a normalização da SEFAZ estadual e submete automaticamente as NFC-e off-line emitidas nas últimas 24h, reutilizando estritamente o mesmo XML assinado originalmente e disparando o webhook document.authorized.
3. Transmissão manual sob demanda (opcional)
Se o PDV quiser forçar a autorização imediatamente assim que a conexão retornar:
curl --request POST \
--url https://fiscal.contora.com.br/api/v1/nfe/drafts/{draft_id}/dispatch \
--header 'Authorization: Bearer SEU_TOKEN' \
--header 'Content-Type: application/json' \
--data '{"action": "authorize"}'
- Prazo Legal de 24 Horas: Segundo a legislação do ENCAT/SEFAZ (Ajuste SINIEF), a NFC-e emitida em contingência off-line deve ser autorizada na SEFAZ em até 24 horas contadas da emissão.
- Proibição de Reemissão com Nova Chave: Uma nota emitida em contingência off-line nunca deve ser cancelada ou reemitida em modo normal (
tpEmis = 1) gerando nova chave, pois o consumidor já tem o cupom impresso com aquele QR Code específico. A transmissão posterior deve sempre enviar o mesmo XML assinado original.
Build, autorização e artefatos
- Crie o rascunho com
document_type=nfce. - Opcionalmente use
/buildcom{"sign": false}para validar o XML sem transmitir. - Envie
{"action": "authorize"}para/dispatch; o worker monta e assina automaticamente quando necessário. - Acompanhe
/statusou os webhooks até o estado final. - Quando autorizada, baixe
xml_authorizedepdf_danfe.