Menu

Home Cek Transaksi Marketplace Daftar Harga
Leaderboard Artikel API Docs Reviews Hubungi Kami
Host-to-Host API * v1

Dokumentasi API

Integrasikan sistem website Anda dengan kami sebagai supplier produk H2H.

Masuk untuk Mendapatkan API Key

Pendahuluan

Semua request menggunakan method POST dengan body JSON. Base URL endpoint:

POST https://www.bybanana.my/api/v1/{endpoint}
Header Wajib
Content-Type: application/json

Autentikasi & Signature

Setiap request harus menyertakan api_id, api_key, dan signature dalam body JSON. Signature dihitung menggunakan rumus MD5.

API ID
Masuk untuk melihat
API Key
Masuk untuk melihat
Rumus Signature
signature = HMAC-SHA256(
    METHOD + "|" + PATH + "|" + timestamp + "|" + nonce,
    api_key
)
Aktifkan toggle Status Akses API di menu Integrasi API, dan pastikan IP server Anda terdaftar di IP Whitelist agar request tidak ditolak.
Cara menghitung signature (PHP)
$apiId     = 'API_ID_ANDA';
$apiKey    = 'API_KEY_ANDA';
$method    = 'POST';
$path      = '/api/v1/profile';          // path LENGKAP dari base_url('api/v1')
$timestamp = time();                     // unix timestamp (detik)
$nonce     = bin2hex(random_bytes(16));  // string acak unik, min 8 karakter

$canonical = $method . '|' . $path . '|' . $timestamp . '|' . $nonce;
$signature = hash_hmac('sha256', $canonical, $apiKey);

$payload = [
    'api_id'    => $apiId,
    'timestamp' => $timestamp,
    'nonce'     => $nonce,
    'signature' => $signature,
    // ...field lain (order_id, service_id, dst)
];
api_key TIDAK dikirim dalam body — hanya dipakai untuk menghitung signature. Field timestamp (±300 detik dari waktu server) dan nonce (unik, tidak boleh dipakai ulang) wajib dikirim. Tiap request butuh signature berbeda. Skema lama md5(api_id + api_key) sudah tidak didukung.
Contoh Body (semua endpoint)
{
  "api_id": "YOUR_API_ID",
  "timestamp": 1700000000,
  "nonce": "a1b2c3d4e5f6",
  "signature": "HMAC-SHA256(POST|/api/v1/profile|1700000000|a1b2c3d4e5f6, api_key)"
}

Cek Profil / Saldo

Ambil informasi akun reseller: username, saldo, dan level harga (role).

POST https://www.bybanana.my/api/v1/profile
Contoh Request
{
  "api_id": "YOUR_API_ID",
  "timestamp": 1700000000,
  "nonce": "a1b2c3d4e5f6",
  "signature": "HMAC-SHA256(POST|/api/v1/profile|1700000000|a1b2c3d4e5f6, api_key)"
}
Response
{
  "status": true,
  "msg": "Berhasil mengambil data profil",
  "data": {
    "username": "resellerku",
    "balance": "150000",
    "role": "Gold"
  }
}

Daftar Layanan (Price List)

Ambil semua produk beserta harga sesuai level Anda (Basic / Gold / Platinum). Gunakan id sebagai service_id saat order.

POST https://www.bybanana.my/api/v1/service
Contoh Request
ParameterTipeDeskripsi
api_id *stringAutentikasi & Signature
timestamp *integerUnix timestamp (detik), ±300 detik dari waktu server.
nonce *stringString acak unik (min 8 karakter), tidak boleh dipakai ulang.
signature *stringHMAC-SHA256(METHOD|PATH|timestamp|nonce, api_key)
regionstringOpsional. Filter hasil ke 1 region saja. Bisa diisi nama ("Indonesia") atau kode ("ID"), tidak case-sensitive. Kalau dikosongkan, semua region dikembalikan sekaligus. Alias: negara.
{
  "api_id": "YOUR_API_ID",
  "timestamp": 1700000000,
  "nonce": "a1b2c3d4e5f6",
  "signature": "HMAC-SHA256(POST|/api/v1/service|1700000000|a1b2c3d4e5f6, api_key)",
  "region": "Indonesia"
}
Response
[
  {
    "status": true,
    "msg": "Berhasil mengambil data layanan",
    "data": {
      "id": "101",
      "game": "Mobile Legends",
      "game_display": "Mobile Legends (Indonesia)",
      "region_code": "ID",
      "region_name": "Indonesia",
      "nama_layanan": "86 Diamonds",
      "negara": "ID",
      "harga": {
        "regular": "21500",
        "basic": "21000",
        "gold": "20500",
        "platinum": "20000"
      },
      "status": "available"
    }
  }
]
Objek harga berisi 4 tingkatan harga sesuai role akun reseller Anda: regular (akun tanpa subscription aktif), basic, gold, dan platinum. Harga yang dibebankan saat order (endpoint /order) otomatis mengikuti role akun Anda saat ini — lihat field role pada respons /profile di atas.
Field negara berisi kode region produk (ID, MY, PH, SG, TH, …), diturunkan dari Master Type yang terkait dengan produk (produk.tipeproduct_typesmaster_types.negara).

