Categorias financeiras
Como organizar receitas e despesas em categorias hierárquicas na API de Integrações, e como vinculá-las a contas a pagar e a receber.
Uma categoria financeira (/financial-categories) classifica para onde o dinheiro vai ou de onde ele vem: "Vendas de produtos", "Aluguel", "Folha de pagamento". É o plano de contas do tenant — contas a receber e contas a pagar apontam para uma categoria através do campo financial_category_id.
Permissão exigida: financial-categories (ações create, read, update, delete).
Conceitos e campos-chave
| Campo | Tipo | Obrigatório | Observações |
|---|---|---|---|
name | string | Sim | Nome da categoria. Único entre irmãs (mesmo parent_id) |
type | enum | Sim | revenue (receita) ou expense (despesa) |
parent_id | UUID | Não | Categoria-mãe. Ausente/null = categoria raiz |
code | string | Não | Código contábil da sua estrutura (ex.: 3.01.001) |
reference_code | string | Não | Código do sistema de origem. null quando criada direto no bitERP |
position | number | Não | Inteiro de ordenação entre irmãs — é a ordenação padrão da listagem |
is_locked | boolean | Não | Trava a categoria para novos documentos (ver abaixo); padrão false |
description | string | Não | |
metadata | object | Não | Dados livres da sua integração |
Hierarquia
Categorias formam uma árvore, com três regras que a API impõe na criação e na atualização:
- Profundidade máxima de 3 níveis. Uma quarta geração é rejeitada.
- O
typeda filha tem que ser igual ao da mãe. Não existe subcategoria de despesa dentro de uma categoria de receita. - Sem ciclos. Uma categoria não pode ser mãe de si mesma, nem de uma ancestral sua.
Nome duplicado sob a mesma mãe retorna 409 Conflict. Duas categorias com o mesmo nome em mães diferentes são permitidas.
Quais categorias podem ser usadas em documentos
Nem toda categoria aceita vínculo com um documento financeiro. Ao informar financial_category_id em uma conta a pagar ou a receber, a API exige que a categoria seja:
- Folha — categorias que têm filhas servem para agrupar, não para lançar. Vincular uma categoria com filhas é rejeitado.
- Destravada — uma categoria com
is_locked: truecontinua existindo e mantém o histórico dos documentos que já a usavam, mas é recusada em novos documentos. É como aposentar uma categoria sem apagar o passado.
Criar uma categoria
curl -X POST https://api.biterp.ai/financial-categories \
-H "Authorization: Bearer sk_abc123_secretXYZ" \
-H "Content-Type: application/json" \
-d '{
"name": "Vendas de produtos",
"type": "revenue",
"code": "3.01.001",
"position": 1
}'Para criar uma subcategoria, informe o parent_id e repita o type da mãe:
curl -X POST https://api.biterp.ai/financial-categories \
-H "Authorization: Bearer sk_abc123_secretXYZ" \
-H "Content-Type: application/json" \
-d '{
"name": "Vendas no varejo",
"type": "revenue",
"parent_id": "7b3e9d1c-4a2f-4e8b-9c0d-5f1a3b7e2d64",
"position": 1
}'Ler a árvore inteira
GET /financial-categories/tree devolve a hierarquia já montada — cada categoria traz suas filhas em children[], recursivamente. É a chamada indicada para popular um seletor na sua interface, porque evita reconstruir a árvore a partir da listagem plana.
# Só a árvore de despesas
curl "https://api.biterp.ai/financial-categories/tree?type=expense" \
-H "Authorization: Bearer sk_abc123_secretXYZ"O query param type é opcional e aceita revenue ou expense; sem ele, a resposta traz as duas árvores. Diferente de GET /financial-categories, este endpoint não é paginado.
Listar e manter
GET /financial-categories retorna a lista plana e paginada (ver filtros e paginação).
Campos filtráveis: type, parent_id, reference_code, name, code, position, is_locked, created_at, updated_at. Ordenação por id, type, parent_id, reference_code, name, code, position, is_locked, created_at, updated_at — o padrão é position:asc.
No contrato de filtros deste recurso, apenas reference_code é anulável — então só ele aceita os operadores is_null / is_not_null. É o caminho para achar o que ainda não foi mapeado a partir do seu sistema:
GET /financial-categories?type=expense&reference_code[is_null]=trueDELETE /financial-categories/{id} faz soft delete e responde 204 No Content. Não há endpoint de restauração — ver DELETE é de mão única. Para tirar uma categoria de circulação sem perdê-la, prefira is_locked: true.
Referência dos endpoints
| Método | Endpoint | Referência |
|---|---|---|
| POST | /financial-categories | Criar categoria |
| GET | /financial-categories | Listar categorias |
| GET | /financial-categories/tree | Listar árvore |
| GET | /financial-categories/{id} | Buscar por ID |
| PATCH | /financial-categories/{id} | Atualizar categoria |
| DELETE | /financial-categories/{id} | Remover categoria |

