Emitir NF-e
POST /nfe?ref=SUA-REF: emite uma NF-e. A resposta é assíncrona: 202 significa que a nota foi aceita, tem número reservado e está a caminho da SEFAZ.
| Rota | POST /api/v2/nfe?ref={ref} |
| Corpo | JSON com a venda (destinatário, itens, pagamentos...) |
| Qual empresa emite | cnpj_emitente no corpo (ou na query). Conta com uma só empresa dispensa o campo |
| Limite | 120 emissões por minuto por chave (ajustável por conta) |
| Resposta | Quando |
|---|---|
202 |
aceita e na fila (ou a nota da ref já estava em andamento com este mesmo conteúdo) |
200 |
a ref já tinha uma nota com este mesmo conteúdo, em estado final: devolve o estado atual |
404 |
a empresa não é da sua conta (empresa_nao_encontrada) |
409 |
a ref já pertence a uma nota com outro conteúdo (ref_ja_utilizada) |
422 |
requisição inválida (requisicao_invalida), cálculo fiscal recusado (validacao_fiscal) ou empresa não informada (cnpj_emitente_obrigatorio) |
Tudo o que dá para recusar sem a SEFAZ volta como 422 aqui, antes de gastar um número da série: nota recusada na validação não deixa buraco na numeração.
O exemplo mínimo
Venda para um consumidor final (pessoa física) em outro estado, paga por PIX. É o menor corpo que emite uma nota completa:
{
"nome_destinatario": "Maria da Silva",
"cpf_destinatario": "529.982.247-25",
"logradouro_destinatario": "Av Atlantica",
"numero_destinatario": "500",
"bairro_destinatario": "Copacabana",
"municipio_destinatario": "Rio de Janeiro",
"codigo_municipio_destinatario": "3304557",
"uf_destinatario": "RJ",
"cep_destinatario": "22010-000",
"items": [
{
"codigo_produto": "CAMISA-P",
"descricao": "Camiseta basica algodao P",
"codigo_ncm": "61091000",
"icms_origem": 0,
"quantidade_comercial": 1,
"valor_unitario_comercial": 100.00
}
],
"formas_pagamento": [ { "forma_pagamento": "17" } ]
}
Resposta 202:
{
"cnpj_emitente": "11222333000181",
"ref": "PED-1001",
"ambiente": "homologacao",
"status": "processando_autorizacao",
"numero": "1",
"serie": "1",
"chave_nfe": null,
"protocolo_sefaz": null,
"status_sefaz": null,
"mensagem_sefaz": null,
"mensagem": null,
"valor_total": 100,
"autorizada_em": null,
"caminho_xml_nota_fiscal": null,
"caminho_danfe": null,
"eventos": []
}
Note que o ICMS, o DIFAL, o PIS/COFINS e o CFOP não foram informados: a plataforma calcula pelo regime da empresa e pela operação. Aqui, por ser uma venda interestadual a consumidor final não contribuinte, ela calcula também o DIFAL.
Segundos depois, GET /nfe/PED-1001 devolve a nota autorizada:
{
"cnpj_emitente": "11222333000181",
"ref": "PED-1001",
"ambiente": "homologacao",
"status": "autorizado",
"numero": "1",
"serie": "1",
"chave_nfe": "35261011222333000181550010000000011219954665",
"protocolo_sefaz": "135260000000001",
"status_sefaz": "100",
"mensagem_sefaz": "Autorizado o uso da NF-e",
"mensagem": null,
"valor_total": 100,
"autorizada_em": "2026-10-04T15:50:10+00:00",
"caminho_xml_nota_fiscal": "https://srv1839254.hstgr.cloud/api/v2/nfe/PED-1001/xml?cnpj_emitente=11222333000181",
"caminho_danfe": "https://srv1839254.hstgr.cloud/api/v2/nfe/PED-1001/danfe?cnpj_emitente=11222333000181",
"eventos": []
}
A resposta da nota
| Campo | Significado |
|---|---|
cnpj_emitente, ref, ambiente |
quem emitiu, o seu identificador e homologacao ou producao |
status |
estado atual: veja os estados |
numero, serie |
número fiscal da NF-e e série (texto). Reservados na aceitação; não mudam se a nota for rejeitada e reenviada |
chave_nfe |
chave de acesso de 44 dígitos (existe depois que a nota é montada e assinada) |
protocolo_sefaz |
protocolo de autorização |
status_sefaz, mensagem_sefaz |
código (cStat) e texto da última resposta da SEFAZ. Sempre o original |
mensagem |
por que a nota está parada ou foi recusada, numa frase (rejeição da SEFAZ ou pendência de validação) |
valor_total |
valor da nota em reais |
autorizada_em |
quando a SEFAZ autorizou |
caminho_xml_nota_fiscal |
link do XML autorizado. Continua disponível depois do cancelamento (guarda obrigatória de 5 anos) |
caminho_danfe |
link do DANFE (PDF), enquanto a nota vale |
eventos |
cancelamentos e cartas de correção, com o estado de cada um (veja Consultar e eventos) |
Os links exigem a chave de API, como qualquer chamada. Guarde o XML autorizado: é o documento fiscal, e você precisa mantê-lo por 5 anos.
Referência dos campos
Campo desconhecido é recusado (422, com o caminho do campo). Valores em reais (número). Documentos aceitam máscara.
Nota
| Campo | Regra |
|---|---|
cnpj_emitente |
a empresa que emite. Dispensável se a conta tem uma só |
serie |
série em que a nota sai, 0 a 889. Padrão 1. O próximo número de cada série se configura em Numeração |
natureza_operacao |
texto, até 60. Padrão VENDA DE MERCADORIA |
presenca_comprador |
0 não se aplica, 1 presencial, 2 internet, 3 teleatendimento, 4 entrega a domicílio, 5 presencial fora do estabelecimento, 9 outros. Padrão 2 |
modalidade_frete |
0 por conta do remetente, 1 do destinatário, 2 de terceiros, 3 transporte próprio do remetente, 4 do destinatário, 9 sem frete. Padrão 9 |
consumidor_final |
0 ou 1. Padrão: 1 se o destinatário não é contribuinte de ICMS e 0 se é |
valor_frete, valor_seguro, valor_desconto, valor_outras_despesas |
valores da nota, que a API rateia entre os itens (como) |
valor_total |
opcional: o total que você calculou, com IPI (o vNF). A nota só sai se o total calculado pela API fechar com ele |
valor_produtos |
opcional: soma dos itens, só para conferência |
informacoes_adicionais_contribuinte |
texto livre (até 2000) que vai nas informações complementares da nota |
cnpj_intermediador, identificador_intermediador |
venda por marketplace (abaixo) |
tipo_documento |
só 1 (saída) |
finalidade_emissao |
só 1 (normal). Devolução, complementar e ajuste ainda não |
local_destino |
1 interna, 2 interestadual. Precisa bater com as UFs (emitente e destinatário) |
Destinatário
Informe um documento: cpf_destinatario ou cnpj_destinatario (com dígito verificador válido; o CNPJ pode ser alfanumérico).
| Campo | Regra |
|---|---|
nome_destinatario |
obrigatório |
cpf_destinatario / cnpj_destinatario |
exatamente um dos dois |
inscricao_estadual_destinatario |
dígitos, ou o texto ISENTO |
indicador_inscricao_estadual_destinatario |
1 contribuinte, 2 isento, 9 não contribuinte. Padrão: CNPJ com IE → 1; ISENTO → 2; o resto → 9. Com 1 a IE é obrigatória |
logradouro_destinatario, bairro_destinatario, municipio_destinatario |
obrigatórios |
numero_destinatario |
padrão S/N |
complemento_destinatario, telefone_destinatario, email_destinatario |
opcionais |
uf_destinatario |
obrigatório; UF válida |
cep_destinatario |
obrigatório, 8 dígitos |
codigo_municipio_destinatario |
código IBGE do município (7 dígitos). Informe sempre que puder: se faltar, a API tenta descobrir pelo CEP (consulta externa) e, se não conseguir, devolve 422 pedindo o código |
pais_destinatario |
só Brasil (Brasil ou 1058). Destinatário no exterior não é suportado |
Em homologação a SEFAZ exige o texto
NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCALno nome do destinatário e na descrição do item 1: a plataforma coloca sozinha. Você manda os dados reais normalmente.
Itens (items)
De 1 a 990 itens, na ordem.
| Campo | Regra |
|---|---|
codigo_produto |
obrigatório (até 60). É o SKU e a chave do catálogo |
descricao |
descrição do item (até 120 saem na nota). Se faltar, vem do catálogo |
codigo_ncm |
NCM, 8 dígitos. Se faltar, vem do catálogo |
icms_origem |
origem da mercadoria, 0 a 8. Se faltar, vem do catálogo |
quantidade_comercial |
obrigatória, maior que zero, até 4 casas |
valor_unitario_comercial |
obrigatório, até 10 casas (0.3333 vale) |
valor_bruto |
opcional: quantidade × preço. Se vier, precisa bater com a conta (tolerância de R$ 0,01, como a SEFAZ) |
unidade_comercial |
padrão UN (ou a do catálogo) |
codigo_barras_comercial |
GTIN válido, ou SEM GTIN/omitido |
codigo_cest |
7 dígitos |
producao_propria |
true para o que você fabrica (CFOP x101). Padrão: revenda (x102) |
valor_desconto, valor_frete, valor_seguro, valor_outras_despesas |
valores do item, somados ao rateio da nota |
numero_item |
opcional; se vier, tem de ser a posição do item (1, 2, 3...) |
unidade_tributavel, quantidade_tributavel, valor_unitario_tributavel |
só aceitos se iguais aos comerciais (unidade tributável diferente ainda não é suportada) |
inclui_no_total |
só 1 |
cfop, icms_situacao_tributaria, icms_aliquota, icms_reducao_base_calculo, fcp_aliquota, icms_difal, pis_situacao_tributaria, pis_aliquota_porcentual, cofins_situacao_tributaria, cofins_aliquota_porcentual, ipi_situacao_tributaria, ipi_aliquota |
parâmetros fiscais do modo híbrido. Opcionais: o que você não informa a plataforma calcula |
Valores de imposto (icms_valor, icms_base_calculo, pis_valor, ipi_valor...) são recusados, com uma mensagem que explica: a API calcula os valores a partir dos parâmetros.
Pagamentos (formas_pagamento)
Pelo menos uma forma de pagamento.
| Campo | Regra |
|---|---|
forma_pagamento |
obrigatório. Código da NF-e: 01 dinheiro, 02 cheque, 03 cartão de crédito, 04 cartão de débito, 05 crédito loja, 10 a 13 vales (alimentação, refeição, presente, combustível), 14 duplicata mercantil, 15 boleto, 16 depósito, 17 PIX, 90 sem pagamento, 99 outros. 18 a 22 são os demais meios da tabela de formas de pagamento do leiaute da NF-e (tPag) |
valor_pagamento |
opcional com uma forma (paga a nota inteira); obrigatório com duas ou mais, e a soma tem de fechar com o valor da nota |
descricao_pagamento |
obrigatória na forma 99 |
indicador_pagamento |
0 à vista, 1 a prazo. Padrão 1 para 03, 05 e 14; 0 para as demais |
tipo_integracao_pagamento |
cartão (03 e 04): 1 integrado ao sistema de pagamento, 2 não integrado. Obrigatório no cartão. PIX dinâmico (17) também leva o grupo de pagamento eletrônico na nota: se você não informar, sai como 2 (não integrado) — a SEFAZ rejeita (391) o PIX sem esse grupo |
cnpj_credenciadora, bandeira_operadora, numero_autorizacao |
cartão integrado (tipo_integracao_pagamento = 1): obrigatórios. Bandeira: 01 Visa, 02 Mastercard, 03 Amex, 04 Sorocred, 05 Diners, 06 Elo, 07 Hipercard, 08 Aura, 09 Cabal, 99 outras |
Frete, desconto e rateio
Você pode informar frete, seguro, desconto e outras despesas na nota e/ou em cada item. Os valores da nota são rateados entre os itens, proporcionalmente ao valor de cada um, e a soma dos itens bate exatamente com o que você informou (a diferença de arredondamento vai para os maiores restos). Os valores de cada item entram além do rateio.
Exemplo: dois itens de R$ 100,00 e R$ 30,00, frete de R$ 10,00 na nota e desconto de R$ 5,00. O frete se divide em R$ 7,69 e R$ 2,31; o desconto em R$ 3,85 e R$ 1,15. A nota fecha em 100 + 30 + 10 − 5 = 135,00.
O desconto de um item não pode passar do valor dele.
Total e pagamentos precisam fechar
Antes de emitir, a API calcula o total da nota e confere:
- se você informou
valor_total, ele tem de bater com o total calculado (incluindo IPI). Se não bater:422 validacao_fiscalcom a mensagemTotal calculado (11500) difere do total informado (9990).(valores em centavos). É a rede de segurança para um erro de cálculo do seu lado não virar uma nota errada; - com duas ou mais formas de pagamento, a soma de
valor_pagamentotem de fechar com o valor da nota.
Campos aceitos e ignorados
Para facilitar a migração de quem vem de outro emissor, estes campos são aceitos e ignorados de propósito:
data_emissao,data_entrada_saida: a nota sai com o horário real da emissão, o da plataforma;cpf_emitente,nome_emitente,nome_fantasia_emitente,logradouro_emitente,numero_emitente,bairro_emitente,municipio_emitente,uf_emitente,cep_emitente,inscricao_estadual_emitente,regime_tributario_emitente: os dados do emitente vêm do cadastro da empresa.
Qualquer outro campo desconhecido é recusado.
Reenvio de uma ref
O que acontece ao enviar de novo uma ref que já existe depende do estado da nota:
| Estado da nota | Mesmo conteúdo | Conteúdo diferente |
|---|---|---|
processando_autorizacao |
202, devolve o estado (repetir por falha de rede é seguro) |
409 ref_ja_utilizada |
autorizado, cancelado, denegado, inutilizado |
200, devolve o estado |
409 ref_ja_utilizada: use uma ref nova |
erro_autorizacao ou erro_validacao |
reenfileira (é o "tentar de novo") | aceita o conteúdo corrigido e reenfileira, com o mesmo número |
Em resumo: nota rejeitada se corrige reenviando na mesma ref; nota cancelada, denegada ou inutilizada nunca reaproveita a ref para outro conteúdo (assim, uma repetição por falha de rede jamais emite uma segunda nota). Para uma venda nova, use sempre uma ref nova.
O corpo do 409:
{ "codigo": "ref_ja_utilizada", "mensagem": "A ref PED-1001 já pertence a uma nota (autorizado) com outro conteúdo. Use uma ref nova para uma nota nova.", "status_atual": "autorizado" }
Exemplos prontos
Venda B2B com frete, desconto e pagamento dividido
Empresa do Simples Nacional vendendo para uma empresa contribuinte de outro estado. Dois itens, frete de R$ 10,00 e desconto de R$ 5,00 na nota, total conferido, pago em PIX e boleto a prazo:
{
"natureza_operacao": "VENDA DE MERCADORIA ADQUIRIDA",
"modalidade_frete": 1,
"valor_frete": 10.00,
"valor_desconto": 5.00,
"valor_total": 135.00,
"informacoes_adicionais_contribuinte": "Pedido de compra 4471.",
"nome_destinatario": "COMERCIAL RIO LTDA",
"cnpj_destinatario": "11.444.777/0001-61",
"inscricao_estadual_destinatario": "12345678",
"logradouro_destinatario": "Av Atlantica",
"numero_destinatario": "500",
"bairro_destinatario": "Copacabana",
"municipio_destinatario": "Rio de Janeiro",
"codigo_municipio_destinatario": "3304557",
"uf_destinatario": "RJ",
"cep_destinatario": "22010-000",
"items": [
{ "codigo_produto": "CAMISA-P", "descricao": "Camiseta basica algodao P", "codigo_ncm": "61091000", "icms_origem": 0,
"quantidade_comercial": 2, "valor_unitario_comercial": 50.00, "codigo_barras_comercial": "7891000100103" },
{ "codigo_produto": "BONE-U", "descricao": "Bone aba curva", "codigo_ncm": "65050090", "icms_origem": 0,
"quantidade_comercial": 1, "valor_unitario_comercial": 30.00 }
],
"formas_pagamento": [
{ "forma_pagamento": "17", "valor_pagamento": 85.00 },
{ "forma_pagamento": "15", "valor_pagamento": 50.00, "indicador_pagamento": 1 }
]
}
Venda por marketplace com cartão
Quando a venda foi intermediada por um marketplace, informe o CNPJ do intermediador (e o seu identificador de vendedor lá). O pagamento por cartão integrado exige credenciadora, bandeira e número de autorização:
{
"cnpj_intermediador": "03.007.331/0001-41",
"identificador_intermediador": "123456789",
"nome_destinatario": "Maria da Silva",
"cpf_destinatario": "529.982.247-25",
"logradouro_destinatario": "Av Atlantica",
"numero_destinatario": "500",
"bairro_destinatario": "Copacabana",
"municipio_destinatario": "Rio de Janeiro",
"codigo_municipio_destinatario": "3304557",
"uf_destinatario": "RJ",
"cep_destinatario": "22010-000",
"items": [
{ "codigo_produto": "CAMISA-P", "descricao": "Camiseta basica algodao P", "codigo_ncm": "61091000", "icms_origem": 0,
"quantidade_comercial": 1, "valor_unitario_comercial": 100.00 }
],
"formas_pagamento": [
{
"forma_pagamento": "03",
"tipo_integracao_pagamento": 1,
"cnpj_credenciadora": "03.007.331/0001-41",
"bandeira_operadora": "01",
"numero_autorizacao": "A12345"
}
]
}
Com cnpj_intermediador a nota sai com o indicador de intermediador ligado. O identificador_intermediador sozinho (sem o CNPJ) é recusado.
Empresa do regime normal, venda interna
Empresa do Lucro Presumido vendendo dentro do próprio estado. O ICMS, o PIS, a COFINS e o IBS/CBS são calculados pelo regime, sem você informar nada:
{
"nome_destinatario": "COMERCIAL PAULISTA LTDA",
"cnpj_destinatario": "11.444.777/0001-61",
"inscricao_estadual_destinatario": "110042490114",
"logradouro_destinatario": "Rua Augusta",
"numero_destinatario": "1000",
"bairro_destinatario": "Consolacao",
"municipio_destinatario": "Sao Paulo",
"codigo_municipio_destinatario": "3550308",
"uf_destinatario": "SP",
"cep_destinatario": "01304-001",
"items": [
{ "codigo_produto": "CAMISA-P", "descricao": "Camiseta basica algodao P", "codigo_ncm": "61091000", "icms_origem": 0,
"quantidade_comercial": 2, "valor_unitario_comercial": 50.00 }
],
"formas_pagamento": [ { "forma_pagamento": "15", "indicador_pagamento": 1 } ]
}
Item só com o SKU, usando o catálogo
Se o produto está no catálogo, o item pode ir só com o essencial: o NCM, a origem, a descrição e a unidade vêm do cadastro.
{
"nome_destinatario": "Maria da Silva",
"cpf_destinatario": "529.982.247-25",
"logradouro_destinatario": "Av Atlantica",
"numero_destinatario": "500",
"bairro_destinatario": "Copacabana",
"municipio_destinatario": "Rio de Janeiro",
"codigo_municipio_destinatario": "3304557",
"uf_destinatario": "RJ",
"cep_destinatario": "22010-000",
"items": [ { "codigo_produto": "CAMISA-P", "quantidade_comercial": 3, "valor_unitario_comercial": 100.00 } ],
"formas_pagamento": [ { "forma_pagamento": "17" } ]
}
Quando a emissão é recusada
Exemplos reais do que a API devolve na hora, antes de gastar um número:
Campos inválidos (422 requisicao_invalida, com todos os problemas de uma vez):
{
"codigo": "requisicao_invalida",
"mensagem": "O campo nome destinatario é obrigatório.",
"erros": {
"nome_destinatario": ["O campo nome destinatario é obrigatório."],
"uf_destinatario": ["O valor informado em uf destinatario é inválido."],
"items.0.codigo_ncm": ["O campo items.0.codigo_ncm deve ter 8 dígitos."],
"items.0.icms_valor": ["A API calcula icms_valor a partir da situação tributária e da alíquota informadas; não envie este valor."]
}
}
Recusa fiscal (422 validacao_fiscal): o cálculo ou a empresa não permitem emitir. Exemplos: total que não fecha, cenário tributário que o motor não suporta, certificado vencido, empresa inativa, produção bloqueada.
{ "codigo": "validacao_fiscal", "mensagem": "Total calculado (11500) difere do total informado (9990)." }
ref já usada com outro conteúdo (409): veja Reenvio de uma ref.
Se a nota passou pela validação e a SEFAZ a rejeitar, o status fica erro_autorizacao e a nota traz o motivo original:
{
"ref": "PED-1005", "status": "erro_autorizacao", "numero": "3", "chave_nfe": "35261011222333000181550010000000031948157050",
"status_sefaz": "225", "mensagem_sefaz": "Rejeicao: Falha no Schema XML da NFe", "mensagem": "Rejeição 225: Rejeicao: Falha no Schema XML da NFe"
}
Corrija o problema e reenvie na mesma ref: o número fiscal é o mesmo (rejeição não consome número). Veja os motivos mais comuns em Erros.