Documentação de Integração

v3.19
NF-e (mod 55)

Guia completo para integrar seu sistema com a ianfe e emitir NF-e (mod 55) via API.

Devolução (finNFe = 4) — a partir de 16/11/2026

Por força da NT 2025.002 v1.52, a nota de devolução deve referenciar a nota original item a item (grupo DFeReferenciado). A ianfe já gera o XML nesse formato. Para que a referência saia correta, envie nItemOriginal em todos os itens da devolução (ver seção "Finalidade da Nota (finNFe) e Devoluções").

Visão Geral

A ianfe é o intermediário entre o seu sistema e a SEFAZ. Você monta o payload, envia para os nossos endpoints, e nós cuidamos de tudo: assinatura digital, comunicação com a SEFAZ, tratamento de erros e retorno estruturado.

Você não precisa se preocupar com:

  • ✓ Certificado digital A1
  • ✓ Assinatura XML (C14N / RSA-SHA1)
  • ✓ SOAP / WebService da SEFAZ
  • ✓ Endpoints por estado

Você é responsável por:

  • ✓ Montar o payload conforme documentação
  • ✓ Controlar numeração sequencial das notas
  • ✓ Guardar chNFe, nProt e xmlProtocolo

Todas as operações usam o mesmo endpoint

POST https://ianfe.com.br/functions/operacaoFiscal
Content-Type: application/json

Body: {
  "secret_key": "...",
  "api_key": "...",
  "action": "transmitir" | "cancelar" | "corrigir" | "danfe",
  "modelo": "nfe",
  ...
}
O campo action define a operação: transmitir, cancelar, corrigir, inutilizar, danfe ou pre_danfe.

Importante: Segurança das Credenciais

Nunca exponha secret_key e api_key no frontend!

  • • Use sempre em backend (Node.js, Python, PHP, etc.)
  • • Armazene como variáveis de ambiente
  • • Nunca commit no Git ou exponha em código cliente
  • • Use HTTPS em todas as requisições
// ✅ CORRETO - Backend (Node.js)
const SECRET_KEY = process.env.IANFE_SECRET_KEY;
const API_KEY = process.env.IANFE_API_KEY;

// ❌ ERRADO - Frontend (React, Vue, etc.)
const SECRET_KEY = "sellerx_Ahot8B9MXuoy2R$W"; // NUNCA faça isso!

Timeout Recomendado

Configure timeout de 70 segundos em todas as chamadas para o endpoint https://ianfe.com.br/functions/operacaoFiscal.

A comunicação com a SEFAZ pode levar até 60 segundos em períodos de instabilidade. Um timeout menor pode causar falsos erros e duplicidade de notas.

// Node.js (axios)
axios.post(URL, payload, { timeout: 70000 })

// Python (requests)
requests.post(URL, json=payload, timeout=70)

// PHP (cURL)
curl_setopt($ch, CURLOPT_TIMEOUT, 70);

Tabela completa de endpoints

MétodoEndpointAutenticaçãoDescrição
POSThttps://ianfe.com.br/functions/operacaoFiscalbody: secret_key + api_keyOFICIAL — transmitir, cancelar, corrigir, inutilizar, danfe, pre_danfe
GETapi.ianfe.com.br/xml/:chaveheader: x-api-keyAlternativa — baixar XML pelo chNFe
GETapi.ianfe.com.br/danfe/:chaveheader: x-api-keyAlternativa — gerar DANFE pela chave
POSTapi.ianfe.com.br/danfeheader: x-api-keyAlternativa — gerar DANFE enviando xmlProtocolo
GETapi.ianfe.com.br/consultar/:chaveheader: x-api-keyAlternativa — consultar status pela chave
GETapi.ianfe.com.br/status-sefazheader: x-api-keyAlternativa — verificar disponibilidade da SEFAZ
Para as rotas GET, a api_key pode ser passada como header (x-api-key) ou query string (?api_key=...).

Operações disponíveis

OperaçãoactionMétodo/Endpoint
Emitir NF-e"transmitir"POST https://ianfe.com.br/functions/operacaoFiscal
Cancelar NF-e"cancelar"POST https://ianfe.com.br/functions/operacaoFiscal
Carta de Correção"corrigir"POST https://ianfe.com.br/functions/operacaoFiscal
Inutilizar Numeração"inutilizar"POST https://ianfe.com.br/functions/operacaoFiscal
Gerar DANFE (recomendado)"danfe"POST https://ianfe.com.br/functions/operacaoFiscal
Pré-DANFE (sem valor fiscal)"pre_danfe"POST https://ianfe.com.br/functions/operacaoFiscal
Baixar XML (alternativa)—GET api.ianfe.com.br/xml/:chave
DANFE pela chave (alternativa)—GET api.ianfe.com.br/danfe/:chave
Consultar NF-e (alternativa)—GET api.ianfe.com.br/consultar/:chave
Status SEFAZ (alternativa)—GET api.ianfe.com.br/status-sefaz
Endpoint único para operações fiscais: todas as ações de emissão, cancelamento, correção, inutilização e geração de DANFE/Pré-DANFE usam o mesmo endpoint POST https://ianfe.com.br/functions/operacaoFiscal, variando apenas o campo action. As rotas GET em api.ianfe.com.br são alternativas opcionais para download/consulta direta. O fluxo recomendado é usar action: "danfe" e armazenar o xmlProtocolo retornado na transmissão.

Checklist antes de enviar (NF-e)

✓ secret_key e api_key estão no body
✓ modelo: "nfe" (ou omitido — padrão é nfe)
✓ cnpj_emitente tem 14 dígitos, só números
✓ nota.serie sem zeros à esquerda ("10" não "010")
✓ nota.numero é sequencial e não foi usado antes
✓ nota.ambiente: "1" produção, "2" homologação
✓ destinatario: preenchido cpf OU cnpj, não os dois
✓ itens[].unidade em MAIÚSCULO ("UN" não "un")
✓ itens[].ncm com 8 dígitos numéricos
✓ itens[].quantidade e valorUnitario com 4 casas decimais
✓ itens[].valorTotal com 2 casas decimais
✓ total.vNF igual à soma dos valorTotal dos itens
✓ pagamento.detPag[].vPag = "0.00" se tPag = "90"
✓ Em homologação (ambiente="2"): destinatario.xNome = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO"
✓ PIS/COFINS CST 07: enviar apenas { "CST": "07" } (sem vBC/pPIS/vPIS)
✓ Não enviar indPag dentro de detPag (depreciado)
✓ tPag "99" (Outros): enviar "xPag" com a descrição real do meio de pagamento (ex: "PIX", "TRANSFERENCIA")
✓ transporte.transportadora só com modFrete 0, 1 ou 2, e com xNome + cnpj (ou cpf)
✓ Texto adicional da nota em nota.infAdic.infCpl (não em observacao/obs)
✓ Devolução (finNFe=4): nItemOriginal em todos os itens (obrigatório na prática a partir de 16/11/2026)
✓ Ler o campo "avisos" da resposta e corrigir o que for apontado
✓ Timeout da chamada HTTP configurado para 70 segundos

Regras de Schema (cStat 225)

Estas regras evitam a rejeição mais comum da SEFAZ (cStat 225 — Falha de Schema):

  • • PIS/COFINS no Simples Nacional (CST 07): enviar apenas { "CST": "07" } — NÃO incluir vBC, pPIS/pCOFINS, vPIS/vCOFINS. Esses campos com CST 07 causam falha de schema.
  • • Sanitização de texto: todos os campos de texto (emitente, destinatário, produtos, observações) passam por sanitização automática que remove caracteres de controle e não-ASCII (aspas curvas, travessões longos). Apenas ASCII imprimível + Latin-1 (0xA0–0xFF).
  • • Ordem dos blocos XML: cobranca deve vir antes de pagamento (exigência do schema v4.00). A ianfe ordena automaticamente — não se preocupe com a ordem no payload JSON.
  • • indPag depreciado: não enviar dentro de detPag. O campo foi removido do schema v4.00.
  • • tPag = "99" (Outros): a tag <xPag> é suportada pela ianfe. Envie xPag em detPag com a descrição real do meio de pagamento (ex: "PIX", "TRANSFERENCIA", "CASHBACK"). Se você omitir xPag, a ianfe usa "OUTROS" como texto de emergência para não travar a transmissão — mas o ideal é enviar a descrição real.
  • • tPag = "90" (Sem Pagamento): incoerente com venda com valor — mapeie para "15" (Boleto) quando houver valor.
  • • Bloco cobranca: só incluir quando houver cobrança real (boleto/parcelamento). Pagamentos à vista (Dinheiro/PIX/Cheque) não devem gerar o box FATURA no DANFE.
  • • chaveReferenciada: string de 44 dígitos para devolução/complementar/ajuste (1 nota referenciada por campo).

Importante: campo modelo

Envie sempre "modelo": "nfe" na raiz do payload. A ianfe opera exclusivamente com NF-e (modelo 55).

Configuração

Credenciais, URL base e webhook de retorno

1.1 Credenciais

CampoExemploUso
secret_keysellerx_Ahot8B9MXuoy2R$WIdentifica sua conta
api_keyyzV3C1hYWOAutoriza cada operação

Inclua ambas em todas as requisições, dentro do body JSON:

{
  "secret_key": "sellerx_Ahot8B9MXuoy2R$W",
  "api_key":    "yzV3C1hYWO",
  "modelo":     "nfe",
  ...
}

1.2 URL Base e Headers

Endpoint único (oficial):

Todas as operações fiscais — emissão, cancelamento, carta de correção, inutilização, DANFE e Pré-DANFE — usam um único endpoint:

POST https://ianfe.com.br/functions/operacaoFiscal
Content-Type: application/json

Body: {
  "secret_key": "...",
  "api_key":    "...",
  "action":     "transmitir | cancelar | corrigir | inutilizar | danfe | pre_danfe",
  "modelo":     "nfe",
  ...
}

O endpoint oficial é sempre https://ianfe.com.br/functions/operacaoFiscal. Todas as operações fiscais usam esse único POST, variando apenas o campo action. Não configure outra rota como equivalente ou fallback sem confirmação formal da ianfe. O webhook de retorno é uma URL do integrador para receber notificações, não uma rota de envio de operações fiscais.

Há também rotas GET opcionais no servidor fiscal api.ianfe.com.br para download/consulta direta pela chave de acesso. São alternativas de conveniência — o fluxo recomendado é armazenar o xmlProtocolo da resposta de transmissão e usar action: "danfe" para gerar o DANFE, dispensando chamadas GET.

TipoURL BaseRotas
POST (oficial — todas as operações)https://ianfe.com.br/functions/operacaoFiscalaction: transmitir, cancelar, corrigir, inutilizar, danfe, pre_danfe
GET (opcional — download/consulta)https://api.ianfe.com.br/xml/:chave, /danfe/:chave, /consultar/:chave, /status-sefaz
DANFE: o caminho recomendado é action: "danfe" no endpoint POST oficial (enviando o xmlProtocolo salvo). As rotas GET /danfe/:chave e POST /danfe em api.ianfe.com.br são alternativas válidas, mas exigem header x-api-key separado e não passam pela camada de validação de credenciais da ianfe.

1.3 Webhook de retorno (opcional)

Configure um webhook_url no painel para receber notificações automáticas após cada operação. Acesse em: ianfe.com.br/dashboard → Software Houses → Webhooks.

{
  "evento":       "transmitir",
  "timestamp":    "2026-05-16T14:30:00.000Z",
  "sucesso":      true,
  "cStat":        "100",
  "xMotivo":      "Autorizado o uso da NF-e",
  "nProt":        "135260000123456",
  "chNFe":        "35260512345678000199550010000001231234567890",
  "dhRecbto":     "2026-05-16T14:30:00-03:00",
  "xmlProtocolo": "<?xml version="1.0"...>",
  "detalhe":      ""
}

XML sempre retornado!

Toda resposta de action: "transmitir", "cancelar" e "corrigir" inclui o campo xmlProtocolo com o XML completo. Você pode armazená-lo diretamente sem precisar de chamada GET separada.

Tributação Automática

Cálculo inteligente de ICMS, PIS e COFINS (ianfe)

A API suporta três modos de tributação por item. A detecção é automática, item a item, no mesmo payload.

Modo 1 — Automático (sem tributos no payload)

Omita o campo icms do item (ou envie-o vazio). O servidor calculará ICMS, PIS e COFINS com base no CFOP, UF de origem, UF de destino e CRT do emitente.

Use quando: seu sistema não gerencia tributos fiscais diretamente.

{
  "itens": [
    {
      "codigo": "001",
      "descricao": "Notebook Dell",
      "ncm": "84713012",
      "cfop": "5102",
      "unidade": "UN",
      "quantidade": 1,
      "valorUnitario": 3500.00,
      "valorTotal": 3500.00
    }
  ]
}

O servidor responderá com os tributos calculados no xmlProtocolo.

Modo 2 — Controlado (com tributos no payload)

Preencha icms com CST (Regime Normal) ou CSOSN (Simples Nacional). O servidor usa seus valores sem alteração.

Use quando: seu sistema já calcula os tributos (ERP com motor fiscal próprio).

Critério de detecção: se icms.CST ou icms.CSOSN estiver presente e não vazio, o item é tratado como calculado e passa direto.

{
  "itens": [
    {
      "codigo": "001",
      "descricao": "Notebook Dell",
      "ncm": "84713012",
      "cfop": "5102",
      "unidade": "UN",
      "quantidade": 1,
      "valorUnitario": 3500.00,
      "valorTotal": 3500.00,
      "icms": {
        "CSOSN": "102",
        "orig": "0"
      },
      "pis":    { "CST": "07" },
      "cofins": { "CST": "07" }
    }
  ]
}

Modo 3 — Misto (combinado no mesmo pedido)

Alguns itens com icms preenchido, outros sem. O motor detecta por item:

  • Item com CST/CSOSN → passa exatamente como enviado
  • Item sem CST/CSOSN → calculado automaticamente pela tabela

Use quando: parte dos itens tem tributação especial (ex: ST já retida) e outra parte segue a regra geral.

Regras do cálculo automático

ParâmetroFonte
ICMS internoTabela por CFOP + UF do emitente
ICMS interestadualTabela por CFOP + região de destino (7% N/NE/CO, 12% S/SE)
ICMS com STCalculado por MVA da tabela (padrão 50%)
PIS/COFINS Simples NacionalCST 07 — isento
PIS/COFINS Regime NormalCST 01 — 0,65% PIS / 3,0% COFINS (cumulativo)
CRT do emitenteemitente.CRT do payload — 1 ou 2 = Simples, 3 = Normal

As alíquotas padrão são ponto de partida — valide por cenário fiscal.

O cálculo automático aplica alíquotas padrão por CFOP + UF + CRT. Esses valores cobrem a maioria das operações de venda, mas não substituem o motor fiscal do seu ERP em cenários específicos: substituição tributária (ST) com MVA ajustada por NCM, benefício fiscal estadual (redução de base, isenção), diferencial de alíquota (DIFAL) com partilha 2024, antecipação tributária, regimes setoriais (combustíveis, papel, etc.). Nesses casos, envie icms preenchido (Modo Controlado) — a ianfe respeita os valores que você informar. Sempre valide em homologação antes de ir a produção.

Simulação de tributos (action: simular_tributos) — NÃO IMPLEMENTADO

⚠️ Esta action NÃO existe no backend fiscal atual. Não há rota, handler ou lógica correspondente no servidor. Se você (ERP ou IA) enviar action: "simular_tributos", a requisição falhará — não use até que este aviso seja removido.

~~Calcula ICMS, PIS, COFINS (e IBS/CBS para CRT=3) sem transmitir para a SEFAZ.~~ (recurso planejado, não disponível)

Para validar tributos hoje, a única forma confiável é usar action: "pre_danfe" (gera PDF de conferência, incluindo os tributos calculados, sem transmitir à SEFAZ — ver seção XML, DANFE e Pré-DANFE).

