API de Registro Remoto
Última atualização: 10 de maio de 2026
Registre entradas do cURL, Atalhos do iOS ou scripts de automação com um token de API pessoal. O token é apenas para escrita: pode inserir transações e ler as listas de categorias e tags, mas não pode ler nem excluir dados de transações.
1. Obter um token
Faça login como admin, abra Configurações → 🔑 API de Registro Remoto e clique em "Gerar token".
O token em texto puro é mostrado apenas uma vez — copie imediatamente. O servidor só armazena o hash SHA-256, então um token perdido só pode ser substituído por rotação (o que invalida o anterior).
Formato do token: bb_<userId>_<secret>. Envie em cada requisição como Authorization: Bearer <token>.
2. POST /api/ingest — inserir uma transação
O corpo da requisição é um objeto JSON com estes campos:
title(string, obrigatório) — nome da transaçãoamount(number, obrigatório) — deve ser positivotype(string, opcional, padrãoexpense) — um deexpense/income/prepaid_expense/pending_incomecategory(string, opcional) — nome da categorianote(string, opcional) — observação livrecreated_at(string, opcional) — ISO 8601; padrão é agora
curl -X POST https://billbook.me/api/ingest \
-H "Authorization: Bearer bb_<userId>_<secret>" \
-H "Content-Type: application/json" \
-d '{"title":"Coffee","amount":120,"type":"expense","category":"Food"}'
# response: 201
{ "id": "...", "created_at": "..." }3. GET /api/ingest/categories — listar categorias
Retorna os nomes das categorias do admin na ordem do dropdown do painel. A resposta contém apenas os nomes — sem ids, user ids ou dados de transação.
curl https://billbook.me/api/ingest/categories \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "categories": ["Food", "Rent", "..."] }4. GET /api/ingest/tags — tags usadas recentemente
Retorna os prefixos de tag atualizados mais recentemente (os marcadores #XXX embutidos nos títulos). Padrão 20; use ?limit= para sobrescrever (máx. 100).
Retorna um array vazio em vez de erro se a tabela tag_prefixes ainda não existir.
curl "https://billbook.me/api/ingest/tags?limit=20" \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "tags": ["#management-fee", "#travel", "..."] }5. Códigos de erro
Todos os erros são JSON: { "error": "mensagem" }.
401— autorização ausente, token mal formado, revogado ou inconsistente402— assinatura expirada; renovação necessária para escrever405— método não suportado (ex.: GET em/api/ingest)501—SUPABASE_SERVICE_ROLE_KEYnão configurada no servidor500— outro erro interno
6. Segurança e limites
Por design, o token só pode escrever na própria organização — não pode personificar outras orgs nem ler dados existentes:
user_idé sempre o dono do token; não pode ser forjadoorg_idé sempre a org do dono; escritas entre orgs são impossíveis- Tokens só são emitidos para a função admin (manager / staff recebem 403)
- As respostas nunca vazam outras linhas — apenas
{ id, created_at }é retornado - A revogação é imediata; faça rotação a qualquer momento nas Configurações
7. Exemplo de Atalhos do iOS
Adicione uma ação "Obter Conteúdo de URL", URL https://billbook.me/api/ingest, método POST, cabeçalhos Authorization: Bearer bb_... e Content-Type: application/json, e corpo em JSON: {"title":"Café","amount":120,"type":"expense"}. Conecte title e amount à entrada do Atalho ou variáveis "Perguntar a cada execução".
Este documento é uma referência rápida; o código do backend é a fonte da verdade para o comportamento real.