API Reference

 H2H TopUp REST API

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.

Base URL /api
Content-Type untuk POST Wajib kirim header: Content-Type: application/json

Alur Integrasi

1
Ambil daftar produk
GET /api/categories/game → tampilkan grid game ke user (gunakan gambar untuk thumbnail)
2
Ambil detail & items
GET /api/game/:game_id → tampilkan daftar item, gunakan item.kode sebagai product_code
3
Buat order
POST /api/order dengan product_code + target (+ zone_id jika format_order = zone)
4
Polling status (jika pending)
GET /api/status/:trx_id setiap ~3 detik sampai status berubah dari pending

Contoh Kode Integrasi

PHP — Order Mobile Legends 86 Diamond
<?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";
}
Tips Integrasi
  • Simpan API Key di environment variable, jangan hardcode
  • Gunakan ref_id unik dari sistem kamu untuk menghindari order duplikat
  • Selalu cek format_order dari produk — tidak semua butuh zone_id
  • Jika status failed, saldo otomatis dikembalikan ke akun

Autentikasi

Setiap request harus menyertakan API Key. Ambil dari halaman Dashboard → tab Profil.

Ada dua cara:

Cara 1 — Query Parameter
GET /api/products?apikey=OKAPI-XXXXXXXX
Cara 2 — HTTP Header
GET /api/products
X-Api-Key: OKAPI-XXXXXXXX
Jangan share API Key! API Key bersifat rahasia. Jika bocor, reset segera dari halaman Dashboard.

API Playground

Uji endpoint secara real-time langsung dari browser. Semua request dikirim ke server ini.

Format Respons

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"
  }
}
Error — semua endpoint
{
  "status":  false,
  "message": "API Key tidak valid"
}
Error — saldo tidak cukup (POST /api/order)
{
  "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"
  }
}

Daftar Kategori

GET /api/categories

Ambil semua kategori yang tersedia beserta metadata. Items tidak disertakan — gunakan /api/game/:game_id untuk items.

ParameterWajibKeterangan
apikeyYaAPI Key akun
Request
GET /api/categories?apikey=OKAPI-XXXXXXXX
Respons
{
  "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
    }
  ]
}

Produk per Kategori

GET /api/categories/:category

Daftar semua produk/brand dalam satu kategori. Items tidak disertakan — gunakan /api/game/:game_id untuk item lengkap.

ParameterWajibKeterangan
apikeyYaAPI Key akun
:category (path)Yagame / pulsa / data / ewallet / tagihan
Request
GET /api/categories/game?apikey=OKAPI-XXXXXXXX
Respons
{
  "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"
    }
  ]
}

Detail Game + Items

GET /api/game/:game_id

Ambil detail lengkap satu produk/game berikut seluruh item-nya dikelompokkan per grup. game_id bisa berupa id produk atau nama produk.

ParameterWajibKeterangan
apikeyYaAPI Key akun
:game_id (path)YaID atau nama produk (cth: mlbb-001 atau mobile-legends)
Request
GET /api/game/mlbb-001?apikey=OKAPI-XXXXXXXX
Respons
{
  "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
        }
      ]
    }
  ]
}
Field gambar Gambar hanya ada di level groups[].icon_url dan produk (gambar), bukan di level item. Gunakan groups[].icon_url sebagai thumbnail per grup.

Semua Produk (flat)

GET /api/products

Ambil semua item produk aktif dalam format flat. Bisa difilter per kategori atau kata kunci.

ParameterWajibKeterangan
apikeyYaAPI Key akun
categoryTidakgame / pulsa / data / ewallet / tagihan
searchTidakCari berdasarkan kode, nama item, atau nama brand
Request (dengan filter kategori)
GET /api/products?apikey=OKAPI-XXXXXXXX&category=game
Respons (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"
    }
  ]
}
Tanpa filter category Respons berbentuk objek dengan key per kategori: {"game": [...], "pulsa": [...], ...}

Detail Produk

GET /api/product/:kode

Ambil detail satu item produk berdasarkan kode. Berguna untuk validasi harga terkini dan format order sebelum membuat order.

ParameterWajibKeterangan
apikeyYaAPI Key akun
:kode (path)YaKode produk (cth: DML86, S10, D50)
Request
GET /api/product/DML86?apikey=OKAPI-XXXXXXXX
Respons
{
  "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"
  }
}

Varian per Brand

GET /api/variants/:category

Produk dikelompokkan per brand (produk), setiap brand memiliki gambar + items[]. Format berbeda dari /api/game — cocok untuk tampilan grid brand.

ParameterWajibKeterangan
apikeyYaAPI Key
:category (path)YaKategori produk
produkTidakFilter berdasarkan nama brand (misal: DANA)
Respons (/api/variants/ewallet)
{
  "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"
        }
      ]
    }
  }
}

Buat Order

POST /api/order

Membuat order topup. Saldo dipotong otomatis. Jika status failed, saldo dikembalikan.

