Documentação

API de NF-e

Basehttps://api.apisimples.com/v1

Visão geral

A emissão usa o emitente da chave. Razão social, endereço, inscrição estadual, regime e certificado A1 ficam no cadastro. O JSON descreve a operação, o destinatário e os itens. A API monta o XML, assina e envia à SEFAZ.

POST/nfeEnvia a NF-e à SEFAZ e grava a nota quando ela é autorizada.
GET/nfe/{id}Consulta a NF-e pelo id ou pela identificação.
POST/nfe/{id}/cancelarCancela a NF-e autorizada deste emitente na SEFAZ.
POST/nfe/carta_correcaoRegistra uma carta de correção da NF-e autorizada na SEFAZ.
POST/nfe/interessadoAutoriza ou remove o transportador como ator interessado da NF-e.
POST/nfe/comprovanteRegistra ou cancela o comprovante de entrega da NF-e.
GET/nfe/{id}/eventosLista os eventos gravados para a nota.
GET/nfe/{id}/pdfGera o DANFE em PDF a partir do XML autorizado.
GET/nfe/{id}/pdf/simplesGera o DANFE simplificado.
GET/nfe/{id}/pdf/etiquetaGera o DANFE em etiqueta.

Testar

Cole a chave do emitente e envie a requisição nesta página. A chave fica neste navegador e segue somente para a API, no header Authorization.

POST

Autenticação

Use a chave do emitente, a que começa com apse_. A chave geral da conta não autoriza estas rotas.

Authorization: Bearer apse_sua_chave_do_emitente
Content-Type: application/json
Accept: application/json

Sem chave, ou com chave inválida, a resposta é HTTP 401. Conta inativa ou emitente sem NF-e habilitada responde HTTP 403.

Ambientes

A URL é a mesma. No cadastro do emitente ficam o ambiente da SEFAZ e o certificado A1.

CadastroValoresEfeito na emissão
Ambiente 2 homologação, 1 produção Homologação fala com o ambiente de testes. Produção autoriza NF-e com valor fiscal. Sem a escolha, a API usa homologação.
Certificado A1 e senha Obrigatório para assinar e transmitir. Sem ele, o POST responde 422.

Em homologação, o XML troca o nome do destinatário pelo texto exigido pela SEFAZ. Quando o JSON traz contingencia, a nota sai em SVC-AN.

Emitir

POSThttps://api.apisimples.com/v1/nfe

HTTP 201 devolve a nota autorizada, com chave, protocolo e xml em base64. O número com a série, e a identificação, são únicos por emitente. Repetir um dos dois responde HTTP 409.

Se a SEFAZ recusar, a nota não é gravada e a resposta é HTTP 422. Se denegar, o número fica gravado com status denegada.

{
    "identificacao": "pedido-1042",
    "natureza_operacao": "Venda de mercadoria",
    "numero": "15",
    "serie": "1",
    "data_emissao": "2026-10-10T14:30:00-03:00",
    "tipo_operacao": "1",
    "finalidade_emissao": "1",
    "consumidor_final": "1",
    "presenca_comprador": "1",
    "destinatario": {
        "cnpj": "19131243000197",
        "nome": "Cliente Exemplo Ltda",
        "indicador_inscricao_estadual": "9",
        "endereco": {
            "logradouro": "Rua das Acácias",
            "numero": "120",
            "bairro": "Centro",
            "codigo_municipio": "3550308",
            "nome_municipio": "São Paulo",
            "uf": "SP",
            "cep": "01001000"
        }
    },
    "itens": [
        {
            "numero_item": "1",
            "codigo_produto": "SKU-1",
            "descricao": "Camiseta algodão",
            "codigo_ncm": "61091000",
            "cfop": "5102",
            "unidade_comercial": "UN",
            "quantidade_comercial": "1",
            "valor_unitario_comercial": "150.00",
            "valor_bruto": "150.00",
            "inclui_no_total": "1",
            "origem": "0",
            "imposto": {
                "icms": {
                    "situacao_tributaria": "00",
                    "modalidade_base_calculo": "3",
                    "valor_base_calculo": "150.00",
                    "aliquota": "18.00",
                    "valor": "27.00"
                },
                "pis": {
                    "situacao_tributaria": "07"
                },
                "cofins": {
                    "situacao_tributaria": "07"
                }
            }
        }
    ],
    "frete": {
        "modalidade_frete": "9"
    },
    "pagamento": {
        "formas_pagamento": [
            {
                "meio_pagamento": "01",
                "valor": "150.00"
            }
        ]
    }
}

