← Kembali ke Billbook

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 transaksi
  • amount (number, wajib) — harus positif
  • type (string, opsional, default expense) — salah satu dari expense / income / prepaid_expense / pending_income
  • category (string, opsional) — nama kategori
  • note (string, opsional) — catatan bebas
  • created_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 cocok
  • 402 — langganan kedaluwarsa; perlu perpanjangan untuk menulis
  • 405 — metode tidak didukung (misal GET ke /api/ingest)
  • 501 — server tidak memiliki SUPABASE_SERVICE_ROLE_KEY
  • 500 — 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_id selalu pemilik token; tidak bisa dipalsukan
  • org_id selalu 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.