๐Ÿ“š MakerGames Reseller API

Dokumentasi API untuk reseller: produk prabayar, sosmed/SMM, dan pascabayar.

๐Ÿ” Autentikasi

API hanya untuk akun Reseller. Buat API Key di Dashboard โ†’ API Reseller, lalu sertakan di header setiap request. Key disimpan dalam bentuk hash dan hanya ditampilkan sekali saat dibuat โ€” simpan di server Anda; lupa key = buat ulang.

X-API-Key: mg_xxxxxxxxxxxxxxxx
(atau) Authorization: Bearer mg_xxxxxxxxxxxxxxxx

Whitelist IP wajib diisi sebelum API bisa dipakai: atur di Dashboard โ†’ API Reseller (lihat Whitelist IP).

๐ŸŒ Base URL & format

https://makergames.id/api/reseller
  • Aksi dipilih lewat parameter action.
  • Parameter boleh dikirim lewat query string atau body JSON (Content-Type: application/json).
  • order dan inquiry wajib POST.
  • Semua nominal dalam Rupiah (bilangan bulat). Respon selalu berisi success (boolean).

๐Ÿงฉ Jenis produk

typeHargaCara order
prepaidper itemorder dengan productId + targetId
sosmedper 1.000 (atau per paket)order + quantity (bebas di antara minโ€“max dari services)
postpaidtagihan + biaya layananinquiry โ†’ order + inquiryId

๐Ÿ‘ค Profil & saldo

GET/api/reseller?action=profile
Respon
{
  "success": true,
  "data": { "username": "tokoku", "email": "[email protected]", "role": "RESELLER", "tier": "GOLD", "balance": 500000 }
}

๐Ÿ’ฐ Riwayat deposit

GET/api/reseller?action=deposit_history

Saldo dan 20 deposit terakhir.

Respon
{
  "success": true,
  "data": {
    "balance": 500000,
    "deposits": [
      { "invoiceId": "DEP2026...", "amount": 100000, "method": "TRIPAY", "status": "PAID", "createdAt": "...", "paidAt": "..." }
    ]
  }
}

๐Ÿ›ก๏ธ Whitelist IP

Wajib diisi. Atur di Dashboard โ†’ API Reseller (IPv4/IPv6, maksimal 2 IP per akun โ€” tambahan lewat admin). Whitelist kosong ditolak 403 dengan code: IP_WHITELIST_REQUIRED; request dari IP lain ditolak 403 dengan code: IP_NOT_WHITELISTED. IP dibaca dari koneksi asli (header X-Forwarded-For dari klien diabaikan).

๐Ÿ“ฆ Daftar layanan

GET/api/reseller?action=services

Produk aktif dengan harga sesuai tier Anda, dikelompokkan per layanan. code = kode produk MakerGames (unik โ€” bukan kode supplier); kirim sebagai product_code atau pakai id sebagai productId. Layanan game dengan "accountCheck": true mendukung cek akun;needZoneId = wajib targetServer.

ParameterTipeWajibKeterangan
typestringTidakprepaid (bawaan) ยท sosmed ยท postpaid ยท all. Tanpa type = hanya prabayar (kompatibel dengan integrasi lama).
Prabayar โ€” ?action=services
{
  "success": true,
  "type": "prepaid",
  "data": [
    {
      "id": "service_id", "name": "Mobile Legends", "category": "Voucher Game", "type": "prepaid",
      "needZoneId": true, "accountCheck": true,
      "products": [
        { "id": "product_id", "code": "dg-ml86-mvx1a2", "name": "86 Diamonds", "type": "prepaid", "price": 20000, "isActive": true }
      ]
    }
  ]
}
Sosmed โ€” ?action=services&type=sosmed
{
  "success": true,
  "type": "sosmed",
  "data": [
    {
      "id": "service_id", "name": "Instagram Followers Indonesia", "category": "SMM Panel", "type": "sosmed", "group": "Instagram",
      "products": [
        {
          "id": "product_id", "code": "vr-380-mvrwcwrg", "name": "Instagram Followers Indonesia [MAX 1K]", "type": "sosmed",
          "package": "Follower",
          "price": 1296602,          // per 1.000 (priceUnit = per_1000) atau per paket (priceUnit = package)
          "priceUnit": "per_1000",
          "min": 10, "max": 10000, "step": 1,
          "isActive": true
        }
      ]
    }
  ]
}
Pascabayar โ€” ?action=services&type=postpaid
{
  "success": true,
  "type": "postpaid",
  "data": [
    {
      "id": "service_id", "name": "PLN PASCABAYAR", "category": "Postpaid", "type": "postpaid", "postpaidFormat": "STANDARD",
      "products": [
        { "id": "product_id", "code": "dgp-pln-mvx1a2", "name": "PLN Pascabayar", "type": "postpaid", "serviceFee": 0, "isActive": true }
      ]
    }
  ]
}

