API Pembukuan Jauh
Kemaskini terakhir: 10 Mei 2026
Catat entri dari cURL, Pintasan iOS atau skrip automasi menggunakan token API peribadi. Token ini hanya untuk menulis — boleh menambah transaksi dan membaca senarai kategori / tag, tetapi tidak boleh membaca atau memadam apa-apa data transaksi.
1. Dapatkan token
Log masuk sebagai admin, buka Tetapan → 🔑 API Pembukuan Jauh dan klik "Jana token".
Token teks biasa dipaparkan sekali sahaja — segera salin. Pelayan hanya menyimpan hash SHA-256, jadi token yang hilang hanya boleh diganti dengan putaran (yang membatalkan yang lama).
Format token: bb_<userId>_<secret>. Hantar dalam setiap permintaan sebagai Authorization: Bearer <token>.
2. POST /api/ingest — sisip satu transaksi
Body permintaan ialah objek JSON dengan medan berikut:
title(string, wajib) — nama transaksiamount(number, wajib) — mesti positiftype(string, pilihan, lalaiexpense) — salah satu daripadaexpense/income/prepaid_expense/pending_incomecategory(string, pilihan) — nama kategorinote(string, pilihan) — nota bebascreated_at(string, pilihan) — ISO 8601; lalai sekarang
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 — senarai kategori
Mengembalikan nama kategori admin dalam urutan dropdown papan pemuka. Respons hanya mengandungi nama — tiada id, user id atau data transaksi.
curl https://billbook.me/api/ingest/categories \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "categories": ["Food", "Rent", "..."] }4. GET /api/ingest/tags — tag yang baru digunakan
Mengembalikan awalan tag yang baru-baru ini dikemaskini (penanda #XXX yang tertanam dalam tajuk). Lalai 20; gunakan ?limit= untuk menggantikan (maks 100).
Mengembalikan array kosong dan bukan ralat jika jadual tag_prefixes belum wujud.
curl "https://billbook.me/api/ingest/tags?limit=20" \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "tags": ["#management-fee", "#travel", "..."] }5. Kod ralat
Semua ralat adalah JSON: { "error": "mesej" }.
401— kebenaran tiada, format token salah, dibatalkan atau tidak sepadan402— langganan tamat; pembaharuan diperlukan untuk menulis405— kaedah tidak disokong (cth. GET pada/api/ingest)501— pelayan kekuranganSUPABASE_SERVICE_ROLE_KEY500— ralat dalaman lain
6. Keselamatan dan had
Reka bentuknya, token hanya boleh menulis ke organisasinya sendiri — tidak boleh menyamar sebagai org lain atau membaca data sedia ada:
user_idsentiasa pemilik token; tidak boleh dipalsukanorg_idsentiasa org pemilik; penulisan merentas org adalah mustahil- Token hanya dikeluarkan kepada peranan admin (manager / staff dapat 403)
- Respons tidak pernah membocorkan baris lain — hanya
{ id, created_at }dikembalikan - Pembatalan serta-merta; putar bila-bila masa dari Tetapan
7. Contoh Pintasan iOS
Tambah tindakan "Get Contents of URL", URL https://billbook.me/api/ingest, kaedah POST, header Authorization: Bearer bb_... dan Content-Type: application/json, dan body permintaan sebagai JSON: {"title":"Kopi","amount":120,"type":"expense"}. Sambungkan title dan amount ke input Pintasan atau pemboleh ubah "Tanya Setiap Kali".
Dokumen ini adalah rujukan pantas; kod backend adalah sumber kebenaran untuk tingkah laku sebenar.