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 transaksyonamount(number, kinakailangan) — dapat positibotype(string, opsyonal, defaultexpense) — isa saexpense/income/prepaid_expense/pending_incomecategory(string, opsyonal) — pangalan ng categorynote(string, opsyonal) — malayang notacreated_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 tugma402— subscription expired; kailangang i-renew para makapag-write405— hindi suportado ang method (hal. GET sa/api/ingest)501— kulang ang server saSUPABASE_SERVICE_ROLE_KEY500— 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_iday laging may-ari ng token; hindi maipekeorg_iday 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.