Se omitir, a API preenche local_destino, o código de barras com SEM GTIN, a unidade tributável com a comercial e, sem pagamento, envia a forma 90 com valor zero.

Consultar

GEThttps://api.apisimples.com/v1/nfe/{id}
GEThttps://api.apisimples.com/v1/nfe/{identificacao}

O segundo caminho usa o valor de identificacao. HTTP 200 devolve o JSON gravado, mais status, chave, protocolo e xml em base64. Cartas de correção, atores interessados e comprovantes de entrega voltam nas listas cartas_correcao, atores_interessados e comprovantes_entrega. HTTP 404 se a nota não for deste emitente.

Cancelar

POSThttps://api.apisimples.com/v1/nfe/{id}/cancelar

O caminho aceita o id da nota ou a identificação. A nota precisa estar autorizada. HTTP 200 devolve a nota com status cancelada e o XML do evento em cancelamento.xml, em base64. Se ela já estiver cancelada, a resposta é HTTP 409.

{
    "justificativa": "Nota emitida com destinatário incorreto."
}
CampoTipoObrigatórioDescrição
justificativastringSimDe 15 a 255 caracteres.

Carta de correção

POSThttps://api.apisimples.com/v1/nfe/carta_correcao

A nota precisa estar autorizada. O campo id é o uuid devolvido na emissão ou na consulta. A identificação da nota não entra aqui. A API usa a chave de 44 dígitos já gravada, assina o evento e envia à SEFAZ. HTTP 200 devolve a nota com a lista cartas_correcao. Cada item traz sequencial, justificativa, protocolo, data e xml em base64. O status da nota continua autorizada.

Uma carta nova substitui a anterior. O texto precisa repetir todas as correções que continuam valendo, e o sequencial sobe de 1 até 20. Sem sequencial, a API usa o próximo número. A carta não serve para mudar valor de imposto, remetente, destinatário ou data de emissão.

{
    "id": "8f3c2a10-6b4e-4d2a-9c11-2e5a7b9d0f31",
    "justificativa": "Teste de carta de correcao"
}
CampoTipoObrigatórioDescrição
idstringSimUuid da nota devolvido pela API. A identificação não serve neste campo.
sequencialintegerNãoDe 1 a 20. Precisa ser o próximo número desta nota.
justificativastringSimDe 15 a 1000 caracteres. É o texto da correção.

Ator interessado

POSThttps://api.apisimples.com/v1/nfe/interessado

A nota precisa estar autorizada. O campo id é o uuid devolvido na emissão ou na consulta. A API usa a chave de 44 dígitos já gravada, assina o evento 110150 e envia ao Ambiente Nacional. O certificado do emitente assina o evento. HTTP 200 devolve a nota com a lista atores_interessados. O status da nota continua autorizada.

tipo_autor 1 é o emitente, 2 o destinatário e 3 o transportador. permite true autoriza o CPF ou CNPJ informado a baixar o XML. permite false remove essa autorização. Sem numero_evento, a API usa o próximo número, de 1 a 20. Informe o CPF ou o CNPJ do transportador, um dos dois.

{
    "id": "8f3c2a10-6b4e-4d2a-9c11-2e5a7b9d0f31",
    "tipo_autor": "1",
    "permite": true,
    "cpf": "01234567890"
}
CampoTipoObrigatórioDescrição
idstringSimUuid da nota devolvido pela API. A identificação não serve neste campo.
tipo_autorstringSim1 emitente, 2 destinatário ou 3 transportador.
permitebooleanSimtrue autoriza o download do XML. false remove a autorização.
numero_eventointegerNãoDe 1 a 20. Precisa ser o próximo número desta nota.
cpfstringNãoCPF do transportador, com 11 dígitos. Use no lugar do CNPJ.
cnpjstringNãoCNPJ do transportador, com 14 dígitos. Use no lugar do CPF.

Comprovante de entrega

POSThttps://api.apisimples.com/v1/nfe/comprovante

A nota precisa estar autorizada. O campo id é o uuid devolvido na emissão ou na consulta. A API usa a chave de 44 dígitos já gravada. O certificado do emitente assina o evento e envia ao Ambiente Nacional. HTTP 200 devolve a nota com a lista comprovantes_entrega. O status da nota continua autorizada.

Com registra, a API envia o evento 110130. A imagem entra só no hash SHA1 junto com a chave e não volta na resposta. As coordenadas são opcionais. Sem elas, o evento segue sem GPS. Com cancela, a API envia o evento 110131 e usa o protocolo do comprovante já gravado. O número do evento sobe sozinho, de 1 a 20.

