API Pembukuan Jarak Jauh
Terakhir diperbarui: 10 Mei 2026
Catat entri dari cURL, iOS Shortcuts, atau skrip otomasi dengan token API pribadi. Token ini hanya untuk menulis — bisa menambah transaksi dan membaca daftar kategori / tag, tetapi tidak bisa membaca atau menghapus data transaksi.
1. Dapatkan token
Masuk sebagai admin, buka Pengaturan → 🔑 API Pembukuan Jarak Jauh dan klik "Buat token".
Token teks polos hanya ditampilkan sekali — segera salin. Server hanya menyimpan hash SHA-256-nya, jadi token yang hilang hanya bisa diganti dengan rotasi (yang membatalkan yang lama).
Format token: bb_<userId>_<secret>. Kirim di setiap permintaan sebagai Authorization: Bearer <token>.
2. POST /api/ingest — sisipkan satu transaksi
Body permintaan adalah objek JSON dengan field-field berikut:
title(string, wajib) — nama transaksiamount(number, wajib) — harus positiftype(string, opsional, defaultexpense) — salah satu dariexpense/income/prepaid_expense/pending_incomecategory(string, opsional) — nama kategorinote(string, opsional) — catatan bebascreated_at(string, opsional) — ISO 8601; default 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 — daftar kategori
Mengembalikan nama kategori admin sesuai urutan dropdown dasbor. Respons hanya berisi nama — tanpa 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-baru ini digunakan
Mengembalikan awalan tag yang paling baru diperbarui (penanda #XXX yang disematkan di judul). Default 20; gunakan ?limit= untuk mengubah (maks 100).
Mengembalikan array kosong alih-alih error jika tabel tag_prefixes belum ada.
curl "https://billbook.me/api/ingest/tags?limit=20" \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "tags": ["#management-fee", "#travel", "..."] }5. Kode error
Semua error berupa JSON: { "error": "pesan" }.
401— tidak ada otorisasi, format token salah, dicabut atau tidak cocok402— langganan kedaluwarsa; perlu perpanjangan untuk menulis405— metode tidak didukung (misal GET ke/api/ingest)501— server tidak memilikiSUPABASE_SERVICE_ROLE_KEY500— error internal lain
6. Keamanan dan batasan
Secara desain, token hanya bisa menulis ke organisasinya sendiri — tidak bisa menyamar sebagai org lain atau membaca data yang ada:
user_idselalu pemilik token; tidak bisa dipalsukanorg_idselalu org pemilik; menulis lintas org tidak mungkin- Token hanya diberikan ke peran admin (manager / staff mendapat 403)
- Respons tidak pernah membocorkan baris lain — hanya
{ id, created_at }yang dikembalikan - Pencabutan langsung berlaku; rotasi kapan pun dari Pengaturan
7. Contoh iOS Shortcut
Tambahkan aksi "Get Contents of URL", URL https://billbook.me/api/ingest, metode POST, header Authorization: Bearer bb_... dan Content-Type: application/json, body JSON: {"title":"Kopi","amount":120,"type":"expense"}. Hubungkan title dan amount ke input Shortcut atau variabel "Tanya Setiap Kali".
Dokumen ini adalah referensi cepat; perilaku sebenarnya mengikuti kode backend.