{
  "secret_key":    "sellerx_Ahot8B9MXuoy2R$W",
  "api_key":       "yzV3C1hYWO",
  "action":        "simular_tributos",
  "modelo":        "nfe",
  "cnpj_emitente": "37850573000114",
  "nota": {
    "naturezaOperacao": "VENDA DE MERCADORIA",
    "serie": "1",
    "numero": "999",
    "ambiente": "2",
    "destinatario": {
      "cnpj": "98765432000100",
      "xNome": "EMPRESA XYZ LTDA",
      "uf": "SP"
    },
    "itens": [
      {
        "nItem": 1,
        "codigo": "P01",
        "descricao": "Produto Exemplo",
        "ncm": "84713012",
        "cfop": "5102",
        "unidade": "UN",
        "quantidade": "1.0000",
        "valorUnitario": "1000.0000",
        "valorTotal": "1000.00"
      }
    ]
  }
}
{
  "sucesso": true,
  "simulacao": true,
  "crt": "3",
  "regime": "Regime Normal",
  "uf_origem": "SP",
  "uf_destino": "SP",
  "interestadual": false,
  "aliquota_interestadual": null,
  "itens": [
    {
      "nItem": 1,
      "codigo": "P01",
      "descricao": "Produto Exemplo",
      "valorTotal": "1000.00",
      "icms":   { "CST": "00", "orig": "0", "modBC": "3", "vBC": "1000.00", "pICMS": 18, "vICMS": "180.00" },
      "pis":    { "CST": "01", "vBC": "1000.00", "pPIS": "0.65", "vPIS": "6.50" },
      "cofins": { "CST": "01", "vBC": "1000.00", "pCOFINS": "3.00", "vCOFINS": "30.00" },
      "ibscbs": {
        "CST": "01", "cClassTrib": "01099", "vBC": "1000.00",
        "pCBS": 0.90, "vCBS": "9.00",
        "pIBSUF": 0.10, "vIBSUF": "1.00",
        "pIBSMun": 0, "vIBSMun": "0.00",
        "vIBS": "1.00"
      },
      "_simulado": true,
      "_motivo": "Calculado automaticamente (Regime Normal, CRT=3, interna 18% + IBS/CBS 2026)"
    }
  ],
  "totais": {
    "vICMS": "180.00",
    "vPIS": "6.50",
    "vCOFINS": "30.00",
    "vCBS": "9.00",
    "vIBS": "1.00",
    "vTotalTributos": "226.50"
  },
  "observacao": "Simulação de tributos — sem transmissão para a SEFAZ. Valores calculados com base nas alíquotas padrão 2026. Para operações reais, use action: \"transmitir\"."
}

Itens que já possuem icms.CST ou icms.CSOSN no payload são retornados com _simulado: false — a ianfe respeita os tributos informados pelo ERP. Apenas itens sem tributo recebem cálculo automático (_simulado: true).

Tabela de alíquotas

As alíquotas são configuradas em src/data/aliquotas.json no servidor. Alterações entram em vigor imediatamente, sem reiniciar o processo.

Para atualizar a alíquota de ICMS interno do CFOP 5102 em SP:

PATCH /tributos/aliquotas/5102
x-admin-token: SEU_TOKEN
{ "por_uf": { "SP": { "pICMS": 13.3 } } }

Decisão rápida para o desenvolvedor ou IA

Meu sistema calcula tributos?
├── SIM → envie icms.CST ou icms.CSOSN em cada item → Modo controlado
├── NÃO → omita o campo icms → Modo automático
└── PARCIALMENTE → preencha apenas os itens que você controla → Modo misto

Estrutura do Payload

Detalhes sobre os campos comuns (destinatario, itens, totais, transporte, pagamento)

Objeto: nota.destinatario

CampoTipoObrigatoriedadeRegras
cpfstringcondicionalInformar cpf OU cnpj. Omitir ambos = consumidor não identificado.
cnpjstringcondicionalSomente dígitos.
xNomestringopcionalSe omitido, será preenchido como "CONSUMIDOR NAO IDENTIFICADO".
indIEDeststringopcionalPadrão: "9" (não contribuinte). Use "1" para contribuinte com IE.
iestringopcionalIE do destinatário. Obrigatório somente se indIEDest = "1".
emailstringopcionalE-mail para envio automático do XML e DANFE.
telefonestringopcionalTelefone do destinatário (DDD + número). Será impresso no DANFE ao lado do nome/razão social.
logradourostringopcionalSe omitido, usa endereço do emitente.
numerostringopcionalNúmero do endereço.
bairrostringopcional
cMunstringopcionalCódigo IBGE do município.
xMunstringopcionalNome do município.
ufstringopcionalSigla da UF (ex: "SP").
cepstringopcionalCEP (somente dígitos). Se "00000000", usa o CEP do emitente.
Pessoa Física sem IE: Não envie o campo ie no destinatário. Envie apenas cpf e indIEDest: "9". Nunca envie ie: "" ou ie: null — isso causa rejeição cStat 225 na SEFAZ.
🔴 IE informada mas descartada silenciosamente: se você enviar destinatario.ie preenchida mas não enviar indIEDest, a ianfe usa o padrão "9" (não contribuinte) — e como IE só é incluída no XML quando indIEDest = "1", a Inscrição Estadual que você mandou é descartada sem nenhum aviso ou erro. Se o destinatário for contribuinte de ICMS com IE válida, sempre envie indIEDest: "1" explicitamente junto com ie.

Objeto: nota.itens[]

CampoTipoObrigatoriedadeDescrição
nItemnumberobrigatórioNúmero sequencial do item (começa em 1).
codigostringobrigatórioCódigo interno do produto.
descricaostringobrigatórioDescrição do produto (máx 120 chars).
ncmstringobrigatórioNCM/SH do produto (somente dígitos, 8 posições).
cfopstringobrigatórioCFOP (4 dígitos). Ex: "5102".
unidadestringobrigatórioUnidade comercial. Sempre MAIÚSCULO. Ex: "UN", "KG".
quantidadestringobrigatórioQuantidade com 4 casas decimais. Ex: "1.0000".
valorUnitariostringobrigatórioValor unitário com 4 casas decimais. Ex: "99.9900".
valorTotalstringobrigatórioValor total do item com 2 casas decimais. Ex: "99.99".
observacaostringopcionalObservação livre do item (máx 500 chars). Também aceita obs ou infAdProd. Ver detalhes abaixo.
icmsobjectopcionalSe omitido, a ianfe calcula automaticamente (Modo Automático).
pisobjectopcionalSe omitido, calculado automaticamente.
cofinsobjectopcionalSe omitido, calculado automaticamente.
ibscbsobjectcondicionalDados de IBS e CBS por item. Obrigatório apenas para CRT=3 (Regime Normal) a partir de 03/08/2026. Se omitido, a ianfe calcula automaticamente com as alíquotas padrão do período de teste 2026 (CBS = 0,90% / IBS = 0,10%). Para CRT=1/2/4 (Simples Nacional e MEI), não enviar — causa rejeição na SEFAZ até 2027. Ver seção IBS e CBS para detalhes.

Campo observacao — observação por item

Texto livre associado a um item específico (ex: cor, tamanho, número de série, instrução de manuseio). Esse campo é opcional — itens sem observação não sofrem nenhuma alteração.

Onde aparece: a observação é gravada no XML oficial da nota, na tag <infAdProd> dentro do item correspondente — portanto fica registrada permanentemente no documento autorizado pela SEFAZ.

No DANFE e na Pré-DANFE, a observação aparece como uma segunda linha, em fonte menor e em itálico, logo abaixo da descrição do produto, dentro da mesma célula.

Exemplo — item com observação:

{
  "nItem": 1,
  "codigo": "266",
  "descricao": "TIRANTE",
  "ncm": "84529099",
  "cfop": "5102",
  "unidade": "UN",
  "quantidade": "4.0000",
  "valorUnitario": "47.0000",
  "valorTotal": "188.00",
  "observacao": "Lote 2026-A — garantia 90 dias",
  "icms": { "CSOSN": "102", "orig": "0" }
}

Objeto: nota.total

Envie os totais calculados pelo seu sistema. Se não enviados, a ianfe calcula automaticamente a partir dos itens.

CampoTipoDescrição
vNFstringValor total da nota (obrigatório se enviar total).
vProdstringValor total dos produtos.
vBCstringBase de cálculo ICMS. Default: "0.00".
vICMSstringValor do ICMS. Default: "0.00".
vDescstringValor de desconto. Default: "0.00".
vFretestringValor do frete. Default: "0.00".
vIBSTotstringcondicional · CRT=3 apenas. Valor total do IBS de todos os itens. Se omitido, a ianfe soma automaticamente os valores de IBS de cada item.
vCBSTotstringcondicional · CRT=3 apenas. Valor total da CBS de todos os itens. Se omitido, a ianfe soma automaticamente os valores de CBS de cada item.

Despesas, Frete e Rateio Automático

Para que o frete, seguro, desconto ou outras despesas saiam destacados no DANFE e no XML, o seu ERP só precisa continuar mandando o valor total da despesa no objeto total (ex: total.vFrete). O rateio automático entre os itens agora é feito automaticamente pelo servidor, nenhuma mudança é necessária no ERP.

"total": {
  "vFrete": "50.00",
  "vDesc": "10.00"
}

Se um dia o ERP quiser controlar a despesa individualmente por item (em vez de ratear), basta incluir o campo desejado em cada objeto do array itens.

DespesaCampos aceitos no item
Frete"frete", "valorFrete", "vFrete"
Seguro"seguro", "valorSeguro", "vSeg"
Desconto"desconto", "valorDesconto", "vDesc"
Outras Despesas"outras", "valorOutras", "vOutro"
"itens": [
  {
    "nItem": 1,
    "codigo": "266",
    "descricao": "TIRANTE",
    "valorTotal": "188.00",
    "frete": "15.00",
    "desconto": "2.50"
  }
]

Objeto: nota.pagamento.detPag[]

CampoTipoDescrição
tPagstringForma de pagamento. Ver tabela de referência. Use "90" para Sem Pagamento. Use "99" para Outros (exige xPag).
vPagstringValor pago. Se tPag = "90", enviar "0.00".
xPagstringopcional · Obrigatório quando tPag = "99" (Outros). Descrição livre do meio de pagamento (ex: "PIX", "TRANSFERENCIA", "CASHBACK"). Se omitido com tPag = "99", a ianfe preenche "OUTROS" automaticamente.

Objeto: nota.cobranca — fatura e duplicatas

opcionalUse quando a venda tiver faturamento com parcelas/duplicatas (ex: vendas a prazo com boleto). Se a nota não tiver duplicatas, simplesmente omita este objeto.

CampoTipoDescrição
faturaobjectDados gerais da fatura. Também aceita o nome "fat".
duplicatasarrayLista de parcelas/duplicatas. Também aceita o nome "dup" (objeto único ou array).

Subcampos de fatura:

CampoTipoDescrição
nFatstringNúmero da fatura.
vOrigstringValor original da fatura.
vDescstringValor de desconto. Default: "0.00".
vLiqstringValor líquido da fatura (após desconto).

Subcampos de cada item em duplicatas[]:

CampoTipoDescrição
nDupstringNúmero da duplicata/parcela. Ex: "001", "002".
dVencstringData de vencimento, formato AAAA-MM-DD.
vDupstringValor da duplicata/parcela.

Onde aparece: os dados de cobrança geram a tag oficial <cobr> no XML da nota (ficando registrados permanentemente no documento autorizado pela SEFAZ) e são exibidos no DANFE e na Pré-DANFE numa seção própria, posicionada entre o bloco do Transportador e a tabela de Produtos.

Exemplo — fatura com uma duplicata:

"cobranca": {
  "fatura": {
    "nFat": "11235",
    "vOrig": "2220.00",
    "vDesc": "0.00",
    "vLiq": "2220.00"
  },
  "duplicatas": [
    { "nDup": "001", "dVenc": "2026-08-02", "vDup": "2220.00" }
  ]
}

Exemplo — fatura parcelada em 3x:

"cobranca": {
  "fatura": { "nFat": "11240", "vOrig": "900.00", "vDesc": "0.00", "vLiq": "900.00" },
  "duplicatas": [
    { "nDup": "001", "dVenc": "2026-07-15", "vDup": "300.00" },
    { "nDup": "002", "dVenc": "2026-08-15", "vDup": "300.00" },
    { "nDup": "003", "dVenc": "2026-09-15", "vDup": "300.00" }
  ]
}

Objeto: nota.transporte

Só modFrete é obrigatório. Se transporte for omitido, a ianfe assume modFrete = "9" (sem frete).

CampoTipoObrigatórioDescrição
modFretestringsim0 = Emitente (CIF), 1 = Destinatário (FOB), 2 = Terceiros, 3 = Próprio do remetente, 4 = Próprio do destinatário, 9 = Sem frete. Alias: modalidadeFrete.
transportadoraobjetonãoSó é enviada à SEFAZ com modFrete 0, 1 ou 2 e se tiver xNome e (cnpj ou cpf). Sem isso é descartada (a ianfe devolve um aviso em avisos). Alias: transporta.
veiculoobjetonãoplaca, uf, RNTC. Só com modFrete 0, 1 ou 2. Alias: veicTransp.
volumesobjeto/arraynãoUm volume (objeto) ou vários (array). Alias: vol.

Campos de transportadora:

xNome (alias nome), cnpj/CNPJ ou cpf/CPF, ie, xEnder (alias endereco), xMun (alias municipio), uf. Atenção: o nome da empresa deve vir em xNome. O campo razaoSocial não é lido nesse bloco.

Campos de cada volume:

quantidade (ou qVol), especie (ou esp; padrão "VOLUME"), marca, numeracao (ou nVol), pesoBruto (ou pesoB), pesoLiquido (ou pesoL). O volume só é gerado se tiver pelo menos quantidade, marca, numeração ou algum peso.

Transporte por conta do emitente/destinatário sem transportadora (frete próprio, retirada): envie só modFrete (e, se quiser, veiculo e volumes).

Exemplo — frete por conta do destinatário, com transportadora, veículo e volume

"transporte": {
  "modFrete": "1",
  "transportadora": {
    "xNome": "TRANSPORTES EXEMPLO LTDA",
    "cnpj": "00000000000191",
    "ie": "123456789",
    "xEnder": "RUA A, 100",
    "xMun": "FRANCA",
    "uf": "SP"
  },
  "veiculo": { "placa": "ABC1D23", "uf": "SP" },
  "volumes": [
    {
      "quantidade": 1,
      "especie": "CAIXA",
      "marca": "SUA_MARCA",
      "numeracao": "123456",
      "pesoBruto": 1.500,
      "pesoLiquido": 1.200
    }
  ]
}
Não combine modFrete: "3"/"4"/"9" com transportadora: nesses modos a transportadora é descartada (rejeição SEFAZ cStat 845).

Formato de Data/Hora de Emissão (dhEmi)

O campo dhEmi deve seguir estritamente o padrão UTC sem milissegundos (TDateTimeUTC).

A SEFAZ rejeita datas com milissegundos no validador XSD (cStat 225 — Falha de Schema).

FormatoExemploAceito?
UTC sem milissegundos2026-10-14T19:20:27Z✅ Sim
UTC com fuso (sem ms)2026-10-14T19:20:27-03:00✅ Sim
UTC com milissegundos2026-10-14T19:20:27.429Z❌ Rejeitado (cStat 225)
Se você omitir dhEmi, a ianfe gera automaticamente a data/hora atual no formato correto. Só envie se o seu ERP controla a data de emissão manualmente.

Objeto: nota.infAdic

Informações adicionais da nota. Envie dentro de nota, no objeto infAdic (alias do objeto: informacoesAdicionais, como objeto).

CampoTipoDescrição
infCplstringInformações complementares de interesse do contribuinte (máx. 5.000 caracteres). Sai no quadro "Dados adicionais" do DANFE.
infAdFiscostringInformações adicionais de interesse do Fisco (máx. 2.000 caracteres).
"infAdic": { "infCpl": "Pedido nº 9988 - entregar no periodo da manha", "infAdFisco": "" }

