Skip to main content
Este é o checklist rápido de pré-requisitos antes da 1ª emissão. Pra ver todos os campos, regimes tributários e tratamento de erros, veja o guia completo Emitir NF-e.
Antes de emitir sua primeira NF-e em homologação (sandbox), você precisa ter três coisas prontas. Sem uma delas, a emissão vai falhar. Para o que muda ao ir pra produção, ver Sandbox.

Conta criada

Partner registrado e token JWT (ou API Key) em mãos

Empresa cadastrada

CNPJ emissor cadastrado via POST /v1/companies

Certificado enviado

Arquivo .pfx (A1) com senha válida
Não tem os três? Volte para o Quickstart e siga os passos.
Fluxo recomendado: cadastra → lê prontoPara → pede só o que falta. POST /v1/companies já termina sozinho o que dá para derivar (ex.: servicoPadraoLc116/ cTribNacPadrao a partir do CNAE) e devolve prontoPara por documento fiscal. O mesmo campo volta no GET /v1/companies (por item), no GET /v1/companies/{id}, no PATCH /v1/companies/{id}, no PATCH /v1/companies/{id}/ambiente e no 201 do POST /v1/companies/{id}/certificate — o flip nfe/nfce de falsetrue aparece no upload, sem GET extra. prontoPara.sandbox é true quando o emissor está em sandbox (cert/CSC não são cobrados). avisos[] vem no mesmo corpo: município não aderente ao Padrão Nacional gera MUNICIPIO_NAO_ADERENTE_PADRAO_NACIONAL (NF-e e NFC-e seguem disponíveis); nos 30 dias anteriores ao vencimento do A1, avisos[] traz CERTIFICADO_EXPIRANDO (aviso, não reprovação). Se a validade do A1 não pôde ser lida, avisos[] traz CERTIFICADO_VALIDADE_DESCONHECIDA (também aviso). desconhecido não gera aviso. Peça ao cliente só os campos que aparecerem em prontoPara.faltando.<documento>, nunca o cadastro inteiro de novo.

Checklist de pré-requisitos

1

Credencial disponível

Você tem uma API Key (ek_live_/ek_test_, formato recomendado para integração server-to-server) ou um JWT de POST /v1/auth/login (data.access_token, fluxo de dashboard)? Ver Autenticação.
2

Empresa cadastrada

Você já fez POST /v1/companies? O id retornado é o issuerId, usado para escolher o emissor em qualquer módulo (ver aviso abaixo sobre obrigatoriedade por módulo). A resposta já traz prontoPara: { nfse, nfe, nfce, sandbox, faltando } — leia ali o que falta para CADA documento fiscal, em vez de descobrir com um 422 na hora de emitir. avisos[] vem junto: se o município não adere ao Padrão Nacional da NFS-e neste ambiente, o item MUNICIPIO_NAO_ADERENTE_PADRAO_NACIONAL aparece (NF-e e NFC-e seguem disponíveis). desconhecido não gera aviso e o cadastro nunca falha por cobertura.
3

Certificado enviado

Você já fez POST /v1/companies/{id}/certificate (campo multipart file, não certificate)? Se sim, a resposta veio sem erro de senha? Sem certificado, prontoPara.nfe/prontoPara.nfce/prontoPara.nfse vêm false. Certificado vencido entra em faltando.nfse como certificadoVencido; de outra pessoa jurídica (raiz diferente), como certificadoOutroCnpj. O 201 desta rota já traz prontoPara atualizado: não precisa de um GET extra para ver o flip.
4

Ambiente correto para o teste

Todo emissor novo nasce em homologação (ambienteFiscal: 2). Não tente emitir em produção sem antes validar em homologação. Ver Sandbox para o estado real da promoção pra produção.
NF-e e NFC-e aceitam issuerId opcional no payload. Se você só tem uma empresa cadastrada, pode omitir; a API usa o seu emissor. Com dois ou mais emissores, informe issuerId (UUID) para escolher o CNPJ; sem ele a API responde 400. NFS-e exige issuerId explícito no corpo da requisição.

Estrutura de uma NF-e

Uma NF-e é composta por 4 blocos no payload (o emissor não entra no body, é resolvido pela API Key/JWT):

Campos obrigatórios

Um payload com nomes de campo diferentes destes é rejeitado com 400 antes de chegar na SEFAZ.

Raiz

Destinatário

Item (dentro de items[])

Não há campo numero por item: o índice do array já identifica o item. O item não exige icms preenchido: sem resolverTributacao, os campos fiscais viajam como passthrough (o que você mandar é o que vai pro XML); com resolverTributacao: true, o Cérebro Fiscal completa icms.csosn/icms (Regime Normal)/ibsCbs ausentes.

ICMS simplificado (Simples Nacional)

ICMS no Regime Normal (Lucro Real / Lucro Presumido)

O emissor crt: 3 não informa cst à mão: icms.cst é recusado com 422 CST_NAO_SUPORTADO_NFE (o leiaute exige a modalidade da base de cálculo, campo fora deste contrato). O caminho que autoriza é resolverTributacao: true: o motor calcula CST, base, alíquota e valor a partir de NCM, CFOP, UF e origem:
Detalhe completo do cenário (pré-requisitos, resposta, XML, erros e limitações) em Regime Normal.

Pagamentos (array, mínimo 1)


Exemplo completo mínimo


Resposta de sucesso

Mesmo contrato de resposta nos dois caminhos de emissão (síncrono e lote), envelopado por { data, meta }:
data.status: "AUTHORIZED" (inglês, mesmo enum usado em GET /v1/nfe/{id} e no webhook invoice.authorized) está aprovada pela SEFAZ e tem validade fiscal (se o emissor está em produção: ambienteFiscal: 1). Não há issuer/customer embutidos, nem xml/xmlPath/pdfPath/invoiceId/message/success/invoice aninhado: o PDF/XML têm rotas próprias de download (downloads.xml/downloads.pdf apontam pra elas). amount é string decimal ("100", sem zeros à direita), nunca number cru nem o Decimal.js interno serializado.

Como a emissão chega até você

Um payload com nome de campo desconhecido é recusado antes de qualquer processamento (ver Campo desconhecido no payload). Passada essa validação, o caminho síncrono (POST /v1/nfe) e o caminho em lote (POST /v1/nfe/batch, que enfileira e devolve o desfecho em GET /v1/nfe/queue) convergem no mesmo destino: a SEFAZ decide, e o resultado chega por webhook ou por consulta.

Erros mais comuns nesta etapa

Rejeição SEFAZ é sempre 400, nunca 422. O corpo carrega error.erros[] ({codigo, descricao} verbatim da SEFAZ). Veja o formato completo em Erros e Rejeições. O 422 existe na API, mas só para a emissão assistida (resolverTributacao: true) quando um campo fiscal não tem fonte para ser resolvido, não é o mesmo caso de rejeição SEFAZ.

Próximos passos

Emitir NF-e (guia completo)

ICMS, IPI, PIS, COFINS. Todos os impostos detalhados

Webhooks

Receba a confirmação da SEFAZ em tempo real

Certificados

Gerenciar validade e renovação do certificado A1