Emitir pela API é sempre assíncrono: a resposta
2xx confirma que a
nota foi aceita, não que foi autorizada pela SEFAZ. Veja Síncrono vs
assíncrono e Ciclo de vida da
nota antes de integrar o fluxo de
emissão ao restante do seu sistema.Exemplo de criação
cURL
Exemplo mínimo para empresas do Simples Nacional. A tributação por item usa:
icms.csosn: 102— Tributada pelo Simples Nacional, sem permissão de crédito de ICMS ao destinatário.pis.cstecofins.cst: 49— Outras operações de saída: um CST comum no Simples Nacional, em que PIS e COFINS são recolhidos no DAS, sem valor destacado na nota.
taxes é diferente (ICMS com cst + base e
alíquota, e PIS/COFINS com seus valores) — veja Regimes e códigos
fiscais. O cfop 5102 é para
operação dentro do estado; use 6102 quando emissor e destinatário
estiverem em UFs diferentes.Item informado inline (sem produto cadastrado) precisa do trio de
tributação por unidade —
unitTax (uTrib), quantityTax (qTrib) e
unitTaxAmount (vUnTrib). Na maioria dos casos a unidade tributável é a
mesma da comercial — basta espelhar unit/quantity/unitAmount. Elas
só diferem quando a embalagem de venda ≠ unidade tributada (ex.: bebida
vendida por fardo e tributada por lata, ovo por dúzia × unidade, atacado por
caixa). Sem o trio, uTrib pode sair vazio (erro SPD003) ou vUnTrib
zerado (rejeição SEFAZ 630). Se o item referencia um produto
cadastrado, a Spedy preenche esse trio automaticamente.Quando usar NF-e
UsePOST /v1/product-invoices sempre que a operação envolver a saída ou
entrada de produtos e não for venda a consumidor final em balcão (esse caso
é NFC-e). Exemplos típicos: venda para outra empresa, remessa para
industrialização, devolução de mercadoria, transferência entre filiais,
venda de veículo por concessionária.
Fluxo de emissão
Assim como os demais modelos, a NF-e pode nascer de uma venda (order) com
autoIssueMode, ou ser criada diretamente no endpoint de nota — veja Fluxo
de emissão para os dois caminhos. Criando
direto:
POST /v1/product-invoices— cria a nota e já a enfileira para a SEFAZ (status: enqueued), sem passo de emissão separado.- A Spedy envia o lote à SEFAZ e aguarda o retorno.
- Você acompanha o resultado por webhook (
invoice.status_changed,invoice.authorized,invoice.rejected) ou consultando a nota — nunca pelo código HTTP do passo 1.
Estrutura do payload
O schemaCreateProductInvoiceDto formalmente exige apenas
isFinalCustomer. Na prática, a SEFAZ rejeita a nota se faltarem os blocos
abaixo — eles são condicionalmente obrigatórios conforme o tipo de
operação:
Há dois blocos de veículo distintos e não intercambiáveis:
items[].specificProduct.vehicle descreve o veículo quando ele é o
produto vendido (nota de concessionária), enquanto transport.vehicle
descreve o veículo usado para transportar a mercadoria. Confirme qual
dos dois a sua operação precisa antes de montar o payload.Operações relacionadas
Além de criar e emitir, o endpoint de NF-e expõe operações para o ciclo de vida completo da nota:
Cancelamento, carta de correção e inutilização têm regras de prazo e uso
específicas — veja Cancelamento, correção e
inutilização antes de
implementar qualquer uma delas.
Próximos passos
- Referência dos endpoints de NF-e: Referência da API
- Reenvios seguros e idempotência: Idempotência e reprocessamento
- Estados possíveis da nota: Ciclo de vida da nota
- Por que a emissão não é imediata: Síncrono vs assíncrono
- CFOP, NCM e regime tributário: Regimes e códigos fiscais