Kuota & Minting
Cara me-mint Token Plan secara idempoten, melindungi dari double-submit, dan mengandalkan debit-dan-grant atomik.
Minting adalah operasi yang memberikan tier Token Plan kepada salah satu pelanggan Anda dan mendebit kuota Anda. Karena memindahkan uang, API ini idempoten: Anda dapat melakukan retry dengan aman tanpa pernah mendebit kuota dua kali. Halaman ini menjelaskan persis cara kerjanya dan cara membangun klien yang andal di atasnya.
Operation ID#
Setiap mint memuat operation_id yang Anda buat. Ini adalah key idempotensi Anda: string non-kosong maksimal 128 karakter yang mengidentifikasi satu *intent* mint. zrouter menghitung fingerprint idempotensi di sisi server dari operation_id, customer_email, dan plan_tier_id — Anda tidak perlu mengirim hash terpisah.
Replay idempoten#
Jika Anda mengulang mint dengan operation_id yang sama dan payload yang sama (email dan tier sama), API memperlakukannya sebagai replay. Ia mengembalikan 200 dengan already_applied: true dan tidak melakukan debit tambahan — grant awal dan satu debit itu tetap tidak berubah. Mengulang request yang sebenarnya sudah diterapkan karenanya tidak akan pernah menagih Anda dua kali.
Deteksi konflik#
Jika Anda memakai ulang operation_id dengan payload berbeda — misalnya customer_email atau plan_tier_id yang berbeda — request gagal dengan 409 idempotency_conflict. Pemeriksaan di sisi server ini membuat pemakaian ulang id lama secara tidak sengaja tidak mungkin disalahartikan sebagai mint baru.
Membangun pelindung double-submit#
- Buat
operation_idsekali per intent, sebelum ada panggilan jaringan. UUID atau token acak sudah cukup baik. - Nonaktifkan tombol submit saat mint sedang berjalan agar klik ganda tidak memicu dua request dengan id berbeda.
- Retry dengan
operation_idyang sama pada kegagalan sementara (429,5xx, timeout). Jangan pernah membuat id baru saat retry. - Simpan
operation_idsampai Anda mendapat hasil yang pasti. Jika respons hilang, ulangi request yang persis sama untuk mengetahui apakah ia sudah diterapkan.
Jaminan atomicity#
Sebuah mint diterapkan sebagai satu unit atomik: debit kuota Anda dan grant Token Plan kepada pelanggan sama-sama terjadi, atau tidak terjadi keduanya. Tidak ada jendela di mana kuota Anda telah terdebit tetapi pelanggan tidak menerima apa pun, atau pelanggan menerima grant yang tidak dibayar kuota Anda. Dikombinasikan dengan idempotensi, ini berarti hasil terburuk dari badai retry mana pun adalah satu grant dan satu debit.
Contoh kerja#
Dua request di bawah adalah request yang sama. Yang pertama menerapkan mint; yang kedua — misalnya setelah respons hilang — me-replay-nya dengan operation_id yang sama dan mengembalikan already_applied: true tanpa debit kedua.
curl -X POST "https://api.zrouter.dev/api/reseller/mint" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"operation_id": "op_1234567890abcdef",
"customer_email": "[email protected]",
"plan_tier_id": "<tier-id>"
}'