API Penggunaan & Saldo
Endpoint REST workspace untuk membaca saldo, riwayat penggunaan, transaksi, analitik, dan ekspor data Anda sendiri — via sesi browser atau API key zr_.
Endpoint-endpoint ini memberikan akses read-only ke data workspace Anda sendiri: saldo, riwayat penggunaan, transaksi, analitik, dan ekspor CSV/JSON. Di browser Anda memakainya dengan sesi dashboard; dari server atau script Anda kini bisa memakai API key zr_ yang sama dengan yang Anda pakai untuk API inference.
Autentikasi#
Setiap endpoint di bawah menerima salah satu kredensial, yang mana pun datang lebih dulu:
- Cookie sesi — cookie httpOnly
zrouter_sessiondari login Google. Beginilah dashboard memanggil API. - API key — key
zr_yang dibuat di dashboard bagian API Keys (ditampilkan sekali saat pembuatan). Kirim lewat headerAuthorizationsebagai Bearer token atau lewat headerX-Api-Key.
Akses via API key hanya berlaku untuk lima path read-only ini: GET /api/customer/balances, GET /api/customer/usage, GET /api/customer/transactions, GET /api/customer/analytics, dan GET /api/customer/exports/{kind}. Semua yang lain di bawah /api/customer/* — checkout, unduh receipt, manajemen sesi, dan manajemen API key — tetap membutuhkan sesi browser. Jika kedua header dikirim dan berisi key yang berbeda, request ditolak.
# Gaya 1: Authorization Bearer
curl -H "Authorization: Bearer zr_<public-id>_<secret>" \
https://api.zrouter.dev/api/customer/balances
# Gaya 2: X-Api-Key
curl -H "X-Api-Key: zr_<public-id>_<secret>" \
https://api.zrouter.dev/api/customer/balancesJika sebuah request membawa cookie sesi yang valid, sesi menang dan API key diabaikan. Key yang diblokir mengembalikan 401 invalid_api_key yang sama dengan key yang salah, dicabut, atau kedaluwarsa — responsnya identik secara desain, sehingga tidak mungkin membedakan mode kegagalannya.
Batas laju#
Request yang diautentikasi dengan API key dibatasi 60 request per menit per key (nilai default; operator bisa mengubahnya lewat CUSTOMER_KEY_RATE_LIMIT_PER_MINUTE). Melebihi batas mengembalikan 429 rate_limited dengan header Retry-After: 60. Percobaan berulang dengan key yang tidak valid juga dithrottle per IP sumber. Panggilan dengan cookie sesi tidak dihitung terhadap limiter key.
Error#
| HTTP | code | Kapan |
|---|---|---|
| 401 | invalid_session | Tidak ada atau cookie sesi tidak valid dan tidak ada API key. |
| 401 | invalid_api_key | API key salah, dicabut, kedaluwarsa, atau diblokir — body identik di semua kasus. |
| 429 | rate_limited | Terlalu banyak request. Coba lagi sebentar lagi. Lihat Retry-After. |
| 503 | blacklist_unavailable | Kondisi sementara di sisi server. Coba lagi sebentar; jangan anggap key Anda tidak valid. |
Lihat saldo#
/api/customer/balancesMengembalikan saldo PAYG Anda (sebagai string desimal) dan ringkasan token tersisa untuk setiap Token Plan yang Anda miliki.
Responses
{
"payg": { "currency": "USD", "balance": "12.345678" },
"token_plans": [
{
"model": "<public-name>",
"purchased_tokens": 1000,
"used_tokens": 320,
"remaining_tokens": 680,
"status": "active"
}
],
"as_of": "2026-09-16T00:00:00Z"
}{ "error": { "code": "invalid_api_key", "message": "Invalid API key." } }curl -H "Authorization: Bearer zr_<public-id>_<secret>" \
https://api.zrouter.dev/api/customer/balancesLihat penggunaan#
/api/customer/usageMengembalikan event penggunaan inference Anda, terbaru lebih dulu, dengan paginasi cursor dan retensi 90 hari.
Parameters
Ukuran halaman, 1-100. Default 50.
Cursor opak dari next_cursor / prev_cursor.
Set true untuk halaman ke belakang. Butuh cursor.
Batas bawah RFC3339, inklusif.
Batas atas RFC3339, inklusif.
Filter berdasarkan nama publik model.
Filter berdasarkan id API key (UUID). Hanya key milik Anda yang terlihat.
Responses
{
"data": [
{
"id": "b8c1...",
"request_id": "req_9f2e...",
"model": "<public-name>",
"input_tokens": 1204,
"output_tokens": 356,
"total_tokens": 1560,
"display_cost_usd_micro": "0.000120",
"funding_mode": "token_plan",
"status": "success",
"timestamp": "2026-09-16T04:12:33Z"
}
],
"next_cursor": "eyJvZmZzZXQiOjUwfQ",
"prev_cursor": null,
"total": 1234,
"retention_days": 90
}{ "error": { "code": "invalid_request", "message": "limit must be between 1 and 100" } }{ "error": { "code": "invalid_api_key", "message": "Invalid API key." } }Setiap item juga membawa api_key_id, api_key_name, api_key_prefix, endpoint_kind, streamed, cache_read_input_tokens, plan_debit_tokens, payg_debit_usd_micro, funding, settlement_status, completed_at, dan settled_at bila tersedia.
curl -H "X-Api-Key: zr_<public-id>_<secret>" \
"https://api.zrouter.dev/api/customer/usage?limit=100&cursor=eyJvZmZzZXQiOjB9"Lihat transaksi#
/api/customer/transactionsMengembalikan transaksi top-up dan pembelian Anda (order checkout), terbaru lebih dulu, dengan paginasi cursor.
Parameters
Ukuran halaman, 1-100. Default 50.
Cursor opak dari next_cursor / prev_cursor.
Set true (atau 1) untuk halaman ke belakang. Butuh cursor.
Responses
{
"data": [
{
"id": "3f1c...",
"type": "token_plan",
"status": "credited",
"amount_idr": 16000000,
"usd_value_micro": 1000000,
"fee_idr": 800000,
"total_idr": 16800000,
"granted_tokens": 1000,
"created_at": "2026-09-12T08:30:00Z",
"credited_at": "2026-09-12T08:31:02Z"
}
],
"next_cursor": null,
"prev_cursor": null,
"total": 7
}{ "error": { "code": "invalid_request", "message": "invalid cursor" } }{ "error": { "code": "invalid_api_key", "message": "Invalid API key." } }amount_idr, fee_idr, dan total_idr adalah integer IDR (IDR tidak punya unit minor). usd_value_micro adalah micro-USD. credited_at terisi setelah pembayaran dikreditkan; unduh receipt (GET /api/customer/transactions/{order_id}/receipt) tetap hanya lewat dashboard dan bukan bagian dari akses API key.
curl -H "Authorization: Bearer zr_<public-id>_<secret>" \
"https://api.zrouter.dev/api/customer/transactions?limit=50"Analitik penggunaan#
/api/customer/analyticsMengembalikan analitik penggunaan teragregasi untuk satu rentang waktu (default: 30 hari terakhir), dirinci per hari, per model, dan per API key, plus perbandingan dengan periode sebelumnya yang sama panjangnya.
Parameters
Batas bawah RFC3339. Default 30 hari lalu.
Batas atas RFC3339. Default sekarang. Harus setelah from.
Filter berdasarkan nama publik model.
Filter berdasarkan id API key (UUID). Hanya key milik Anda yang terlihat.
Responses
{
"summary": {
"requests": 210,
"tokens": 348000,
"cost_usd_micro": 25400,
"input_tokens": 300000,
"output_tokens": 48000,
"cache_read_tokens": 12000,
"cached_input_share": 0.04,
"blended_cost_usd_micro_per_million": 73000
},
"previous_summary": { ... },
"daily": [
{ "date": "2026-09-16", "requests": 18, "tokens": 26000, "cost_usd_micro": 1900,
"input_tokens": 22000, "output_tokens": 4000, "cache_read_tokens": 900 }
],
"breakdown_by_model": [
{ "model": "<public-name>", "requests": 180, "input_tokens": 250000,
"output_tokens": 45000, "cache_read_tokens": 11000, "cost_usd_micro": 22000 }
],
"breakdown_by_key": [
{ "api_key_id": "d1e2...", "name": "prod-key", "requests": 200,
"tokens": 340000, "cost_usd_micro": 24000 }
],
"token_breakdown": { "input_tokens": 300000, "output_tokens": 48000, "cache_read_tokens": 12000 }
}{ "error": { "code": "invalid_range", "message": "from must be before to" } }{ "error": { "code": "invalid_api_key", "message": "Invalid API key." } }curl -H "X-Api-Key: zr_<public-id>_<secret>" \
"https://api.zrouter.dev/api/customer/analytics?from=2026-09-01T00:00:00Z&to=2026-09-28T00:00:00Z"Ekspor data#
/api/customer/exports/{kind}Unduh data Anda sebagai file lampiran. Respons membawa Content-Disposition: attachment.
Parameters
Salah satu dari usage, transactions, balances.
Salah satu dari csv, json.
Batas bawah RFC3339 (hanya usage dan transactions).
Batas atas RFC3339 (hanya usage dan transactions).
Responses
Content-Disposition: attachment; filename="usage-2026-09-28.csv"{ "error": { "code": "invalid_request", "message": "unsupported export kind" } }{ "error": { "code": "invalid_api_key", "message": "Invalid API key." } }curl -o usage.csv -H "Authorization: Bearer zr_<public-id>_<secret>" \
"https://api.zrouter.dev/api/customer/exports/usage?format=csv"