Emitir NF-e POST
Emite uma Nota Fiscal Eletrônica (modelo 55) de venda/circulação de mercadoria -- o motor fiscal calcula ICMS/IPI/PIS/COFINS, monta o XML, assina com o certificado digital do contribuinte e transmite para a SEFAZ da UF do emitente.
Quando utilizar
Sempre que seu ERP precisar emitir uma NF-e de saída (venda) ou entrada em nome do contribuinte cadastrado. Cada chamada gera exatamente um documento -- para NFC-e (modelo 65, venda a consumidor final) use o endpoint específico de NFC-e.
Pré-requisitos
- Contribuinte (emitente) já cadastrado --
POST /v1/contribuintes. - Certificado digital A1 vinculado ao contribuinte --
POST /v1/contribuintes/{id}/certificado-digital. - Inscrição estadual ativa na UF do emitente.
- Você controla a numeração (
ide.numero/ide.serie) -- a API não auto-incrementa, diferente do RPS de NFS-e. -
Responsável técnico cadastrado na sua conta -- CNPJ, nome, e-mail e
telefone de contato, preenchidos em Área do Cliente → Responsável Técnico.
Sem isso, toda emissão de NF-e/CT-e/MDF-e falha com
status: "ERROR". Ver Responsável técnico abaixo.
Responsável técnico
O grupo infRespTec do layout oficial identifica quem desenvolve/opera o sistema
usado pra emitir o documento -- na sua conta CentralFiscal, não em cada contribuinte
individual. Não existe campo responsavel_tecnico no corpo desta
requisição -- a API resolve automaticamente a partir do cadastro da sua conta
(CNPJ + nome/e-mail/telefone de contato, preenchidos uma vez em
Área do Cliente → Responsável Técnico).
status: "ERROR" e mensagem explicando o que falta -- nenhum documento
incompleto chega a ser transmitido. Alguns estados (AL/AM/MS/PE/PR/SC/TO) já rejeitam
NF-e sem esse grupo na SEFAZ (rejeição 972); CT-e/MDF-e exigem o grupo sempre que
enviado, com CNPJ obrigatório (sem opção de branco).
Fluxo da operação
POST já calcula os tributos, assina e transmite pra SEFAZ -- a resposta já
vem com status final (AUTHORIZED/REJECTED/
ERROR/PROCESSING), não um "recebido, consulte depois". Não
existe notificação automática hoje -- GET /v1/nfe/emissoes/{transmissao_id}
continua disponível pra reconsulta, mas normalmente não é necessário logo após o
POST.
Endpoint
Headers
| Header | Valor | |
|---|---|---|
Authorization | Bearer <sua_api_key> | obrigatório |
Content-Type | application/json | obrigatório |
Idempotency-Key | string livre, definida por você | opcional -- alternativa ao campo idempotencia no corpo |
Accept | application/pdf | opcional -- só tem efeito com so_gerar_xml=true e quando o PDF foi gerado com sucesso; ver nota abaixo |
Accept, ou mandando Accept: application/json), a resposta de
so_gerar_xml=true já traz os dois juntos numa única chamada
-- xml_assinado e pdf_preview_base64 (base64) no mesmo JSON. Não
é preciso chamar duas vezes nem existem duas rotas. Se você mandar
Accept: application/pdf, a resposta muda pra devolver só o PDF
puro no corpo (Content-Type: application/pdf, sem o XML) -- útil
quando você só quer abrir o documento direto num navegador/iframe sem decodificar base64.
Se o PDF não puder ser gerado (XML inválido, falha na montagem), a resposta cai de volta
pro JSON normal mesmo com Accept: application/pdf, nunca devolve um PDF vazio
ou corrompido.
Body
O corpo do NF-e segue de perto os grupos do XML -- clique num campo com ▸ pra expandir.
true, roda o pipeline completo (IBS/CBS, crítica tributária, XSD pré-assinatura, assinatura real com o certificado do emitente, XSD pós-assinatura) e devolve o XML assinado em xml_assinado sem transmitir à SEFAZ -- nunca toca a rede da SEFAZ. Útil pra conferir o documento antes de emitir de verdade. Não consome idempotência nem número/série de verdade (não fica gravado como transmissão). A resposta também traz pdf_preview_base64: um PDF (base64) do DANFE, com a marca d'água "PRÉ-VISUALIZAÇÃO" (nunca foi transmitido) -- vem null se o XML não pôde ser gerado ou se a montagem do PDF falhar (o XML em si nunca fica bloqueado por isso). Se você mandar o header Accept: application/pdf na mesma chamada, a resposta vem como o PDF puro (Content-Type: application/pdf) em vez do JSON com base64 -- útil pra abrir direto num navegador/cliente REST sem decodificar nada. Só funciona quando o PDF realmente foi gerado; se não deu (XML inválido, falha na montagem), a resposta continua vindo em JSON. Default false -- os demais campos abaixo (emitente_documento, ide, emitente, etc.) são os mesmos com ou sem so_gerar_xml, ele só muda o que a API faz com o resultado (transmite ou não).<ide>).2026-08-06T10:00:00-03:00.5/6 são finalidades novas da reforma tributária (LC 214/2025) e exigem tipo_nota_credito/tipo_nota_debito respectivamente -- sem isso a emissão falha.uf: "EX" → Exterior; UF do destinatário diferente da do emitente → Interestadual; UF igual → Interna.tpNFCredito -- obrigatório quando finalidade: "5". 01 Multa e juros, 02 Apropriação de crédito presumido de IBS sobre saldo devedor na ZFM (art. 450 §1º LC 214/25), 03 Retorno por recusa na entrega ou não localização do destinatário, 04 Redução de valores, 05 Transferência de crédito na sucessão, 06 Retorno por recusa parcial na entrega.tpNFDebito -- obrigatório quando finalidade: "6". 01 Transferência de créditos para Cooperativas, 02 Anulação de Crédito por Saídas Imunes/Isentas, 03 Débitos de notas fiscais não processadas na apuração, 04 Multa e juros, 05 Transferência de crédito na sucessão, 06 Pagamento antecipado, 07 Perda em estoque (Perecimento, Perda, Furto, Roubo), 08 Desenquadramento do Simples Nacional.cIndOp -- código indicador do local da operação de fornecimento (6 dígitos).gCompraGov.tpEnteGov.pRedutor.tpOperGov -- 2 exige exatamente 1 chave em chaves_documento_fiscal_anterior, 3 aceita várias, 1/4 não aceita nenhuma.refDFeAnt -- chave(s) de acesso do(s) documento(s) fiscal(is) anterior(es). Quantidade validada de acordo com tipo_operacao (ver acima).indFinal. Default: NORMAL. Toda NFC-e (modelo 65) normalmente é CONSUMIDOR_FINAL.indPres. Default: NAO_PRESENCIAL_OUTROS -- errado pra venda de balcão. Informe PRESENCIAL explicitamente em NFC-e de PDV.PessoaFiscaldestinatario usa exatamente o mesmo formato.destinatario, obrigatório para modelo 55.xFant.fone. Também aceito solto na raiz do emitente (fora de endereco).cPais -- código BACEN do país. Também aceito solto na raiz.xPais. Também aceito solto na raiz.emitente -- destinatário não tem CRT. 1 Simples Nacional, 2 Simples Nacional excesso de sublimite, 3 Regime Normal, 4 Simples Nacional MEI. Decide se o motor monta o item com CST (regime normal) ou CSOSN (Simples Nacional) -- enviar csosn no item sem crt correto no emitente falha. Se omitido, usa o regime já cadastrado do contribuinte. crt: 4 (MEI) só aceita csosn: "900" -- é o único CSOSN que o layout oficial associa a MEI; qualquer outro (101, 102, 500 etc.) falha a emissão.emitente. IEST -- Inscrição Estadual do Substituto Tributário.emitente. CNAE fiscal (7 dígitos), dentro do grupo opcional "informações de interesse da Prefeitura" -- exige inscricao_municipal informada junto (grupo indivisível no XSD, falha se vier um sem o outro).emitente (ISUFEmit) quanto em destinatario (ISUF).PessoaFiscalemitente. Obrigatório para modelo 55.identificador_estrangeiro vier preenchido (comprador estrangeiro sem documento brasileiro).EX pra destinatário no exterior (operação de exportação) -- ver cep abaixo.uf não é EX. Em operação com o exterior (uf: "EX") pode ser omitido -- o XML sai sem <CEP> (campo opcional no XSD nesse caso). municipio_ibge também pode ser omitido junto -- a API usa o código reservado 9999999 automaticamente.fone. Também aceito solto na raiz do destinatário (fora de endereco).xPais -- nome do país. Default BRASIL quando omitido -- exceto com uf: "EX", onde vira obrigatório (não tem como a API adivinhar qual dos ~240 países é o destino). Também aceito solto na raiz.cPais -- código BACEN do país. Default 1058 (Brasil). Com uf: "EX" é opcional: se você mandar só pais (o nome), a API resolve o código sozinha por uma tabela oficial de ~240 países -- só precisa informar pais_codigo explicitamente se souber um código que a tabela não cobre direito. Também aceito solto na raiz.indIEDest: 1 contribuinte de ICMS, 2 contribuinte isento de inscrição, 9 não contribuinte. Default: 1 se documento tiver 14 dígitos (CNPJ); 9 automaticamente se tiver 11 dígitos (CPF, nunca é contribuinte de ICMS). Venda a pessoa física sem informar isso corretamente é rejeitada pela SEFAZ -- informe explicitamente se souber o caso exato (ex.: CNPJ isento = 2).destinatario -- emitente não tem email no XSD (aceito se enviado ali, mas nunca transmitido no XML).ISUF), 8 ou 9 dígitos. Também aceito em emitente (ISUFEmit).destinatario. idEstrangeiro -- terceira alternativa (além de CNPJ/CPF) pra comprador estrangeiro sem documento brasileiro. Quando informado, documento deixa de ser obrigatório.<retirada>, XSD TLocal). Se documento não vier, assume o CNPJ/CPF do próprio emitente.xNome -- nome do expedidor/recebedor no local.retirada for enviado.<entrega>, mesma estrutura TLocal de retirada acima). Mesmos campos e mesma regra de obrigatoriedade de retirada (logradouro/numero/bairro/municipio_ibge/municipio/uf obrigatórios se o objeto for enviado); se documento não vier, assume o CNPJ/CPF do próprio destinatário.nItem. Se omitido, a API numera na ordem em que os itens aparecem no array.cProd -- código do produto no seu sistema."SEM GTIN"cEAN/GTIN, quando o produto tem código de barras."SEM GTIN"cEANTrib -- GTIN da unidade tributável. Pode ser diferente de ean quando a unidade tributável não é a mesma da comercial.tributacao.icms.codigo_beneficio_fiscal, que só vale pro CST 51.uCom. Também usada como unidade tributável (uTrib) -- a API não suporta unidades comercial/tributável diferentes.vProd = quantidade × valor unitário comercial. A API não recalcula/confere -- envie o valor certo.unidade_comercial.quantidade_comercial.valor_unitario_comercial.xPed -- número do pedido de compra, uso do emissor pra controle de B2B com o cliente. Máx. 15 caracteres.nItemPed -- número do item dentro do pedido de compra informado em pedido_compra. Máx. 6 dígitos.infAdProd -- informações adicionais do produto (norma referenciada, observação livre etc.), específicas deste item. Diferente de informacoes_complementares (nível raiz do documento), que vai no campo infAdic/xInfComp. Máx. 500 caracteres.EXTIPI -- código EX TIPI (exceção da TIPI), 2 a 3 dígitos.tpCredPresIBSZFM -- classificação pra subapuração do IBS na Zona Franca de Manaus. Campo de <prod>, diferente do crédito presumido de IBS dentro de tributacao.ibs_cbs.gCred -- crédito presumido de ICMS na UF aplicado ao item (até 4 ocorrências, Convênio ICMS).cCredPresumido -- código do benefício fiscal na UF, 8 ou 10 caracteres.pCredPresumido.vCredPresumido.vItem -- valor total do item, participação no total da nota (a soma dos itens deve bater com o total da NF-e). Campo filho direto de <det> (diferente de valor_produto, que é vProd dentro de <prod>).DFeReferenciado -- referência a um item de outro documento fiscal (devolução parcial referenciando o item específico do documento original). Filho direto de <det> -- diferente do grupo referenciados (nível raiz), que referencia o documento inteiro.nItem daquele documento (não deste).DI -- Declaração de Importação (NT 2011/004), até 100 por item.nDI -- número do DI/DSI/DIRE/DUImp.dDI.xLocDesemb.UFDesemb.dDesemb.tpViaTransp -- 1 Marítima, 2 Fluvial, 3 Lacustre, 4 Aérea, 5 Postal, 6 Ferroviária, 7 Rodoviária, 8 Conduto, 9 Meios próprios, 10 Entrada/saída ficta, 11 Courier, 12 Em mãos, 13 Por reboque.tpIntermedio -- 1 por conta própria, 2 por conta e ordem, 3 encomenda.cExportador -- código interno do exportador no seu sistema.vAFRMM -- adicional de frete pra renovação de marinha mercante.UFTerceiro.adi -- adições da DI (até 999).nSeqAdic.cFabricante.nAdicao.vDescDI.nDraw.detExport -- detalhe da exportação (drawback/exportação indireta), até 500 por item. Sibling de importacoes dentro de <prod>.nDraw.exportInd.nRE.chNFe -- chave de acesso da NF-e recebida para exportação.qExport.cst (regime normal) ou csosn (Simples Nacional) -- nunca os dois. N11-N28cada código tem seu próprio grupo de campos no layout oficial (XSD 4.00) -- escolha um abaixo:● verde no código = suportado pela API hoje · ● cinza = existe no layout oficial, ainda não implementado pelo motor.
<IPI> no XML. O grupo montado depende do cst: 00/49/50/99 gera IPITrib (usa base_calculo/aliquota/valor, ou o par quantidade_unidade_padrao/valor_por_unidade pra "pauta fixa"); 01-05/51-55 gera IPINT (só o CST).ipi for enviado -- mandar ipi sem cst falha a emissão inteira."999"cEnq.CNPJProd -- selo de controle do IPI (cigarros/bebidas). Opcional, fica antes de cEnq no XML.cSelo -- código do selo de controle do IPI. Ver cnpj_produtor.qSelo -- quantidade de selos de controle do IPI. Ver cnpj_produtor.qUnid -- "pauta fixa" (valor do IPI por unidade de medida), alternativa a base_calculo/aliquota. Só faz sentido pros CST 00/49/50/99; quando informado junto com valor_por_unidade, o motor usa esse par no lugar de vBC/pIPI.vUnid -- ver quantidade_unidade_padrao. Os dois são obrigatórios juntos.<II> (Imposto de Importação), sibling de icms/ipi. Os 4 campos são todos obrigatórios juntos -- o grupo inteiro é opcional (omita se o item não teve importação).vBC do II.vDespAdu.vII.vIOF.cst informado: 01/02 gera PISAliq (usa base_calculo/aliquota/valor); 04-09 gera PISNT (só o CST, os outros campos são ignorados); 49-99 gera PISOutr (usa base_calculo/aliquota/valor). CST 03 ainda não suportado (tributação por quantidade).cst for 04-09.cst for 04-09.cst for 04-09.PISST -- substituição tributária, sibling de pis. xs:choice: informe base_calculo+aliquota (percentual) OU quantidade_vendida+aliquota_reais (por unidade), exatamente uma das duas variantes -- nunca as duas nem nenhuma. valor é sempre obrigatório.vPIS (do PISST).vBC -- variante percentual, com aliquota.pPIS -- variante percentual, com base_calculo.qBCProd -- variante por unidade, com aliquota_reais.vAliqProd -- variante por unidade, com quantidade_vendida.indSomaPISST -- indica se o valor compõe o total da NF-e.cst de pis (grupo COFINSAliq/COFINSNT/COFINSOutr).cst for 04-09.cst for 04-09.cst for 04-09.COFINSST -- substituição tributária, sibling de cofins. Mesma regra de xs:choice de pis_st.vCOFINS (do COFINSST).vBC -- variante percentual, com aliquota.pCOFINS -- variante percentual, com base_calculo.qBCProd -- variante por unidade, com aliquota_reais.vAliqProd -- variante por unidade, com quantidade_vendida.indSomaCOFINSST -- indica se o valor compõe o total da NF-e.ICMSUFDest) -- só se aplica em venda interestadual pra consumidor final não contribuinte de ICMS. A API não calcula esse grupo sozinha -- use POST /v1/tributario/icms/difal pra calcular e informe os valores prontos aqui. O motor confere a aritmética contra a mesma fonte oficial do calculador e devolve aviso em detalhes.divergencias_tributarias se algo não bater (nunca sobrescreve, nunca bloqueia).vBCUFDest.pICMSUFDest -- alíquota interna da UF de destino pro produto. Sem fonte federal única pras 27 alíquotas internas (mesma limitação do calculador standalone).pICMSInter -- 4/7/12. O motor confere contra a tabela oficial (Resolução do Senado 22/89 e 13/2012) e avisa se divergir.100pICMSInterPart -- 100% desde 2019 (fim do cronograma da EC 87/2015). Só informe diferente se for uma operação do período de transição 2016-2018.vICMSUFDest. O motor confere contra base_calculo_uf_destino × (aliquota_interna_uf_destino - aliquota_interestadual) / 100 e avisa se divergir.0vICMSUFRemet -- sempre zero desde 2019, mesmo raciocínio do percentual_partilha.vBCFCPUFDest. Só emitido junto com aliquota_fcp_uf_destino/valor_fcp_uf_destino.pFCPUFDest -- percentual do Fundo de Combate à Pobreza na UF de destino, quando aplicável.vFCPUFDest.data_emissao for de 2026 e o ambiente for homologação, a API preenche automaticamente com cst=000/classificacao_tributaria=000001 (tributação integral, sem benefício) pra não quebrar na SEFAZ; a base de cálculo é o próprio valor_produto do item. Em produção a API nunca inventa essa classificação sozinha -- informe este campo explicitamente se precisar dele antes de 2027, ou se o item tiver uma classificação tributária diferente da genérica. Fora de 2026 continua opcional e sem default -- documento com data_emissao fora de 2026 é rejeitado se ibs_cbs vier preenchido.● verde no código = suportado pela API hoje · ● cinza = existe no layout oficial, ainda não implementado pelo motor.
<total>/<ICMSTot>. Todo campo abaixo é opcional -- se omitido, o motor calcula automaticamente somando os itens (mesma regra que usa pra conferir o XML antes de assinar).vOutro -- outras despesas acessórias.0vICMSDeson -- sem soma automática dos itens ainda (nenhum campo de item alimenta este total hoje), por isso só aceita override explícito.0vFCPSTRet -- mesmo caso de valor_icms_desonerado, só override explícito.0vIPIDevol -- valor total do IPI devolvido (finalidade: "4", devolução, operações com não contribuintes do IPI).vTotTrib -- valor estimado total de impostos federais/estaduais/municipais (Lei da Transparência Fiscal, IBPT). Nunca calculado pelo motor (depende de tabela IBPT que não carregamos) -- só emitido se você informar.retTrib -- retenção de tributos federais (comum em prestação de serviços com retenção na fonte pelo adquirente). Todos os campos são opcionais e independentes -- informe só o que foi retido.vRetPIS.vRetCOFINS.vRetCSLL.vBCIRRF.vIRRF.vBCRetPrev.vRetPrev.<total> além do ICMSTot acima -- veja o que a API aceita hoje e o que ainda não:
- ICMS-ST (
vBCST/vST/vFCPST) -- calculado automaticamente somando o ICMS-ST de cada item (CST 10/30/70, CSOSN 201/202/203). Não é um campo detotais-- não há como sobrescrever, o motor sempre soma. - DIFAL (
vFCPUFDest/vICMSUFDest/vICMSUFRemet) -- calculado automaticamente somando os itens que tiveremtributacao.icms_uf_destpreenchido. Mesma regra: não há como sobrescrever. - Imposto de Importação (
vII) -- calculado automaticamente somandotributacao.importacao.valorde cada item. - IBS/CBS (
IBSCBSTot) -- mesma regra: calculado automaticamente a partir doibs_cbsinformado em cada item (ver seção itens acima). Não existe campototais.ibs_cbsde entrada -- se enviado, é ignorado. - ISSQNtot (NF-e mista com serviço/ISS) e ISTot (Imposto Seletivo) existem no leiaute oficial (
nfe_v4.00.xsd) mas o motor ainda não os suporta -- não há campo de entrada equivalente para nenhum dos dois.
<transp>. Omitido = sem transporte de carga (modFrete=9, default)."9"<transporta>.xEnder), sem estrutura de logradouro/número -- assim que o layout da NF-e define este grupo.<veicTransp>.<reboque> (até 5) -- mesma estrutura de veiculo, placa obrigatória.veiculo/reboques e balsa (xs:choice no XSD).veiculo/reboques e vagao (xs:choice no XSD).retTransp -- retenção de ICMS do transporte (frete por conta de terceiro tributado).vServ.vBCRet.pICMSRet.vICMSRet.cMunFG -- código IBGE do município.<vol>, pode repetir.nLacre -- números dos lacres deste volume.<cobr> -- fatura e duplicatas de venda a prazo. Independente da forma de pagamento em pagamentos.<fat>.<dup>, uma por parcela.<pag>, obrigatório no layout desde a NT 2020.005. Se omitido, a API preenche automaticamente um pagamento "SEM_PAGAMENTO" (tPag=90) com valor 0 -- tPag=90 significa que não houve pagamento, então vPag não pode ser o valor da nota.tPag (2 dígitos): 01 Dinheiro, 02 Cheque, 03 Cartão de crédito, 04 Cartão de débito, 05 Crédito Loja, 10 Vale Alimentação, 11 Vale Refeição, 12 Vale Presente, 13 Vale Combustível, 14 Duplicata Mercantil, 15 Boleto, 16 Depósito Bancário, 17 PIX, 18 Transferência bancária/Carteira Digital, 19 Fidelidade/Cashback, 90 Sem pagamento, 91 Pagamento Posterior, 99 Outros. Também aceita os aliases DINHEIRO/CHEQUE/CARTAO_CREDITO/CARTAO_DEBITO/CREDITO_LOJA/VALE_ALIMENTACAO/VALE_REFEICAO/VALE_PRESENTE/VALE_COMBUSTIVEL/DUPLICATA_MERCANTIL/BOLETO/DEPOSITO_BANCARIO/PIX/TRANSFERENCIA_BANCARIA/PROGRAMA_FIDELIDADE/SEM_PAGAMENTO/PAGAMENTO_POSTERIOR/OUTROS -- qualquer outro código cru de 2 dígitos também é aceito e transmitido como veio.xPag -- descrição livre do meio de pagamento, 2-60 caracteres. Obrigatório na prática pra forma=99/OUTROS -- sem isso a SEFAZ rejeita com "Descrição do pagamento obrigatória para meio de pagamento 99-outros" (rejeição 441). Nas demais formas é opcional.indPag: 0 à vista, 1 a prazo. Omita se não aplicável.dPag -- data em que o pagamento foi processado.CNPJPag -- CNPJ do estabelecimento onde o pagamento foi processado, quando diferente do emitente. Só é emitido se uf_estabelecimento_pagamento também vier -- o par é tudo ou nada.UFPag -- ver nota de cnpj_estabelecimento_pagamento.<card> -- "Cartões, PIX, Boletos e outros Pagamentos Eletrônicos" (nome genérico no XSD oficial, não é exclusivo de cartão de fato).tpIntegra: 1 pagamento integrado (TEF, e-commerce, POS integrado), 2 não integrado (POS simples). Único campo obrigatório do grupo.tBand -- código de 2 dígitos da bandeira do cartão.cAut -- número de autorização da operação.CNPJReceb -- CNPJ do beneficiário do pagamento.idTermPag -- identificador do terminal de pagamento (POS).vTroco -- irmão do array pagamentos, não pertence a nenhum pagamento específico. Comum em NFC-e de PDV (venda em dinheiro com troco).<NFref>. Cada item escolhe um tipo e preenche só os campos daquela variante -- o XSD exige exatamente uma por documento.nfe<NFref> este documento representa.tipo é nfe (<refNFe>), nfe_sigilosa (<refNFeSig> -- mesma NF-e, mas com código numérico zerado pra manter sigilo) ou cte (<refCTe>).cUF -- código IBGE da UF do emitente do documento referenciado. Usado em nf_modelo_antigo/nf_produtor.AAMM -- ano+mês de emissão (4 dígitos, ex. "2607"). Usado em nf_modelo_antigo/nf_produtor.nf_modelo_antigo) ou CNPJ/CPF (nf_produtor) do emitente do documento referenciado.nf_produtor.01/02 em nf_modelo_antigo, 01/04 em nf_produtor, 2B/2C/2D em cupom_fiscal.0 se inexistente). Usado em nf_modelo_antigo/nf_produtor.nf_modelo_antigo/nf_produtor.nECF -- número de ordem sequencial do ECF que emitiu o cupom fiscal. Usado em cupom_fiscal.nCOO -- número do contador de ordem de operação do cupom fiscal. Usado em cupom_fiscal.autXML -- CNPJ ou CPF de pessoas autorizadas a baixar o XML desta NF-e (máx. 10, limite do XSD). A API decide CNPJ/CPF pelo tamanho do número informado.<infAdic>.infCpl -- texto livre impresso no DANFE ("Dados Adicionais").infAdFisco -- informações adicionais de interesse do Fisco, normalmente exigidas por legislação específica da UF.obsCont -- observações de interesse do contribuinte, cada uma com campo nomeado.xCampo.xTexto.obsFisco -- observações de interesse do Fisco, mesma estrutura de observacoes_contribuinte.xCampo.xTexto.procRef -- processos administrativos/judiciais referenciados pela NF-e.nProc.indProc.tpAto.WARNSTRICT bloqueia a emissão se a crítica tributária (CST/CSOSN vs regime do emitente, CFOP vs UF, etc.) encontrar divergência; WARN emite mesmo assim e devolve a divergência em detalhes.divergencias_tributarias; OFF desliga a crítica. Recomendado usar STRICT nos primeiros testes de integração pra pegar erro de mapeamento cedo.true. Quando o autorizador primário da UF falha por comunicação (timeout/DNS/TLS -- nunca uma rejeição de negócio da SEFAZ), a CentralFiscal confirma que a SVC (Sistema de Contingência) mapeada pra UF está ativa e, se estiver, reconstrói e retransmite a NF-e automaticamente em contingência (SVC-AN ou SVC-RS, conforme a UF -- Ato COTEPE ICMS 39/2012); se a SVC também estiver fora do ar, o erro original volta normalmente -- não há risco de forçar uma contingência indevida. Envie false explicitamente (booleano de verdade, não string) se precisar travar a emissão num único canal. Veja detalhes.tipo_emissao_utilizado na resposta pra saber se isso realmente aconteceu.
Não existem validar_xml_antes_assinatura nem gerar_qrcode --
a validação contra o XSD oficial antes de assinar é sempre feita (não dá pra desligar), e
o QR Code é gerado automaticamente quando o modelo é 65 (NFC-e) e nunca quando é 55 (NF-e).
Idempotency-Key. Reenviar a mesma chave nunca gera uma segunda NF-e -- devolve o resultado da primeira tentativa.Exemplo mínimo
Um item, ICMS regime normal -- veja o código ao lado.
Exemplo Simples Nacional
Mesma estrutura do exemplo acima -- só muda o crt do emitente e a tributação do
ICMS do item. Em emitente.crt, use "1" (Simples Nacional). No item,
troque icms.cst por icms.csosn -- o exemplo ao lado usa
102 (Tributada pelo Simples Nacional sem permissão de crédito), o CSOSN mais comum
pra revenda de mercadoria. PIS/COFINS seguem normalmente com cst de regime
normal (01/02 etc.) -- a API não muda o tratamento de PIS/COFINS
conforme o CRT do emitente, só o ICMS distingue CST de CSOSN.
icms.csosn com
emitente.crt diferente de 1/2/4 (ou
icms.cst com um emitente do Simples Nacional) falha a emissão. Veja a tabela
completa de CSOSN suportados na seção Body → itens → tributacao →
icms acima.
Resposta de sucesso
200 OK -- já com o resultado final da SEFAZ nesta mesma resposta
(status: "AUTHORIZED" em caso de sucesso). Traz chave (chave de
acesso de 44 dígitos) e documento (rótulo do tipo). O campo detalhes
traz o cstat/xmotivo reais devolvidos pela SEFAZ, além de
tipo_emissao_utilizado ("1" na grande maioria dos casos; "6"
ou "7" quando o autorizador primário falhou por comunicação e a NF-e saiu em
contingência SVC-AN/SVC-RS -- comportamento ligado por padrão, desliga só se você mandar
configuracoes.permitir_contingencia: false). Veja o exemplo ao lado.
Resposta de erro
Erro de payload (campo obrigatório ausente, valor inválido) não vira 400
-- ainda vem 200 OK, com o erro embutido no corpo. A chamada só devolve
HTTP de erro de verdade pra falha de autenticação (401) ou contrato ausente
(403/409). Pra tudo que acontece depois disso -- inclusive campo
obrigatório faltando -- olhe status e retorno_amigavel.codigo
(NFE_EMISSAO_FALHOU é o caso comum) na resposta 200, nunca o status
HTTP. Exemplo real: endereço do emitente incompleto devolve 200 com
status: "ERROR" e retorno_amigavel.codigo: "NFE_EMISSAO_FALHOU"
trazendo a mensagem exata do campo que faltou. Catálogo completo de erros:
Tratamento de Erros.
idempotency_key depois de corrigir
o payload. Se a primeira tentativa falhou por campo ausente, ela já ficou
registrada com esse erro. Reenviar com a MESMA chave de idempotência devolve
"duplicado": true com o erro antigo -- não tenta de novo. Corrija o payload
e gere uma idempotency_key nova antes de reenviar.
Notificação assíncrona
Não existe webhook genérico hoje -- e como a chamada já é síncrona (a resposta já traz o
resultado final), normalmente você não precisa de nada além do próprio POST.
Se precisar reconsultar mais tarde (ex. reprocessamento manual), use
GET /v1/nfe/emissoes/{transmissao_id}.
Cancelamento
POST /v1/nfe/cancelamentos -- exige chave_acesso (44 dígitos),
protocolo (da autorização original) e justificativa com pelo
menos 15 caracteres. Mesmo padrão síncrono da emissão: a resposta já vem com o resultado
final do evento de cancelamento na SEFAZ. Veja o exemplo ao lado.
Carta de Correção (CC-e)
POST /v1/nfe/cartas-correcao -- evento 110110. Não cancela nem corrige
valores, impostos ou participantes da NF-e (isso exige cancelamento + nova emissão)
-- só serve para os campos que a legislação permite corrigir por evento (dados cadastrais,
endereço, informações complementares etc.). A NF-e original continua
AUTHORIZED em caso de sucesso -- é isso que aparece no campo
status da resposta, não um estado novo. Mesmo padrão síncrono do
Cancelamento acima.
Exige chave_acesso (44 dígitos) e x_correcao (texto livre, 15 a
1000 caracteres -- limites do próprio schema oficial da SEFAZ, leiauteCCe_v1.00.xsd).
sequencia_evento é opcional (padrão 1) -- só precisa informar se for
enviar mais de uma CC-e para a mesma NF-e (a SEFAZ aceita até 19 por chave); quem controla
qual sequencial usar em cada reenvio é quem chama a API, a CentralFiscal não guarda esse
contador.
curl -X POST https://areacliente.centralfiscal.com.br/v1/nfe/cartas-correcao \
-H "Authorization: Bearer cf_test_51JqK..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: cce-nfe-0001" \
-d '{
"chave_acesso": "43260712345678000190550010000010011000010018",
"x_correcao": "Correcao do endereco do destinatario: numero do imovel e complemento."
}'POST já traz o resultado final
(mesmo padrão síncrono da emissão/cancelamento), mas se precisar conferir de novo mais
tarde -- ex. depois de um status: "INDETERMINATE" -- use
GET /v1/nfe/cartas-correcao/{transmissao_id} com o transmissao_id
devolvido no POST original.
Ator Interessado
POST /v1/nfe/atores-interessados -- evento 110150 ("Ator Interessado na NF-e -
Transportador"). Autoriza um terceiro (CNPJ ou CPF -- ex.: contador, outro transportador, ou
qualquer parte interessada) a baixar o XML completo da NF-e diretamente na SEFAZ, sem você
precisar compartilhar o arquivo manualmente. Não cancela nem altera nenhum dado da
NF-e -- ela continua AUTHORIZED em caso de sucesso, só ganha um evento de
autorização anexado. Mesmo padrão síncrono do Cancelamento/CC-e acima.
tpAutor 1/2/3). A
CentralFiscal só expõe a geração pelo emitente (tpAutor=1) --
é o caso de uso do produto, que atua do lado de quem emite a nota. Não há campo para
escolher outra variante.
Exige chave_acesso (44 dígitos) e autorizado.documento (CNPJ ou CPF
de quem está sendo autorizado a baixar o XML). tipo_autorizacao é opcional:
"0" não permite, "1" permite que o autorizado -- quando for um
transportador -- repasse a autorização a subcontratados ou redespachados. Quando
tipo_autorizacao é "1", a CentralFiscal já preenche
xCondUso com o texto fixo exigido pelo schema oficial (leiauteEventoAtorInteressado_v1.00.xsd)
-- não é um campo que você envia. sequencia_evento é opcional (padrão
1), mesmo critério da CC-e (a SEFAZ aceita até 20 por chave).
curl -X POST https://areacliente.centralfiscal.com.br/v1/nfe/atores-interessados \
-H "Authorization: Bearer cf_test_51JqK..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: ator-nfe-0001" \
-d '{
"chave_acesso": "43260712345678000190550010000010011000010018",
"autorizado": { "documento": "98765432000121" }
}'status: "INDETERMINATE" -- use
GET /v1/nfe/atores-interessados/{transmissao_id} com o
transmissao_id devolvido no POST original.
Eventos RTC (Reforma Tributária)
A Reforma Tributária (IBS/CBS) define 16 eventos novos de NF-e. Esta página documenta os
7 que fazem sentido do lado de quem emite a nota (tpAutor=1,
Empresa Emitente). A CentralFiscal também expõe os 6 eventos do lado da
empresa destinatária (tpAutor=2) -- ver
Eventos RTC · como destinatário
na página de Manifestação do Destinatário. Os 3 que sobram são do lado de empresa sucessora em
fusão/aquisição ou do próprio Fisco -- fora do escopo do produto. Todos os 7 eventos desta
página seguem o mesmo padrão síncrono do Cancelamento/CC-e/Ator Interessado acima:
nenhum deles cancela nem altera a NF-e, ela continua AUTHORIZED
em caso de sucesso, só ganha o evento correspondente anexado.
Pagamento Integral (112110)
POST /v1/nfe/pagamentos-integrais -- "Informação de efetivo pagamento integral
para liberar crédito presumido do adquirente". É uma confirmação simples, no mesmo espírito
do Ator Interessado: o único dado que você envia é a chave_acesso (44 dígitos) da
NF-e referenciada -- a descrição do evento e o indicador de quitação são fixos, preenchidos
pela CentralFiscal.
curl -X POST https://areacliente.centralfiscal.com.br/v1/nfe/pagamentos-integrais \
-H "Authorization: Bearer cf_test_51JqK..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pagtointegral-nfe-0001" \
-d '{
"chave_acesso": "43260712345678000190550010000010011000010018"
}'Importação em ALC/ZFM (112120)
POST /v1/nfe/importacoes-alc-zfm -- "Importação em ALC/ZFM não convertida em
isenção" (Área de Livre Comércio / Zona Franca de Manaus). Item por item, em
itens[]: nItem, vIbs/vCbs (valor do
IBS/CBS que não atendeu aos requisitos da isenção) e qtde/unidade
(quantidade que não converteu).
curl -X POST https://areacliente.centralfiscal.com.br/v1/nfe/importacoes-alc-zfm \
-H "Authorization: Bearer cf_test_51JqK..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: importalczfm-nfe-0001" \
-d '{
"chave_acesso": "43260712345678000190550010000010011000010018",
"itens": [
{ "nItem": 1, "vIbs": 120.50, "vCbs": 45.10, "qtde": 3.5, "unidade": "UN" }
]
}'Perecimento no Transporte (112130)
POST /v1/nfe/perecimentos-transporte-fornecedor -- "Perecimento, perda, roubo ou
furto durante o transporte contratado pelo fornecedor". Item por item, em
itens[], cada item carrega dois pares de valor de imposto com
significado diferente -- não troque um pelo outro:
vIbsNotaFornecimento/vCbsNotaFornecimento-- valor do imposto na nota de fornecimento correspondente à quantidade perdida.qPerecimento/uPerecimento-- a quantidade perdida.vIbsEstornoCredito/vCbsEstornoCredito-- valor do crédito a estornar referente à aquisição (diferente do par acima).
curl -X POST https://areacliente.centralfiscal.com.br/v1/nfe/perecimentos-transporte-fornecedor \
-H "Authorization: Bearer cf_test_51JqK..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: perecimento-nfe-0001" \
-d '{
"chave_acesso": "43260712345678000190550010000010011000010018",
"itens": [
{
"nItem": 1,
"vIbsNotaFornecimento": 200.00, "vCbsNotaFornecimento": 80.00,
"qPerecimento": 5, "uPerecimento": "UN",
"vIbsEstornoCredito": 150.00, "vCbsEstornoCredito": 60.00
}
]
}'Fornecimento Não Realizado (112140)
POST /v1/nfe/fornecimentos-nao-realizados -- "Fornecimento não realizado com
pagamento antecipado". Item por item, em itens[]: nItem,
vIbs/vCbs (valor na nota de débito do pagamento antecipado
correspondente à quantidade não fornecida) e qNaoFornecida/uNaoFornecida.
curl -X POST https://areacliente.centralfiscal.com.br/v1/nfe/fornecimentos-nao-realizados \
-H "Authorization: Bearer cf_test_51JqK..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: fornecnaorealizado-nfe-0001" \
-d '{
"chave_acesso": "43260712345678000190550010000010011000010018",
"itens": [
{ "nItem": 1, "vIbs": 30.00, "vCbs": 12.00, "qNaoFornecida": 2, "uNaoFornecida": "UN" }
]
}'Previsão de Entrega (112150)
POST /v1/nfe/atualizacoes-previsao-entrega -- "Atualização da Data de Previsão de
Entrega". O mais simples dos 7: um único campo de negócio, data_previsao_entrega
(formato AAAA-MM-DD).
curl -X POST https://areacliente.centralfiscal.com.br/v1/nfe/atualizacoes-previsao-entrega \
-H "Authorization: Bearer cf_test_51JqK..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: prevendtrega-nfe-0001" \
-d '{
"chave_acesso": "43260712345678000190550010000010011000010018",
"data_previsao_entrega": "2026-10-15"
}'Crédito Presumido (211110)
POST /v1/nfe/solicitacoes-credito-presumido -- "Solicitação de Apropriação de
crédito presumido". Item por item, em itens[]: vBc (base de
cálculo) é obrigatório; ibs e/ou cbs trazem
codigoCreditoPresumido (tabela SEFAZ, 2 dígitos), percentualCreditoPresumido
e valorCreditoPresumido.
ibs/cbs. O schema oficial
tecnicamente permite os dois ausentes num item, mas um pedido de crédito presumido sem
IBS nem CBS não tem sentido de negócio nenhum -- a CentralFiscal rejeita o item se nenhum
dos dois vier preenchido.
curl -X POST https://areacliente.centralfiscal.com.br/v1/nfe/solicitacoes-credito-presumido \
-H "Authorization: Bearer cf_test_51JqK..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: credpresumido-nfe-0001" \
-d '{
"chave_acesso": "43260712345678000190550010000010011000010018",
"itens": [
{
"nItem": 1,
"vBc": 1000.00,
"ibs": { "codigoCreditoPresumido": "01", "percentualCreditoPresumido": 10, "valorCreditoPresumido": 100.00 },
"cbs": { "codigoCreditoPresumido": "02", "percentualCreditoPresumido": 5, "valorCreditoPresumido": 50.00 }
}
]
}'Consumo Pessoal (211120)
POST /v1/nfe/consumos-pessoais -- "Destinação de item para consumo pessoal".
Item por item, em itens[]: vIbs/vCbs (valor na nota de
aquisição correspondente à quantidade destinada a consumo pessoal),
qConsumo/uConsumo e chaveAcessoReferenciada/
nItemReferenciado -- a chave da nota emitida para o fornecimento e o item
correspondente nela.
tpAutor=1 (emitente) ou tpAutor=2 (destinatária), com a
regra "caso NF-e de Importação, informar 1=Empresa Emitente; demais casos, informar
2=Empresa destinatária". Nesta página (do ponto de vista do emitente) o padrão é
tpAutor=1, exclusivo do caso de NF-e de Importação. Para a variante
destinatária (tpAutor=2), informe "papel": "destinataria" no
corpo da requisição -- ver Consumo
Pessoal · como destinatário na página de Manifestação do Destinatário, que documenta
essa variante com o campo autorDocumento (quem assina o evento quando é o
destinatário, não o emitente original da nota).
curl -X POST https://areacliente.centralfiscal.com.br/v1/nfe/consumos-pessoais \
-H "Authorization: Bearer cf_test_51JqK..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: consumopessoal-nfe-0001" \
-d '{
"chave_acesso": "43260712345678000190550010000010011000010018",
"itens": [
{
"nItem": 1,
"vIbs": 40.00, "vCbs": 16.00,
"qConsumo": 1, "uConsumo": "UN",
"chaveAcessoReferenciada": "43260712345678000190550010000010021000010028",
"nItemReferenciado": 3
}
]
}'GET /v1/nfe/{recurso}/{transmissao_id} correspondente (ex.
GET /v1/nfe/pagamentos-integrais/{transmissao_id},
GET /v1/nfe/consumos-pessoais/{transmissao_id} etc.) usando o
transmissao_id devolvido no POST original.
O que ainda não existe
Estes grupos existem no leiaute oficial (nfe_v4.00.xsd) mas o motor não os
suporta hoje -- todos são nichos legítimos de baixo volume, sem previsão:
- NF-e avulsa -- emissão por órgão do Fisco em nome de terceiro.
- infIntermed -- identificação de intermediador/marketplace.
- exporta -- comprovante de exportação (DI, drawback).
- compra -- dados de nota de empenho/pedido de compra governamental.
- cana -- agroindústria canavieira (fechamento de safra).
- agropecuario -- produtos agropecuários animais/vegetais/florestais (NT 2024.003).
- infRespTec -- responsável técnico pelo sistema emissor.
- infSolicNFF -- Nota Fiscal Fácil (NT específica).
Próximos passos
- Baixar o XML e o DANFE usando as URLs em
detalhes. - Se precisar cancelar, ver
POST /v1/nfe/cancelamentosacima. - Se precisar corrigir dados sem cancelar, ver
POST /v1/nfe/cartas-correcaoacima. - Se precisar autorizar um terceiro a baixar o XML, ver
POST /v1/nfe/atores-interessadosacima. - Reconsultar mais tarde, se precisar:
GET /v1/nfe/emissoes/{transmissao_id}.