API H2H (Host-to-Host) untuk topup game, pulsa, e-wallet, paket data, dan tagihan secara otomatis. Cocok untuk integrasi website, aplikasi mobile, bot Telegram/WhatsApp, atau sistem reseller.
/api
Content-Type: application/json
GET /api/categories/game → tampilkan grid game ke user (gunakan gambar untuk thumbnail)GET /api/game/:game_id → tampilkan daftar item, gunakan item.kode sebagai product_codePOST /api/order dengan product_code + target (+ zone_id jika format_order = zone)GET /api/status/:trx_id setiap ~3 detik sampai status berubah dari pending<?php
$apiKey = 'OKAPI-XXXXXXXX';
$baseUrl = '/api';
function apiCall($method, $path, $data = []) {
global $apiKey, $baseUrl;
$ch = curl_init($baseUrl . $path);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_CUSTOMREQUEST => $method,
]);
if ($method === 'POST')
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array_merge(['apikey' => $apiKey], $data)));
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
return $res;
}
// 1. Cek saldo
$saldo = apiCall('GET', '/balance?apikey=' . $apiKey);
echo "Saldo: " . $saldo['data']['balance_format'] . "\n";
// 2. Buat order Mobile Legends
$order = apiCall('POST', '/order', [
'product_code' => 'DML86',
'target' => '123456789',
'zone_id' => '2006',
'ref_id' => 'ORD-' . time()
]);
if ($order['status']) {
$trxId = $order['data']['trx_id'];
$status = $order['data']['status'];
// 3. Polling jika pending
while ($status === 'pending') {
sleep(3);
$cek = apiCall('GET', "/status/{$trxId}?apikey={$apiKey}");
$status = $cek['data']['status'];
}
echo $status === 'success' ? "✅ Topup berhasil!\n" : "❌ Topup gagal.\n";
} else {
echo "Error: " . $order['message'] . "\n";
}
ref_id unik dari sistem kamu untuk menghindari order duplikatformat_order dari produk — tidak semua butuh zone_idfailed, saldo otomatis dikembalikan ke akunSetiap request harus menyertakan API Key. Ambil dari halaman Dashboard → tab Profil.
Ada dua cara:
GET /api/products?apikey=OKAPI-XXXXXXXX
GET /api/products
X-Api-Key: OKAPI-XXXXXXXX
Uji endpoint secara real-time langsung dari browser. Semua request dikirim ke server ini.
Semua endpoint mengembalikan JSON. Field status: true untuk sukses, false untuk error.
GET /api/balance — Sukses{
"status": true,
"creator": "H2H TopUp",
"data": {
"username": "johndoe",
"role": "regular",
"is_reseller": false,
"balance": 85000,
"balance_format": "Rp85.000",
"note": "Harga menggunakan tarif regular"
}
}
{
"status": false,
"message": "API Key tidak valid"
}
{
"status": false,
"message": "Saldo tidak cukup",
"data": {
"saldo_anda": 20000,
"saldo_format": "Rp20.000",
"harga": 25000,
"harga_format": "Rp25.000",
"kekurangan": 5000,
"kekurangan_format": "Rp5.000"
}
}
Ambil semua kategori yang tersedia beserta metadata. Items tidak disertakan — gunakan /api/game/:game_id untuk items.
| Parameter | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API Key akun |
GET /api/categories?apikey=OKAPI-XXXXXXXX
{
"status": true,
"creator": "H2H TopUp",
"total": 6,
"data": [
{
"kategori_id": "game",
"nama": "Game",
"gambar": "https://cdn.example.com/ml-logo.png",
"total_produk": 12,
"total_group": 36,
"total_item": 420
},
{
"kategori_id": "pulsa",
"nama": "Pulsa",
"gambar": null,
"total_produk": 6,
"total_group": 6,
"total_item": 54
}
]
}
Daftar semua produk/brand dalam satu kategori. Items tidak disertakan — gunakan /api/game/:game_id untuk item lengkap.
| Parameter | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API Key akun |
:category (path) | Ya | game / pulsa / data / ewallet / tagihan |
GET /api/categories/game?apikey=OKAPI-XXXXXXXX
{
"status": true,
"creator": "H2H TopUp",
"kategori": "game",
"total": 12,
"data": [
{
"id": "mlbb-001",
"nama": "Mobile Legends",
"gambar": "https://cdn.example.com/ml-logo.png",
"format_order": "zone",
"populer": true,
"total_group": 3,
"total_item": 42,
"harga_mulai": 3500,
"harga_mulai_format": "Rp3.500"
}
]
}
Ambil detail lengkap satu produk/game berikut seluruh item-nya dikelompokkan per grup. game_id bisa berupa id produk atau nama produk.
| Parameter | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API Key akun |
:game_id (path) | Ya | ID atau nama produk (cth: mlbb-001 atau mobile-legends) |
GET /api/game/mlbb-001?apikey=OKAPI-XXXXXXXX
{
"status": true,
"creator": "H2H TopUp",
"id": "mlbb-001",
"nama": "Mobile Legends",
"gambar": "https://cdn.example.com/ml-logo.png",
"format_order": "zone",
"populer": true,
"kategori_id": "game",
"total_group": 3,
"total_item": 42,
"groups": [
{
"group_id": "diamond",
"group_nama": "Diamond",
"icon_url": null,
"total": 18,
"items": [
{
"kode": "DML86",
"nama": "86 Diamond",
"harga": 25000,
"harga_format": "Rp25.000",
"populer": true,
"promo": false
},
{
"kode": "DML172",
"nama": "172 Diamond",
"harga": 49000,
"harga_format": "Rp49.000",
"populer": false,
"promo": false
}
]
}
]
}
groups[].icon_url dan produk (gambar), bukan di level item. Gunakan groups[].icon_url sebagai thumbnail per grup.
Ambil semua item produk aktif dalam format flat. Bisa difilter per kategori atau kata kunci.
| Parameter | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API Key akun |
category | Tidak | game / pulsa / data / ewallet / tagihan |
search | Tidak | Cari berdasarkan kode, nama item, atau nama brand |
GET /api/products?apikey=OKAPI-XXXXXXXX&category=game
{
"status": true,
"creator": "H2H TopUp",
"total": 84,
"data": [
{
"kode": "DML86",
"nama": "86 Diamond",
"produk": "Mobile Legends",
"produk_id": "mlbb-001",
"icon_url": "https://cdn.example.com/ml-logo.png",
"produk_gambar": "https://cdn.example.com/ml-logo.png",
"kategori": "Diamond",
"kategori_id": "game",
"format_order": "zone",
"harga": 25000,
"harga_format": "Rp25.000",
"populer": true,
"promo": false,
"status": "1"
}
]
}
category
Respons berbentuk objek dengan key per kategori: {"game": [...], "pulsa": [...], ...}
Ambil detail satu item produk berdasarkan kode. Berguna untuk validasi harga terkini dan format order sebelum membuat order.
| Parameter | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API Key akun |
:kode (path) | Ya | Kode produk (cth: DML86, S10, D50) |
GET /api/product/DML86?apikey=OKAPI-XXXXXXXX
{
"status": true,
"creator": "H2H TopUp",
"data": {
"kode": "DML86",
"nama": "86 Diamond",
"produk": "Mobile Legends",
"produk_id": "mlbb-001",
"gambar": null,
"kategori": "Diamond",
"kategori_id": "game",
"format_order": "zone",
"harga": 25000,
"harga_format": "Rp25.000",
"status": "1"
}
}
Produk dikelompokkan per brand (produk), setiap brand memiliki gambar + items[]. Format berbeda dari /api/game — cocok untuk tampilan grid brand.
| Parameter | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API Key |
:category (path) | Ya | Kategori produk |
produk | Tidak | Filter berdasarkan nama brand (misal: DANA) |
{
"status": true,
"creator": "H2H TopUp",
"kategori": "ewallet",
"total_produk": 5,
"data": {
"DANA": {
"id": "dana-001",
"produk": "DANA",
"gambar": "https://cdn.example.com/dana-logo.png",
"format_order":"phone",
"populer": true,
"total": 8,
"items": [
{
"kode": "D10",
"nama": "Top Up DANA 10.000",
"produk": "DANA",
"produk_id": "dana-001",
"icon_url": "https://cdn.example.com/dana-logo.png",
"produk_gambar": "https://cdn.example.com/dana-logo.png",
"kategori": "E-Wallet",
"kategori_id": "ewallet",
"format_order": "phone",
"harga": 12000,
"harga_format": "Rp12.000",
"populer": false,
"promo": false,
"status": "1"
}
]
}
}
}
Membuat order topup. Saldo dipotong otomatis. Jika status failed, saldo dikembalikan.
| Field (body JSON) | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API Key akun |
product_code | Ya | Kode produk (ambil dari item.kode) |
target | Ya | User ID / nomor HP / nomor pelanggan (sesuai format_order) |
zone_id | Kondisional | Zone ID — wajib jika format_order = zone (misal Mobile Legends) |
ref_id | Tidak | ID order dari sistem kamu (opsional, untuk idempotency) |
{
"apikey": "OKAPI-XXXXXXXX",
"product_code": "DML86",
"target": "123456789",
"zone_id": "2006",
"ref_id": "ORD-20250115-001"
}
{
"status": true,
"creator": "H2H TopUp",
"data": {
"trx_id": "H2H-A3F21C4D",
"ref_id": "ORD-20250115-001",
"product_code": "DML86",
"product_name": "86 Diamond",
"kategori": "game",
"target": "123456789",
"zone_id": "2006",
"amount": 25000,
"amount_format":"Rp25.000",
"status": "success",
"message": "SUKSES",
"created_at": "2025-01-15T10:30:00.000Z",
"note": null
}
}
{
"status": true,
"creator": "H2H TopUp",
"data": {
"trx_id": "H2H-B7C39E2F",
"ref_id": "ORD-20250115-002",
"product_code": "DML86",
"product_name": "86 Diamond",
"kategori": "game",
"target": "123456789",
"zone_id": "2006",
"amount": 25000,
"amount_format":"Rp25.000",
"status": "pending",
"message": "Order sedang diproses",
"created_at": "2025-01-15T10:30:00.000Z",
"note": "Order sedang diproses. Gunakan GET /api/status/H2H-B7C39E2F untuk cek status terbaru."
}
}
Cek status terbaru dari satu order. Jika status masih pending, endpoint ini otomatis melakukan re-check ke provider dan memperbarui status.
| Parameter | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API Key akun |
:trx_id (path) | Ya | Trx ID dari respons order (data.trx_id) |
GET /api/status/H2H-A3F21C4D?apikey=OKAPI-XXXXXXXX
{
"status": true,
"creator": "H2H TopUp",
"data": {
"trx_id": "H2H-A3F21C4D",
"ref_id": "ORD-20250115-001",
"product_code": "DML86",
"product_name": "86 Diamond",
"kategori": "game",
"target": "123456789",
"zone_id": "2006",
"amount": 25000,
"amount_format":"Rp25.000",
"status": "success",
"message": "SUKSES",
"created_at": "2025-01-15T10:30:00.000Z",
"updated_at": "2025-01-15T10:30:05.000Z"
}
}
Ambil riwayat transaksi milik akun. Bisa difilter dan dibatasi jumlahnya.
| Parameter | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API Key akun |
limit | Tidak | Jumlah data (default: 20, maks: 100) |
category | Tidak | Filter kategori (game, pulsa, dll) |
status | Tidak | Filter status (success, pending, failed) |
{
"status": true,
"creator": "H2H TopUp",
"total": 2,
"data": [
{
"trx_id": "H2H-A3F21C4D",
"ref_id": "ORD-20250115-001",
"product_code": "DML86",
"product_name": "86 Diamond",
"kategori": "game",
"target": "123456789",
"zone_id": "2006",
"amount": 25000,
"amount_format":"Rp25.000",
"status": "success",
"message": "SUKSES",
"created_at": "2025-01-15T10:30:00.000Z",
"updated_at": "2025-01-15T10:30:05.000Z"
}
]
}
Cek saldo dan informasi akun. Field role menentukan harga yang berlaku (reseller mendapat harga lebih murah).
GET /api/balance?apikey=OKAPI-XXXXXXXX
{
"status": true,
"creator": "H2H TopUp",
"data": {
"username": "johndoe",
"role": "regular",
"is_reseller": false,
"balance": 85000,
"balance_format": "Rp85.000",
"note": "Harga menggunakan tarif regular"
}
}
Generate QRIS untuk deposit saldo. Setelah user membayar, saldo otomatis masuk dalam 1–5 menit.
| Field (body JSON) | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API Key akun |
amount | Ya | Jumlah deposit (angka, tanpa titik/koma) |
{
"apikey": "OKAPI-XXXXXXXX",
"amount": 50000
}
{
"status": true,
"creator": "H2H TopUp",
"data": {
"trxid": "SANZXCODE-ED0C",
"nominal": 50000,
"qris_image": "https://api.okeconnect.com/qris/img?id=SANZXCODE-ED0C",
"expired_at": "2025-01-15T11:00:00.000Z",
"status": "pending"
}
}
{
"apikey": "OKAPI-XXXXXXXX",
"trxid": "SANZXCODE-ED0C"
}
{
"status": true,
"result": {
"trxid": "SANZXCODE-ED0C",
"status": "success",
"amount": 50000
}
}
format_orderField format_order di setiap produk menentukan cara mengisi target dan zone_id saat order:
| Nilai | Artinya | Contoh produk | target | zone_id |
|---|---|---|---|---|
zone | Butuh Player ID + Zone ID | Mobile Legends | Player ID: 123456789 | Wajib |
phone | Butuh nomor HP | Pulsa, Data, E-Wallet | Nomor HP: 08123456789 | Tidak |
normal | Butuh User ID / UID | Free Fire, Genshin, Tagihan | UID / no. pelanggan | Tidak |
| Game | format_order | target | zone_id |
|---|---|---|---|
| Mobile Legends (MLBB) | zone | Player ID (angka) | Wajib |
| Free Fire | normal | UID | — |
| Genshin Impact | normal | UID | — |
| PUBG Mobile | normal | Player ID | — |
| Honkai Star Rail | normal | UID | — |
| Roblox | normal | Username / User ID | — |
Semua produk pulsa dan paket data menggunakan format_order: "phone". Target adalah nomor HP aktif.
| Operator | Contoh kode | Contoh target |
|---|---|---|
| Telkomsel | S5, S10, S50 | 0812xxxxxxxx |
| Indosat Ooredoo | I5, I25 | 0815xxxxxxxx |
| XL Axiata | X10, X50 | 0817xxxxxxxx |
| Axis | A5, A50 | 0838xxxxxxxx |
| Tri | T5, T25 | 0896xxxxxxxx |
| Smartfren | SF5, SF25 | 0881xxxxxxxx |
Semua e-wallet menggunakan format_order: "phone". Target adalah nomor HP yang terdaftar di e-wallet.
| E-Wallet | Contoh kode | Catatan |
|---|---|---|
| DANA | D10, D50, D100 | Nomor HP terdaftar DANA |
| GoPay | GPY10000, GPY50000 | Nomor HP Gojek |
| ShopeePay | SHOPE10, SHOPE50 | Nomor HP Shopee |
| LinkAja | LJ10, LJ50 | Nomor HP LinkAja |
| OVO | OVO10, OVO50 | Nomor HP OVO |
Tagihan menggunakan format_order: "normal". Target adalah nomor pelanggan / ID meteran.
| Layanan | target |
|---|---|
| Token PLN (Prabayar) | Nomor meteran / ID pelanggan PLN |
| PLN Postpaid (Pascabayar) | Nomor ID pelanggan PLN |
| BPJS Kesehatan | Nomor BPJS |
| PDAM | Nomor pelanggan PDAM |
Jika error, status = false dan field message berisi penjelasan.
| Pesan Error | Penyebab | Solusi |
|---|---|---|
API Key diperlukan | Request tanpa API Key | Tambahkan ?apikey=... atau header X-Api-Key |
API Key tidak valid | API Key salah atau expired | Cek & reset API Key di Dashboard |
Saldo tidak cukup | Balance kurang dari harga produk | Deposit saldo terlebih dahulu |
Produk tidak ditemukan | Kode produk tidak ada / tidak aktif | Cek kode dari /api/products |
product_code dan target wajib diisi | Field body tidak lengkap | Pastikan semua field wajib dikirim |
Produk ini membutuhkan zone_id | Format order = zone tapi zone_id kosong | Sertakan zone_id (cth: Mobile Legends) |
Gagal menghubungi provider | Timeout/error jaringan ke provider | Coba lagi — saldo tidak terpotong |
Akses ditolak | Mengakses transaksi milik user lain | Hanya bisa cek transaksi sendiri |