TopupDong
Untuk Reseller

Dokumentasi API H2H

API khusus reseller yang sudah disetujui. Saldo, deposit QRIS, layanan, dan pesanan.

Ringkasan

API khusus reseller yang sudah disetujui. Pesanan dibayar dengan saldo TopupDong (prabayar); saldo diisi lewat QRIS. Harga reseller = harga normal − 5% (diskon dibulatkan ke bawah), selalu dihitung server.

Base URL: https://domain-anda.com/api/public/h2h (ganti dengan domain toko). Wajib HTTPS. Batas: 60 request/menit per API key.

Catatan: pesanan yang dibuat masuk antrean (queued). Pengiriman otomatis ke supplier belum aktif, jadi status akan berubah setelah diproses.

Autentikasi

Buat API key di Dasbor Reseller. Key hanya ditampilkan sekali; regenerate langsung mematikan key lama.

Authorization: Bearer tdk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# atau
X-API-Key: tdk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Endpoint

GET/balanceSaldo tersedia, total deposit, pemakaian, dan refund.
GET/balance-history?page=1&limit=50Mutasi saldo (deposit, order_debit, refund, admin_adjust).
GET/services?game=&page=1&limit=200Daftar produk aktif dengan harga normal & harga reseller.
POST/orderBuat pesanan, dibayar dari saldo.
GET/order/{order_id}Status satu pesanan milik kamu.
GET/orders?status=&page=1&limit=50Riwayat pesanan H2H.
POST/depositBuat invoice QRIS untuk isi saldo.
GET/deposit/{reference}Status deposit (dicek ulang bila masih menunggu).

POST /order

Body JSON: product_id (uuid dari /services), target (sesuai target_fields produk), ref_id (ID unik dari sistemmu, 6–64 karakter; mengirim ulang ref_id yang sama tidak membuat pesanan baru). Jangan kirim harga — field lain akan ditolak.

{ "product_id": "7f2c...", "target": { "user_id": "12345678", "zone_id": "1234" }, "ref_id": "INV-0001" }
HTTP 201
{ "success": true, "data": {
  "order_id": "TD-AB12CD", "ref_id": "INV-0001", "product": "86 Diamonds", "category": "Top Up Game",
  "target": { "user_id": "12345678", "zone_id": "1234" },
  "price": 20000, "discount": 1000, "total": 19000,
  "payment_status": "paid", "status": "queued", "message": null, "refunded": false,
  "created_at": "2026-10-31T12:00:00Z", "duplicate": false, "balance": 81000 } }

Status: queued, processing, success, failed, needs_review.

POST /deposit

{ "amount": 100000 }   // Rp10.000 – Rp10.000.000
HTTP 201
{ "success": true, "data": { "id": "…", "reference": "DEP-XXXXXXXX", "status": "pending",
  "base_amount": 100000, "pay_amount": 100123, "qris": "000201…", "checkout_url": "https://…",
  "expires_at": "…", "paid_at": null, "created_at": "…" } }

Bayar tepat pay_amount. Saldo bertambah sebesar base_amount hanya setelah pembayaran terkonfirmasi (notifikasi terverifikasi + pengecekan ulang status). Halaman redirect bukan bukti bayar.

Format error

{ "success": false, "error": { "code": "INSUFFICIENT_BALANCE", "message": "Saldo tidak cukup…" } }
401 INVALID_API_KEY
403 RESELLER_INACTIVE
400 INVALID_JSON / HTTPS_REQUIRED / CATEGORY_NOT_SUPPORTED / GAME_BLOCKED — game sedang diblokir, saldo tidak berubah
422 INVALID_INPUT / INVALID_TARGET
402 INSUFFICIENT_BALANCE — pesanan tidak dibuat, saldo tidak berubah
404 PRODUCT_UNAVAILABLE / NOT_FOUND
409 DUPLICATE_REF
429 RATE_LIMITED / TOO_MANY_PENDING
503 PAYMENT_UNAVAILABLE
500 SERVER_ERROR

Aturan saldo & refund

  • Pengecekan saldo, pembuatan pesanan, dan pemotongan saldo terjadi dalam satu transaksi; request bersamaan tidak bisa memakai saldo yang sama.
  • Refund hanya untuk pesanan yang gagal permanen, sebesar nominal yang benar-benar dipotong, dan hanya sekali. Pesanan yang masih diproses atau berhasil tidak direfund.
  • Setiap perubahan saldo tercatat di riwayat saldo.

Contoh cURL

curl -H "Authorization: Bearer $KEY" https://domain-anda.com/api/public/h2h/balance

curl -X POST https://domain-anda.com/api/public/h2h/order \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"product_id":"7f2c...","target":{"user_id":"12345678","zone_id":"1234"},"ref_id":"INV-0001"}'

Contoh JavaScript

const res = await fetch("https://domain-anda.com/api/public/h2h/order", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.TOPUPDONG_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({ product_id: "7f2c...", target: { user_id: "12345678" }, ref_id: "INV-0001" }),
});
const json = await res.json();
if (!json.success) console.error(json.error.code, json.error.message);

Contoh PHP

<?php
$ch = curl_init("https://domain-anda.com/api/public/h2h/order");
curl_setopt_array($ch, [
  CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("TOPUPDONG_KEY"), "Content-Type: application/json"],
  CURLOPT_POSTFIELDS => json_encode(["product_id" => "7f2c...", "target" => ["user_id" => "12345678"], "ref_id" => "INV-0001"]),
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
Ajukan Jadi Reseller