API de Registro Remoto
Última actualización: 10 de mayo de 2026
Registra entradas desde cURL, Atajos de iOS o scripts de automatización con un token de API personal. El token es solo de escritura: puede insertar transacciones y leer las listas de categorías y etiquetas, pero no puede leer ni eliminar datos de transacciones.
1. Obtener un token
Inicia sesión como admin, abre Ajustes → 🔑 API de Registro Remoto y haz clic en "Generar token".
El token en texto plano se muestra solo una vez — cópialo de inmediato. El servidor solo guarda su hash SHA-256, así que un token perdido solo se reemplaza rotándolo (lo que invalida el anterior).
Formato del token: bb_<userId>_<secret>. Envíalo en cada solicitud como Authorization: Bearer <token>.
2. POST /api/ingest — insertar una transacción
El cuerpo de la solicitud es un objeto JSON con estos campos:
title(string, obligatorio) — nombre de la transacciónamount(number, obligatorio) — debe ser positivotype(string, opcional, por defectoexpense) — uno deexpense/income/prepaid_expense/pending_incomecategory(string, opcional) — nombre de la categoríanote(string, opcional) — nota librecreated_at(string, opcional) — ISO 8601; por defecto ahora
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 categorías
Devuelve los nombres de categoría del admin en el orden del menú desplegable del panel. La respuesta contiene solo los nombres — sin ids, user ids ni datos de transacciones.
curl https://billbook.me/api/ingest/categories \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "categories": ["Food", "Rent", "..."] }4. GET /api/ingest/tags — etiquetas usadas recientemente
Devuelve los prefijos de etiqueta más recientes (las marcas #XXX incrustadas en los títulos). 20 por defecto; usa ?limit= para cambiarlo (máx. 100).
Devuelve un array vacío en lugar de un error si la tabla tag_prefixes aún no existe.
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 error
Todos los errores son JSON: { "error": "mensaje" }.
401— falta autorización, token mal formado, revocado o no coincide402— suscripción vencida; se requiere renovar para escribir405— método no soportado (p. ej. GET en/api/ingest)501— al servidor le faltaSUPABASE_SERVICE_ROLE_KEY500— otro error interno
6. Seguridad y límites
Por diseño, el token solo puede escribir en su propia organización — no puede suplantar a otras orgs ni leer datos existentes:
user_idsiempre es el dueño del token; no se puede falsificarorg_idsiempre es la org del dueño; las escrituras entre orgs son imposibles- Los tokens solo se emiten al rol admin (manager / staff reciben 403)
- Las respuestas nunca filtran otras filas — solo se devuelve
{ id, created_at } - La revocación es inmediata; rota cuando quieras desde Ajustes
7. Ejemplo de Atajos de iOS
Añade una acción "Obtener contenido de URL", URL https://billbook.me/api/ingest, método POST, encabezados Authorization: Bearer bb_... y Content-Type: application/json, y cuerpo en JSON: {"title":"Café","amount":120,"type":"expense"}. Conecta title y amount a la entrada del atajo o variables de "Preguntar cada vez".
Este documento es una referencia rápida; el código del backend es la fuente de verdad para el comportamiento real.