Tema
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/jsonjson
{ "csv": "serie;referencia_externa;natureza;...\n5;pedido-1001;tributada;..." }- Separador
,ou;(Excel pt-BR) — detectado automaticamente; decimais aceitam vírgula (24,90). natureza:tributadaouisenta. O regime (Simples × normal) vem do cadastro da empresa: Simples sai CSOSN 102/103; normal sai CST 00 (comaliquota_icms) ou CST 40 — o mesmo modelo da emissão pela tela.serievazia usa a série padrão da empresa;referencia_externavolta 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 mesmolote_idcomidempotent_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.