Versionamento da API
Como funciona o versionamento da API de Integrações via header api-version.
A API de Integrações usa versionamento via header customizado, garantindo que integrações existentes continuem funcionando quando novas versões forem lançadas.
Como usar
Envie o header api-version em suas requisições:
curl -H "Authorization: Bearer <token>" \
-H "api-version: v1" \
https://api.biterp.ai/productsComportamento
| Cenário | Resultado |
|---|---|
Header api-version presente e válido | Usa a versão solicitada |
Header api-version ausente | Usa a versão atual (v1) |
Header api-version com valor inválido | Retorna 400 Bad Request com as versões aceitas |
Versões disponíveis
| Versão | Status |
|---|---|
v1 | Atual — versão padrão |
Boas práticas
- Sempre envie o header: mesmo que a versão padrão funcione hoje, enviar explicitamente protege sua integração contra mudanças futuras
- Teste antes de migrar: quando uma nova versão for lançada, teste sua integração antes de atualizar o header
- Monitore deprecações: versões antigas serão depreciadas com antecedência
Exemplo de erro
Quando uma versão inválida é enviada, a resposta é 400 Bad Request com as versões aceitas:
{
"status_code": 400,
"message": "Invalid api-version. Accepted: v1. Current: v1",
"error": "Bad Request"
}Changelog (breaking changes em v1)
Mudanças de contrato na versão atual (v1) são documentadas aqui. Integrações que dependem de campos removidos devem buscar o dado no recurso dedicado (ex.: GET /customers/{id}).
2026-08 — customer embutido em orçamentos (GET /quotes, GET /quotes/{id})
O objeto customer aninhado nas respostas de listagem e detalhe de orçamentos foi reduzido para alinhar com pedidos de venda e notas: apenas identificação mínima do cliente, sem dados bancários, de contato ou de endereço.
Antes (~17 campos):
{
"customer": {
"id": "8f2c1e4a-9b3d-4c7e-a1f2-6d5b8e0c3a71",
"type": "company",
"tax_id": "12345678000195",
"tax_id_type": "cnpj",
"legal_name": "ACME Comércio Ltda",
"trade_name": "ACME",
"website": "https://acme.example",
"address_line1": "Rua das Flores, 100",
"address_line2": "Sala 12",
"city": "São Paulo",
"state": "SP",
"postal_code": "01310100",
"country_code": "BR",
"is_blocked": false,
"metadata": { "erp_code": "C-001" },
"created_at": "2026-01-15T10:00:00.000Z",
"updated_at": "2026-06-01T14:30:00.000Z"
}
}Depois (4 campos):
{
"customer": {
"id": "8f2c1e4a-9b3d-4c7e-a1f2-6d5b8e0c3a71",
"legal_name": "ACME Comércio Ltda",
"trade_name": "ACME",
"tax_id": "12345678000195"
}
}Campos removidos do objeto embutido: type, tax_id_type, website, address_line1, address_line2, city, state, postal_code, country_code, is_blocked, metadata, created_at, updated_at.
O customer_id no corpo do orçamento não muda. Para o cadastro completo, use GET /customers/{id}. Detalhes no guia de orçamentos.