Regras:

  • • Textos enviados em outros campos (observacao, obs, informacoesComplementares, infCpl solto na raiz da nota) ou como texto solto em informacoesAdicionais não entram na nota. A ianfe devolve um aviso em avisos quando isso acontece.
  • • O texto passa pela sanitização geral (remove caracteres de controle e não-ASCII).
  • • A observação por item é outro campo (itens[].observacao, vai em infAdProd).

Emitir NF-e (mod 55)

action: "transmitir" · modelo: "nfe" — POST https://ianfe.com.br/functions/operacaoFiscal

Payload Completo (Controlado)

Ideal para quando seu sistema já calcula os tributos (ERP com motor fiscal próprio). Envie os campos de icms, pis e cofins preenchidos e a ianfe os usará sem alteração.

{
  "secret_key":    "sellerx_Ahot8B9MXuoy2R$W",
  "api_key":       "yzV3C1hYWO",
  "action":        "transmitir",
  "modelo":        "nfe",
  "invoice_id":    "SEU-ID-INTERNO-001",
  "cnpj_emitente": "37850573000114",
  "url_logotipo":  "https://cdn.suaempresa.com/logo.png",

  "nota": {
    "naturezaOperacao": "VENDA DE MERCADORIA",
    "serie": "1",
    "numero": "123",
    "ambiente": "1",

    "destinatario": {
      "cpf": "25063007830",
      "cnpj": "",
      "xNome": "João da Silva",
      "indIEDest": "9",
      "IE": "",
      "telefone": "1133334444",
      "cMun": "3550308",
      "xMun": "SAO PAULO",
      "uf": "SP",
      "cep": "01310100",
      "logradouro": "Rua Augusta",
      "numero": "500",
      "complemento": "",
      "bairro": "Consolação"
    },

    "itens": [
      {
        "nItem": 1,
        "codigo": "PROD001",
        "descricao": "Camiseta Masculina Algodão",
        "ncm": "61091000",
        "cfop": "5102",
        "unidade": "UN",
        "quantidade": "2.0000",
        "valorUnitario": "75.0000",
        "valorTotal": "150.00",
        "icms": { "CSOSN": "102", "orig": "0" },
        "pis":    { "CST": "07" },
        "cofins": { "CST": "07" }
      }
    ],

    "total": {
      "vBC": "0.00", "vICMS": "0.00", "vICMSDeson": "0.00",
      "vFCP": "0.00", "vBCST": "0.00", "vST": "0.00",
      "vFCPST": "0.00", "vFCPSTRet": "0.00",
      "vProd": "150.00", "vFrete": "0.00", "vSeg": "0.00",
      "vDesc": "0.00", "vII": "0.00", "vIPI": "0.00",
      "vIPIDevol": "0.00", "vPIS": "0.00", "vCOFINS": "0.00",
      "vOutro": "0.00", "vNF": "150.00"
    },

    "transporte": { "modFrete": "9" },

    "pagamento": {
      "detPag": [
        { "tPag": "01", "vPag": "150.00" }
      ]
    },

    "infAdic": {
      "infCpl": "Pedido nº 9988",
      "infAdFisco": ""
    }
  }
}

Payload Parcial (Automático)

Ideal para quando seu sistema não gerencia tributos. Omita o campo icms e a ianfe calculará tudo automaticamente baseado no CFOP, UF e CRT do emitente.

{
  "secret_key":    "sellerx_Ahot8B9MXuoy2R$W",
  "api_key":       "yzV3C1hYWO",
  "action":        "transmitir",
  "modelo":        "nfe",
  "cnpj_emitente": "37850573000114",
  "nota": {
    "naturezaOperacao": "VENDA DE MERCADORIA",
    "serie": "1",
    "numero": "123",
    "ambiente": "1",
    "destinatario": {
      "cpf": "25063007830",
      "xNome": "João da Silva",
      "uf": "SP"
    },
    "itens": [
      {
        "nItem": 1,
        "codigo": "PROD001",
        "descricao": "Camiseta",
        "ncm": "61091000",
        "cfop": "5102",
        "unidade": "UN",
        "quantidade": "2.0000",
        "valorUnitario": "75.0000",
        "valorTotal": "150.00"
      }
    ],
    "total": { "vNF": "150.00", "vProd": "150.00" },
    "pagamento": {
      "detPag": [
        { "tPag": "01", "vPag": "150.00" }
      ]
    }
  }
}

Payload Híbrido (Misto)

Você pode enviar tributos apenas nos itens que desejar (ex: um item com ST retida) e omitir nos demais. A ianfe calcula os itens sem tributos e respeita os itens que foram enviados preenchidos no mesmo pedido.

{
  "itens": [
    {
      "nItem": 1,
      "descricao": "Item COM tributo calculado por você",
      "cfop": "5405",
      "icms": { "CSOSN": "500", "orig": "0" },
      "valorTotal": "100.00"
    },
    {
      "nItem": 2,
      "descricao": "Item SEM tributo (ianfe vai calcular para você)",
      "cfop": "5102",
      "valorTotal": "50.00"
    }
  ]
}

cBenef e CEST — benefícios fiscais e Substituição Tributária por item

Comuns em segmentos com incentivo fiscal estadual (ex: pescados, EPI com CA no Ministério do Trabalho, entre outros) ou sujeitos a ICMS-ST.

🔴 cBenef não é simplesmente "opcional" — é OBRIGATÓRIO sempre que o CST/CSOSN do item indicar algum tipo de benefício fiscal

(redução de base de cálculo, isenção com benefício, crédito presumido, diferimento com benefício, etc. — depende da legislação da UF e do produto). Omitir cBenef quando o CST exige causa rejeição real da SEFAZ:

Rejeicao: CST com beneficio fiscal e nao informado o codigo de beneficio fiscal [nItem:N]

Isso não é um bug da ianfe — o campo já é aplicado corretamente sempre que enviado; a rejeição significa que o ERP usou um CST que precisa do código, mas não mandou o código. Não existe uma lista fixa de "quais CSTs exigem cBenef" válida para todo o Brasil — depende do convênio/benefício específico daquela operação, do produto (NCM) e da UF. Se sua operação usa uma redução de base, isenção parcial, ou qualquer benefício fiscal concedido por convênio/protocolo ICMS, consulte o código de benefício aplicável (tabela do Convênio ICMS 190/2017, publicada por UF) antes de montar o item.

CampoOnde vaiTipoDescrição
item.icms.cBenefdentro do objeto icms do itemstring (até 10 chars)Código de Benefício Fiscal na UF, conforme Convênio ICMS 190/2017. Funciona com qualquer CST ou CSOSN — não precisa mudar o resto do bloco icms.
item.cestdireto no item (fora do icms)string (7 dígitos)Código Especificador da Substituição Tributária (Convênio ICMS 142/2018). Obrigatório quando o produto está sujeito a ICMS-ST ou consta na tabela oficial de CEST.

Exemplo — item com redução de base de cálculo + benefício fiscal + CEST:

{
  "codigo": "CAM01",
  "descricao": "CAMARAO CONGELADO",
  "ncm": "03061700",
  "cest": "1706400",
  "cfop": "6102",
  "unidade": "KG",
  "quantidade": "100.0000",
  "valorUnitario": "30.0000",
  "valorTotal": "3000.00",
  "icms": {
    "CST": "20",
    "orig": "0",
    "modBC": "3",
    "pRedBC": "41.18",
    "vBC": "1764.60",
    "pICMS": "17.00",
    "vICMS": "300.00",
    "cBenef": "SC830001"
  }
}
Importante: o código de benefício certo para cada operação (CST, cBenef, percentual de redução, CEST) depende da legislação da UF, do NCM do produto e da natureza exata da operação — a ianfe transmite qualquer combinação tecnicamente válida, mas não determina qual é a combinação fiscalmente correta para o seu caso. Confirme sempre com seu contador/consultoria tributária.

Operações que exigem mais de uma NF-e (ex: remessa e retorno de industrialização)

Fluxos como "remessa para industrialização por encomenda" (ex: CFOP 5.901), seguido do retorno do produto industrializado (ex: CFOP 5.124) e de uma nota separada cobrando o serviço de beneficiamento, não são uma funcionalidade especial da API — são simplesmente múltiplas chamadas independentes a action: "transmitir", cada uma com seu próprio CFOP, natureza de operação e itens. A ianfe não faz nenhuma vinculação automática entre notas desse tipo (exceto quando você usa explicitamente o mecanismo de NFref — ver seção NFref — para casos como devolução, onde a nota referencia a chave da NF-e original).

total.vBC / vICMS — não precisa calcular, mas se calcular tem que bater

🔴 Causa comum de rejeição: "Total da BC ICMS difere do somatório dos itens". Você não precisa enviar total.vBC, total.vICMS, total.vBCST nem total.vST — a ianfe soma automaticamente a partir do vBC/vICMS/vBCST/vICMSST de cada item. Mas se você enviar esses campos manualmente, o valor tem que bater exatamente com a soma dos itens — a SEFAZ rejeita qualquer divergência. Na dúvida, é mais seguro simplesmente não enviar e deixar a ianfe calcular.

infRespTec — Responsável Técnico (obrigatório em várias UFs)

Identifica, para a SEFAZ, qual empresa de software é responsável pela emissão da nota (medida antifraude). Não é sobre o emitente nem sobre o destinatário — é sobre quem desenvolve/opera o sistema de emissão.

CampoTipoObrigatórioDescrição
cnpjstringobrigatório (se enviar o grupo)CNPJ da empresa de software responsável técnica.
xContatostring (até 60 chars)obrigatórioNome da pessoa de contato técnico.
emailstring (até 60 chars)obrigatórioE-mail de contato técnico.
fonestring (até 14 dígitos)obrigatórioTelefone de contato técnico.
idCSRTstringopcionalIdentificador do CSRT (só use se sua empresa tiver token emitido pela SEFAZ).
csrtTokenstringopcionalToken bruto do CSRT — se enviado com idCSRT, a ianfe calcula o hash automaticamente (SHA-1 em Base64).
CSRTstringopcionalHash já calculado, se preferir calcular por fora em vez de enviar csrtToken.

Os 4 campos básicos são obrigatórios em conjunto — se faltar cnpj, xContato, email ou fone, a ianfe descarta o grupo inteiro (não gera infRespTec nenhum), e a SEFAZ segue cobrando o grupo se a UF exigir.

Envie na raiz do payload (fora de nota, ao lado de emitente/empresa) — funciona também dentro de nota.infRespTec, mas a raiz é mais comum:

{
  "nota": { "...": "..." },
  "emitente": { "...": "..." },
  "empresa": { "...": "..." },
  "infRespTec": {
    "cnpj": "11222333000181",
    "xContato": "NOME DO CONTATO TECNICO",
    "email": "contato@suaempresa.com.br",
    "fone": "4700000000"
  }
}

✅ Injeção automática pela ianfe: a software house pode cadastrar os 4 campos do Responsável Técnico uma única vez no painel da ianfe (aba Dados da Software House). Quando o ERP não envia o bloco infRespTec na nota, a ianfe injeta automaticamente os dados cadastrados — emitentes em UFs que exigem o grupo (PR e outras) passam a funcionar sem nenhuma alteração no ERP. Se o ERP já enviar o bloco, ele prevalece sobre o cadastro.

Importante: o CNPJ aqui normalmente é o da própria software house/API fiscal responsável pela emissão (não muda por cliente/nota) — vale configurar como valor fixo do seu lado em vez de recalcular por transmissão.

ICMS por regime tributário

Simples Nacional (CSOSN):

"icms": { "CSOSN": "102", "orig": "0" }

// CSOSN mais comuns:
// "102" — Tributado, sem crédito ✅
// "400" — Não tributado pelo Simples
// "101" — Tributado com crédito
// "500" — ST cobrado anteriormente
// "103" — Isenção para faixa de receita bruta
// "201" — ST com permissão de crédito
// "202" — ST sem permissão de crédito
// "203" — Isenção para faixa de receita bruta com ST
// "300" — Imune
// "900" — Outros (grupo genérico)

Regime Normal (CST):

"icms": {
  "CST":   "00",
  "orig":  "0",
  "modBC": "3",
  "vBC":   "150.00",
  "pICMS": "18.00",
  "vICMS": "27.00"
}

PIS e COFINS

Simples Nacional (CST 07):

"pis":    { "CST": "07" },
"cofins": { "CST": "07" }

Regime Normal (CST 01):

"pis":    { "CST": "01", "vBC": "150.00", "pPIS": "0.65", "vPIS": "0.98" },
"cofins": { "CST": "01", "vBC": "150.00", "pCOFINS": "3.00", "vCOFINS": "4.50" }

CFOPs mais comuns

CFOPUso
5102Venda de mercadoria — cliente no mesmo estado
6102Venda de mercadoria — cliente em outro estado
5405Venda com ST — cliente no mesmo estado
5910Remessa para demonstração

Meios de pagamento (tPag)

CódigoDescrição
"01"Dinheiro
"02"Cheque
"03"Cartão de crédito
"04"Cartão de débito
"05"Crédito loja
"10"Vale alimentação
"15"Boleto bancário
"17"PIX
"90"Sem pagamento (remessa, bonificação) → vPag: "0.00". Incoerente com venda com valor — mapeie para "15" (Boleto) quando houver valor.
"99"Outros — xPag OBRIGATÓRIO com a descrição real do meio (ex: "PIX", "TRANSFERENCIA", "CASHBACK"). Se omitir xPag, a ianfe usa "OUTROS" como texto de emergência.

Resposta — Autorizada (200)

{
              "sucesso":      true,
              "autorizada":   true,
              "cStat":        "100",
              "xMotivo":      "Autorizado o uso da NF-e",
              "nProt":        "135260000123456",
              "chNFe":        "35260512345678000199550010000001231234567890",
              "dhRecbto":     "2026-05-16T14:30:00-03:00",
              "tpEmis":       "1",
              "contingencia": false,
              "svc":          null,
              "motivoContingencia": null,
              "jobId":        "nfe_12345678000199_1716825600000",
              "xmlProtocolo": "<?xml version="1.0"...>"
              }
Salve imediatamente: chNFe, nProt, xmlProtocolo, dhRecbto e tpEmis. O XML deve ser armazenado por 5 anos por lei.
CampoTipoDescrição
sucessobooleanOperação completou (verdadeiro ou falso)
autorizadabooleanNota foi autorizada (true = sucesso)
cStatstringCódigo de status da SEFAZ
xMotivostringDescrição do status
nProtstringNúmero do protocolo de autorização
chNFestringChave de acesso (44 dígitos) — salve por 5 anos
dhRecbtostringData/hora do recebimento pela SEFAZ
tpEmisstring"1" = normal, "4" = contingência SVC-RS, "5" = contingência SVC-AN
contingenciabooleantrue = nota autorizada em contingência — retransmita em até 7 dias
svcstring"svc-rs" ou "svc-an" quando contingencia = true
motivoContingenciastringMotivo da contingência se aplicável
xmlProtocolostringXML completo com protocolo — salve por 5 anos
avisosarrayTextos gerados pela ianfe quando ajustou ou descartou algo do payload. A nota é transmitida mesmo assim. Leia e corrija o ERP. Pode ser [].
alertasarrayMensagens { cMsg, xMsg } devolvidas pela SEFAZ junto da autorização (ex.: cStat 120, autorizada com alerta).

Avisos mais comuns:

  • • emitente.CRT não informado — a ianfe assumiu 1 (Simples). Envie o CRT real.
  • • transportadora ignorada: modFrete=... — enviada com modFrete 3, 4 ou 9.
  • • transportadora ignorada: é obrigatório informar xNome... — faltou xNome ou CNPJ/CPF (ou veio em razaoSocial).
  • • texto adicional ignorado (enviado em: ...) — texto fora de nota.infAdic.infCpl.
  • • devolução sem nItemOriginal — item de devolução sem o número do item original.
  • • total.vNF do ERP difere do somatório dos itens — a ianfe usou a soma dos itens.

Erros de payload (HTTP 400, origem: "payload") trazem a lista completa em erros[]; nada foi enviado à SEFAZ.

