← Volver a Billbook

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ón
  • amount (number, obligatorio) — debe ser positivo
  • type (string, opcional, por defecto expense) — uno de expense / income / prepaid_expense / pending_income
  • category (string, opcional) — nombre de la categoría
  • note (string, opcional) — nota libre
  • created_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 coincide
  • 402 — suscripción vencida; se requiere renovar para escribir
  • 405 — método no soportado (p. ej. GET en /api/ingest)
  • 501 — al servidor le falta SUPABASE_SERVICE_ROLE_KEY
  • 500 — 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_id siempre es el dueño del token; no se puede falsificar
  • org_id siempre 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.