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").
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:
Você é responsável por:
POST https://ianfe.com.br/functions/operacaoFiscal
Content-Type: application/json
Body: {
"secret_key": "...",
"api_key": "...",
"action": "transmitir" | "cancelar" | "corrigir" | "danfe",
"modelo": "nfe",
...
}action define a operação: transmitir, cancelar, corrigir, inutilizar, danfe ou pre_danfe.Nunca exponha secret_key e api_key no frontend!
// ✅ 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!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);| Método | Endpoint | Autenticação | Descrição |
|---|---|---|---|
| POST | https://ianfe.com.br/functions/operacaoFiscal | body: secret_key + api_key | OFICIAL — transmitir, cancelar, corrigir, inutilizar, danfe, pre_danfe |
| GET | api.ianfe.com.br/xml/:chave | header: x-api-key | Alternativa — baixar XML pelo chNFe |
| GET | api.ianfe.com.br/danfe/:chave | header: x-api-key | Alternativa — gerar DANFE pela chave |
| POST | api.ianfe.com.br/danfe | header: x-api-key | Alternativa — gerar DANFE enviando xmlProtocolo |
| GET | api.ianfe.com.br/consultar/:chave | header: x-api-key | Alternativa — consultar status pela chave |
| GET | api.ianfe.com.br/status-sefaz | header: x-api-key | Alternativa — verificar disponibilidade da SEFAZ |
api_key pode ser passada como header (x-api-key) ou query string (?api_key=...).| Operação | action | Mé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 |
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.✓ 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 segundosEstas regras evitam a rejeição mais comum da SEFAZ (cStat 225 — Falha de Schema):
{ "CST": "07" } — NÃO incluir vBC, pPIS/pCOFINS, vPIS/vCOFINS. Esses campos com CST 07 causam falha de schema.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.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).Envie sempre "modelo": "nfe" na raiz do payload. A ianfe opera exclusivamente com NF-e (modelo 55).
Credenciais, URL base e webhook de retorno
| Campo | Exemplo | Uso |
|---|---|---|
| secret_key | sellerx_Ahot8B9MXuoy2R$W | Identifica sua conta |
| api_key | yzV3C1hYWO | Autoriza cada operação |
Inclua ambas em todas as requisições, dentro do body JSON:
{
"secret_key": "sellerx_Ahot8B9MXuoy2R$W",
"api_key": "yzV3C1hYWO",
"modelo": "nfe",
...
}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.
| Tipo | URL Base | Rotas |
|---|---|---|
| POST (oficial — todas as operações) | https://ianfe.com.br/functions/operacaoFiscal | action: transmitir, cancelar, corrigir, inutilizar, danfe, pre_danfe |
| GET (opcional — download/consulta) | https://api.ianfe.com.br | /xml/:chave, /danfe/:chave, /consultar/:chave, /status-sefaz |
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.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.
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.
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.
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" }
}
]
}Alguns itens com icms preenchido, outros sem. O motor detecta por item:
CST/CSOSN → passa exatamente como enviadoCST/CSOSN → calculado automaticamente pela tabelaUse quando: parte dos itens tem tributação especial (ex: ST já retida) e outra parte segue a regra geral.
| Parâmetro | Fonte |
|---|---|
| ICMS interno | Tabela por CFOP + UF do emitente |
| ICMS interestadual | Tabela por CFOP + região de destino (7% N/NE/CO, 12% S/SE) |
| ICMS com ST | Calculado por MVA da tabela (padrão 50%) |
| PIS/COFINS Simples Nacional | CST 07 — isento |
| PIS/COFINS Regime Normal | CST 01 — 0,65% PIS / 3,0% COFINS (cumulativo) |
| CRT do emitente | emitente.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.
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).
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 } } }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
Detalhes sobre os campos comuns (destinatario, itens, totais, transporte, pagamento)
| Campo | Tipo | Obrigatoriedade | Regras |
|---|---|---|---|
| cpf | string | condicional | Informar cpf OU cnpj. Omitir ambos = consumidor não identificado. |
| cnpj | string | condicional | Somente dígitos. |
| xNome | string | opcional | Se omitido, será preenchido como "CONSUMIDOR NAO IDENTIFICADO". |
| indIEDest | string | opcional | Padrão: "9" (não contribuinte). Use "1" para contribuinte com IE. |
| ie | string | opcional | IE do destinatário. Obrigatório somente se indIEDest = "1". |
| string | opcional | E-mail para envio automático do XML e DANFE. | |
| telefone | string | opcional | Telefone do destinatário (DDD + número). Será impresso no DANFE ao lado do nome/razão social. |
| logradouro | string | opcional | Se omitido, usa endereço do emitente. |
| numero | string | opcional | Número do endereço. |
| bairro | string | opcional | |
| cMun | string | opcional | Código IBGE do município. |
| xMun | string | opcional | Nome do município. |
| uf | string | opcional | Sigla da UF (ex: "SP"). |
| cep | string | opcional | CEP (somente dígitos). Se "00000000", usa o CEP do emitente. |
ie no destinatário. Envie apenas cpf e indIEDest: "9". Nunca envie ie: "" ou ie: null — isso causa rejeição cStat 225 na SEFAZ.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.| Campo | Tipo | Obrigatoriedade | Descrição |
|---|---|---|---|
| nItem | number | obrigatório | Número sequencial do item (começa em 1). |
| codigo | string | obrigatório | Código interno do produto. |
| descricao | string | obrigatório | Descrição do produto (máx 120 chars). |
| ncm | string | obrigatório | NCM/SH do produto (somente dígitos, 8 posições). |
| cfop | string | obrigatório | CFOP (4 dígitos). Ex: "5102". |
| unidade | string | obrigatório | Unidade comercial. Sempre MAIÚSCULO. Ex: "UN", "KG". |
| quantidade | string | obrigatório | Quantidade com 4 casas decimais. Ex: "1.0000". |
| valorUnitario | string | obrigatório | Valor unitário com 4 casas decimais. Ex: "99.9900". |
| valorTotal | string | obrigatório | Valor total do item com 2 casas decimais. Ex: "99.99". |
| observacao | string | opcional | Observação livre do item (máx 500 chars). Também aceita obs ou infAdProd. Ver detalhes abaixo. |
| icms | object | opcional | Se omitido, a ianfe calcula automaticamente (Modo Automático). |
| pis | object | opcional | Se omitido, calculado automaticamente. |
| cofins | object | opcional | Se omitido, calculado automaticamente. |
| ibscbs | object | condicional | Dados 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. |
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" }
}Envie os totais calculados pelo seu sistema. Se não enviados, a ianfe calcula automaticamente a partir dos itens.
| Campo | Tipo | Descrição |
|---|---|---|
| vNF | string | Valor total da nota (obrigatório se enviar total). |
| vProd | string | Valor total dos produtos. |
| vBC | string | Base de cálculo ICMS. Default: "0.00". |
| vICMS | string | Valor do ICMS. Default: "0.00". |
| vDesc | string | Valor de desconto. Default: "0.00". |
| vFrete | string | Valor do frete. Default: "0.00". |
| vIBSTot | string | condicional · CRT=3 apenas. Valor total do IBS de todos os itens. Se omitido, a ianfe soma automaticamente os valores de IBS de cada item. |
| vCBSTot | string | condicional · CRT=3 apenas. Valor total da CBS de todos os itens. Se omitido, a ianfe soma automaticamente os valores de CBS de cada item. |
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.
| Despesa | Campos 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"
}
]| Campo | Tipo | Descrição |
|---|---|---|
| tPag | string | Forma de pagamento. Ver tabela de referência. Use "90" para Sem Pagamento. Use "99" para Outros (exige xPag). |
| vPag | string | Valor pago. Se tPag = "90", enviar "0.00". |
| xPag | string | opcional · 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. |
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.
| Campo | Tipo | Descrição |
|---|---|---|
| fatura | object | Dados gerais da fatura. Também aceita o nome "fat". |
| duplicatas | array | Lista de parcelas/duplicatas. Também aceita o nome "dup" (objeto único ou array). |
Subcampos de fatura:
| Campo | Tipo | Descrição |
|---|---|---|
| nFat | string | Número da fatura. |
| vOrig | string | Valor original da fatura. |
| vDesc | string | Valor de desconto. Default: "0.00". |
| vLiq | string | Valor líquido da fatura (após desconto). |
Subcampos de cada item em duplicatas[]:
| Campo | Tipo | Descrição |
|---|---|---|
| nDup | string | Número da duplicata/parcela. Ex: "001", "002". |
| dVenc | string | Data de vencimento, formato AAAA-MM-DD. |
| vDup | string | Valor 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" }
]
}Só modFrete é obrigatório. Se transporte for omitido, a ianfe assume modFrete = "9" (sem frete).
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| modFrete | string | sim | 0 = Emitente (CIF), 1 = Destinatário (FOB), 2 = Terceiros, 3 = Próprio do remetente, 4 = Próprio do destinatário, 9 = Sem frete. Alias: modalidadeFrete. |
| transportadora | objeto | não | Só é 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. |
| veiculo | objeto | não | placa, uf, RNTC. Só com modFrete 0, 1 ou 2. Alias: veicTransp. |
| volumes | objeto/array | não | Um 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).
"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
}
]
}modFrete: "3"/"4"/"9" com transportadora: nesses modos a transportadora é descartada (rejeição SEFAZ cStat 845).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).
| Formato | Exemplo | Aceito? |
|---|---|---|
| UTC sem milissegundos | 2026-10-14T19:20:27Z | ✅ Sim |
| UTC com fuso (sem ms) | 2026-10-14T19:20:27-03:00 | ✅ Sim |
| UTC com milissegundos | 2026-10-14T19:20:27.429Z | ❌ Rejeitado (cStat 225) |
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.Informações adicionais da nota. Envie dentro de nota, no objeto infAdic (alias do objeto: informacoesAdicionais, como objeto).
| Campo | Tipo | Descrição |
|---|---|---|
| infCpl | string | Informações complementares de interesse do contribuinte (máx. 5.000 caracteres). Sai no quadro "Dados adicionais" do DANFE. |
| infAdFisco | string | Informações adicionais de interesse do Fisco (máx. 2.000 caracteres). |
"infAdic": { "infCpl": "Pedido nº 9988 - entregar no periodo da manha", "infAdFisco": "" }Regras:
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.itens[].observacao, vai em infAdProd).action: "transmitir" · modelo: "nfe" — POST https://ianfe.com.br/functions/operacaoFiscal
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": ""
}
}
}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" }
]
}
}
}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"
}
]
}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.
| Campo | Onde vai | Tipo | Descrição |
|---|---|---|---|
| item.icms.cBenef | dentro do objeto icms do item | string (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.cest | direto 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"
}
}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.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).
🔴 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.
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.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| cnpj | string | obrigatório (se enviar o grupo) | CNPJ da empresa de software responsável técnica. |
| xContato | string (até 60 chars) | obrigatório | Nome da pessoa de contato técnico. |
| string (até 60 chars) | obrigatório | E-mail de contato técnico. | |
| fone | string (até 14 dígitos) | obrigatório | Telefone de contato técnico. |
| idCSRT | string | opcional | Identificador do CSRT (só use se sua empresa tiver token emitido pela SEFAZ). |
| csrtToken | string | opcional | Token bruto do CSRT — se enviado com idCSRT, a ianfe calcula o hash automaticamente (SHA-1 em Base64). |
| CSRT | string | opcional | Hash 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.
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"
}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" }| CFOP | Uso |
|---|---|
| 5102 | Venda de mercadoria — cliente no mesmo estado |
| 6102 | Venda de mercadoria — cliente em outro estado |
| 5405 | Venda com ST — cliente no mesmo estado |
| 5910 | Remessa para demonstração |
| Código | Descriçã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. |
{
"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"...>"
}chNFe, nProt, xmlProtocolo, dhRecbto e tpEmis. O XML deve ser armazenado por 5 anos por lei.| Campo | Tipo | Descrição |
|---|---|---|
| sucesso | boolean | Operação completou (verdadeiro ou falso) |
| autorizada | boolean | Nota foi autorizada (true = sucesso) |
| cStat | string | Código de status da SEFAZ |
| xMotivo | string | Descrição do status |
| nProt | string | Número do protocolo de autorização |
| chNFe | string | Chave de acesso (44 dígitos) — salve por 5 anos |
| dhRecbto | string | Data/hora do recebimento pela SEFAZ |
| tpEmis | string | "1" = normal, "4" = contingência SVC-RS, "5" = contingência SVC-AN |
| contingencia | boolean | true = nota autorizada em contingência — retransmita em até 7 dias |
| svc | string | "svc-rs" ou "svc-an" quando contingencia = true |
| motivoContingencia | string | Motivo da contingência se aplicável |
| xmlProtocolo | string | XML completo com protocolo — salve por 5 anos |
| avisos | array | Textos gerados pela ianfe quando ajustou ou descartou algo do payload. A nota é transmitida mesmo assim. Leia e corrija o ERP. Pode ser []. |
| alertas | array | Mensagens { 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.
action: "cancelar" — POST https://ianfe.com.br/functions/operacaoFiscal
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.{
"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"
}
}Os 3 campos obrigatórios para cancelar são: ambiente, cancelamento.chave e cancelamento.numero.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ambiente | string | Sim | "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.chave | string | Sim | chNFe retornado na autorização (44 dígitos). |
| cancelamento.numero | number | Sim | Nú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.nProt | string | Sim | nProt retornado na autorização. |
| cancelamento.xJust | string | Sim | Justificativa (mínimo 15, máximo 255 caracteres). |
{
"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.
{
"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"
}action: "corrigir" · modelo: "nfe" — POST https://ianfe.com.br/functions/operacaoFiscal
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.{
"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"
}
}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"
}
}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ambiente | string | Sim | "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.chave | string | Sim | Chave de acesso da NF-e (44 dígitos). |
| correcao.xCorrecao | string | Sim | Texto da correção. Mínimo 15 caracteres, máximo 1000. |
| correcao.nSeqEvento | number | Nã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.uf | string | Não | Sigla da UF do emitente, usada para rotear ao webservice correto. Se omitido, a ianfe usa a UF do objeto emitente. |
| correcao.cUF | string | Não | Código IBGE da UF (2 dígitos, ex: "35" para SP). Derivado automaticamente de uf se omitido — normalmente não precisa enviar. |
| correcao.cnpj | string | Não | CNPJ do emitente, caso não venha via emitente.cnpj ou empresa.cnpj. |
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.Pode corrigir:
Não pode corrigir:
{
"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.
{
"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"
}action: "inutilizar" · modelo: "nfe" — POST https://ianfe.com.br/functions/operacaoFiscal
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:
{
"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"
}
}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| inutilizacao.cnpj | string | Sim | CNPJ do emitente (14 dígitos) |
| inutilizacao.uf | string | Não | UF (padrão: UF do emitente) |
| inutilizacao.serie | number | Não | Série da NF-e (padrão: 1) |
| inutilizacao.nNFIni | number | Sim | Número inicial da faixa a inutilizar |
| inutilizacao.nNFFin | number | Sim | Número final da faixa (igual ao inicial para 1 nota) |
| inutilizacao.xJust | string | Sim | Justificativa (mín. 15, máx. 255 caracteres) |
| inutilizacao.ambiente | number | Não | 1 = Produção, 2 = Homologação (padrão: 1) |
| inutilizacao.ano | string | Não | Ano com 2 dígitos (padrão: ano atual, ex: "26") |
{
"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..."
}| Campo | Descrição |
|---|---|
| sucesso | true se inutilização aprovada |
| autorizada | true se cStat = 102 |
| jobId | ID do job para rastreamento nos logs |
| cStat | Código de status da SEFAZ (102 = sucesso) |
| xMotivo | Descrição do status |
| nProt | Número do protocolo de inutilização |
| dhRecbto | Data/hora do recebimento pela SEFAZ |
| xmlProtocolo | XML completo da resposta SEFAZ — salve por 5 anos |
{
"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)"
}{
"sucesso": false,
"erro": "inutilizacao.nNFIni e nNFFin são obrigatórios.",
"jobId": "inut_..."
}| Erro | Causa |
|---|---|
| inutilizacao.cnpj é obrigatório | CNPJ não informado |
| inutilizacao.nNFIni e nNFFin são obrigatórios | Faixa de números não informada |
| inutilizacao.xJust deve ter no mínimo 15 caracteres | Justificativa muito curta |
| O certificado digital não foi fornecido | Certificado ausente no emitente |
| cStat | Significado |
|---|---|
| 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 |
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');| HTTP | Situação | O que fazer |
|---|---|---|
| 200 | Operação autorizada pela SEFAZ | Salvar chNFe, nProt, xmlProtocolo |
| 422 | Rejeitada pela SEFAZ ou modelo inválido | Ler "detalhe" e corrigir o dado indicado |
| 400 | Payload inválido ou ação não permitida | Ler "erro" e corrigir o campo |
| 403 | Credenciais inválidas ou plano inativo | Verificar secret_key e api_key |
| 404 | CNPJ emitente não cadastrado | Cadastrar o emitente no painel ianfe |
| 504 | SEFAZ e contingência falharam | Ambas as rotas (estadual + SVC) retornaram erro — tente novamente ou entre em contato |
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)"
}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.).| Mensagem | Causa | Solução |
|---|---|---|
| CNPJ emitente não cadastrado | CNPJ não está na sua lista de emitentes | Cadastrar no painel ianfe |
| Rejeição: Regime Tributário diverge (481) | CRT na ianfe diverge do cadastro SEFAZ | Verificar o regime real da empresa |
| Rejeição: Regime Tributário diverge (481) | CRT na ianfe diverge do cadastro SEFAZ | Verificar o regime real da empresa |
| Rejeição: Chave de Acesso inválida (237) | chave informada está incorreta | Copiar 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érie | NF-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 | Significado | Ação |
|---|---|---|
| 100 | Autorizada | Salvar protocolo ✅ |
| 150 | Autorizada fora do prazo | Tratar igual ao 100 ✅ |
| 204 | Duplicidade — nota já autorizada | Tratar como autorizada, recuperar protocolo ✅ |
| 135 | Evento registrado (cancel / CC-e) | Sucesso ✅ |
| Outros | Rejeição | Corrigir e retransmitir ❌ |
{
"sucesso": false,
"erro": "XML inválido ou mal formado",
"detalhe": "XML não contém elemento nfeProc ou está corrompido"
}| Erro | Causa | Solução |
|---|---|---|
| XML inválido | XML não é um nfeProc válido | Use xmlProtocolo completo da resposta de transmissão |
| XML corrompido | XML foi modificado ou truncado | Recupere do banco ou retransmita a nota |
Campos comuns em TODAS as respostas:
sucesso: boolean — operação completouautorizada: boolean (se aplicável) — SEFAZ autorizoucStat: string — código de status da SEFAZxMotivo: string — descrição do statuschNFe: string — chave de acesso (44 dígitos)nProt: string — número do protocolodhRecbto: string — data/hora do recebimentoxmlProtocolo: string — XML completo (sempre retornado em transmitir/cancelar/corrigir)erro: string (apenas em erro) — descrição do problemadetalhe: string (apenas em erro) — detalhes para correçãoBaixar o XML, gerar documento impresso oficial e pré-visualização sem valor fiscal
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=yzV3C1hYWODica 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.
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.
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"
}| Item | Requisito |
|---|---|
| Formato | PNG ou JPG |
| Tamanho recomendado | 300 × 100 px (proporção 3:1) |
| Fundo | Transparente (PNG) ou branco |
| Tamanho máximo | 500 KB |
| Acesso | URL pública (sem autenticação) |
url_logotipo direto no payload de transmissão.{
"secret_key": "sellerx_Ahot8B9MXuoy2R$W",
"api_key": "yzV3C1hYWO",
"action": "transmitir",
"modelo": "nfe",
"cnpj_emitente": "37850573000114",
"url_logotipo": "https://cdn.suaempresa.com/logo.png",
"nota": { ... }
}url_logotipo na raiz do payload tem prioridade sobre o cadastrado no painel, permitindo logotipos diferentes por emissão se necessário.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>"
}| Campo | Nível | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
| action | raiz | string | Sim | Deve ser "danfe" |
| modelo | raiz | string | Sim | "nfe" — define o formato do documento (NF-e mod 55) |
| cnpj_emitente | raiz | string | Sim | CNPJ do emitente (14 dígitos) |
| invoice_id | raiz | string | Não | Seu identificador interno da nota |
| url_logotipo | raiz | string | Não | URL da logomarca para o DANFE |
| imprimir_marca_dagua | raiz | boolean | Não | Se true, imprime marca d'água "SEM VALOR FISCAL" no DANFE. Padrão: false. Útil para reimpressões, cópias ou ambiente de homologação. |
| xmlProtocolo | raiz | string | Sim | XML 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).
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... }
}{
"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"
}| Campo | Tipo | Descrição |
|---|---|---|
| sucesso | boolean | DANFE foi gerado com sucesso |
| danfe_url | string | URL temporária para download do PDF (válida por 24h) |
| pdf_base64 | string | PDF em base64 para armazenamento ou envio direto |
| chNFe | string | Chave de acesso da nota (44 dígitos) |
| modelo | string | "nfe" = A4 |
| formato | string | Formato do documento gerado |
| mensagem | string | Mensagem descritiva do resultado |
Como usar a resposta:
danfe_url: Use para download direto ou abrir em nova abapdf_base64: Decodifique e salve no seu banco, ou envie por email/WhatsApp1. 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"O motor ianfe detecta automaticamente quando a SEFAZ do estado está indisponível e ativa a contingência de forma transparente
Quando a SEFAZ estadual cai ou fica instável, a legislação permite transmitir as notas para a SEFAZ Virtual de Contingência.
| Sigla | Nome completo | Usado por |
|---|---|---|
| SVC-AN | SEFAZ Virtual Contingência — Ambiente Nacional (Brasília) | SP, MG, GO, MT, MS, AM, BA e demais |
| SVC-RS | SEFAZ Virtual Contingência — Rio Grande do Sul | PR, SC, RS |
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:
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).
| SVC | Quando usado | Estados |
|---|---|---|
| SVC-RS | Fallback padrão em contingência | Todos os estados (exceto aqueles com SVC-AN obrigatório) |
| SVC-AN | Contingência nacional complementar | Usado quando SVC-RS também falha ou em situações específicas |
A ianfe ativa contingência automaticamente em:
{
"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"...>"
}{
"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"
}| Campo | Normal | Contingência |
|---|---|---|
| contingencia | false | true |
| svc | null | "SVC-AN" ou "SVC-RS" |
| tpEmis | "1" | "6" (SVC-AN) ou "7" (SVC-RS) |
| motivoContingencia | null | Motivo da falha estadual |
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"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.');
}
}Retorno: HTTP 504 Service Unavailable
Significa que:
O que fazer: Aguarde alguns minutos e tente novamente. A indisponibilidade simultânea é rara e geralmente se resolve em menos de 30 minutos.
| Aspecto | Normal (tpEmis=1) | Contingência (tpEmis=6 ou 7) |
|---|---|---|
| SEFAZ usada | SEFAZ Estadual (SP, MG, RJ...) | SVC-AN ou SVC-RS |
| chNFe válida | Sim, imediatamente | Sim, imediatamente |
| Protocolo válido | Sim (pode consultar em tempo real) | Sim (consultar em até 7 dias) |
| Prazo de retransmissão | Sem prazo (já está autorizada) | Até 7 dias para SEFAZ estadual |
| DANFE pode imprimir | Sim | Sim (com aviso de contingência) |
| Ação do desenvolvedor | Salvar e continuar | Salvar tpEmis, retransmitir em até 7 dias |
| Método | Endpoint | Autenticação | Descrição |
|---|---|---|---|
| POST | https://ianfe.com.br/functions/operacaoFiscal | body: secret_key + api_key | OFICIAL — transmitir, cancelar, corrigir, inutilizar, danfe, pre_danfe |
| GET | api.ianfe.com.br/xml/:chave | header: x-api-key | Alternativa — baixar XML pelo chNFe |
| GET | api.ianfe.com.br/danfe/:chave | header: x-api-key | Alternativa — gerar DANFE pela chave |
| POST | api.ianfe.com.br/danfe | header: x-api-key | Alternativa — gerar DANFE pelo xmlProtocolo |
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).Node.js, Python e PHP — NF-e (mod 55)
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
}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
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);
}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:
cnpj_emitente (string) na raiz do payload — usada quando o cadastro completo da empresa já está armazenado na ianfe.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.| Campo | Tipo | Obrigatoriedade | Regras |
|---|---|---|---|
| cnpj | string | obrigatório | CNPJ 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. |
| razaoSocial | string | obrigatório | Razão social completa. |
| CRT | string | obrigatório | "1"=Simples, "2"=Simples excesso, "3"=Regime Normal. NUNCA envie null ou omita — ver aviso na seção Tabelas de Referência. |
| ie | string | condicional | Inscrição Estadual. Aliases: inscricaoEstadual, inscEstadual. Obrigatório na prática (SEFAZ costuma exigir). |
| uf | string | obrigatório | Sigla da UF (ex: "SC"). |
| cMun | string | obrigatório na prática | Có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. |
| xMun | string | obrigatório | Nome do município. |
| cep | string | obrigatório | CEP (com ou sem formatação). |
| logradouro | string | obrigatório | Endereço. |
| numero | string | obrigatório | Número do endereço. |
| bairro | string | obrigatório | Bairro. |
| telefone | string | opcional | Telefone (DDD + número). Aliases: fone, telefoneFixo, foneFixo, telefoneComercial. Aparece no DANFE abaixo do logotipo. |
| string | opcional | Não existe no schema oficial da NF-e — não é gravado no XML. Se enviado, usado apenas para exibição no DANFE. | |
| certificadoBase64 | string | obrigatório | Certificado digital A1 (.pfx) em Base64. |
| senhaCertificado | string | obrigatório | Senha do certificado digital. |
| cIdToken | string | opcional | Token de identificação (uso futuro). Vazio ("") é aceito. |
{
"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": ""
}
}🔴 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.
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).
| finNFe | Finalidade | Como a nota original é referenciada no XML |
|---|---|---|
| 1 | Normal | Não referencia (opcional) |
| 2 | Complementar | <NFref><refNFe> no cabeçalho (<ide>) |
| 3 | Ajuste | <NFref><refNFe> no cabeçalho (<ide>) |
| 4 | Devolução | <DFeReferenciado> dentro de cada item (<det>). Sem <NFref>. |
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.| Campo | Onde | Tipo | Descrição |
|---|---|---|---|
| chaveReferenciada | nota | string (44) | Chave da nota original. Atalho para uma única nota. Aliases: refNFe, chaveNFeReferenciada. |
| notasReferenciadas | nota | array | Várias notas originais: [{ "refNFe": "..." }] ou lista de strings. |
| nItemOriginal | itens[] | 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). |
| chaveReferenciada | itens[] | 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).
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).
| CFOP | Operação | Tipo |
|---|---|---|
| 1202 | Devolução de venda (dentro do estado) | Entrada |
| 2202 | Devolução de venda (de outro estado) | Entrada |
| 5202 | Devolução de compra (para destinatário no mesmo estado) | Saída |
| 6202 | Devolução de compra (para destinatário em outro estado) | Saída |
A ianfe não valida estas regras; quem rejeita é a SEFAZ:
{
"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.
Declaração de Importação, Imposto de Importação e IPI por item
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 | Tipo | Descrição |
|---|---|---|
| numero | string | Número da DI (Declaração de Importação) |
| data | string (AAAA-MM-DD) | Data de registro da DI |
| localDesembaraco | string | Local do desembaraço (ex: "PORTO DE SANTOS") |
| ufDesembaraco | string | UF do desembaraço (ex: "SP") |
| dataDesembaraco | string (AAAA-MM-DD) | Data do desembaraço aduaneiro |
| viaTransporte | string | Ver tabela de vias de transporte abaixo |
| valorAFRMM | number | Valor da AFRMM (Adicional ao Frete para Renovação da Marinha Mercante) |
| tipoIntermediacao | string | 1=Importação direta, 2=Por conta e ordem de terceiro, 3=Por encomenda |
| exportador | string | Nome do exportador no exterior |
| adicoes | array | Lista de adições da DI. Se omitido, gera automaticamente 1 adição padrão |
| Campo | Tipo | Descrição |
|---|---|---|
| numeroAdicao | number | Número da adição (sequencial) |
| numeroSequencialItem | number | Número sequencial do item dentro da adição |
| fabricante | string | Nome do fabricante no exterior |
| valorDesconto | number | Valor de desconto da adição. Default: 0 |
| numeroDrawback | string | Número do regime Drawback (opcional) |
| Código | Descrição |
|---|---|
| 1 | Marítima |
| 2 | Fluvial |
| 3 | Lacustre |
| 4 | Aérea |
| 5 | Postal |
| 6 | Ferroviária |
| 7 | Rodoviária |
| 8 | Conduto / Rede |
| 9 | Meios Próprios |
| 10 | Entrada / Saída Ficta |
| Código | Descrição | Campos adicionais obrigatórios |
|---|---|---|
| 1 | Importação direta | — |
| 2 | Por conta e ordem de terceiro | cnpjAdquirente (CNPJ do terceiro) |
| 3 | Por encomenda | cnpjAdquirente + ufTerceiro (UF do terceiro) |
{
"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 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"
}
}
}orig: "1" no bloco icms do item indica origem estrangeira – importação direta (código de origem exigido pela SEFAZ para produto importado).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.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.Grupo exporta (direta) e detExport (indireta via trading)
Quando o próprio emitente exporta a mercadoria (tipicamente CFOP 7.xx). Envie o objeto exportacao na raiz do payload (ou dentro de nota).
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ufSaidaPais | string | Sim | UF de saída do país (ex: "SP") |
| localExporta | string | Sim | Local de exportação (ex: "PORTO DE SANTOS") |
| localDespacho | string | Não | Local 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.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.
| Campo | Tipo | Descrição |
|---|---|---|
| registroExportacao | string | Número do Registro de Exportação (RE) |
| quantidadeExportada | number | Quantidade do item exportada |
{
"itens": [{
"...": "...",
"detExport": [{
"registroExportacao": "26SP0012345",
"quantidadeExportada": 10
}]
}]
}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.
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:
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".
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 real | Vem 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ção | Envie 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):
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.chNFe, nProt e xmlProtocolo retornados.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".
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.
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):
Cronograma de obrigatoriedade:
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.
| Período | pIBSUF | pIBSMun |
|---|---|---|
| 2026 (atual) | 0,10% | 0% (obrigatório) |
| 2027 e 2028 | a definir (não é mais 0,10% fixo) | 0,05% |
| 2029 em diante | alíquota de referência/específica publicada pelo Comitê Gestor do IBS | idem |
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.
| Campo | Tipo | Obrigatoriedade | Descrição |
|---|---|---|---|
| CST | string (3 dígitos) | opcional | Código de Situação Tributária do IBS/CBS. Default: "000" (Tributação Integral). Ver tabela de CST IBS/CBS abaixo. |
| cClassTrib | string (6 dígitos) | opcional | Có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. |
| vBC | string | opcional | Base de cálculo do IBS/CBS. Se omitido, usa o valorTotal do item. |
| pCBS | number | opcional | Alí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. |
| vCBS | string | opcional | Valor calculado da CBS. Se omitido, a ianfe calcula como vBC × pCBS / 100. |
| pIBSUF | number | opcional | Alíquota IBS da UF (estado) em percentual. Default 2026: 0.10 (100% do IBS de teste vai para a UF neste ano). |
| vIBSUF | string | opcional | Valor IBS da UF. Se omitido, calculado automaticamente. |
| pIBSMun | number | opcional | Alí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. |
| vIBSMun | string | opcional | Valor IBS do Município. Se omitido, calculado automaticamente. |
| vIBS | string | opcional | Valor total do IBS do item (UF + Município). Se omitido, calculado como vIBSUF + vIBSMun. |
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.
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:
| CST | Descrição |
|---|---|
| 000 | Tributação integral (alíquotas padrão, sem reduções) — caso mais comum |
| 200/201 | Alíquota reduzida |
| 400/410 | Isenção |
| 500/510/550/551 | Suspensão / diferimento |
| 620 | Tributação monofásica (combustíveis) |
| 810 | Crédito presumido (ex: Zona Franca de Manaus) |
| 811 | Ajuste de crédito (usa grupo gAjusteCompet em vez de gIBSCBS) |
| 820 | Tributação em declaração de regime específico (sem grupo de alíquotas) |
| 830 | Exclusão de base de cálculo (sem grupo de alíquotas) |
| 900 | Outros |
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" }
}ibscbs omitido), a ianfe gera automaticamente no XML: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"
}
}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.
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 DANFE | Fonte 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.
🔴 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.
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.
.///-) 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.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.ianfe — Documentação de Integração v3.19 · NF-e (mod 55) · Dúvidas: suporte via WhatsApp no painel