Cancelar NF-e

action: "cancelar" — POST https://ianfe.com.br/functions/operacaoFiscal

Prazo: até 24 horas após a autorização. A justificativa deve ter no mínimo 15 caracteres.
🔴 ambiente é OBRIGATÓRIO e precisa ser o MESMO em que a nota foi emitida. Homologação e produção são bancos de dados completamente separados na SEFAZ — uma chave autorizada em homologação não existe para a SEFAZ em produção, e vice-versa. Enviar o cancelamento no ambiente errado é rejeitado com "Chave de Acesso inexistente", uma mensagem que não deixa óbvio que o problema é o ambiente. Se você não enviar ambiente, a ianfe recusa a requisição direto com um erro claro em vez de adivinhar.

Cancelar NF-e

{
               "secret_key":    "sellerx_Ahot8B9MXuoy2R$W",
               "api_key":       "yzV3C1hYWO",
               "action":        "cancelar",
               "modelo":        "nfe",
               "invoice_id":    "SEU-ID-INTERNO-001",
               "cnpj_emitente": "37850573000114",
               "ambiente":      "1",

               "cancelamento": {
               "chave":  "35260512345678000199550010000001231234567890",
               "numero": 123,
               "nProt":  "135260000123456",
               "xJust":  "Cancelamento a pedido do cliente por duplicidade de pedido"
               }
               }

Campos — cancelamento

Os 3 campos obrigatórios para cancelar são: ambiente, cancelamento.chave e cancelamento.numero.

CampoTipoObrigatórioDescrição
ambientestringSim"1" = Produção, "2" = Homologação. Precisa ser IDÊNTICO ao ambiente em que a nota original foi emitida. Aceito na raiz do payload ou dentro de cancelamento.ambiente.
cancelamento.chavestringSimchNFe retornado na autorização (44 dígitos).
cancelamento.numeronumberSimNúmero da nota (aceita também como nNF). A ianfe confere se bate com o número embutido na própria chave (posições 25-33) — se não bater, rejeita antes de gastar uma chamada à SEFAZ.
cancelamento.nProtstringSimnProt retornado na autorização.
cancelamento.xJuststringSimJustificativa (mínimo 15, máximo 255 caracteres).

Resposta — Cancelamento registrado (200)

{
  "sucesso":      true,
  "autorizada":   true,
  "cStat":        "135",
  "xMotivo":      "Evento registrado e vinculado a NF-e",
  "nProt":        "135260000654321",
  "dhRecbto":     "2026-05-16T15:00:00-03:00",
  "jobId":        "cancel_12345678000199_1716825600000",
  "xmlProtocolo": "<?xml version="1.0"...>"
}

O campo xmlProtocolo contém o XML do evento de cancelamento. Armazene junto com o XML original da nota.

Resposta — Erro no cancelamento (422)

{
  "sucesso":    false,
  "autorizada": false,
  "erro":       "Evento não permitido",
  "cStat":      "242",
  "xMotivo":    "Cancelamento fora do prazo",
  "detalhe":    "Cancelamento permitido apenas em até 24 horas após a autorização",
  "chNFe":      "35260512345678000199550010000001231234567890",
  "dhRecbto":   "2026-05-16T14:30:00-03:00"
}

Carta de Correção — CC-e

action: "corrigir" · modelo: "nfe" — POST https://ianfe.com.br/functions/operacaoFiscal

Cada nota pode ter até 20 cartas de correção (nSeqEvento de 1 a 20). O texto deve ter no mínimo 15 caracteres.
🔴 ambiente é OBRIGATÓRIO e precisa ser o MESMO em que a nota foi emitida — mesma regra do cancelamento: homologação e produção são bancos de dados separados na SEFAZ. Enviar a CC-e no ambiente errado é rejeitado com "Chave de Acesso inexistente". Se ambiente não vier em lugar nenhum do payload, a ianfe recusa direto com erro claro em vez de adivinhar.

Formato simplificado (emitente já cadastrado)

{
              "secret_key":    "sellerx_Ahot8B9MXuoy2R$W",
              "api_key":       "yzV3C1hYWO",
              "action":        "corrigir",
              "modelo":        "nfe",
              "cnpj_emitente": "37850573000114",
              "ambiente":      "1",

              "correcao": {
              "chave":      "35260512345678000199550010000001231234567890",
              "nSeqEvento": 1,
              "xCorrecao":  "Correcao no campo de observacoes da nota fiscal"
              }
              }

Formato completo (emitente com certificado enviado a cada requisição)

Use quando o seu sistema gerencia o certificado digital diretamente. Ver seção Objeto emitente para todos os campos aceitos.

{
              "ambiente": "1",
              "emitente": {
              "cnpj": "37850573000114",
              "certificadoBase64": "MIIKX...",
              "senhaCertificado": "1234"
              },
              "correcao": {
              "chave":      "35260512345678000199550010000001231234567890",
              "nSeqEvento": 1,
              "xCorrecao":  "Correcao no campo de observacoes da nota fiscal"
              }
              }

Campos — correção

CampoTipoObrigatórioDescrição
ambientestringSim"1" = Produção, "2" = Homologação. Precisa ser IDÊNTICO ao ambiente em que a nota original foi emitida. Aceito na raiz do payload ou dentro de correcao.ambiente.
correcao.chavestringSimChave de acesso da NF-e (44 dígitos).
correcao.xCorrecaostringSimTexto da correção. Mínimo 15 caracteres, máximo 1000.
correcao.nSeqEventonumberNão (padrão 1)Sequência da correção. Começa em 1, incrementa a cada nova CC-e na mesma nota (máximo 20). Se enviar uma 2ª CC-e usando nSeqEvento: 1 de novo, a SEFAZ rejeita.
correcao.ufstringNãoSigla da UF do emitente, usada para rotear ao webservice correto. Se omitido, a ianfe usa a UF do objeto emitente.
correcao.cUFstringNãoCódigo IBGE da UF (2 dígitos, ex: "35" para SP). Derivado automaticamente de uf se omitido — normalmente não precisa enviar.
correcao.cnpjstringNãoCNPJ do emitente, caso não venha via emitente.cnpj ou empresa.cnpj.
Nota: O campo xml (XML original) presente em versões anteriores desta documentação não é necessário. A ianfe localiza o XML automaticamente pela chave de acesso.

O que pode e o que não pode ser corrigido

Pode corrigir:

  • ✓ Informações complementares (infCpl)
  • ✓ Dados do transporte (transportadora, placa)
  • ✓ Código do produto (sem mudar valor)
  • ✓ Dados do pedido de compra

Não pode corrigir:

  • ✗ Valor total, base de cálculo, alíquota
  • ✗ Dados do destinatário (nome, CPF/CNPJ, endereço)
  • ✗ Data de emissão ou saída
  • ✗ Natureza da operação

Resposta — CC-e registrada (200)

{
  "sucesso":      true,
  "autorizada":   true,
  "cStat":        "135",
  "xMotivo":      "Evento registrado e vinculado a NF-e",
  "nProt":        "135260000789012",
  "dhRecbto":     "2026-05-16T16:00:00-03:00",
  "jobId":        "cce_12345678000199_1716825600000",
  "xmlProtocolo": "<?xml version="1.0"...>"
}

O XML da CC-e (xmlProtocolo) deve ser armazenado junto com o XML da NF-e original. A carta de correção não substitui o XML original — ambos devem ser mantidos.

Resposta — Erro na CC-e (422)

{
  "sucesso":    false,
  "autorizada": false,
  "erro":       "Evento não permitido",
  "cStat":      "242",
  "xMotivo":    "Cancelamento fora do prazo",
  "detalhe":    "A CC-e deve ser enviada enquanto a nota ainda estiver dentro do prazo de validade"
}

Inutilização de Numeração NF-e

action: "inutilizar" · modelo: "nfe" — POST https://ianfe.com.br/functions/operacaoFiscal

O que é a Inutilização?

A inutilização permite declarar à SEFAZ que uma faixa de numeração de NF-e não será utilizada. É obrigatória quando há lacunas na sequência de numeração de notas emitidas.

Regras importantes:

  • • Só pode ser feita para números que nunca foram transmitidos
  • • A justificativa deve ter mínimo 15 caracteres
  • • É uma operação irreversível — os números não poderão ser usados após a inutilização

Payload completo

{
  "secret_key":    "sellerx_Ahot8B9MXuoy2R$W",
  "api_key":       "yzV3C1hYWO",
  "action":        "inutilizar",
  "modelo":        "nfe",
  "invoice_id":    "SEU-ID-INTERNO-001",
  "cnpj_emitente": "04395449000157",

  "inutilizacao": {
    "cnpj":     "04395449000157",
    "uf":       "SP",
    "serie":    1,
    "nNFIni":   50,
    "nNFFin":   55,
    "xJust":    "Numeração inutilizada por erro no sistema de emissão",
    "ambiente": 1,
    "ano":      "26"
  }
}
CampoTipoObrigatórioDescrição
inutilizacao.cnpjstringSimCNPJ do emitente (14 dígitos)
inutilizacao.ufstringNãoUF (padrão: UF do emitente)
inutilizacao.serienumberNãoSérie da NF-e (padrão: 1)
inutilizacao.nNFIninumberSimNúmero inicial da faixa a inutilizar
inutilizacao.nNFFinnumberSimNúmero final da faixa (igual ao inicial para 1 nota)
inutilizacao.xJuststringSimJustificativa (mín. 15, máx. 255 caracteres)
inutilizacao.ambientenumberNão1 = Produção, 2 = Homologação (padrão: 1)
inutilizacao.anostringNãoAno com 2 dígitos (padrão: ano atual, ex: "26")

Resposta — Inutilização homologada (200)

{
  "sucesso":      true,
  "autorizada":   true,
  "jobId":        "inut_04395449000157_1716820000000",
  "cStat":        "102",
  "xMotivo":      "Inutilização de número homologado",
  "nProt":        "135260000000001",
  "dhRecbto":     "2026-05-28T10:30:00-03:00",
  "xmlProtocolo": "<?xml version="1.0"...inutNFeProc..."
}
CampoDescrição
sucessotrue se inutilização aprovada
autorizadatrue se cStat = 102
jobIdID do job para rastreamento nos logs
cStatCódigo de status da SEFAZ (102 = sucesso)
xMotivoDescrição do status
nProtNúmero do protocolo de inutilização
dhRecbtoData/hora do recebimento pela SEFAZ
xmlProtocoloXML completo da resposta SEFAZ — salve por 5 anos

Resposta — Rejeição pela SEFAZ (422)

{
  "sucesso":    false,
  "autorizada": false,
  "jobId":      "inut_04395449000157_1716820000000",
  "cStat":      "227",
  "xMotivo":    "Rejeição: Número inicial maior que final",
  "detalhe":    "Rejeição SEFAZ: Número inicial maior que final (cStat 227)"
}

Resposta — Erro de validação (400)

{
  "sucesso": false,
  "erro":    "inutilizacao.nNFIni e nNFFin são obrigatórios.",
  "jobId":   "inut_..."
}
ErroCausa
inutilizacao.cnpj é obrigatórioCNPJ não informado
inutilizacao.nNFIni e nNFFin são obrigatóriosFaixa de números não informada
inutilizacao.xJust deve ter no mínimo 15 caracteresJustificativa muito curta
O certificado digital não foi fornecidoCertificado ausente no emitente

Códigos de Status da SEFAZ

cStatSignificado
102✅ Inutilização homologada
225❌ Falha no Schema XML
227❌ Número inicial maior que final
228❌ Número final maior que permitido
241❌ Um ou mais números já utilizados
243❌ Número(s) já inutilizado(s) anteriormente
573❌ Duplicidade de inutilização

Exemplo — Node.js

const axios = require('axios');

async function inutilizarNumeracao(serie, nNFIni, nNFFin, justificativa) {
  const { data } = await axios.post('https://ianfe.com.br/functions/operacaoFiscal', {
    secret_key: 'sellerx_Ahot8B9MXuoy2R$W',
    api_key:    'yzV3C1hYWO',
    action:     'inutilizar',
    modelo:     'nfe',
    cnpj_emitente: '04395449000157',
    inutilizacao: {
      cnpj:   '04395449000157',
      uf:     'SP',
      serie:  serie,
      nNFIni: nNFIni,
      nNFFin: nNFFin,
      xJust:  justificativa,
    }
  }, { timeout: 70000 });

  if (data.sucesso) {
    console.log('Inutilização homologada:', data.nProt);
    // Salvar data.xmlProtocolo no banco (5 anos)
    return data;
  } else {
    throw new Error(data.xMotivo || data.erro);
  }
}

// Inutilizar uma única nota:
await inutilizarNumeracao(1, 50, 50, 'Número pulado por erro no sistema de emissão');

// Inutilizar faixa de números (50 até 55):
await inutilizarNumeracao(1, 50, 55, 'Numeração inutilizada por erro no sistema de emissão');

Tratamento de Erros

Tabela de códigos HTTP

HTTPSituaçãoO que fazer
200Operação autorizada pela SEFAZSalvar chNFe, nProt, xmlProtocolo
422Rejeitada pela SEFAZ ou modelo inválidoLer "detalhe" e corrigir o dado indicado
400Payload inválido ou ação não permitidaLer "erro" e corrigir o campo
403Credenciais inválidas ou plano inativoVerificar secret_key e api_key
404CNPJ emitente não cadastradoCadastrar o emitente no painel ianfe
504SEFAZ e contingência falharamAmbas as rotas (estadual + SVC) retornaram erro — tente novamente ou entre em contato

Resposta 422 — Rejeição da SEFAZ

O HTTP 422 é retornado quando a SEFAZ rejeita a nota. O corpo da resposta traz o código de status (cStat), o motivo da rejeição e um campo detalhe com orientação para correção:

{
  "sucesso":    false,
  "autorizada": false,
  "cStat":      "225",
  "xMotivo":    "Rejeição: Falha no Schema XML",
  "detalhe":    "Verifique se os campos obrigatórios estão presentes e no formato correto (ex: notasReferenciadas como array de objetos para finNFe=4)"
}
O campo detalhe traz uma mensagem textual com a causa mais provável. Para erros de schema (cStat 225), verifique a estrutura do payload — especialmente notasReferenciadas (deve ser um array de objetos [{ "refNFe": "..." }], não uma string simples) e os grupos de ICMS (cada CST exige sua tag XML específica: ICMS00, ICMS10, ICMS40, ICMS60, etc.).

Erros mais comuns e como resolver

MensagemCausaSolução
CNPJ emitente não cadastradoCNPJ não está na sua lista de emitentesCadastrar no painel ianfe
Rejeição: Regime Tributário diverge (481)CRT na ianfe diverge do cadastro SEFAZVerificar o regime real da empresa
Rejeição: Regime Tributário diverge (481)CRT na ianfe diverge do cadastro SEFAZVerificar o regime real da empresa
Rejeição: Chave de Acesso inválida (237)chave informada está incorretaCopiar o chNFe exato da autorização
Rejeição: NF-e sem IE do destinatário (728)Destinatário contribuinte (indIEDest="1") sem campo "ie"Enviar "ie" com a Inscrição Estadual
Rejeição: Duplicidade de NF-e (204)Número já foi usado nessa sérieNF-e já autorizada — recuperar protocolo
série deve ser sem zeros à esquerda"010" no lugar de "10"Remover zeros à esquerda
unidade deve ser maiúscula"un" no lugar de "UN".toUpperCase() antes de enviar

cStat especiais — tratamento obrigatório

cStatSignificadoAção
100AutorizadaSalvar protocolo ✅
150Autorizada fora do prazoTratar igual ao 100 ✅
204Duplicidade — nota já autorizadaTratar como autorizada, recuperar protocolo ✅
135Evento registrado (cancel / CC-e)Sucesso ✅
OutrosRejeiçãoCorrigir e retransmitir ❌

Erros específicos — action: danfe

