Skip to content

Emissão em lote

Até 500 NF-e por chamada — via JSON (payloads completos) ou planilha CSV. Validação all-or-nothing: qualquer linha inválida devolve os erros com o número da linha e nada é emitido. Fiscal não combina com "metade entrou".

Por planilha (CSV)

Baixe o template — XLSX · CSV — preencha uma linha por nota (venda simples, 1 item) e envie o conteúdo do arquivo:

http
POST /api/v1/emissao/lote
Authorization: Bearer {token}
Content-Type: application/json
json
{ "csv": "serie;referencia_externa;natureza;...\n5;pedido-1001;tributada;..." }
  • Separador , ou ; (Excel pt-BR) — detectado automaticamente; decimais aceitam vírgula (24,90).
  • natureza: tributada ou isenta. O regime (Simples × normal) vem do cadastro da empresa: Simples sai CSOSN 102/103; normal sai CST 00 (com aliquota_icms) ou CST 40 — o mesmo modelo da emissão pela tela.
  • serie vazia usa a série padrão da empresa; referencia_externa volta no webhook para você casar com o seu pedido.

Preview sem emitir

POST /api/v1/emissao/lote?somente_validar=1 — mesmo corpo; só valida e devolve { "valido": true, "total_linhas": N } ou os erros por linha. É o que a tela do painel usa antes de habilitar o botão de emitir.

Por JSON (ERP)

Quem já monta o payload da NF-e envia um array — cada item no mesmo shape do POST /nfe:

json
{ "itens": [ { "ide": {...}, "dest": {...}, "det": [...] }, ... ] }

Resposta e acompanhamento

json
{ "lote_id": "uuid", "total_linhas": 137, "message": "Lote validado e enfileirado" }

GET /api/v1/emissao/lote/{id} devolve o agregado e cada linha com o status vivo da nota (processando → autorizada/rejeitada, com chave e motivo):

json
{
  "resumo": { "total": 137, "autorizadas": 120, "rejeitadas": 2, "processando": 15 },
  "linhas": [ { "numero_linha": 1, "status": "autorizada", "chave": "3526...", "numero": 42 } ]
}

Reenviar nunca duplica

Duas camadas, ambas com a mesma idempotência de toda emissão:

  • O POST do lote aceita Idempotency-Key — mande o hash do arquivo (o painel faz isso sozinho) ou o id do seu job: reenviar a mesma planilha devolve o mesmo lote_id com idempotent_replay: true, sem emitir nada de novo.
  • Cada linha emite com a chave lote:{lote_id}:linha:{n} — retries internos nunca duplicam.

Rejeição da SEFAZ numa linha não trava as demais: corrija e reenvie apenas as linhas rejeitadas num lote novo (número rejeitado pode ser reaproveitado).

No painel

Emissão → Emissão em lote: upload com preview de erros, barra de progresso ao vivo e exportação do resultado em CSV.

Emissão ilimitada em todos os planos.