๐ 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). orderdaninquirywajibPOST.- Semua nominal dalam Rupiah (bilangan bulat). Respon selalu berisi
success(boolean).
๐งฉ Jenis produk
| type | Harga | Cara order |
|---|---|---|
| prepaid | per item | order dengan productId + targetId |
| sosmed | per 1.000 (atau per paket) | order + quantity (bebas di antara minโmax dari services) |
| postpaid | tagihan + biaya layanan | inquiry โ order + inquiryId |
๐ค Profil & saldo
{
"success": true,
"data": { "username": "tokoku", "email": "[email protected]", "role": "RESELLER", "tier": "GOLD", "balance": 500000 }
}๐ฐ Riwayat deposit
Saldo dan 20 deposit terakhir.
{
"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
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.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| type | string | Tidak | prepaid (bawaan) ยท sosmed ยท postpaid ยท all. Tanpa type = hanya prabayar (kompatibel dengan integrasi lama). |
{
"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 }
]
}
]
}{
"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
}
]
}
]
}{
"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
Cek User ID (dan zone/server) sebelum order untuk layanan dengan "accountCheck": true. Tidak memotong saldo. Maks 30 cek per menit per akun.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| productId / product_code | string | Ya | Produk dari layanan game yang akan dibeli. |
| targetId | string | Ya | User ID game. |
| targetServer | string | Tidak | Zone / server ID bila layanan membutuhkannya. |
POST /api/reseller
{ "action": "check_account", "product_code": "dg-ml86-mvx1a2", "targetId": "123456789", "targetServer": "1234" }{ "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 lagiAtau kirim "check_account": true saat order: akun dicek dulu, bila tidak ditemukan order ditolak (HTTP 422) dan saldo tidak dipotong.
๐ Order prabayar
Saldo dipotong saat order diterima, lalu pesanan dikirim ke provider. Bila gagal, saldo otomatis dikembalikan (status REFUNDED).
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| productId | string | Ya | ID produk dari services (atau product_code = code). |
| targetId | string | Ya | User ID / nomor HP / email tujuan. |
| targetServer | string | Tidak | Zone / server ID bila layanan membutuhkannya. |
| ref_id | string | Tidak | ID unik dari sistem Anda (maks 64 karakter) โ sangat disarankan. |
| check_account | boolean | Tidak | true = cek akun game dulu; tidak ditemukan โ ditolak 422 tanpa potong saldo. |
POST /api/reseller?action=order
{
"productId": "product_id",
"targetId": "123456789",
"targetServer": "1234",
"ref_id": "TRX-0001",
"check_account": true
}{
"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
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.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| productId | string | Ya | ID produk sosmed. |
| targetId | string | Ya | Username (tanpa @) atau link profil/postingan, tanpa spasi, maks 200 karakter. |
| quantity | integer | Ya | Bilangan bulat antara min dan max (lihat services). Produk min = max boleh dikosongkan. |
| note | string | Tidak | Catatan untuk admin MakerGames (maks 300 karakter). Tidak dikirim ke provider. |
| ref_id | string | Tidak | ID unik dari sistem Anda. |
POST /api/reseller?action=order
{
"productId": "product_id",
"targetId": "https://instagram.com/akunku",
"quantity": 2000,
"ref_id": "SMM-0001"
}{
"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
Cek tagihan ke biller. Hasilnya berlaku 30 menit (dan tidak melewati pergantian hari WIB).
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| productId | string | Ya | ID produk pascabayar. |
| targetId | string | Ya | Nomor pelanggan / ID tagihan / kode bayar. |
| amount | integer | Tidak | Wajib untuk format EMONEY: nominal top up. |
| year | integer | Tidak | PBB: tahun pajak (opsional). |
| identityNo | string | Tidak | Wajib untuk format SAMSAT: NIK sesuai STNK. |
{
"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
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.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| productId | string | Ya | Sama dengan saat inquiry. |
| inquiryId | string | Ya | Dari respon inquiry. |
| ref_id | string | Tidak | ID unik dari sistem Anda. |
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.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| q | string | Tidak | Cari nama produk (minimal 2 karakter). |
| platform | string | Tidak | Saring platform, mis. Steam. |
| sort | string | Tidak | recommended ยท cheapest ยท expensive ยท newest ยท name |
| page | number | Tidak | Halaman, mulai 1. |
| per_page | number | Tidak | 1โ48, bawaan 24. |
{
"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 }
]
}| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| type | string | Ya | Isi game_key. |
| product_code | string | Ya | code dari action=game_keys. |
| quantity | number | Tidak | 1 sampai maxQuantity, bawaan 1. |
| expected_amount | number | Tidak | Batas total harga. Bila harga naik melewati ini, order ditolak 409 PRICE_CHANGED tanpa potong saldo. |
| ref_id | string | Tidak | Pencegah 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.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
| invoiceId | string | Tidak | Invoice transaksi game key yang dibuat lewat API. |
| ref_id | string | Tidak | Boleh dipakai sebagai ganti invoiceId. |
{
"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
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).
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)>
{
"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"
}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
โ ๏ธ 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_iddi setiap order dan polling status secukupnya (mis. tiap 10โ30 detik; sosmed cukup tiap beberapa menit). - Ambil ulang
servicessecara 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_keydi order,action=reveal_keys. - 2026-10-30 โ
action=check_account&check_accountdi order; webhook status bertanda tangan; whitelist IP bisa diatur sendiri; API key disimpan sebagai hash (tampil sekali);codedi 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); parametertypedi services; fieldquantity&customerNamedi respon transaksi. - 2026-10-26 โ order dikirim langsung ke provider dengan refund otomatis;
ref_idsebagai pencegah order ganda.