Field baru — disarankan dipakai untuk integrasi baru:
game_display — nama game yang sudah termasuk region, siap tampil langsung sebagai judul/brand di listing Anda (mis. "Mobile Legends (Indonesia)"). Kalau region belum terdeteksi untuk suatu produk, nilainya sama dengan game (tanpa suffix).
region_code — kode ISO region ("ID", "MY", dst), sama isinya dengan negara. Bisa null kalau region belum terdeteksi.
region_name — nama region dalam bentuk terbaca manusia ("Indonesia"), sesuai penamaan Master Type yang admin atur sendiri di panel Bybanana.

Field game tetap dipertahankan apa adanya (nama game polos, tanpa suffix region) untuk kompatibilitas mundur — integrasi lama tidak akan rusak. Kalau ingin listing game Anda otomatis terpisah per region (mis. "Mobile Legends (Indonesia)" dan "Mobile Legends (Malaysia)" sebagai 2 entri berbeda), kelompokkan produk berdasarkan game_display, bukan game.

Buat Order

Buat transaksi baru. Saldo akan otomatis terpotong sesuai level harga Anda. order_id dibuat oleh sistem Anda dan harus unik.

POST https://www.bybanana.my/api/v1/order
Parameter
ParameterTipeDeskripsi
order_id *stringID transaksi unik dari sistem Anda
service_id *stringID Layanan (dari endpoint /service)
target_id *stringID User / nomor tujuan
target_serverstringZone / Server (jika ada)
Contoh Request
{
  "api_id": "YOUR_API_ID",
  "timestamp": 1700000000,
  "nonce": "a1b2c3d4e5f6",
  "signature": "HMAC-SHA256(POST|/api/v1/order|1700000000|a1b2c3d4e5f6, api_key)",
  "order_id": "TRX-1700000001",
  "service_id": "101",
  "target_id": "123456789",
  "target_server": "2001"
}
Response Sukses
{
  "status": true,
  "msg": "Order berhasil! Order sedang diproses",
  "data": {
    "order_id": "TRX-1700000001",
    "nama_layanan": "86 Diamonds",
    "service_id": "101",
    "target_id": "123456789",
    "target_server": "2001",
    "status": "Proses",
    "note": ""
  }
}
Response Error
{
  "status": false,
  "msg": "order_id wajib diisi"
}
{
  "status": false,
  "msg": "order_id sudah tersedia pada sistem kami",
  "data": { "status": "error" }
}
{
  "status": false,
  "msg": "service_id tidak ditemukan"
}
{
  "status": false,
  "msg": "Saldo anda tidak mencukupi"
}

Cek Status Transaksi

Cek status saat ini dari transaksi berdasarkan order_id.

POST https://www.bybanana.my/api/v1/status
Parameter
ParameterTipeDeskripsi
order_id *stringID transaksi yang dicek
Contoh Request
{
  "api_id": "YOUR_API_ID",
  "timestamp": 1700000000,
  "nonce": "a1b2c3d4e5f6",
  "signature": "HMAC-SHA256(POST|/api/v1/status|1700000000|a1b2c3d4e5f6, api_key)",
  "order_id": "TRX-1700000001"
}
Response
{
  "status": true,
  "msg": "Detail transaksi berhasil diambil",
  "data": {
    "order_id": "TRX-1700000001",
    "status": "Sukses",
    "note": "SN: 1234567890"
  }
}

Cek Nickname

Validasi User ID game untuk mendapatkan nickname pemilik akun sebelum order.

POST https://www.bybanana.my/api/v1/nickname
Endpoint ini tidak memerlukan autentikasi (api_id / api_key / signature). Cukup kirim code, id, dan zone. Response diteruskan apa adanya dari provider nickname.
Contoh Request
{
  "code": "mlbb",
  "id": "123456789",
  "zone": "2001"
}

Callback / Webhook

Ketika status order berubah (misal dari Processing ke Success / Failed), sistem kami otomatis mengirim POST JSON ke Callback URL yang Anda atur di menu Integrasi API.

Payload yang Kami Kirim
POST {Callback URL Anda}
Content-Type: application/json
X-Signature: md5(api_id + order_id + status + webhook_secret)

{
  "event": "order.status",
  "order_id": "TRX-1700000001",
  "service_id": "101",
  "product": "86 Diamonds",
  "status": "Sukses",
  "note": "SN: 1234567890",
  "sn": "SN: 1234567890",
  "target_id": "123456789",
  "target_server": "2001",
  "price": 20500,
  "timestamp": 1700000123,
  "signature": "md5(api_id + order_id + status + webhook_secret)"
}
Verifikasi Signature (PHP)
$payload = json_decode(file_get_contents('php://input'), true);
$expected = md5($api_id . $payload['order_id'] . $payload['status'] . $webhook_secret);
if ($_SERVER['HTTP_X_SIGNATURE'] === $expected) {
    // valid — update status order di sistem Anda
    http_response_code(200);
    echo 'OK';
}
Balas dengan HTTP 200 agar callback dianggap berhasil. Jika gagal, status callback dapat dilihat di Integrasi API → Riwayat Callback.

Daftar Status Transaksi

Status yang mungkin muncul di field status:

Pending Diproses Sukses Gagal Refund