/api/v1/accountInfo akun
Profil, mode kunci yang dipakai (test/live), saldo, level, dan batas. Cara tercepat memastikan kunci dan IP kamu benar.
Dokumentasi H2H Partner API: cari produk, buat order, dan ikuti hasilnya. Semua contoh memakai data fiktif; ganti SKU dengan SKU dari katalog akunmu.
https://h2h.indotopup.com/api/v1Satu token Bearer per kunci: kirim header Authorization: Bearer <kunci> di setiap request (selain /lookups/games dan /lookups/quota). Kunci uji dan kunci live adalah dua token berbeda; jangan taruh keduanya di kode browser publik.
Order dengan kunci uji selesai dalam beberapa detik dengan serial SBX-… dan mengirim webhook seperti biasa. Target yang berakhiran 9999 mensimulasikan kegagalan. Order dari dashboard selalu live.
Isi Webhook URL di dashboard. Kami mengirim POST JSON saat order API selesai (order.succeeded atau order.failed), dan order.verification_required saat order butuh kode. Pesanan dari dashboard tidak mengirim webhook. Amplop event:
Header H2H-Signature berbentuk t=<unix>,v1=<hex>. Hitung HMAC-SHA256 dari string "<t>.<body mentah>" dengan rahasia webhook, bandingkan memakai perbandingan waktu-konstan, dan tolak bila t lebih tua dari 5 menit. Balas HTTP 2xx. Bila gagal, kami mencoba lagi setelah 1 menit, 5 menit, 15 menit, 1 jam, dan 6 jam. Deduplikasi dengan id event.
Semua galat berbentuk { "error": { "code": "…", "message": "…", "fields": { … } } }. Gunakan error.code untuk logika program, bukan teks pesan.
| HTTP | error.code | Arti |
|---|---|---|
| 400 | bad_request | Body bukan JSON yang valid. |
| 401 | unauthorized / invalid_key | Header Authorization: Bearer <kunci> hilang atau kunci tidak dikenal. |
| 402 | insufficient_balance | Saldo tidak cukup untuk menahan biaya order (atau cek pemain berbayar). |
| 403 | live_not_enabled / ip_not_allowed / account_suspended | Kunci live dipakai saat akun belum Produksi, IP belum terdaftar, atau akun ditangguhkan. |
| 404 | not_found | Order, batch, produk, atau endpoint tidak ditemukan atau bukan milikmu. |
| 409 | conflict | Reference dipakai dengan isi berbeda, invoice belum tersedia, atau aksi verifikasi usang. |
| 422 | validation_failed / product_not_found / max_price_too_low / product_out_of_stock | Isian tidak valid. Rincian per kolom ada di error.fields. |
| 429 | rate_limited / quota_exceeded | Batas request atau jatah cek terlampaui. Tunggu sesuai header Retry-After. |
| 500 | server_error | Galat di sisi kami. Aman mengulang dengan reference yang sama. |
| 502 | provider_unavailable | Layanan cek pemain sementara tidak tersedia (tidak memakai jatah). |
/api/v1/accountProfil, mode kunci yang dipakai (test/live), saldo, level, dan batas. Cara tercepat memastikan kunci dan IP kamu benar.
/api/v1/catalog/brandsBrand yang punya produk. Dibatasi 30 request/menit untuk semua endpoint katalog; simpan katalog di sisimu dan sinkronkan berkala.
| Nama | Tipe | Keterangan |
|---|---|---|
| type | string | standard | fallback |
/api/v1/catalog/productsProduk dengan harga untuk level akunmu dan field isian yang menempel (fields). Produk fallback (type=fallback) wajib memakai max_price saat dipesan.
| Nama | Tipe | Keterangan |
|---|---|---|
| brand | string | ID atau slug brand. |
| type | string | standard | fallback |
| q | string | Cari nama produk. |
| limit | integer | Jumlah item (1–200). |
| after | string | Salin paging.next_after dari halaman sebelumnya. |
/api/v1/catalog/products/{code}Satu produk berdasarkan kode.
| Nama | Tipe | Keterangan |
|---|---|---|
| code * | string | Kode produk, mis. P12319. |
/api/v1/ordersMembuat satu order. 201 berarti order diterima; lihat status untuk hasilnya (queued → processing → succeeded / failed). reference adalah kunci idempotensimu: bila respons tidak pasti, kirim ulang request yang sama dan kamu menerima order asli (200 + header Idempotent-Replay: true), bukan order baru. Header Idempotency-Key diterima sebagai pengganti reference. Seluruh max_price (bila ada) ditahan di muka; sisa dikembalikan saat sukses, semuanya kembali saat gagal.
| Nama | Tipe | Keterangan |
|---|---|---|
| product * | string | Kode produk dari katalog (P… standar, F… fallback). |
| target.id * | string | ID pemain / nomor tujuan. |
| target.zone | string|null | Server/zona bila produk meminta (pakai value opsi, bukan label). |
| target.extra | object|null | Isian tambahan lain; kuncinya dari fields produk. |
| reference * | string | Referensi unik milikmu, maks 64 karakter. |
| max_price | integer|null | Batas biaya akhir (Rupiah). Wajib untuk produk fallback. |
/api/v1/ordersProduk fallback (kode F…) mencoba jalur termurah dulu lalu pindah jalur bila gagal. Kirim max_price sebagai batas harga; biaya akhir tidak pernah melebihinya dan selisihnya dikembalikan.
| Nama | Tipe | Keterangan |
|---|---|---|
| product * | string | Kode produk fallback (F…). |
| target.id * | string | ID pemain. |
| target.zone | string|null | Server/zona. |
| reference * | string | Referensi unik. |
| max_price * | integer | Batas harga maksimal (≥ harga saat ini). |
/api/v1/orders/{id}Ambil order lewat ID atau reference. serial berisi kode voucher/serial bila ada; failure terisi bila gagal (saldo dikembalikan otomatis).
| Nama | Tipe | Keterangan |
|---|---|---|
| id * | string | ID order (ord_…) atau reference milikmu. |
/api/v1/ordersOrder terbaru lebih dulu.
| Nama | Tipe | Keterangan |
|---|---|---|
| status | string | queued | processing | succeeded | failed |
| mode | string | test | live |
| from | string | Tanggal/waktu awal (ISO 8601). |
| to | string | Tanggal/waktu akhir. |
| limit | integer | Jumlah item (1–200). |
| after | string | Salin paging.next_after dari halaman sebelumnya. |
/api/v1/orders/{id}/verificationSebagian order meminta kode dari pembeli: order.verification.state = "required" dan can_submit = true. Kirim kodenya di sini. 202 hanya berarti kode diterima untuk diproses, bukan bukti valid. Kode sama dikirim ulang mengembalikan hasil sebelumnya; kode berbeda ditolak 409. Batas 5 request/menit per order.
| Nama | Tipe | Keterangan |
|---|---|---|
| id * | string | ID order (ord_…) atau reference milikmu. |
| Nama | Tipe | Keterangan |
|---|---|---|
| code * | string | Kode dari pembeli, 1–128 karakter. |
| action_id | string | verification.id terbaru. |
| version | integer | verification.version terbaru. |
/api/v1/batchesSatu produk standar, satu tujuan, 1–100 order berurutan. Seluruh biaya dipotong di muka dan harga dikunci. reference unik; kirim ulang request identik mengembalikan batch asli, request berbeda dengan reference sama ditolak 409.
| Nama | Tipe | Keterangan |
|---|---|---|
| product * | string | Kode produk dari katalog (P… standar, F… fallback). |
| target.id * | string | ID pemain / nomor tujuan. |
| target.zone | string|null | Server/zona bila produk meminta (pakai value opsi, bukan label). |
| target.extra | object|null | Isian tambahan lain; kuncinya dari fields produk. |
| reference * | string | Referensi batch unik. |
| count * | integer | Jumlah order, 1–100. |
/api/v1/batchesBatch terbaru lebih dulu.
| Nama | Tipe | Keterangan |
|---|---|---|
| status | string | queued | processing | completed | partially_failed | failed |
| from | string | Awal (ISO 8601). |
| to | string | Akhir. |
| limit | integer | Jumlah item (1–200). |
| after | string | Salin paging.next_after dari halaman sebelumnya. |
/api/v1/batches/{id}Status dan hitungan progres.
| Nama | Tipe | Keterangan |
|---|---|---|
| id * | string | ID batch (bat_…) atau reference milikmu. |
/api/v1/batches/{id}/ordersOrder anak berurutan (field sequence), masing-masing dengan ID sendiri.
| Nama | Tipe | Keterangan |
|---|---|---|
| id * | string | ID batch (bat_…) atau reference milikmu. |
| Nama | Tipe | Keterangan |
|---|---|---|
| limit | integer | Jumlah item (1–200). |
| after | string | Salin paging.next_after dari halaman sebelumnya. |
/api/v1/batches/{id}/invoiceSatu PDF ringkasan biaya dan refund setelah semua order selesai. 409 bila belum selesai atau batch uji. Respons sukses berupa berkas application/pdf.
| Nama | Tipe | Keterangan |
|---|---|---|
| id * | string | ID batch (bat_…) atau reference milikmu. |
/api/v1/lookups/gamespublikDaftar kode game dan kebutuhan zona. Publik, tanpa kunci.
/api/v1/lookups/quotapublikJatah gratis harian dan tarif tambahan. Publik. Cek pemain dan cek batas pembelian memakai jatah yang sama; reset pukul 00:00 UTC.
/api/v1/lookups/playerValidasi ID pemain sebelum order. Hasil ditemukan maupun tidak ditemukan memakai jatah. 404 akun tidak ada, 402 saldo kurang untuk cek berbayar, 429 jatah habis.
| Nama | Tipe | Keterangan |
|---|---|---|
| game * | string | Kode game dari /lookups/games. |
| id * | string | ID akun pemain. |
| zone | string|null | Server/zona bila diwajibkan. |
/api/v1/lookups/purchase-limit/mobile-legendsCek apakah paket mingguan/double diamond sudah mencapai batas pembelian. Memakai jatah yang sama dengan cek pemain.
| Nama | Tipe | Keterangan |
|---|---|---|
| id * | string | ID akun. |
| zone * | string | Zona. |
/api/v1/webhooks/testMengirim event webhook.test bertanda tangan ke Webhook URL-mu, supaya penerimamu bisa diuji tanpa membuat order. Isi Webhook URL dan buat rahasia webhook di dashboard terlebih dulu.