serviceFee pascabayar = biaya layanan di atas tagihan untuk tier Anda (0 = tanpa biaya, negatif = potongan). Nominal akhir selalu dari inquiry. postpaidFormat: STANDARD ยท EMONEY (kirim amount) ยท PBB (opsional year) ยท SAMSAT (wajib identityNo).

๐ŸŽฎ Cek akun game

POST/api/reseller?action=check_account

Cek User ID (dan zone/server) sebelum order untuk layanan dengan "accountCheck": true. Tidak memotong saldo. Maks 30 cek per menit per akun.

ParameterTipeWajibKeterangan
productId / product_codestringYaProduk dari layanan game yang akan dibeli.
targetIdstringYaUser ID game.
targetServerstringTidakZone / server ID bila layanan membutuhkannya.
Request
POST /api/reseller
{ "action": "check_account", "product_code": "dg-ml86-mvx1a2", "targetId": "123456789", "targetServer": "1234" }
Respon
{ "success": true, "data": { "required": true, "valid": true, "nickname": "PlayerOne" } }
{ "success": true, "data": { "required": true, "valid": false, "errorType": "not_found", "message": "Akun tidak ditemukan" } }
{ "success": true, "data": { "required": false } }        // layanan tanpa cek akun
{ "success": false, "message": "Server pengecekan akun sedang sibuk ..." }   // HTTP 502, coba lagi

Atau kirim "check_account": true saat order: akun dicek dulu, bila tidak ditemukan order ditolak (HTTP 422) dan saldo tidak dipotong.

๐Ÿ›’ Order prabayar

POST/api/reseller?action=order

Saldo dipotong saat order diterima, lalu pesanan dikirim ke provider. Bila gagal, saldo otomatis dikembalikan (status REFUNDED).

ParameterTipeWajibKeterangan
productIdstringYaID produk dari services (atau product_code = code).
targetIdstringYaUser ID / nomor HP / email tujuan.
targetServerstringTidakZone / server ID bila layanan membutuhkannya.
ref_idstringTidakID unik dari sistem Anda (maks 64 karakter) โ€” sangat disarankan.
check_accountbooleanTidaktrue = cek akun game dulu; tidak ditemukan โ†’ ditolak 422 tanpa potong saldo.
Request
POST /api/reseller?action=order
{
  "productId": "product_id",
  "targetId": "123456789",
  "targetServer": "1234",
  "ref_id": "TRX-0001",
  "check_account": true
}
Respon
{
  "success": true,
  "data": {
    "invoiceId": "API20260101XXXXXX",
    "productName": "86 Diamonds",
    "targetId": "123456789",
    "targetServer": "1234",
    "price": 20000,
    "status": "PROCESSING",
    "serialNumber": null,
    "refId": "TRX-0001",
    "quantity": null,
    "balance": 480000,
    "createdAt": "2026-01-01T00:00:00.000Z"
  }
}

ref_id mencegah order ganda: request ulang dengan ref_id yang sama mengembalikan transaksi lama dengan "duplicate": true tanpa memotong saldo lagi.

๐Ÿ“ฑ Order sosmed / SMM

POST/api/reseller?action=order

Harga produk sosmed per 1.000. Total = ceil(price ร— quantity รท 1000) dihitung server; produk paket (priceUnit = package, min = max = 1) dikenai harga paket utuh; min = max lain tetap per 1.000 ร— quantity tetap.

ParameterTipeWajibKeterangan
productIdstringYaID produk sosmed.
targetIdstringYaUsername (tanpa @) atau link profil/postingan, tanpa spasi, maks 200 karakter.
quantityintegerYaBilangan bulat antara min dan max (lihat services). Produk min = max boleh dikosongkan.
notestringTidakCatatan untuk admin MakerGames (maks 300 karakter). Tidak dikirim ke provider.
ref_idstringTidakID unik dari sistem Anda.
Request
POST /api/reseller?action=order
{
  "productId": "product_id",
  "targetId": "https://instagram.com/akunku",
  "quantity": 2000,
  "ref_id": "SMM-0001"
}
Respon
{
  "success": true,
  "data": {
    "invoiceId": "API20260101XXXXXX",
    "productName": "Instagram Followers Indonesia [MAX 1K]",
    "targetId": "https://instagram.com/akunku",
    "price": 2593204,
    "quantity": 2000,
    "status": "PROCESSING",
    "refId": "SMM-0001",
    "balance": 1406796
  }
}

Pesanan sosmed bisa butuh beberapa menit hingga beberapa jam. Akun target wajib publik selama proses.

๐Ÿงพ Pascabayar: cek tagihan

POST/api/reseller?action=inquiry