{
  "sucesso": false,
  "erro":    "XML inválido ou mal formado",
  "detalhe": "XML não contém elemento nfeProc ou está corrompido"
}
ErroCausaSolução
XML inválidoXML não é um nfeProc válidoUse xmlProtocolo completo da resposta de transmissão
XML corrompidoXML foi modificado ou truncadoRecupere do banco ou retransmita a nota

Resumo completo das respostas

Campos comuns em TODAS as respostas:

  • • sucesso: boolean — operação completou
  • • autorizada: boolean (se aplicável) — SEFAZ autorizou
  • • cStat: string — código de status da SEFAZ
  • • xMotivo: string — descrição do status
  • • chNFe: string — chave de acesso (44 dígitos)
  • • nProt: string — número do protocolo
  • • dhRecbto: string — data/hora do recebimento
  • • xmlProtocolo: string — XML completo (sempre retornado em transmitir/cancelar/corrigir)
  • • erro: string (apenas em erro) — descrição do problema
  • • detalhe: string (apenas em erro) — detalhes para correção

XML, DANFE e Pré-DANFE

Baixar o XML, gerar documento impresso oficial e pré-visualização sem valor fiscal

Baixar XML — GET /xml/:chave

O XML deve ser armazenado por 5 anos por lei. Salve o xmlProtocolo da resposta de transmissão imediatamente.
GET https://ianfe.com.br/xml/35260512345678000199550010000001231234567890
x-api-key: yzV3C1hYWO

// Ou via query string (links diretos no browser):
GET https://ianfe.com.br/xml/35260512345678000199550010000001231234567890?api_key=yzV3C1hYWO

Dica importante:

Você não precisa usar GET /xml/:chave se já armazenou o xmlProtocolo retornado na action: "transmitir". O XML da resposta já é completo e válido para todos os fins legais.

Gerar DANFE / Cupom — GET /danfe/:chave

GET https://ianfe.com.br/danfe/35260512345678000199550010000001231234567890
x-api-key: yzV3C1hYWO

// Abrir em nova aba (link direto):
window.open('https://ianfe.com.br/danfe/' + chNFe + '?api_key=' + API_KEY, '_blank');

NF-e → PDF A4. O formato é detectado automaticamente pelo modelo da nota.

Gerar DANFE pelo XML — POST /danfe

POST https://ianfe.com.br/danfe
x-api-key: yzV3C1hYWO
Content-Type: application/json

{
  "xmlProtocolo": "<?xml version="1.0"...>",
  "url_logotipo": "https://cdn.suaempresa.com/logo.png"
}

Logotipo no DANFE

ItemRequisito
FormatoPNG ou JPG
Tamanho recomendado300 × 100 px (proporção 3:1)
FundoTransparente (PNG) ou branco
Tamanho máximo500 KB
AcessoURL pública (sem autenticação)
Cadastre a URL da logo no painel em Emitentes → Editar → Logo (URL), ou envie via campo url_logotipo direto no payload de transmissão.

Logotipo via payload (prioridade)

{
  "secret_key":    "sellerx_Ahot8B9MXuoy2R$W",
  "api_key":       "yzV3C1hYWO",
  "action":        "transmitir",
  "modelo":        "nfe",
  "cnpj_emitente": "37850573000114",
  "url_logotipo":  "https://cdn.suaempresa.com/logo.png",
  "nota": { ... }
}
O campo url_logotipo na raiz do payload tem prioridade sobre o cadastrado no painel, permitindo logotipos diferentes por emissão se necessário.

Gerar DANFE via POST https://ianfe.com.br/functions/operacaoFiscal (action: danfe) — RECOMENDADO

Forma recomendada para gerar DANFE de notas já autorizadas!

Use action: "danfe" quando você já possui o xmlProtocolo da nota transmitida. É ideal para gerar DANFE sem precisar fazer chamada GET separada.

Atenção ao Payload!

Para gerar o DANFE, não reenvie o objeto nota com itens e produtos usado na transmissão. Envie apenas o xmlProtocolo. O envio de campos não oficiais (como documentoOficial ou semValorFiscal) causará erro 500 no processamento.

{
  "secret_key":    "sellerx_Ahot8B9MXuoy2R$W",
  "api_key":       "yzV3C1hYWO",
  "action":        "danfe",
  "modelo":        "nfe",
  "invoice_id":    "SEU-ID-INTERNO-001",
  "cnpj_emitente": "37850573000114",
  "url_logotipo":  "https://cdn.suaempresa.com/logo.png",
  "imprimir_marca_dagua": false,
  
  "xmlProtocolo": "<?xml version="1.0" encoding="UTF-8"?>
<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="4.00">
  <NFe>...</NFe>
  <protNFe>...</protNFe>
</nfeProc>"
}
CampoNívelTipoObrigatórioDescrição
actionraizstringSimDeve ser "danfe"
modeloraizstringSim"nfe" — define o formato do documento (NF-e mod 55)
cnpj_emitenteraizstringSimCNPJ do emitente (14 dígitos)
invoice_idraizstringNãoSeu identificador interno da nota
url_logotiporaizstringNãoURL da logomarca para o DANFE
imprimir_marca_daguaraizbooleanNãoSe true, imprime marca d'água "SEM VALOR FISCAL" no DANFE. Padrão: false. Útil para reimpressões, cópias ou ambiente de homologação.
xmlProtocoloraizstringSimXML completo da NF-e autorizada (obtido na transmissão)

Marca d'água no DANFE

O parâmetro imprimir_marca_dagua também é aceito nas rotas POST /danfe e GET /danfe/:chave (via query string ?imprimir_marca_dagua=true). Quando omitido, o padrão é false (sem marca d'água).

Pré-DANFE (antes da transmissão)

Endpoint Único: Assim como a transmissão, a Pré-DANFE utiliza o endpoint oficial https://ianfe.com.br/functions/operacaoFiscal. A funcionalidade é ativada exclusivamente pelo envio do campo "action": "pre_danfe".

Gera um PDF de conferência com os dados da nota sem transmitir para a SEFAZ, sem consumir numeração e sem qualquer valor fiscal. O PDF traz marca d'água "PRÉ-VISUALIZAÇÃO — SEM VALOR FISCAL". Ideal para o cliente revisar antes de confirmar a emissão.

{
  "secret_key":    "sellerx_Ahot8B9MXuoy2R$W",
  "api_key":       "yzV3C1hYWO",
  "action":        "pre_danfe",
  "modelo":        "nfe",
  "cnpj_emitente": "37850573000114",
  "nota": { ...mesmo payload da transmissão... }
}

Resposta — DANFE / Pré-DANFE gerado (200)

{
  "sucesso":     true,
  "danfe_url":   "https://www.ianfe.com.br/danfe/pdf/abc123xyz...",
  "pdf_base64":  "JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBS...",
  "chNFe":       "35260512345678000199550010000001231234567890",
  "modelo":      "nfe",
  "formato":     "A4",
  "mensagem":    "DANFE gerado com sucesso"
}
CampoTipoDescrição
sucessobooleanDANFE foi gerado com sucesso
danfe_urlstringURL temporária para download do PDF (válida por 24h)
pdf_base64stringPDF em base64 para armazenamento ou envio direto
chNFestringChave de acesso da nota (44 dígitos)
modelostring"nfe" = A4
formatostringFormato do documento gerado
mensagemstringMensagem descritiva do resultado

Como usar a resposta:

  • • danfe_url: Use para download direto ou abrir em nova aba
  • • pdf_base64: Decodifique e salve no seu banco, ou envie por email/WhatsApp

Fluxo recomendado

1. Transmite a nota → recebe { chNFe, nProt, xmlProtocolo }
2. Salva xmlProtocolo no seu banco (obrigatório por 5 anos)
3. Para imprimir: 
   → Opção A: POST https://ianfe.com.br/functions/operacaoFiscal com action="danfe" (RECOMENDADO)
   → Opção B: GET api.ianfe.com.br/danfe/{chNFe} (alternativa — link direto)
4. Para backup / reimpressão: Use o xmlProtocolo salvo com action="danfe"

Contingência Automática — SEFAZ Virtual (SVC-AN / SVC-RS)

O motor ianfe detecta automaticamente quando a SEFAZ do estado está indisponível e ativa a contingência de forma transparente

14.1 O que é a contingência

Quando a SEFAZ estadual cai ou fica instável, a legislação permite transmitir as notas para a SEFAZ Virtual de Contingência.

SiglaNome completoUsado por
SVC-ANSEFAZ Virtual Contingência — Ambiente Nacional (Brasília)SP, MG, GO, MT, MS, AM, BA e demais
SVC-RSSEFAZ Virtual Contingência — Rio Grande do SulPR, SC, RS

14.2 Como o motor detecta e aciona a contingência

O motor tenta a SEFAZ estadual com timeout de 10 segundos. Se não responder em 10s — ou retornar código de instabilidade — automaticamente tenta a SVC-AN ou SVC-RS com timeout normal de 30s.

Situações que acionam a contingência:

  • Timeout de rede após 10s
  • Erro de conexão (ECONNREFUSED, ENOTFOUND, etc.)
  • SEFAZ responde com cStat 108 (paralisada momentaneamente)
  • SEFAZ responde com cStat 109 (paralisada sem prazo)
  • SEFAZ responde com cStat 999 (erro não catalogado)

14.3 O que é Contingência?

Quando a SEFAZ estadual (Ex: SP, MG, RJ) fica indisponível, a ianfe automaticamente tenta a SEFAZ Contingencial (SVC — Serviço de Valores Contingenciados). Há dois provedores: SVC-RS (Rio Grande do Sul) e SVC-AN (Ambiente Nacional).

SVCQuando usadoEstados
SVC-RSFallback padrão em contingênciaTodos os estados (exceto aqueles com SVC-AN obrigatório)
SVC-ANContingência nacional complementarUsado quando SVC-RS também falha ou em situações específicas

14.2 Situações que acionam Contingência

A ianfe ativa contingência automaticamente em:

  1. SEFAZ estadual indisponível — o servidor da SEFAZ do estado está down
  2. Timeout da SEFAZ estadual — resposta demora mais de 60 segundos
  3. Erro 507 (Serviço Indisponível) — SEFAZ retorna indisponibilidade
  4. Rejeitada com cStat = 999 — erro genérico da SEFAZ (rede ou infraestrutura)
  5. Certificado expirado ou inválido — impossível assinar no SEFAZ estadual

14.3 Resposta em Contingência

{
  "sucesso":             true,
  "autorizada":          true,
  "cStat":               "100",
  "xMotivo":             "Autorizado o uso da NF-e",
  "nProt":               "135260000123456",
  "chNFe":               "35260512345678000199550010000001231234567890",
  "dhRecbto":            "2026-05-16T14:30:00-03:00",
  "tpEmis":              "4",
  "contingencia":        true,
  "svc":                 "svc-rs",
  "motivoContingencia":  "SEFAZ SP indisponível",
  "xmlProtocolo":        "<?xml version="1.0"...>"
}
contingencia: true significa que a nota foi autorizada pela SVC, não pela SEFAZ estadual. Você tem até 7 dias para retransmitir este lote para a SEFAZ estadual quando ela voltar online.

14.4 Como identificar na resposta

{
              "sucesso":             true,
              "autorizada":          true,
              "cStat":               "100",
              "xMotivo":             "Autorizado o uso da NF-e",
              "nProt":               "135260000123456",
              "chNFe":               "35260512345678000199550010000001231234567890",
              "dhRecbto":            "2026-05-16T14:30:00-03:00",
              "xmlProtocolo":        "<?xml version="1.0"...>",
              "contingencia":        true,
              "svc":                 "SVC-AN",
              "tpEmis":              "6",
              "motivoContingencia":  "TIMEOUT_SEFAZ:nfe.fazenda.sp.gov.br"
              }
CampoNormalContingência
contingenciafalsetrue
svcnull"SVC-AN" ou "SVC-RS"
tpEmis"1""6" (SVC-AN) ou "7" (SVC-RS)
motivoContingencianullMotivo da falha estadual

14.5 O que você deve fazer quando contingencia: true

1. Salvar a nota normalmente — chNFe, nProt, xmlProtocolo são válidos
              2. Registrar no seu banco que tpEmis = "6" ou "7"
              3. Guardar o flag contingencia = true
              4. Quando a SEFAZ estadual voltar:
              → Retransmitir o lote para a SEFAZ estadual (exigência legal)
              → Prazo: até 168 horas (7 dias)
              5. Após retransmitir: atualizar o registro da nota com tpEmis = "1"
O DANFE e o XML gerados são válidos mesmo em contingência. A nota tem validade jurídica — o destinatário pode receber a mercadoria com o DANFE impresso normalmente.

14.6 Em código — como tratar

const resposta = await emitirNFe(nota);

              if (resposta.sucesso) {
              // Salva sempre — válido em qualquer caso
              await salvarNota({
              chNFe:        resposta.chNFe,
              nProt:        resposta.nProt,
              xmlProtocolo: resposta.xmlProtocolo,
              tpEmis:       resposta.tpEmis || '1',
              contingencia: resposta.contingencia || false,
              svc:          resposta.svc || null,
              });

              // Alerta se foi em contingência
              if (resposta.contingencia) {
              console.warn(`Nota emitida em contingência (${resposta.svc}).`);
              console.warn('Retransmitir para SEFAZ estadual quando voltar.');
              }
              }

14.7 Quando a contingência também falha

Retorno: HTTP 504 Service Unavailable

Significa que:

  • ✗ SEFAZ estadual falhou
  • ✗ SVC-AN ou SVC-RS também falhou

O que fazer: Aguarde alguns minutos e tente novamente. A indisponibilidade simultânea é rara e geralmente se resolve em menos de 30 minutos.

14.8 Fluxo Normal vs Contingência

AspectoNormal (tpEmis=1)Contingência (tpEmis=6 ou 7)
SEFAZ usadaSEFAZ Estadual (SP, MG, RJ...)SVC-AN ou SVC-RS
chNFe válidaSim, imediatamenteSim, imediatamente
Protocolo válidoSim (pode consultar em tempo real)Sim (consultar em até 7 dias)
Prazo de retransmissãoSem prazo (já está autorizada)Até 7 dias para SEFAZ estadual
DANFE pode imprimirSimSim (com aviso de contingência)
Ação do desenvolvedorSalvar e continuarSalvar tpEmis, retransmitir em até 7 dias

14.9 Tabela completa de endpoints

MétodoEndpointAutenticaçãoDescrição
POSThttps://ianfe.com.br/functions/operacaoFiscalbody: secret_key + api_keyOFICIAL — transmitir, cancelar, corrigir, inutilizar, danfe, pre_danfe
GETapi.ianfe.com.br/xml/:chaveheader: x-api-keyAlternativa — baixar XML pelo chNFe
GETapi.ianfe.com.br/danfe/:chaveheader: x-api-keyAlternativa — gerar DANFE pela chave
POSTapi.ianfe.com.br/danfeheader: x-api-keyAlternativa — gerar DANFE pelo xmlProtocolo
Para as rotas GET /xml e GET /danfe, a api_key pode ser passada como header x-api-key ou como query string ?api_key=yzV3C1hYWO (útil para links diretos no browser).

Exemplos de Código

Node.js, Python e PHP — NF-e (mod 55)

Node.js / JavaScript (axios)

const axios = require('axios');

const IANFE_URL     = 'https://ianfe.com.br/functions/operacaoFiscal';
const SECRET_KEY    = process.env.IANFE_SECRET_KEY;
const API_KEY       = process.env.IANFE_API_KEY;
const CNPJ_EMITENTE = '37850573000114';

// Emitir NF-e — repassa transporte e infAdic como o ERP montou
async function emitirNFe(nota) {
  const { data } = await axios.post(IANFE_URL, {
    secret_key: SECRET_KEY, api_key: API_KEY,
    action: 'transmitir', modelo: 'nfe',
    invoice_id: nota.id, cnpj_emitente: CNPJ_EMITENTE,
    nota: {
      naturezaOperacao: nota.natureza || 'VENDA DE MERCADORIA',
      serie: nota.serie, numero: String(nota.numero), ambiente: '1',
      destinatario: nota.destinatario, itens: nota.itens,
      total: nota.total,
      transporte: nota.transporte || { modFrete: '9' },
      pagamento: nota.pagamento,
      infAdic: nota.infAdic || { infCpl: nota.infCpl || '' },
    },
  }, { timeout: 70000 });
  if (data.avisos && data.avisos.length) console.warn('Avisos ianfe:', data.avisos);
  return data;
}

// Cancelar NF-e (ambiente deve ser o mesmo da emissão)
async function cancelar(chNFe, numero, nProt, motivo) {
  const { data } = await axios.post(IANFE_URL, {
    secret_key: SECRET_KEY, api_key: API_KEY,
    action: 'cancelar', modelo: 'nfe', cnpj_emitente: CNPJ_EMITENTE,
    ambiente: '1',
    cancelamento: { chave: chNFe, numero, nProt, xJust: motivo },
  }, { timeout: 70000 });
  return data;
}

// Carta de Correção
async function corrigirNFe(chNFe, nSeqEvento, textoCorrecao) {
  const { data } = await axios.post(IANFE_URL, {
    secret_key: SECRET_KEY, api_key: API_KEY,
    action: 'corrigir', modelo: 'nfe', cnpj_emitente: CNPJ_EMITENTE,
    ambiente: '1',
    correcao: { chave: chNFe, nSeqEvento, xCorrecao: textoCorrecao },
  }, { timeout: 70000 });
  return data;
}

// Gerar DANFE a partir do XML já autorizado (xmlProtocolo na raiz)
async function gerarDanfe(xmlProtocolo, invoiceId, urlLogo, marcaDagua = false) {
  const { data } = await axios.post(IANFE_URL, {
    secret_key: SECRET_KEY, api_key: API_KEY,
    action: 'danfe', modelo: 'nfe',
    invoice_id: invoiceId, cnpj_emitente: CNPJ_EMITENTE,
    url_logotipo: urlLogo,
    imprimir_marca_dagua: marcaDagua,
    xmlProtocolo,
  }, { timeout: 70000 });
  return data; // data.danfe_url, data.pdf_base64
}

Python

import requests

IANFE_URL      = 'https://ianfe.com.br/functions/operacaoFiscal'
SECRET_KEY    = 'sellerx_Ahot8B9MXuoy2R$W'
API_KEY       = 'yzV3C1hYWO'
CNPJ_EMITENTE = '37850573000114'

def emitir_nfe(nota: dict) -> dict:
    payload = {
        'secret_key': SECRET_KEY, 'api_key': API_KEY,
        'action': 'transmitir', 'modelo': 'nfe',
        'invoice_id': nota.get('id'), 'cnpj_emitente': CNPJ_EMITENTE,
        'nota': {
            'naturezaOperacao': nota.get('natureza', 'VENDA DE MERCADORIA'),
            'serie': nota['serie'], 'numero': str(nota['numero']),
            'ambiente': '1', 'destinatario': nota['destinatario'],
            'itens': nota['itens'], 'total': nota['total'],
            'transporte': nota.get('transporte', {'modFrete': '9'}),
            'pagamento': nota['pagamento'],
            'infAdic': nota.get('infAdic', {'infCpl': nota.get('infCpl', '')}),
        }
    }
    resp = requests.post(IANFE_URL, json=payload, timeout=70).json()
    if resp.get('avisos'):
        print('Avisos ianfe:', resp['avisos'])
    return resp

def cancelar(ch_nfe: str, numero: int, n_prot: str, motivo: str) -> dict:
    payload = {
        'secret_key': SECRET_KEY, 'api_key': API_KEY,
        'action': 'cancelar', 'modelo': 'nfe',
        'cnpj_emitente': CNPJ_EMITENTE, 'ambiente': '1',
        'cancelamento': {'chave': ch_nfe, 'numero': numero, 'nProt': n_prot, 'xJust': motivo}
    }
    return requests.post(IANFE_URL, json=payload, timeout=70).json()

def corrigir_nfe(ch_nfe: str, n_seq_evento: int, texto_correcao: str) -> dict:
    payload = {
        'secret_key': SECRET_KEY, 'api_key': API_KEY,
        'action': 'corrigir', 'modelo': 'nfe',
        'cnpj_emitente': CNPJ_EMITENTE, 'ambiente': '1',
        'correcao': {'chave': ch_nfe, 'nSeqEvento': n_seq_evento, 'xCorrecao': texto_correcao},
    }
    return requests.post(IANFE_URL, json=payload, timeout=70).json()

def gerar_danfe(xml_protocolo: str, invoice_id: str, url_logo: str = None, marca_dagua: bool = False) -> dict:
    payload = {
        'secret_key': SECRET_KEY, 'api_key': API_KEY,
        'action': 'danfe', 'modelo': 'nfe',
        'invoice_id': invoice_id, 'cnpj_emitente': CNPJ_EMITENTE,
        'imprimir_marca_dagua': marca_dagua,
        'xmlProtocolo': xml_protocolo,
    }
    if url_logo:
        payload['url_logotipo'] = url_logo
    return requests.post(IANFE_URL, json=payload, timeout=70).json()

PHP

<?php
define('IANFE_URL',      'https://ianfe.com.br/functions/operacaoFiscal');
define('SECRET_KEY',    'sellerx_Ahot8B9MXuoy2R$W');
define('API_KEY',       'yzV3C1hYWO');
define('CNPJ_EMITENTE', '37850573000114');

function ianfe_post(array $payload): array {
    $ch = curl_init(IANFE_URL);
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => json_encode($payload),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 70,
        CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    ]);
    $resp = curl_exec($ch);
    curl_close($ch);
    return json_decode($resp, true);
}

