Notas de compra
Como registrar notas de compra na API de Integrações, vinculá-las a fornecedores e gerar contas a pagar.
Uma nota de compra (/purchase-invoices) registra um documento recebido de um fornecedor. É o espelho, no lado das compras, da nota de venda: tem itens, impostos e pode gerar contas a pagar após a finalização.
Permissão exigida: purchase-invoices (ações create, read, update, delete).
Conceitos e campos-chave
| Campo | Tipo | Obrigatório | Observações |
|---|---|---|---|
supplier_id | UUID | Sim | Fornecedor — precisa existir (não há cadastro inline) |
invoice_number | string | Sim | Número do documento do fornecedor (≤ 60) |
document_type | enum | Sim | Tipo do documento (ver abaixo) |
product_type | enum | Não | goods, service ou mixed; omitido, vem do document_type |
issue_date | date | Sim | |
items | array | Sim | 1+ itens |
reference_code | string | Não | Autogerado (PINV-…) se omitido |
invoice_series | string | Não | Série do documento |
operation_type | string | Não | Padrão purchase (≤ 50 caracteres) |
received_date, due_date | date | Não | |
discount_amount | string | Não | Desconto em valor (≥ 0) — decimal numeric(18,6) como string |
discount_rate | string | Não | Desconto em percentual (0 a 100) — decimal numeric(9,6) como string |
taxes | array | Não | Impostos por item |
payables | array | Não | Planejamento financeiro (ver abaixo) |
description, notes, metadata, br_data, us_data | — | Não |
Tipo do documento
document_type diz que documento a nota é, e define quais product_type ela aceita. Se o product_type for omitido, vale o padrão do tipo. Combinação fora da tabela é rejeitada com 422.
document_type | Documento | País | product_type aceitos | Padrão |
|---|---|---|---|---|
nfe | NF-e (modelo 55) | Brasil | goods, service, mixed | goods |
nfce | NFC-e (modelo 65) | Brasil | goods, service, mixed | goods |
cfe | Cupom fiscal SAT/MF-e (modelo 59) | Brasil | goods, service, mixed | goods |
nfse | NFS-e | Brasil | service | service |
cte | CT-e (modelo 57) | Brasil | service | service |
receipt | Recibo ou fatura sem documento fiscal | Qualquer | goods, service, mixed | service |
other | Outro documento | Qualquer | goods, service, mixed | mixed |
O tipo é aceito só se valer para o país da empresa. Na resposta, document_type pode vir null em notas antigas que não puderam ser classificadas. O tipo não muda depois de gravado: o PATCH só aceita document_type numa nota antiga que ainda não tem tipo, e nunca aceita limpá-lo. Nota lançada com o tipo errado precisa ser excluída e lançada de novo.
Itens da nota de compra
Cada item tem item_description (obrigatório), quantity (string decimal ≥ "0.000001") e unit_price (string decimal ≥ "0"); product_id é opcional (permite lançar itens sem vínculo a um produto do catálogo). Em atualizações, informe id no item para reconciliação.
No Brasil, o br_data do item aceita, além de NCM, CEST, CFOP e CST, os códigos do serviço comprado: federal_service_code (código de tributação nacional, até 10), city_service_code (código de tributação municipal, até 50) e nbs_code (NBS, 9 dígitos). Com product_id, os códigos vazios são completados pelo produto.
Unicidade: não pode haver nota de compra ativa com o mesmo fornecedor, série e número de documento — a segunda tentativa é rejeitada.
Chaves de acesso (Brasil)
Campo em br_data | Tamanho | Vale para |
|---|---|---|
nfe_access_key | até 44 | NF-e, NFC-e, CF-e e CT-e (chave da SEFAZ) |
nfse_access_key | 50 | NFS-e Nacional, só com document_type nfse |
- A
nfse_access_keyprecisa ter o dígito verificador válido. Com outrodocument_type, junto danfe_access_keyou já usada por outra nota ativa, ela é rejeitada (422, ou409com o códigopurchase_invoice_nfse_access_key_existse opurchase_invoice_idda outra nota). - A
nfe_access_keynão é aceita numa notanfse.
Origem do documento
A resposta da nota traz, quando houver, de onde ela veio. São campos só de leitura:
nfe_import: a NF-e de origem, com as duplicatas do XML sugeridas como parcelas.nfse_import: a NFS-e tomada recebida pelo Ambiente Nacional que criou a nota (origin=created) ou que foi vinculada a uma nota lançada à mão (origin=linked). Traz a chave, o líquido declarado (net_amount), o desconto condicionado não aplicado à nota (conditional_discount) e os avisos da importação (warnings).
Cada imposto traz imported_missing_fields: os campos que o documento importado não declarou. Exemplo: base_amount e rate de uma retenção federal da NFS-e, que vêm como 0.
Planejamento e materialização de contas a pagar
O fluxo financeiro segue o mesmo princípio do pedido de venda: o create não gera títulos reais.
POST /purchase-invoices— incluapayables[]opcional (amount,due_date,financial_account_idobrigatório; opcionaisfinancial_category_id,payment_method_id,description). A soma deve bater comnet_payable_total. A nota nascedraftcompending_payablesno response (somente leitura).POST /purchase-invoices/{id}/finalize— materializa os payables (purchase-invoices:update) e limpa o snapshot. Só então os títulos aparecem em/payables.
Cada parcela carrega a própria financial_category_id (opcional). Não envie financial_account_id nem financial_category_id no cabeçalho da nota.
Criar uma nota de compra (com parcelas planejadas)
curl -X POST https://api.biterp.ai/purchase-invoices \
-H "Authorization: Bearer sk_xxx_yyy" \
-H "Content-Type: application/json" \
-d '{
"supplier_id": "1a2b3c4d-5e6f-4708-9a0b-1c2d3e4f5a6b",
"invoice_number": "12345",
"invoice_series": "1",
"document_type": "nfe",
"product_type": "goods",
"issue_date": "2026-07-06",
"due_date": "2026-08-05",
"items": [
{
"item_description": "Matéria-prima X",
"quantity": "100.000000",
"unit_price": "12.500000"
}
],
"payables": [
{
"amount": "1250.000000",
"due_date": "2026-08-05",
"financial_account_id": "9c8b7a6d-5e4f-4321-8b0a-1d2c3e4f5a6b"
}
]
}'Depois, finalize:
curl -X POST https://api.biterp.ai/purchase-invoices/{id}/finalize \
-H "Authorization: Bearer sk_xxx_yyy" \
-H "Content-Type: application/json" \
-d '{}'Status e atualização
A nota nasce em status: draft (estados comerciais: draft, finalized). finalized é terminal — não há cancel nem reopen; para corrigir, exclua e recrie.
No PATCH em draft, payables substitui o snapshot por completo ([] limpa). Se o total mudar sem payables, o snapshot só é preservado quando a soma continuar compatível; caso contrário a API retorna 422. Em finalized, alterações financeiras são bloqueadas.
DELETE /purchase-invoices/{id} remove notas draft/finalized e, quando finalizada, exclui em cascata os payables vinculados (bloqueado se algum já estiver parcial ou pago).
Referência dos endpoints
| Método | Endpoint | Referência |
|---|---|---|
| POST | /purchase-invoices | Criar nota de compra |
| GET | /purchase-invoices | Listar notas de compra |
| GET | /purchase-invoices/{id} | Buscar por ID |
| PATCH | /purchase-invoices/{id} | Atualizar |
| DELETE | /purchase-invoices/{id} | Remover |
| POST | /purchase-invoices/{id}/finalize | Finalizar |