{
    "id": "8f3c2a10-6b4e-4d2a-9c11-2e5a7b9d0f31",
    "registra": {
        "data": "2021-09-16T16:22:33-03:00",
        "imagem": "",
        "recebedor_documento": "123456789",
        "recebedor_nome": "Fulano de Tal",
        "coordenadas": {
            "latitude": "-3.717355",
            "longitude": "-53.740541"
        }
    }
}
CampoTipoObrigatórioDescrição
idstringSimUuid da nota devolvido pela API. A identificação não serve neste campo.
registra.datastringSimData e hora da entrega, no formato 2021-09-16T16:22:33-03:00. O fuso precisa terminar em :00.
registra.imagemstringNãoTexto ou base64 usado no hash do comprovante. Até 1200000 caracteres.
registra.recebedor_documentostringSimDocumento de quem recebeu. De 2 a 20 caracteres.
registra.recebedor_nomestringSimNome de quem recebeu. De 2 a 60 caracteres.
registra.coordenadas.latitudestringNãoDe -90 a 90. Envie junto com a longitude.
registra.coordenadas.longitudestringNãoDe -180 a 180. Envie junto com a latitude.
cancela.protocolostringSimProtocolo do comprovante que será cancelado. 15 ou 17 dígitos.

Eventos

GEThttps://api.apisimples.com/v1/nfe/{id}/eventos

O caminho usa o id da nota devolvido pela API, ou a identificação. HTTP 200 devolve os eventos que esta API gravou para a nota. O cancelamento entra com tipo cancelamento. Cada carta de correção entra com tipo carta_correcao. Cada ator interessado entra com tipo ator_interessado. O comprovante de entrega entra com tipo comprovante_entrega, e o cancelamento desse comprovante com comprovante_cancelado. A lista vem em ordem de data. Sem eventos, eventos volta vazio.

{
    "id": "8f3c2a10-6b4e-4d2a-9c11-2e5a7b9d0f31",
    "chave": "35261000000000000000550010000000151000000015",
    "eventos": [
        {
            "tipo": "carta_correcao",
            "sequencial": 1,
            "justificativa": "Teste de carta de correcao",
            "protocolo": "135260000000002",
            "data": "2026-10-12T14:00:00-03:00",
            "xml": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4="
        },
        {
            "tipo": "cancelamento",
            "sequencial": 1,
            "justificativa": "Nota emitida com destinatário incorreto.",
            "protocolo": "135260000000003",
            "data": "2026-10-12T15:00:00-03:00",
            "xml": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4="
        }
    ]
}
CampoTipoObrigatórioDescrição
idstringSimUuid da nota, ou a identificação, no caminho da URL.
eventos.tipostringSimcancelamento, carta_correcao, ator_interessado, comprovante_entrega ou comprovante_cancelado.
eventos.sequencialintegerSim1 no cancelamento. Na carta e no ator, o número de 1 a 20.
eventos.justificativastringNãoTexto do cancelamento ou da carta de correção.
eventos.tipo_autorstringNãoNo ator interessado: 1, 2 ou 3.
eventos.permitebooleanNãoNo ator interessado: true autoriza o download, false remove.
eventos.cpfstringNãoCPF do transportador, quando o evento for ator interessado.
eventos.cnpjstringNãoCNPJ do transportador, quando o evento for ator interessado.
eventos.data_entregastringNãoData da entrega, no comprovante.
eventos.recebedor_documentostringNãoDocumento de quem recebeu.
eventos.recebedor_nomestringNãoNome de quem recebeu.
eventos.latitudestringNãoLatitude do ponto de entrega, quando informada.
eventos.longitudestringNãoLongitude do ponto de entrega, quando informada.
eventos.protocolo_entregastringNãoProtocolo do comprovante cancelado.
eventos.protocolostringNãoProtocolo do evento na SEFAZ, quando houver.
eventos.datastringNãoData e hora do registro.
eventos.xmlstringNãoXML do evento em base64.

Imprimir

GEThttps://api.apisimples.com/v1/nfe/{id}/pdf
GEThttps://api.apisimples.com/v1/nfe/{id}/pdf/simples
GEThttps://api.apisimples.com/v1/nfe/{id}/pdf/etiqueta

O caminho usa o id da nota devolvido pela API, ou a identificação. Sem complemento, a resposta é o DANFE em A4. /simples gera o DANFE simplificado. /etiqueta gera a etiqueta de 100 por 150 mm, com margem de 3 mm e o e-mail do emitente quando ele está no cadastro. HTTP 200 devolve modelo e pdf em base64. A logo do cadastro entra no DANFE e na etiqueta quando for JPG ou PNG. Nota cancelada sai com a tarja de cancelamento no DANFE. Nota denegada ou ainda não autorizada responde HTTP 422.

