← Bumalik sa Billbook

API ng Remote Bookkeeping

Huling na-update: Mayo 10, 2026

Mag-log ng mga entry mula sa cURL, iOS Shortcuts, o automation scripts gamit ang personal na API token. Ang token ay write-only — pwedeng magdagdag ng transaksyon at magbasa ng listahan ng category / tag, ngunit hindi makakapagbasa o makakapag-delete ng anumang transaction data.

1. Kumuha ng token

Mag-sign in bilang admin, buksan ang Mga Setting → 🔑 API ng Remote Bookkeeping, at i-click ang "Gumawa ng token".

Ang plaintext token ay ipinapakita isang beses lang — kopyahin agad. Ang server ay nag-iimbak lamang ng SHA-256 hash nito, kaya ang nawalang token ay maipapalitan lamang sa pamamagitan ng pag-rotate (na nagpapawalang-bisa sa luma).

Format ng token: bb_<userId>_<secret>. Ipadala ito sa bawat request bilang Authorization: Bearer <token>.

2. POST /api/ingest — magpasok ng isang transaksyon

Ang request body ay JSON object na may mga sumusunod na field:

  • title (string, kinakailangan) — pangalan ng transaksyon
  • amount (number, kinakailangan) — dapat positibo
  • type (string, opsyonal, default expense) — isa sa expense / income / prepaid_expense / pending_income
  • category (string, opsyonal) — pangalan ng category
  • note (string, opsyonal) — malayang nota
  • created_at (string, opsyonal) — ISO 8601; default ay ngayon
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 — listahan ng kategorya

Nagbabalik ng mga pangalan ng category ng admin sa pagkakasunod ng dropdown sa dashboard. Ang tugon ay naglalaman lamang ng mga pangalan — walang id, user id, o transaction data.

curl https://billbook.me/api/ingest/categories \
  -H "Authorization: Bearer bb_<userId>_<secret>"

# response: 200
{ "categories": ["Food", "Rent", "..."] }

4. GET /api/ingest/tags — kamakailang ginamit na tags

Nagbabalik ng pinaka-recent na na-update na mga tag prefix (ang #XXX markers na naka-embed sa mga title). Default na 20; gamitin ang ?limit= para palitan (max 100).

Nagbabalik ng walang laman na array sa halip na error kung wala pang tag_prefixes table.

curl "https://billbook.me/api/ingest/tags?limit=20" \
  -H "Authorization: Bearer bb_<userId>_<secret>"

# response: 200
{ "tags": ["#management-fee", "#travel", "..."] }

5. Mga error code

Lahat ng error ay JSON: { "error": "mensahe" }.

  • 401 — walang authorization, malformed token, in-revoke o hindi tugma
  • 402 — subscription expired; kailangang i-renew para makapag-write
  • 405 — hindi suportado ang method (hal. GET sa /api/ingest)
  • 501 — kulang ang server sa SUPABASE_SERVICE_ROLE_KEY
  • 500 — iba pang internal error

6. Seguridad at limitasyon

Sa disenyo, ang token ay makakapag-write lamang sa sarili nitong organisasyon — hindi maaaring mag-impersonate ng ibang orgs o magbasa ng umiiral na data:

  • user_id ay laging may-ari ng token; hindi maipeke
  • org_id ay laging org ng may-ari; imposible ang cross-org writes
  • Ang mga token ay ibinibigay lamang sa admin role (manager / staff ay nakakatanggap ng 403)
  • Hindi nag-le-leak ang mga tugon ng ibang rows — { id, created_at } lang ang ibinabalik
  • Agad ang revocation; mag-rotate anumang oras mula sa Mga Setting

7. Halimbawa ng iOS Shortcut

Magdagdag ng "Get Contents of URL" na aksyon, URL https://billbook.me/api/ingest, paraan POST, mga header Authorization: Bearer bb_... at Content-Type: application/json, request body bilang JSON: {"title":"Kape","amount":120,"type":"expense"}. Ikabit ang title at amount sa Shortcut input o "Ask Each Time" variables.

Ang dokumentong ito ay quick reference; ang backend code ang source of truth para sa aktwal na pag-uugali.