function emitir_nfe(array $nota): array {
    $resp = ianfe_post([
        'secret_key' => SECRET_KEY, 'api_key' => API_KEY,
        'action' => 'transmitir', 'modelo' => 'nfe',
        'invoice_id' => $nota['id'] ?? '', 'cnpj_emitente' => CNPJ_EMITENTE,
        'nota' => [
            'naturezaOperacao' => $nota['natureza'] ?? 'VENDA DE MERCADORIA',
            'serie'  => $nota['serie'], 'numero' => (string)$nota['numero'],
            'ambiente' => '1', 'destinatario' => $nota['destinatario'],
            'itens' => $nota['itens'], 'total' => $nota['total'],
            'transporte' => $nota['transporte'] ?? ['modFrete' => '9'],
            'pagamento' => $nota['pagamento'],
            'infAdic' => $nota['infAdic'] ?? ['infCpl' => $nota['infCpl'] ?? ''],
        ],
    ]);
    if (!empty($resp['avisos'])) { error_log('Avisos ianfe: ' . json_encode($resp['avisos'])); }
    return $resp;
}

function cancelar(string $chNFe, int $numero, string $nProt, string $motivo): array {
    return ianfe_post([
        'secret_key' => SECRET_KEY, 'api_key' => API_KEY,
        'action' => 'cancelar', 'modelo' => 'nfe',
        'cnpj_emitente' => CNPJ_EMITENTE, 'ambiente' => '1',
        'cancelamento' => ['chave' => $chNFe, 'numero' => $numero, 'nProt' => $nProt, 'xJust' => $motivo],
    ]);
}

function corrigir_nfe(string $chNFe, int $nSeqEvento, string $textoCorrecao): array {
    return ianfe_post([
        'secret_key' => SECRET_KEY, 'api_key' => API_KEY,
        'action' => 'corrigir', 'modelo' => 'nfe',
        'cnpj_emitente' => CNPJ_EMITENTE, 'ambiente' => '1',
        'correcao' => ['chave' => $chNFe, 'nSeqEvento' => $nSeqEvento, 'xCorrecao' => $textoCorrecao],
    ]);
}

function gerar_danfe(string $xmlProtocolo, string $invoiceId, string $urlLogo = null, bool $marcaDagua = false): array {
    $payload = [
        'secret_key' => SECRET_KEY, 'api_key' => API_KEY,
        'action' => 'danfe', 'modelo' => 'nfe',
        'invoice_id' => $invoiceId, 'cnpj_emitente' => CNPJ_EMITENTE,
        'imprimir_marca_dagua' => $marcaDagua,
        'xmlProtocolo' => $xmlProtocolo,
    ];
    if ($urlLogo) { $payload['url_logotipo'] = $urlLogo; }
    return ianfe_post($payload);
}

Objeto emitente (completo)

Forma robusta de enviar os dados do emitente + certificado digital a cada requisição

Dependendo de como sua conta foi provisionada, o emitente pode ser identificado de duas formas:

  • • Forma simplificada: apenas cnpj_emitente (string) na raiz do payload — usada quando o cadastro completo da empresa já está armazenado na ianfe.
  • • Forma completa: um objeto emitente na raiz do payload, com todos os dados e o certificado digital — usada quando o seu ERP gerencia essas informações. Recomendada para integrações próprias.

Campos do objeto emitente

CampoTipoObrigatoriedadeRegras
cnpjstringobrigatórioCNPJ do emitente. Aceita formatado ou só dígitos. Pode conter letras desde 01/07/2026 (CNPJ Alfanumérico, NT 2026.004) — não filtre letras.
razaoSocialstringobrigatórioRazão social completa.
CRTstringobrigatório"1"=Simples, "2"=Simples excesso, "3"=Regime Normal. NUNCA envie null ou omita — ver aviso na seção Tabelas de Referência.
iestringcondicionalInscrição Estadual. Aliases: inscricaoEstadual, inscEstadual. Obrigatório na prática (SEFAZ costuma exigir).
ufstringobrigatórioSigla da UF (ex: "SC").
cMunstringobrigatório na práticaCódigo IBGE do município (7 dígitos). Se vazio ou omitido, a ianfe usa o código da capital do estado como fallback — incorreto se a empresa não for da capital. Sempre envie o código IBGE real.
xMunstringobrigatórioNome do município.
cepstringobrigatórioCEP (com ou sem formatação).
logradourostringobrigatórioEndereço.
numerostringobrigatórioNúmero do endereço.
bairrostringobrigatórioBairro.
telefonestringopcionalTelefone (DDD + número). Aliases: fone, telefoneFixo, foneFixo, telefoneComercial. Aparece no DANFE abaixo do logotipo.
emailstringopcionalNão existe no schema oficial da NF-e — não é gravado no XML. Se enviado, usado apenas para exibição no DANFE.
certificadoBase64stringobrigatórioCertificado digital A1 (.pfx) em Base64.
senhaCertificadostringobrigatórioSenha do certificado digital.
cIdTokenstringopcionalToken de identificação (uso futuro). Vazio ("") é aceito.

Exemplo — objeto emitente completo

{
  "emitente": {
    "cnpj": "12.345.678/0001-99",
    "razaoSocial": "MINHA EMPRESA LTDA",
    "CRT": "3",
    "ie": "123456789",
    "uf": "SC",
    "cMun": "4208203",
    "xMun": "ITAJAI",
    "cep": "88317180",
    "logradouro": "RUA EXEMPLO",
    "numero": "125",
    "bairro": "CENTRO",
    "telefone": "4799216645",
    "email": "contato@minhaempresa.com.br",
    "certificadoBase64": "MIIKX...",
    "senhaCertificado": "1234",
    "cIdToken": ""
  }
}

Avisos críticos

🔴 CRT é OBRIGATÓRIO — nunca envie null ou omita.

Se emitente.CRT vier null/ausente, a ianfe assume "1" (Simples Nacional) como padrão de segurança — e se a empresa real for Regime Normal, a nota é gerada com o regime tributário errado, sem nenhum erro ou aviso. Sempre envie o CRT real da empresa.

🔴 cMun vazio — fallback perigoso

Se cMun for enviado vazio ("") ou omitido, a ianfe usa o código da capital do estado como fallback de segurança — isso é factualmente incorreto se a empresa não for da capital. Sempre envie o código IBGE real.

Finalidade da Nota (finNFe) e Devoluções

finNFe, referência à nota original (item a item a partir de 16/11/2026), CFOP e tpNF

O campo nota.finNFe define a finalidade. Padrão: 1 (Normal).

finNFeFinalidadeComo a nota original é referenciada no XML
1NormalNão referencia (opcional)
2Complementar<NFref><refNFe> no cabeçalho (<ide>)
3Ajuste<NFref><refNFe> no cabeçalho (<ide>)
4Devolução<DFeReferenciado> dentro de cada item (<det>). Sem <NFref>.
Para finNFe 2, 3 e 4, é obrigatório informar pelo menos uma chave de 44 caracteres da nota original. Sem ela, a ianfe recusa a requisição (HTTP 400) antes de enviar à SEFAZ.

Como informar a nota original

CampoOndeTipoDescrição
chaveReferenciadanotastring (44)Chave da nota original. Atalho para uma única nota. Aliases: refNFe, chaveNFeReferenciada.
notasReferenciadasnotaarrayVárias notas originais: [{ "refNFe": "..." }] ou lista de strings.
nItemOriginalitens[]number (1 a 990)Número do item na nota original que este item está devolvendo. Aliases: nItemRef, nItemReferenciado. Obrigatório na prática para devolução (ver abaixo).
chaveReferenciadaitens[]string (44)Chave da nota original deste item. Use quando a devolução reúne itens de mais de uma nota. Se omitida, usa a primeira chave informada em nota. Alias: refNFe.

Importante — nItemOriginal:

Se não for enviado, a ianfe assume que o item da devolução tem o mesmo número do item da nota original e devolve um aviso em avisos. Isso só acerta quando a devolução é total e na mesma ordem. Numa devolução parcial ou com itens em outra ordem, a referência sai errada e a SEFAZ pode rejeitar a nota. Sempre envie nItemOriginal.

Chaves com tamanho diferente de 44 caracteres são descartadas do cabeçalho; no item, uma chave inválida gera aviso e a SEFAZ rejeita (cStat 225).

CFOP e tpNF

Se nota.tpNF não for enviado, a ianfe define o tipo pelo primeiro dígito do CFOP do primeiro item: CFOP iniciado em 1, 2 ou 3 gera nota de entrada (tpNF = 0); os demais geram nota de saída (tpNF = 1).

CFOPOperaçãoTipo
1202Devolução de venda (dentro do estado)Entrada
2202Devolução de venda (de outro estado)Entrada
5202Devolução de compra (para destinatário no mesmo estado)Saída
6202Devolução de compra (para destinatário em outro estado)Saída

Regras da SEFAZ que o ERP precisa respeitar

A ianfe não valida estas regras; quem rejeita é a SEFAZ:

  • VC02-14: na devolução, a referência à nota original é feita somente por item (DFeReferenciado). A ianfe já gera assim.
  • VC02-50 (ajustada na NT 2025.002 v1.52): a SEFAZ confere a relação entre o destinatário da devolução e o emitente da nota referenciada, e considera se a nota original é uma nota de saída. Confira a redação vigente da regra no Portal Nacional da NF-e para o seu cenário.

Exemplo — Devolução de compra (saída), com dois itens

{
  "secret_key": "sua_secret_key",
  "api_key": "sua_api_key",
  "action": "transmitir",
  "modelo": "nfe",
  "cnpj_emitente": "12345678000199",

  "nota": {
    "naturezaOperacao": "DEVOLUCAO DE COMPRA",
    "finNFe": 4,
    "serie": "1",
    "numero": "200",
    "ambiente": "1",

    "chaveReferenciada": "35260598765432000100550010000001231234567890",

    "destinatario": {
      "cnpj": "98765432000100",
      "xNome": "FORNECEDOR LTDA",
      "indIEDest": "1",
      "ie": "987654321",
      "logradouro": "Avenida do Fornecedor",
      "numero": "500",
      "bairro": "Industrial",
      "cMun": "3550308",
      "xMun": "SAO PAULO",
      "uf": "SP",
      "cep": "04001000"
    },

    "itens": [
      {
        "nItem": 1,
        "nItemOriginal": 3,
        "codigo": "001",
        "descricao": "Camiseta Masculina Algodao",
        "ncm": "61091000",
        "cfop": "5202",
        "unidade": "UN",
        "quantidade": "1.0000",
        "valorUnitario": "150.0000",
        "valorTotal": "150.00",
        "icms": { "CSOSN": "102", "orig": "0" },
        "pis": { "CST": "07" },
        "cofins": { "CST": "07" }
      },
      {
        "nItem": 2,
        "nItemOriginal": 1,
        "codigo": "002",
        "descricao": "Bermuda Masculina",
        "ncm": "62034200",
        "cfop": "5202",
        "unidade": "UN",
        "quantidade": "2.0000",
        "valorUnitario": "80.0000",
        "valorTotal": "160.00",
        "icms": { "CSOSN": "102", "orig": "0" },
        "pis": { "CST": "07" },
        "cofins": { "CST": "07" }
      }
    ],

    "total": { "vProd": "310.00", "vNF": "310.00" },
    "transporte": { "modFrete": "9" },
    "pagamento": { "detPag": [{ "tPag": "90", "vPag": "0.00" }] },
    "infAdic": { "infCpl": "Devolucao referente NF-e 123 de 01/06/2026" }
  }
}