Cek tagihan ke biller. Hasilnya berlaku 30 menit (dan tidak melewati pergantian hari WIB).

ParameterTipeWajibKeterangan
productIdstringYaID produk pascabayar.
targetIdstringYaNomor pelanggan / ID tagihan / kode bayar.
amountintegerTidakWajib untuk format EMONEY: nominal top up.
yearintegerTidakPBB: tahun pajak (opsional).
identityNostringTidakWajib untuk format SAMSAT: NIK sesuai STNK.
Respon
{
  "success": true,
  "data": {
    "inquiryId": "inq_xxx",
    "productId": "product_id",
    "productName": "PLN Pascabayar",
    "targetId": "530000000001",
    "customerName": "BUDI",
    "billAmount": 152500,
    "serviceFee": 0,
    "total": 152500,
    "detail": { "info": [...], "periods": [...] },
    "expiresAt": "2026-01-01T00:30:00.000Z"
  }
}

๐Ÿ’ณ Pascabayar: bayar

POST/api/reseller?action=order

Membayar hasil inquiry. Nominal = total dari inquiry (tidak bisa diubah). Satu inquiry hanya bisa dibayar sekali; mengulang dengan inquiryId yang sama mengembalikan transaksi yang sudah ada.

ParameterTipeWajibKeterangan
productIdstringYaSama dengan saat inquiry.
inquiryIdstringYaDari respon inquiry.
ref_idstringTidakID unik dari sistem Anda.
Request
POST /api/reseller?action=order
{ "productId": "product_id", "inquiryId": "inq_xxx", "ref_id": "PLN-0001" }

Respon sama dengan order prabayar; customerName berisi nama pelanggan tagihan.

๐Ÿ”‘ Game key

Katalog game key terpisah dari services karena jumlahnya besar. Harga dan stok mengikuti supplier, jadi selalu dicek ulang saat order. Produk konten dewasa tidak tersedia lewat API. Bila delivery bernilai account, barang yang diterima adalah data login akun, bukan product key: tampilkan isi accountNotice kepada pembeli Anda.

GET/api/reseller?action=game_keys
ParameterTipeWajibKeterangan
qstringTidakCari nama produk (minimal 2 karakter).
platformstringTidakSaring platform, mis. Steam.
sortstringTidakrecommended ยท cheapest ยท expensive ยท newest ยท name
pagenumberTidakHalaman, mulai 1.
per_pagenumberTidak1โ€“48, bawaan 24.
Contoh respon
{
  "success": true, "page": 1, "perPage": 24, "total": 1200, "maxQuantity": 9,
  "data": [
    { "code": "kg-12345", "name": "Nama Game EN Steam CD Key", "platform": "Steam", "region": "GLOBAL",
      "image": "https://...", "price": 185000, "stock": 12, "isPreorder": false, "releaseDate": "2025-02-01",
      "delivery": "key", "accountNotice": null }
  ]
}
POST/api/reseller?action=order
ParameterTipeWajibKeterangan
typestringYaIsi game_key.
product_codestringYacode dari action=game_keys.
quantitynumberTidak1 sampai maxQuantity, bawaan 1.
expected_amountnumberTidakBatas total harga. Bila harga naik melewati ini, order ditolak 409 PRICE_CHANGED tanpa potong saldo.
ref_idstringTidakPencegah order ganda (sangat disarankan).

Status awal PROCESSING. Tunggu webhook atau cek action=status sampai SUCCESS. Isi key tidak pernah dikirim lewat webhook atau field serialNumber.

POST/api/reseller?action=reveal_keys
ParameterTipeWajibKeterangan
invoiceIdstringTidakInvoice transaksi game key yang dibuat lewat API.
ref_idstringTidakBoleh dipakai sebagai ganti invoiceId.
Contoh respon (key bersifat rahasia, jangan dicatat di log)
{
  "success": true,
  "data": {
    "invoiceId": "API-...", "productName": "Nama Game EN Steam CD Key",
    "keys": [
      { "id": "...", "name": "Nama Game", "contentType": "text/plain", "value": "XXXXX-XXXXX-XXXXX", "firstRevealedAt": null }
    ],
    "platform": "Steam", "regionName": "GLOBAL", "activation": "...", "account": null
  }
}