CampoTipoObrigatórioDescrição
idstringSimUuid da nota, ou a identificação, no caminho da URL.

Nota

Campos da raiz do JSON. O emitente sai do cadastro. O objeto emitente só substitui inscrição, nome e endereço quando você precisa de um valor diferente nesta nota.

CampoTipoObrigatórioDescrição
identificacaostringNãoAté 40 caracteres. Serve para consultar a nota depois.
natureza_operacaostringSimAté 60 caracteres.
numerostringSimDe 1 a 9 dígitos.
seriestringSimDe 1 a 3 dígitos.
data_emissaostringSimData e hora com fuso, no formato 2026-10-10T14:30:00-03:00.
data_entrada_saidastringNãoMesmo formato de data_emissao, no mesmo fuso.
data_previsao_entregastringNãoData e hora com fuso. O XML usa só o dia.
tipo_operacaostringSim0 entrada ou 1 saída.
local_destinostringNão1 interna, 2 interestadual ou 3 exterior. Sem o campo, a API calcula pela UF.
finalidade_emissaostringSim1 normal, 2 complementar, 3 ajuste, 4 devolução, 5 crédito ou 6 débito.
consumidor_finalstringSim0 normal ou 1 consumidor final.
presenca_compradorstringSim0 a 5, ou 9. Com 2, 3, 4 ou 9 e sem intermediário, a API envia indicador 0.
codigo_municipio_ibsstringCom presença 5IBGE de 7 dígitos.
nota_fiscal_debitostringNão01 a 08, quando a finalidade for débito.
nota_fiscal_creditostringNão01 a 06, quando a finalidade for crédito.

Destinatário

Opcional. Se enviar, o endereço entra junto.

CampoTipoObrigatórioDescrição
cnpj, cpf ou id_estrangeirostringUm dos trêsCNPJ ou CPF só com números. No exterior, use id_estrangeiro.
nomestringSimDe 2 a 60 caracteres. Em homologação, a SEFAZ recebe o nome de teste.
indicador_inscricao_estadualstringSim1 contribuinte, 2 isento ou 9 não contribuinte.
inscricao_estadualstringNãoDe 2 a 14 dígitos.
emailstringNãoAté 60 caracteres.
enderecoobjetoSimlogradouro, numero, bairro, codigo_municipio e nome_municipio. uf é obrigatória fora do exterior.

Itens

De 1 a 990 itens. O imposto do item fica em imposto.

CampoTipoObrigatórioDescrição
numero_itemstringSimDe 1 a 990, sem repetir.
codigo_produtostringSimDe 1 a 60 caracteres.
descricaostringSimDe 1 a 120 caracteres.
codigo_ncmstringSim2 ou 8 dígitos.
cfopstringSim4 dígitos.
unidade_comercialstringSimDe 1 a 6 caracteres.
quantidade_comercialnúmeroSimAté 4 casas.
valor_unitario_comercialnúmeroSimAté 10 casas.
valor_brutonúmeroSimQuantidade vezes o valor unitário, com tolerância de um centavo.
inclui_no_totalstringSim1 soma no total da nota ou 0 não soma.
origemstringNão0 a 8. Sem o campo, a API usa 0.
imposto.icms.situacao_tributariastringNo grupoCST de 2 dígitos ou CSOSN de 3 dígitos.
imposto.pis e imposto.cofinsobjetoNãoCada um leva situacao_tributaria. Base, alíquota e valor entram quando o CST pedir.
imposto.ipiobjetoNãosituacao_tributaria e codigo_enquadramento_legal.

Frete e pagamento

CampoTipoObrigatórioDescrição
frete.modalidade_fretestringSim0 a 4, ou 9 sem transporte.
frete.transportadorobjetoNãocnpj ou cpf, nome, inscrição, endereço, município e UF.
frete.veiculoobjetoNãoplaca, uf, rntc e até 5 reboques.
frete.volumeslistaNãoquantidade, espécie, marca, número, pesos e lacres.
pagamento.formas_pagamentolistaNãomeio_pagamento e valor. Sem o grupo, a API envia 90 com valor zero.
pagamento.valor_troconúmeroNãoTroco da operação.
cobranca.faturaobjetoNãonumero, valor_original, valor_desconto e valor_liquido.
cobranca.duplicataslistaNãoCada uma tem data_vencimento e valor. A API numera 001, 002 e assim por diante.