Para itens vindos de notas diferentes, acrescente chaveReferenciada no item:

{ "nItem": 2, "nItemOriginal": 1, "chaveReferenciada": "35260598765432000100550010000001241234567891", "...": "..." }

Em finNFe 2 e 3 (complementar e ajuste) o formato não muda: a chave vai em nota.chaveReferenciada ou nota.notasReferenciadas e sai como <NFref> no cabeçalho.

Importação — DI / Adições / II / IPI

Declaração de Importação, Imposto de Importação e IPI por item

Quando usar

Nota de entrada de mercadoria importada (tipicamente CFOP iniciado em 3.xx), onde é obrigatório informar a Declaração de Importação (DI) vinculada a cada item, além dos tributos de importação (II) e, quando aplicável, IPI.

Campo por item: declaracoesImportacao

CampoTipoDescrição
numerostringNúmero da DI (Declaração de Importação)
datastring (AAAA-MM-DD)Data de registro da DI
localDesembaracostringLocal do desembaraço (ex: "PORTO DE SANTOS")
ufDesembaracostringUF do desembaraço (ex: "SP")
dataDesembaracostring (AAAA-MM-DD)Data do desembaraço aduaneiro
viaTransportestringVer tabela de vias de transporte abaixo
valorAFRMMnumberValor da AFRMM (Adicional ao Frete para Renovação da Marinha Mercante)
tipoIntermediacaostring1=Importação direta, 2=Por conta e ordem de terceiro, 3=Por encomenda
exportadorstringNome do exportador no exterior
adicoesarrayLista de adições da DI. Se omitido, gera automaticamente 1 adição padrão

Subcampos de cada item em adicoes[]

CampoTipoDescrição
numeroAdicaonumberNúmero da adição (sequencial)
numeroSequencialItemnumberNúmero sequencial do item dentro da adição
fabricantestringNome do fabricante no exterior
valorDescontonumberValor de desconto da adição. Default: 0
numeroDrawbackstringNúmero do regime Drawback (opcional)

Tabela de vias de transporte (viaTransporte)

CódigoDescrição
1Marítima
2Fluvial
3Lacustre
4Aérea
5Postal
6Ferroviária
7Rodoviária
8Conduto / Rede
9Meios Próprios
10Entrada / Saída Ficta

Tabela de tipoIntermediacao

CódigoDescriçãoCampos adicionais obrigatórios
1Importação direta—
2Por conta e ordem de terceirocnpjAdquirente (CNPJ do terceiro)
3Por encomendacnpjAdquirente + ufTerceiro (UF do terceiro)

Exemplo — Item importado completo

{
  "itens": [{
    "nItem": 1,
    "codigo": "IMP-001",
    "descricao": "PECA IMPORTADA",
    "ncm": "84139190",
    "cfop": "3102",
    "unidade": "UN",
    "quantidade": "10.0000",
    "valorUnitario": "50.0000",
    "valorTotal": "500.00",
    "icms": { "CSOSN": "900", "orig": "1", "modBC": "3", "vBC": "500.00", "pICMS": "18.00", "vICMS": "90.00" },

    "declaracoesImportacao": [{
      "numero": "2326123456",
      "data": "2026-07-01",
      "localDesembaraco": "PORTO DE SANTOS",
      "ufDesembaraco": "SP",
      "dataDesembaraco": "2026-07-05",
      "viaTransporte": "1",
      "valorAFRMM": 350.00,
      "tipoIntermediacao": "1",
      "exportador": "SUPPLIER INTERNATIONAL LTD",
      "adicoes": [{
        "numeroAdicao": 1,
        "numeroSequencialItem": 1,
        "fabricante": "MANUFACTURER CO",
        "valorDesconto": 0,
        "numeroDrawback": null
      }]
    }],

    "ii":  { "vBC": "500.00", "vII": "60.00", "vDespAdu": "15.00" },
    "ipi": { "CST": "50", "vBC": "500.00", "pIPI": "10.00", "vIPI": "50.00" }
  }]
}

Exemplo — Payload completo de Nota de Importação

Exemplo real de nota de importação (CFOP 3102), com destinatário no exterior. Atente para os campos obrigatórios do destinatário estrangeiro: uf: "EX", cMun: "9999999", xMun: "EXTERIOR", e o identificador idEstrangeiro (mesmo vazio, é exigido pelo schema da NF-e para clientes fora do Brasil). Não envie cep nem cnpj/cpf para destinatários estrangeiros.

{
  "secret_key": "sua_secret_key",
  "api_key": "sua_api_key",
  "action": "transmitir",
  "modelo": "nfe",
  "cnpj_emitente": "12345678000199",
  "nota": {
    "naturezaOperacao": "COMPRA PARA COMERCIALIZACAO",
    "serie": "1",
    "numero": "234",
    "ambiente": "1",
    "tpNF": "0",
    "idDest": "3",

    "destinatario": {
      "idEstrangeiro": "",
      "xNome": "DONGGUAN KAIDI MACHINERY TECHNOLOGY CO. LTD.",
      "indIEDest": "9",
      "endereco": {
        "logradouro": "HOUJIE AVENUE EAST",
        "numero": "51",
        "bairro": "EXTERIOR",
        "cMun": "9999999",
        "xMun": "EXTERIOR",
        "uf": "EX",
        "cPais": "1600",
        "xPais": "CHINA"
      }
    },

    "itens": [{
      "nItem": 1,
      "codigo": "DL-992",
      "descricao": "MAQUINA DE COSTURA RETA DE DUPLA AGULHA",
      "ncm": "84532000",
      "cfop": "3102",
      "unidade": "UN",
      "quantidade": "2.0000",
      "valorUnitario": "3776.9006",
      "valorTotal": "7553.80",
      "icms": { "CSOSN": "900", "orig": "1", "modBC": "3", "vBC": "9207.28", "pICMS": "8.80", "vICMS": "810.24" },

      "declaracoesImportacao": [{
        "numero": "2608878970",
        "data": "2026-10-01",
        "localDesembaraco": "PORTO DE SANTOS",
        "ufDesembaraco": "SP",
        "dataDesembaraco": "2026-10-01",
        "viaTransporte": "1",
        "valorAFRMM": 227.58,
        "tipoIntermediacao": "1",
        "exportador": "0902",
        "adicoes": [{
          "numeroAdicao": 1,
          "numeroSequencialItem": 1,
          "fabricante": "0902",
          "valorDesconto": 0
        }]
      }],

      "ii":  { "vBC": "6294.83", "vDespAdu": "0.00", "vII": "1258.97", "vIOF": "0.00" },
      "ipi": { "cEnq": "999", "CST": "53" }
    }],

    "total": {
      "vProd": "240311.03",
      "vII": "40051.85",
      "vOutro": "26826.37",
      "vNF": "307189.25"
    },

    "transporte": {
      "modFrete": "0",
      "transportadora": {
        "cnpj": "47973689000102",
        "xNome": "RACE TRANSPORTE FRANCA LTDA",
        "ie": "137002114114",
        "endereco": "R ANDRE GARCIA GOMES, 260",
        "xMun": "FRANCA",
        "uf": "SP"
      },
      "volumes": [{
        "qVol": "36",
        "esp": "OUTROS",
        "pesoL": "10495.000",
        "pesoB": "12395.000"
      }]
    },

    "pagamento": {
      "detPag": [{ "indPag": "0", "tPag": "99", "xPag": "OUTROS", "vPag": "307189.25" }]
    },

    "infAdic": {
      "infCpl": "DI 26/0887897-0 Data DI 01/10/26 - LOCAL DE DESEMBARACO: UF SP, PORTO DE SANTOS - A.F.R.M.M. R$ 1.869,48 - Taxa Siscomex R$ 224,88 - Valor II R$ 40.051,84 - CONTAINER: ONEU 514.424-4"
    }
  }
}

Observações importantes

  • • orig: "1" no bloco icms do item indica origem estrangeira – importação direta (código de origem exigido pela SEFAZ para produto importado).
  • • Destinatário no exterior: envie uf: "EX", cMun: "9999999", xMun: "EXTERIOR" e o identificador idEstrangeiro (pode ser vazio). Não envie cep, cnpj nem cpf — o schema exige um único identificador por destinatário, e para exterior o único aceito é idEstrangeiro.
  • • total.vNF na importação deve somar produtos + II + outras despesas acessórias (vOutro). A SEFAZ rejeita (cStat 610) se o total não bater com a soma dos componentes.
  • • Se adicoes não for enviado, o sistema gera automaticamente uma única adição padrão (nAdicao=1, nSeqAdic=1) — cobre o caso mais comum de 1 item = 1 adição.
  • • ii e ipi são por item e complementam (não substituem) os totalizadores vII/vIPI que já existiam em nota.total — ambos devem ser enviados de forma consistente (a soma dos itens deve bater com o total), senão a SEFAZ rejeita.

Exportação — Direta e Indireta

Grupo exporta (direta) e detExport (indireta via trading)

3a. Exportação direta — grupo exporta

Quando o próprio emitente exporta a mercadoria (tipicamente CFOP 7.xx). Envie o objeto exportacao na raiz do payload (ou dentro de nota).

CampoTipoObrigatórioDescrição
ufSaidaPaisstringSimUF de saída do país (ex: "SP")
localExportastringSimLocal de exportação (ex: "PORTO DE SANTOS")
localDespachostringNãoLocal de despacho aduaneiro (ex: "ALFANDEGA SANTOS")
{
  "exportacao": {
    "ufSaidaPais": "SP",
    "localExporta": "PORTO DE SANTOS",
    "localDespacho": "ALFANDEGA SANTOS"
  }
}
ufSaidaPais e localExporta são obrigatórios pelo schema quando o grupo é enviado. Se um dos dois faltar, o grupo inteiro é omitido automaticamente (evita rejeição por campo obrigatório ausente). O ERP deve garantir o envio de ambos para notas de exportação.

3b. Exportação indireta — detExport (por item)

Por item, quando a venda é para uma empresa comercial exportadora equiparada a exportação, e a nota precisa referenciar o Registro de Exportação (RE) correspondente.

CampoTipoDescrição
registroExportacaostringNúmero do Registro de Exportação (RE)
quantidadeExportadanumberQuantidade do item exportada
{
  "itens": [{
    "...": "...",
    "detExport": [{
      "registroExportacao": "26SP0012345",
      "quantidadeExportada": 10
    }]
  }]
}

Compatibilidade

Todos os campos novos são opcionais e aditivos. Uma nota comum (venda interna, sem devolução/importação/exportação) gera exatamente o mesmo XML de antes — nenhuma das tags novas (NFref, DI, II,exporta, detExport) aparece quando os campos correspondentes não são enviados.

Ambiente de Homologação (ambiente: "2")

A ianfe oferece ambiente de homologação completo — idêntico ao de produção, mas sem valor fiscal. Use para testar toda a integração antes de ir a produção.

Como ativar: envie "ambiente": "2" na raiz do payload (ou dentro de nota.ambiente). O cadastro do emitente no painel também tem o campo Ambiente — defina como Homologação durante os testes.

Diferenças do ambiente de homologação:

  • • A SEFAZ ignora o nome do destinatário e substitui por "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL". Isso é comportamento normal, não é erro.
  • • As notas são autorizadas pela SEFAZ de homologação (bancos separados de produção). Uma chave autorizada em homologação não existe em produção e vice-versa.
  • • Todas as operações funcionam: transmitir, cancelar, corrigir, inutilizar, danfe e pre_danfe.
  • • Não consome numeração de produção — pode testar à vontade.
  • • O DANFE gerado em homologação traz marca d'água "SEM VALOR FISCAL" automaticamente.

Atenção: ao cancelar ou corrigir uma nota, o campo ambiente precisa ser idêntico ao ambiente em que a nota original foi emitida. Enviar cancelamento/CC-e no ambiente errado resulta em "Chave de Acesso inexistente".

Prevenção de Notas Duplicadas (após timeout)

A ianfe não possui idempotência automática (chave de idempotência). No entanto, o fluxo abaixo elimina o risco de duplicidade após timeouts — a causa mais comum de notas dobradas.

Contrato de Idempotência do invoice_id

O que éIdentificador opcional de rastreio do seu ERP. Aparece no painel e nos logs da ianfe para correlacionar a requisição com o seu sistema.
Não éNão é chave de deduplicação. A ianfe não rejeita requisições com invoice_id repetido — duas chamadas com o mesmo invoice_id geram duas notas distintas se o numero for diferente.
Idempotência realVem da SEFAZ: retransmitir a mesma tupla CNPJ + serie + numero + modelo + ambiente devolve cStat 204 (Duplicidade) com o xmlProtocolo da nota original já autorizada. Esse é o mecanismo que impede notas dobradas.
RecomendaçãoEnvie invoice_id em toda requisição. Antes de retransmitir após timeout, consulte o status; nunca reenvie cegamente.

Fluxo recomendado (após timeout ou erro de rede):

  1. Configure timeout de 70 segundos — a SEFAZ pode levar até 60s em instabilidade. Timeout menor causa falsos erros.
  2. Marque a nota como "em processamento" no seu banco antes de enviar. Nunca reenvie uma nota que já está "em processamento" sem antes consultar.
  3. Após timeout: aguarde 10 segundos e consulte o status pela chave (se já tiver) usando GET api.ianfe.com.br/consultar/:chave, ou reenvie a mesma nota (mesmo numero+serie) — a SEFAZ devolve cStat 204 (Duplicidade) se já foi autorizada, e o xmlProtocolo da resposta de duplicidade traz os dados da nota original.
  4. Trate cStat 204 como sucesso: a nota já foi autorizada. Salve o chNFe, nProt e xmlProtocolo retornados.
  5. Envie invoice_id em todas as requisições — é o seu identificador interno, usado para rastrear a nota no painel e nos logs da ianfe. Não use como chave de dedup (ver contrato acima).

Resumo: timeout não equivale a rejeição. A SEFAZ pode ter autorizado a nota mesmo se sua conexão caiu. Sempre consulte antes de retransmitir. O cStat 204 é sua rede de segurança — a ianfe devolve os dados da nota original, não gera uma segunda.

Numeração sequencial: a responsabilidade de controlar a sequência de numeração é do ERP. A ianfe não autoincrementa — envia exatamente o numero que recebeu. Se uma nota for rejeitada, o número não é consumido e pode ser reutilizado. Se precisar declarar um salto na sequência, use action: "inutilizar".

Perguntas Frequentes da Integração

Existe documentação OpenAPI / Swagger?

Não há arquivo OpenAPI/Swagger separado. Esta página é a referência oficial e completa da API, com todos os endpoints, payloads, respostas e exemplos testados em Node.js, Python e PHP. O botão "Baixar Manual para IA" no topo gera um HTML autossuficiente com todo o conteúdo — útil para entregar a um agente de IA ou arquivar offline.

Qual é o endpoint oficial?

Um único: POST https://ianfe.com.br/functions/operacaoFiscal. Todas as operações (transmitir, cancelar, corrigir, inutilizar, danfe, pre_danfe) usam o mesmo endpoint, variando apenas o campo action.

Qual endpoint usar para consultas e downloads?