Field (body JSON)WajibKeterangan
apikeyYaAPI Key akun
product_codeYaKode produk (ambil dari item.kode)
targetYaUser ID / nomor HP / nomor pelanggan (sesuai format_order)
zone_idKondisionalZone ID — wajib jika format_order = zone (misal Mobile Legends)
ref_idTidakID order dari sistem kamu (opsional, untuk idempotency)
Request Body — Mobile Legends
{
  "apikey":       "OKAPI-XXXXXXXX",
  "product_code": "DML86",
  "target":       "123456789",
  "zone_id":      "2006",
  "ref_id":       "ORD-20250115-001"
}
Respons — status success
{
  "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
  }
}
Respons — status pending (proses di provider)
{
  "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 Order

GET /api/status/:trx_id

Cek status terbaru dari satu order. Jika status masih pending, endpoint ini otomatis melakukan re-check ke provider dan memperbarui status.

ParameterWajibKeterangan
apikeyYaAPI Key akun
:trx_id (path)YaTrx ID dari respons order (data.trx_id)
Request
GET /api/status/H2H-A3F21C4D?apikey=OKAPI-XXXXXXXX
Respons
{
  "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"
  }
}

Riwayat Transaksi

GET /api/history

Ambil riwayat transaksi milik akun. Bisa difilter dan dibatasi jumlahnya.

ParameterWajibKeterangan
apikeyYaAPI Key akun
limitTidakJumlah data (default: 20, maks: 100)
categoryTidakFilter kategori (game, pulsa, dll)
statusTidakFilter status (success, pending, failed)
Respons
{
  "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

GET /api/balance

Cek saldo dan informasi akun. Field role menentukan harga yang berlaku (reseller mendapat harga lebih murah).

Request
GET /api/balance?apikey=OKAPI-XXXXXXXX
Respons
{
  "status":  true,
  "creator": "H2H TopUp",
  "data": {
    "username":       "johndoe",
    "role":           "regular",
    "is_reseller":    false,
    "balance":        85000,
    "balance_format": "Rp85.000",
    "note":           "Harga menggunakan tarif regular"
  }
}

Buat QRIS Deposit

POST /api/deposit/create

Generate QRIS untuk deposit saldo. Setelah user membayar, saldo otomatis masuk dalam 1–5 menit.

Field (body JSON)WajibKeterangan
apikeyYaAPI Key akun
amountYaJumlah deposit (angka, tanpa titik/koma)
Request Body
{
  "apikey": "OKAPI-XXXXXXXX",
  "amount": 50000
}
Respons
{
  "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"
  }
}

Cek Status Deposit

POST /api/deposit/check
Request Body
{
  "apikey": "OKAPI-XXXXXXXX",
  "trxid":  "SANZXCODE-ED0C"
}
Respons
{
  "status": true,
  "result": {
    "trxid":   "SANZXCODE-ED0C",
    "status":  "success",
    "amount":  50000
  }
}

Penjelasan format_order

Field format_order di setiap produk menentukan cara mengisi target dan zone_id saat order:

NilaiArtinyaContoh produktargetzone_id
zoneButuh Player ID + Zone IDMobile LegendsPlayer ID: 123456789 Wajib
phoneButuh nomor HPPulsa, Data, E-WalletNomor HP: 08123456789 Tidak
normalButuh User ID / UIDFree Fire, Genshin, TagihanUID / no. pelanggan Tidak

Kategori: Game

Gameformat_ordertargetzone_id
Mobile Legends (MLBB)zonePlayer ID (angka) Wajib
Free FirenormalUID
Genshin ImpactnormalUID
PUBG MobilenormalPlayer ID
Honkai Star RailnormalUID
RobloxnormalUsername / User ID

Kategori: Pulsa & Data

Semua produk pulsa dan paket data menggunakan format_order: "phone". Target adalah nomor HP aktif.

OperatorContoh kodeContoh target
TelkomselS5, S10, S500812xxxxxxxx
Indosat OoredooI5, I250815xxxxxxxx
XL AxiataX10, X500817xxxxxxxx
AxisA5, A500838xxxxxxxx
TriT5, T250896xxxxxxxx
SmartfrenSF5, SF250881xxxxxxxx

Kategori: E-Wallet

Semua e-wallet menggunakan format_order: "phone". Target adalah nomor HP yang terdaftar di e-wallet.

E-WalletContoh kodeCatatan
DANAD10, D50, D100Nomor HP terdaftar DANA
GoPayGPY10000, GPY50000Nomor HP Gojek
ShopeePaySHOPE10, SHOPE50Nomor HP Shopee
LinkAjaLJ10, LJ50Nomor HP LinkAja
OVOOVO10, OVO50Nomor HP OVO

Kategori: Tagihan

Tagihan menggunakan format_order: "normal". Target adalah nomor pelanggan / ID meteran.

Layanantarget
Token PLN (Prabayar)Nomor meteran / ID pelanggan PLN
PLN Postpaid (Pascabayar)Nomor ID pelanggan PLN
BPJS KesehatanNomor BPJS
PDAMNomor pelanggan PDAM

Kode Error

Jika error, status = false dan field message berisi penjelasan.

Pesan ErrorPenyebabSolusi
API Key diperlukanRequest tanpa API KeyTambahkan ?apikey=... atau header X-Api-Key
API Key tidak validAPI Key salah atau expiredCek & reset API Key di Dashboard
Saldo tidak cukupBalance kurang dari harga produkDeposit saldo terlebih dahulu
Produk tidak ditemukanKode produk tidak ada / tidak aktifCek kode dari /api/products
product_code dan target wajib diisiField body tidak lengkapPastikan semua field wajib dikirim
Produk ini membutuhkan zone_idFormat order = zone tapi zone_id kosongSertakan zone_id (cth: Mobile Legends)
Gagal menghubungi providerTimeout/error jaringan ke providerCoba lagi — saldo tidak terpotong
Akses ditolakMengakses transaksi milik user lainHanya bisa cek transaksi sendiri
CS