Meio 99 precisa de descricao_pagamento. Integração 1 precisa de cartao.cnpj_credenciadora e cartao.numero_autorizacao.

Opcionais

Envie o grupo só quando a nota precisar dele.

Emitente, referências e intermediário
CampoTipoObrigatórioDescrição
emitenteobjetoNãoinscricao_estadual, inscricao_estadual_st, razao_social, nome e endereco. O documento continua sendo o do cadastro.
contingenciaobjetoNãodata e motivo, de 15 a 256 caracteres. A nota segue em SVC-AN.
notas_referenciadaslistaNãoUma chave por item: nfe, cte, nf, nota_produtor_rural ou cupom_fiscal.
intermediarioobjetoNãoindicador 0 ou 1. Com 1, informe cnpj e identificacao.
pessoas_autorizadaslistaNãoAté 10, cada uma com cnpj ou cpf.
local_retirada e local_entregaobjetoNãocnpj ou cpf e endereco.
Importação, exportação e informações da nota
CampoTipoObrigatórioDescrição
itens.documentos_importacaolistaNãoDI, adições, via de transporte e exportador.
itens.documentos_exportacaolistaNãoDrawback e, se houver, a exportação indireta.
exportacaoobjetoNãouf_local_embarque, local_embarque e local_despacho.
informacoes_adicionais_contribuintestringNãoAté 5000 caracteres.
informacoes_adicionais_fiscostringNãoAté 2000 caracteres.
observacoes_contribuinte e observacoes_fiscolistaNãoCada item tem campo e texto.
Produto específico, IBS, CBS e agropecuário
CampoTipoObrigatórioDescrição
itens.veiculos_novos, medicamentos, armamentos ou combustiveisobjetoNãoUm desses grupos por item, com os dados do produto específico.
imposto.ibs_cbsobjetoNãosituacao_tributaria, classificacao_tributaria e os grupos de IBS, CBS, monofasia e crédito.
imposto.isobjetoNãoImposto seletivo do item.
compra_governamentalobjetoNãotipo_entidade, percentual_redutor e tipo_operacao.
agropecuarioobjetoNãoguia_transito_animal e a lista defensivo.

responsavel_tecnico com valor true responde 422: o responsável técnico ainda não está configurado. O grupo de incentivo CBS da ALC/ZFM também responde 422.

Erros

Toda resposta de erro traz codigo e mensagem. O código é estável: use ele no sistema e a mensagem para mostrar ao usuário.

HTTPCódigoQuando
400json_invalidoO corpo não é um objeto JSON.
401autenticacao_ausenteO header Authorization não veio.
401autenticacao_invalidaA chave do emitente não existe.
403conta_inativaA conta está inativa.
403nfe_desabilitadaO emitente não tem NF-e habilitada.
404nfe_nao_encontradaA nota não é deste emitente.
404rota_nao_encontradaA rota não existe.
409nfe_duplicadaNúmero e série, ou identificação, já usados.
409nfe_ja_canceladaA nota já está cancelada.
422validacaoUm ou mais campos foram recusados. A lista erros traz campo, código e mensagem.
422xmlO XML não pôde ser montado ou assinado.
422sefazA SEFAZ recusou. A mensagem traz o motivo e o cStat.
422sefaz_denegadaA SEFAZ denegou. A nota fica gravada com status denegada.
422cancelamento_invalidoO status da nota não permite cancelar, ou falta o protocolo.
422carta_correcao_invalidaA nota não está autorizada, não tem chave, o sequencial não é o próximo ou já chegou a 20.
409carta_correcao_duplicadaEsse sequencial já foi gravado para a nota.
422ator_interessado_invalidoA nota não está autorizada, não tem chave, o número do evento não é o próximo ou já chegou a 20.
409ator_interessado_duplicadoEsse número de evento já foi gravado para a nota.
422comprovante_invalidoA nota não está autorizada, não tem chave, o protocolo não existe, o comprovante já foi cancelado ou já chegou a 20.
409comprovante_duplicadoEsse número de evento já foi gravado para a nota.
422pdf_indisponivelA nota não está autorizada nem cancelada, ou não tem XML.
500pdfO DANFE não pôde ser gerado.
500gravacaoA nota autorizada não foi gravada.
502sefaz_indisponivelA SEFAZ não concluiu a autorização, o cancelamento, a carta de correção, o ator interessado ou o comprovante de entrega.
{
    "codigo": "validacao",
    "mensagem": "A requisição foi recusada.",
    "erros": [
        {
            "campo": "itens.0.cfop",
            "codigo": "obrigatorio",
            "mensagem": "Campo obrigatório."
        }
    ]
}