Produtos
Como cadastrar, buscar e manter produtos (bens e serviços) na API de Integrações, incluindo dados fiscais por país.
O recurso Produtos (/products) mantém o catálogo de bens e serviços do tenant. Cada produto tem campos universais (nome, preço, unidade de medida) e, opcionalmente, uma extensão fiscal por país (br_data no Brasil, us_data nos Estados Unidos) — o Extension Table Pattern do bitERP.
Permissão exigida: products (ações create, read, update, delete).
Conceitos e campos-chave
Um produto sempre tem um type — goods (bem) ou service (serviço) — definido na criação. O reference_code é o código do produto no seu catálogo (SKU): você pode enviá-lo ou deixar a API gerar um automaticamente com o prefixo PRD-. Ele é único por tenant e serve para sincronizar com sistemas externos.
| Campo | Tipo | Obrigatório | Observações |
|---|---|---|---|
name | string | Sim | Nome do produto |
type | enum | Sim | goods ou service |
reference_code | string | Não | SKU único por tenant; auto-gerado (PRD-…) se omitido |
sale_price | string | Não | Preço de venda (≥ 0) — decimal numeric(18,6) como string (ex.: "3499.990000"); assume "0.000000" se omitido |
unit_of_measurement_id | UUID | Não | Unidade de medida (ver Dados de referência) |
description | string | Não | Descrição livre |
tags | string[] | Não | Etiquetas de organização |
image_url | string | Não | URL da imagem |
is_blocked | boolean | Não | Bloqueia o produto para uso; padrão false |
metadata | object | Não | Dados livres da sua integração |
br_data | object | Não | Extensão fiscal Brasil (ver abaixo) |
us_data | object | Não | Extensão fiscal Estados Unidos |
is_activeestá depreciado. É apenas um alias invertido deis_blocked(is_active = !is_blocked), mantido por compatibilidade. Prefirais_blocked. Se você enviar os dois com valores contraditórios, a API retorna erro de validação.
Unidade de medida
Use unit_of_measurement_id (UUID) no topo do payload — é a forma canônica. O campo legado br_data.unit_of_measure ainda é aceito por compatibilidade e resolve tanto um UUID quanto um código de unidade (UN, CX, KG…) pelo país do tenant, mas está depreciado. Se você enviar os dois e eles apontarem para unidades diferentes, a API retorna erro de validação; se forem iguais, unit_of_measurement_id prevalece.
Na resposta, a unidade vem resolvida como objeto: "unit_of_measurement": { "id": "…", "code": "UN", "symbol": "un" }.
Extensão fiscal Brasil (br_data)
Enviada apenas para tenants do Brasil. Campos aceitos incluem ncm_code (8 dígitos), cest_code (7 dígitos), origin (1 dígito), extipi, nbs_code, taxation_type, códigos da Reforma Tributária (ibs_cbs_*) e outros. Enviar br_data em um tenant de outro país (ou us_data num tenant BR) é rejeitado.
Criar um produto
curl -X POST https://api.biterp.ai/products \
-H "Authorization: Bearer sk_abc123_secretXYZ" \
-H "Content-Type: application/json" \
-d '{
"reference_code": "EXT-SKU-1001",
"name": "Notebook Pro 14",
"description": "Notebook 14 polegadas, 16GB RAM",
"type": "goods",
"sale_price": "3499.990000",
"unit_of_measurement_id": "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11",
"tags": ["eletronicos", "informatica"],
"is_blocked": false,
"br_data": {
"ncm_code": "84713012",
"cest_code": "0100100",
"origin": "0"
}
}'Buscar produtos
Há três formas de localizar produtos, além da listagem paginada padrão (GET /products com filtros e paginação):
| Endpoint | Uso |
|---|---|
GET /products/search | Busca full-text por name e reference_code. Aceita q, limit (padrão 50) e activeOnly (padrão false). |
GET /products/reference/{code} | Localiza um produto pelo reference_code exato. O query param type (goods/service) é obrigatório. |
GET /products/{id} | Busca por UUID. |
O endpoint por reference_code é o ideal para sincronizar por SKU: se o produto existir mas o type informado não bater, a API retorna 404 — o par (reference_code, type) identifica o produto.
# Buscar por texto (apenas ativos)
curl -G https://api.biterp.ai/products/search \
-H "Authorization: Bearer sk_abc123_secretXYZ" \
--data-urlencode "q=notebook" \
--data-urlencode "activeOnly=true"
# Localizar por SKU externo
curl "https://api.biterp.ai/products/reference/EXT-SKU-1001?type=goods" \
-H "Authorization: Bearer sk_abc123_secretXYZ"Campos filtráveis em GET /products: name, reference_code, is_blocked, type, created_at, updated_at. Ordenação por id, name, reference_code, created_at, updated_at.
Remover
DELETE /products/{id} faz soft delete (o produto pode ser recuperado) e responde 204 No Content.
Referência dos endpoints
| Método | Endpoint | Referência |
|---|---|---|
| POST | /products | Criar produto |
| GET | /products | Listar produtos |
| GET | /products/search | Buscar por texto |
| GET | /products/reference/{code} | Buscar por reference_code |
| GET | /products/{id} | Buscar por ID |
| PATCH | /products/{id} | Atualizar produto |
| DELETE | /products/{id} | Remover produto |