O fluxo recomendado é não fazer chamadas GET separadas: armazene o xmlProtocoloretornado na transmissão (o XML completo já vem na resposta) e use action: "danfe" para gerar o PDF. Há rotas GET opcionais em api.ianfe.com.br para download/consulta direta pela chave, mas são alternativas de conveniência — não são o caminho principal.

Qual a forma recomendada de gerar o DANFE?

action: "danfe" no endpoint POST oficial, enviando o xmlProtocolosalvo da transmissão. As rotas GET /danfe/:chave e POST /danfeem api.ianfe.com.br são alternativas válidas, mas não passam pela validação de credenciais da ianfe.

IBS e CBS — Reforma Tributária (NT 2025.002)

Suporte aos novos tributos da Reforma Tributária (LC 214/2025)

A partir da NT 2025.002, a NF-e passou a suportar os novos tributos da Reforma Tributária Brasileira (LC 214/2025):

  • CBS — Contribuição sobre Bens e Serviços (substitui PIS e COFINS, âmbito federal)
  • IBS — Imposto sobre Bens e Serviços (substitui ICMS e ISS, âmbito estadual/municipal)

Cronograma de obrigatoriedade:

  • • CRT=3 (Regime Normal — Lucro Real / Lucro Presumido): Obrigatório em produção a partir de 03/08/2026.
  • • CRT=1/2/4 (Simples Nacional / MEI): Obrigatório apenas a partir de 04/01/2027. Não enviar antes disso — a SEFAZ rejeita o campo para esses regimes.

Comportamento automático da ianfe: Se o emitente for CRT=3 e o campo ibscbs for omitido em um item, a ianfe aplica automaticamente as alíquotas padrão do período de teste 2026: CBS = 0,90% e IBS = 0,10% — inteiramente na UF. Em 2026, o IBS Municipal é obrigatoriamente 0% (LC 214/2025, art. 343) — só passa a ter alíquota própria (0,05%) a partir de 2027/2028 (art. 344). Dividir 0,10% em 0,05%/0,05% (UF/Município), como versões anteriores desta documentação orientavam, é rejeitado pela SEFAZ (cStat 1036 "Alíquota do IBS do Município inválida"). Para controlar as alíquotas individualmente por item, envie o objeto ibscbs descrito abaixo.

🔴 Cronograma de alíquotas do IBS Municipal (não confundir os anos)

PeríodopIBSUFpIBSMun
2026 (atual)0,10%0% (obrigatório)
2027 e 2028a definir (não é mais 0,10% fixo)0,05%
2029 em diantealíquota de referência/específica publicada pelo Comitê Gestor do IBSidem

A ianfe usa os valores de 2026 como padrão automático hoje. Quando a legislação mudar para 2027, os defaults precisarão ser atualizados — não dependa do valor automático permanecer o mesmo ano que vem; acompanhe as atualizações desta seção.

Objeto ibscbs dentro de cada item (CRT=3 apenas)

CampoTipoObrigatoriedadeDescrição
CSTstring (3 dígitos)opcionalCódigo de Situação Tributária do IBS/CBS. Default: "000" (Tributação Integral). Ver tabela de CST IBS/CBS abaixo.
cClassTribstring (6 dígitos)opcionalCódigo de Classificação Tributária. Default: "000001" (tributação integral, alíquotas padrão). Definido pela LC 214/2025 — tabela oficial publicada no Portal Nacional da NF-e.
vBCstringopcionalBase de cálculo do IBS/CBS. Se omitido, usa o valorTotal do item.
pCBSnumberopcionalAlíquota CBS em percentual. Default 2026: 0.90 (= 0,90%). A partir de 2027 a alíquota sobe conforme calendário da LC 214/2025.
vCBSstringopcionalValor calculado da CBS. Se omitido, a ianfe calcula como vBC × pCBS / 100.
pIBSUFnumberopcionalAlíquota IBS da UF (estado) em percentual. Default 2026: 0.10 (100% do IBS de teste vai para a UF neste ano).
vIBSUFstringopcionalValor IBS da UF. Se omitido, calculado automaticamente.
pIBSMunnumberopcionalAlíquota IBS do Município em percentual. Default 2026: 0 (zero, obrigatório) — só passa a ser 0.05 a partir de 2027/2028. Nunca envie um valor diferente de 0 para notas emitidas em 2026.
vIBSMunstringopcionalValor IBS do Município. Se omitido, calculado automaticamente.
vIBSstringopcionalValor total do IBS do item (UF + Município). Se omitido, calculado como vIBSUF + vIBSMun.

🔴 CST e cClassTrib têm tamanho FIXO — não confundir com o CST do ICMS

Esta é a causa mais comum de rejeição (SEFAZ cStat 225, elemento IBSCBS/CST):

  • • CST do IBSCBS sempre tem 3 dígitos (ex: "000"). O CST do ICMS tem 2 dígitos (ex: "00") — são campos diferentes, em grupos diferentes do XML, com tamanhos diferentes. Enviar um valor de 2 dígitos aqui (ex: "01") é rejeitado.
  • • cClassTrib sempre tem 6 dígitos (ex: "000001"). Um valor de 5 dígitos (ex: "01099") é rejeitado.

A ianfe valida esses tamanhos antes de transmitir e recusa com uma mensagem clara caso estejam errados, em vez de deixar a SEFAZ rejeitar com um erro confuso.

Tabela de CST IBS/CBS (3 dígitos — não confundir com CST/CSOSN do ICMS)

Lista não exaustiva — confirme a tabela completa e atualizada no Portal Nacional da NF-e antes de mapear um código que não esteja aqui:

CSTDescrição
000Tributação integral (alíquotas padrão, sem reduções) — caso mais comum
200/201Alíquota reduzida
400/410Isenção
500/510/550/551Suspensão / diferimento
620Tributação monofásica (combustíveis)
810Crédito presumido (ex: Zona Franca de Manaus)
811Ajuste de crédito (usa grupo gAjusteCompet em vez de gIBSCBS)
820Tributação em declaração de regime específico (sem grupo de alíquotas)
830Exclusão de base de cálculo (sem grupo de alíquotas)
900Outros

Exemplo — Item com IBS/CBS (alíquotas padrão 2026, campos omitidos — ianfe calcula)

Esta é a forma mais simples. Para CRT=3, basta omitir o campo ibscbs — a ianfe aplica CBS=0,90% e IBS=0,10% automaticamente.

{
  "nItem": 1,
  "codigo": "P01",
  "descricao": "PRODUTO EXEMPLO",
  "ncm": "84529099",
  "cfop": "5102",
  "unidade": "UN",
  "quantidade": "1.0000",
  "valorUnitario": "1000.0000",
  "valorTotal": "1000.00",
  "icms": { "CST": "00", "orig": "0", "modBC": "3", "vBC": "1000.00", "pICMS": "12.00", "vICMS": "120.00" },
  "pis":    { "CST": "01", "vBC": "1000.00", "pPIS": "1.65", "vPIS": "16.50" },
  "cofins": { "CST": "01", "vBC": "1000.00", "pCOFINS": "7.60", "vCOFINS": "76.00" }
}
No exemplo acima (CRT=3, ibscbs omitido), a ianfe gera automaticamente no XML:
CBS = R$ 9,00 (1.000 × 0,90%) | IBS UF = R$ 1,00 | IBS Mun = R$ 0,00 | IBS Total = R$ 1,00

Exemplo — Item com IBS/CBS (alíquotas personalizadas pelo ERP)

Use quando seu sistema já calcula as alíquotas reais de IBS/CBS para o estado e município do destinatário.

{
  "nItem": 1,
  "codigo": "P01",
  "descricao": "PRODUTO EXEMPLO",
  "ncm": "84529099",
  "cfop": "5102",
  "unidade": "UN",
  "quantidade": "1.0000",
  "valorUnitario": "1000.0000",
  "valorTotal": "1000.00",
  "icms": { "CST": "00", "orig": "0", "modBC": "3", "vBC": "1000.00", "pICMS": "12.00", "vICMS": "120.00" },
  "pis":    { "CST": "01", "vBC": "1000.00", "pPIS": "1.65", "vPIS": "16.50" },
  "cofins": { "CST": "01", "vBC": "1000.00", "pCOFINS": "7.60", "vCOFINS": "76.00" },
  "ibscbs": {
    "CST": "000",
    "cClassTrib": "000001",
    "vBC": "1000.00",
    "pCBS": 0.90,
    "vCBS": "9.00",
    "pIBSUF": 0.10,
    "vIBSUF": "1.00",
    "pIBSMun": 0,
    "vIBSMun": "0.00",
    "vIBS": "1.00"
  }
}

Exemplo — Payload completo NF-e CRT=3 com IBS/CBS (alíquotas padrão 2026)

POST https://ianfe.com.br/functions/operacaoFiscal

{
  "secret_key": "sua_secret_key",
  "api_key": "sua_api_key",
  "action": "transmitir",
  "modelo": "nfe",
  "cnpj_emitente": "12345678000199",
  "nota": {
    "naturezaOperacao": "VENDA DE MERCADORIA",
    "serie": "1",
    "numero": "500",
    "ambiente": "1",
    "crt": "3",

    "destinatario": {
      "cnpj": "98765432000100",
      "xNome": "EMPRESA COMPRADORA LTDA",
      "indIEDest": "1",
      "ie": "111222333444",
      "logradouro": "Avenida Principal",
      "numero": "200",
      "bairro": "Centro",
      "cMun": "3550308",
      "xMun": "SAO PAULO",
      "uf": "SP",
      "cep": "01310100"
    },

    "itens": [
      {
        "nItem": 1,
        "codigo": "PROD-001",
        "descricao": "PRODUTO EXEMPLO REGIME NORMAL",
        "ncm": "84529099",
        "cfop": "5102",
        "unidade": "UN",
        "quantidade": "10.0000",
        "valorUnitario": "100.0000",
        "valorTotal": "1000.00",
        "icms": { "CST": "00", "orig": "0", "modBC": "3", "vBC": "1000.00", "pICMS": "12.00", "vICMS": "120.00" },
        "pis":    { "CST": "01", "vBC": "1000.00", "pPIS": "1.65",  "vPIS": "16.50" },
        "cofins": { "CST": "01", "vBC": "1000.00", "pCOFINS": "7.60", "vCOFINS": "76.00" }
      }
    ],

    "total": {
      "vProd":  "1000.00",
      "vBC":    "1000.00",
      "vICMS":  "120.00",
      "vPIS":   "16.50",
      "vCOFINS":"76.00",
      "vNF":    "1010.00"
    },

    "transporte": { "modFrete": "9" },

    "pagamento": {
      "detPag": [{ "tPag": "01", "vPag": "1010.00" }]
    }
  }
}

No payload acima, o campo ibscbs foi omitido nos itens. A ianfe gerou automaticamente CBS = R$ 9,00 e IBS = R$ 1,00, totalizando R$ 10,00 — que já está incluído no vNF: "1010.00".

Atenção ao vNF: para emitentes CRT=3, o valor total da nota deve incluir IBS + CBS. No exemplo: R$ 1.000,00 (produtos) + R$ 10,00 (IBS + CBS) = R$ 1.010,00. Se o ERP não incluir IBS/CBS no vNF, a ianfe calcula e soma automaticamente.

Impacto no DANFE

Para notas com IBS/CBS (CRT=3), a seção CÁLCULO DO IMPOSTO do DANFE exibe uma linha adicional com os valores totais de IBS e CBS:

Campo exibido no DANFEFonte no XML
VALOR DO IBS (Reforma Tributária)total.IBSCBSTot.gIBS.vIBS
VALOR DA CBS (Reforma Tributária)total.IBSCBSTot.gCBS.vCBS

Para emitentes CRT=1/2/4 (Simples Nacional), nenhuma linha adicional aparece no DANFE — o layout permanece idêntico ao atual.

Estrutura correta do IBSCBSTot (XSD oficial)

🔴 No nível de TOTAIS, as tags são gIBSUF/gIBSMun (SEM sufixo "Tot") e exigem vDif, vDevTrib, vCredPres e vCredPresCondSus: confirmado contra o XSD oficial (nfephp-org/sped-nfe, tipo TIBSCBSMonoTot). Só a tag externa (IBSCBSTot) leva "Tot" — as tags de dentro dela têm o MESMO nome do nível de item (gIBSUF, gIBSMun), diferenciadas apenas por estarem aninhadas dentro de IBSCBSTot em vez de IBSCBS. Usar gIBSUFTot/gIBSMunTot (nomes que não existem no schema) causa rejeição SEFAZ cStat 225.

Estrutura completa e correta do IBSCBSTot:

<IBSCBSTot>
  <vBCIBSCBS>6300.00</vBCIBSCBS>
  <gIBS>
    <gIBSUF>
      <vDif>0.00</vDif>
      <vDevTrib>0.00</vDevTrib>
      <vIBSUF>3.15</vIBSUF>
    </gIBSUF>
    <gIBSMun>
      <vDif>0.00</vDif>
      <vDevTrib>0.00</vDevTrib>
      <vIBSMun>3.15</vIBSMun>
    </gIBSMun>
    <vIBS>6.30</vIBS>
    <vCredPres>0.00</vCredPres>
    <vCredPresCondSus>0.00</vCredPresCondSus>
  </gIBS>
  <gCBS>
    <vDif>0.00</vDif>
    <vDevTrib>0.00</vDevTrib>
    <vCBS>56.70</vCBS>
    <vCredPres>0.00</vCredPres>
    <vCredPresCondSus>0.00</vCredPresCondSus>
  </gCBS>
</IBSCBSTot>

A ianfe já preenche vDif/vDevTrib/vCredPres/vCredPresCondSus automaticamente como "0.00" quando o ERP não informa diferimento/devolução de tributo/crédito presumido — não é necessário enviar nada a mais para isso funcionar.

Importante — alíquotas reais por estado e município: As alíquotas padrão usadas pela ianfe em 2026 (CBS=0,90%, IBS=0,10%) são as alíquotas de teste definidas pela LC 214/2025 para o período de transição. As alíquotas definitivas variam por estado e município e serão divulgadas pelo Comitê Gestor do IBS. Para operações que exijam alíquotas específicas, envie o objeto ibscbs com os valores corretos calculados pelo seu motor fiscal.

CNPJ Alfanumérico (NT 2026.004)

Novo formato de CNPJ com letras — em produção desde 01/07/2026

Desde 01/07/2026, a Receita Federal passou a emitir CNPJs no novo formato alfanumérico (Nota Técnica 2026.004, em produção nacional). As 12 primeiras posições do CNPJ podem conter letras maiúsculas (A-Z) além de números; os 2 últimos dígitos (DV, verificador) continuam sempre numéricos. Exemplo de CNPJ alfanumérico válido: 12ABC34500DE35.

O que muda para o seu ERP

  • CNPJ do emitente, destinatário, transportadora e outros: continue enviando o CNPJ como string, formatado (com .///-) ou só com os caracteres do documento — a ianfe normaliza automaticamente, mantendo as letras. Nunca filtre/remova letras do CNPJ antes de enviar — se o seu sistema tiver alguma limpeza de string que remova caracteres não numéricos (/\D/g ou similar), ela vai corromper CNPJs alfanuméricos.
  • Chave de acesso (chNFe): por conter o CNPJ do emitente embutido, a chave de 44 posições também pode conter letras a partir de agora. Isso é normal — não trate uma chave com letras como inválida.
  • chaveReferenciada / notasReferenciadas (NFref): o mesmo vale para chaves de NF-e referenciadas — se a nota original foi emitida por um emitente com CNPJ alfanumérico, a chave referenciada também terá letras. A ianfe já aceita isso normalmente.
  • CPF não é afetado — pessoa física continua sendo só dígitos.

Compatibilidade

CNPJs 100% numéricos (o padrão até agora) continuam funcionando exatamente como antes — não é necessário nenhuma mudança se você ainda não tem clientes/emitentes com CNPJ alfanumérico. A mudança é retrocompatível.

ianfe — Documentação de Integração v3.19 · NF-e (mod 55) · Dúvidas: suporte via WhatsApp no painel