Key berjenis gambar memiliki contentType image/* dan value berupa data URL. Transaksi yang belum selesai ditolak 409. Key yang dibeli lewat website tetap dibuka di Dashboard โ†’ Key Saya.

๐Ÿ”Ž Cek status

GET/api/reseller?action=status

Berdasarkan invoiceId atau ref_id. Lakukan polling sampai status final.

GET /api/reseller?action=status&invoiceId=API20260101XXXXXX
GET /api/reseller?action=status&ref_id=TRX-0001

{
  "success": true,
  "data": {
    "invoiceId": "API20260101XXXXXX",
    "status": "SUCCESS",
    "serialNumber": "1234-5678-9012",
    "productName": "86 Diamonds",
    "targetId": "123456789",
    "price": 20000,
    "quantity": null,
    "message": null,
    "createdAt": "2026-01-01T00:00:00.000Z"
  }
}

๐Ÿ“ก Webhook

Daftarkan URL https di Dashboard โ†’ API Reseller dan aktifkan. Saat pesanan yang dibuat lewat API mencapai status akhir (SUCCESS, FAILED, REFUNDED) kami mengirim POST JSON ke URL Anda. Balas HTTP 2xx; selain itu dikirim ulang setelah 1, 5, 15, 60 menit dan 6 jam (maks 6 percobaan). Redirect tidak diikuti, batas waktu 10 detik. Satu status dikirim satu kali (gunakan invoiceId + status untuk idempotensi).

Header
Content-Type: application/json
X-MG-Event: transaction.updated        (atau "test" dari tombol uji)
X-MG-Delivery: <id pengiriman>
X-MG-Timestamp: 1767225600             (detik Unix)
X-MG-Signature: sha256=<hex HMAC_SHA256(webhook_secret, timestamp + "." + body_mentah)>
Body
{
  "event": "transaction.updated",
  "data": {
    "invoiceId": "API20260101XXXXXX", "refId": "TRX-0001", "status": "SUCCESS",
    "serialNumber": "1234-5678-9012", "productName": "86 Diamonds", "targetId": "123456789",
    "price": 20000, "quantity": null, "message": null, "createdAt": "2026-01-01T00:00:00.000Z"
  },
  "deliveryId": "<id pengiriman>",
  "sentAt": "2026-01-01T00:00:05.000Z"
}
Verifikasi (Node.js)
const ts = req.headers['x-mg-timestamp'];
const expected = 'sha256=' + crypto.createHmac('sha256', WEBHOOK_SECRET).update(ts + '.' + rawBody).digest('hex');
const given = req.headers['x-mg-signature'] || '';
const valid = given.length === expected.length && crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected));
if (!valid || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return res.status(401).end();

Webhook adalah pemberitahuan โ€” untuk kepastian, Anda tetap bisa memanggil action=status.

๐Ÿ“Š Status transaksi

PROCESSINGSedang diproses provider
SUCCESSBerhasil โ€” lihat serialNumber
REFUNDEDGagal, saldo sudah dikembalikan โ€” lihat message
FAILEDGagal (jarang; hubungi admin bila saldo belum kembali)

โš ๏ธ Kode error

{ "success": false, "message": "Deskripsi error" }

400  Parameter tidak valid (mis. quantity di luar min/max)
401  API Key tidak ada / tidak valid
402  Saldo tidak mencukupi
403  Bukan akun reseller, whitelist IP kosong, atau IP tidak di whitelist
404  Produk / transaksi / tagihan tidak ditemukan
405  Order / inquiry harus POST
409  Stok habis / produk tidak bisa dibeli / tagihan sudah diproses / harga game key berubah (PRICE_CHANGED)
410  Data tagihan kedaluwarsa โ€” inquiry ulang
422  Tagihan tidak ditemukan di biller, atau akun game tidak ditemukan (order + check_account)
429  Terlalu banyak request / cek tagihan
502  Server pengecekan akun sibuk (check_account) โ€” coba lagi
503  Produk sedang tidak tersedia di provider, atau maintenance
500  Kesalahan server

โฑ๏ธ Rate limit & tips

  • Request dibatasi per IP; cek tagihan dibatasi 10 kali per 5 menit per akun.
  • Gunakan ref_id di setiap order dan polling status secukupnya (mis. tiap 10โ€“30 detik; sosmed cukup tiap beberapa menit).
  • Ambil ulang services secara berkala โ€” harga & min/max sosmed mengikuti provider.
  • Game key per menit per akun: katalog 60, order 20, ambil key 10.

๐Ÿ“ Perubahan

  • 2026-11-10 โ€” whitelist IP kini wajib untuk semua action; game key: action=game_keys,type=game_key di order, action=reveal_keys.
  • 2026-10-30 โ€” action=check_account & check_account di order; webhook status bertanda tangan; whitelist IP bisa diatur sendiri; API key disimpan sebagai hash (tampil sekali); code di services kini kode produk MakerGames (unik) โ€” kode lama tetap diterima bila tidak ambigu; quantity sosmed bebas di antara minโ€“max (step = 1).
  • 2026-10-29 โ€” produk sosmed (parameter quantity, note) dan pascabayar (action=inquiry, inquiryId); parameter type di services; field quantity & customerName di respon transaksi.
  • 2026-10-26 โ€” order dikirim langsung ke provider dengan refund otomatis; ref_id sebagai pencegah order ganda.