Averpay

Dokumentasi API

Panduan lengkap integrasi API pembayaran untuk platform atau aplikasi kamu.

A. Persiapan

Langkah pertama yang harus kamu lakukan adalah mendaftar dan login ke dashboard. Setelah itu, dapatkan API Key kamu di menu Profil untuk mulai mengintegrasikan sistem pembayaran ke aplikasi kamu.

📘 Panduan Cepat untuk Pemula

Belum pernah pakai API sebelumnya? Tenang, semua endpoint di dokumentasi ini pakai method GET — jadi bisa langsung dicoba lewat browser dengan cara paste URL-nya, tidak wajib nulis kode dulu. Beberapa hal penting yang perlu kamu tahu:

  • Base URL = alamat website kamu sendiri (otomatis muncul di tiap contoh kode di bawah, ganti BASE_URL kalau kamu salin manual).
  • API Key = "kunci" biar sistem tahu itu kamu. Ambil di menu Profil, lalu tempel di parameter apikey pada setiap request. Jangan pernah share API Key ke orang lain, siapa saja yang pegang API Key kamu bisa transaksi pakai saldo kamu.
  • Semua parameter dikirim lewat URL (query string), contoh: ?apikey=XXXX&amount=50000.
  • Format respons sukses biasanya: { "success": true, "data": {...} }
  • Format respons gagal biasanya: { "success": false, "error": "pesan errornya" } — selalu cek dulu field success/error sebelum lanjut proses data-nya.
  • Beberapa fitur (Nokos, Beli Panel, Aplikasi Premium) punya beberapa langkah berurutan (mis. pilih layanan → pilih negara → beli, atau pilih produk → beli → cek status), jadi endpoint-nya harus dipanggil satu-satu sesuai urutan, bukan sekali panggil langsung jadi.
  • Tiap contoh kode di bawah ada pilihan bahasa (Node.js / Python / cURL / PHP) — klik tab-nya buat lihat versi yang kamu pakai. Kalau baru belajar, cURL paling gampang dicoba langsung dari terminal/CMD tanpa install apa-apa.

Kalau masih bingung, bisa hubungi CS Bantuan di dashboard buat ditemenin nyoba step-by-step.

B. Cek Saldo (Balance)

  • Method: GET
  • URL: /api/balance

Parameter:

  • apikey (string, wajib)

Contoh Request:

const axios = require('axios');
axios.get('BASE_URL/api/balance?apikey=YOUR_API_KEY')
  .then(response => console.log(response.data));

/*
Contoh response:
{
  "username": "your_username", 
  "email": "name@gmail.com", 
  "balance": 150000
}
*/

C. Membuat Invoice

  • Method: GET
  • URL: /api/invoice

Parameter:

  • apikey (string, wajib)
  • amount (integer, wajib)

Contoh Request:

const axios = require('axios');
axios.get('BASE_URL/api/invoice?apikey=YOUR_API_KEY&amount=50000')
  .then(response => console.log(response.data));

/*
Contoh response:
{
  "success": true,
  "invoice_id": "64c8d9e...",
  "amount": 50000,
  "fee": 500,
  "total": 50500,
  "qris_image": "https://...",
  "payment_link": "https://...", 
  "expired_at": "2025-01-01 12:00:00"
}
*/

D. Cek Status Invoice

  • Method: GET
  • URL: /api/invoice/status

Parameter:

  • apikey (string, wajib)
  • invoice_id (string, wajib)

Contoh Request:

const axios = require('axios');
axios.get('BASE_URL/api/invoice/status?apikey=YOUR_API_KEY&invoice_id=YOUR_INVOICE_ID')
  .then(response => console.log(response.data));

/*
Contoh response:
{
  "invoice_id": "64c8d9e...",
  "amount": 50000,
  "fee": 500,
  "total": 50500,
  "status": "paid",
  "qris_image": "https://...",
  "payment_link": "https://...",   
  "expired_at": "2025-01-01 12:00:00",
  "created_at": "2025-01-01 11:30:00"
}
*/

E. Lihat Metode Withdraw

  • Method: GET
  • URL: /api/withdraw/methods

Parameter:

  • apikey (string, wajib)

Contoh Request:

const axios = require('axios');
axios.get('BASE_URL/api/withdraw/methods?apikey=YOUR_API_KEY')
  .then(response => console.log(response.data));

/*
Contoh response:
{
  "manual_methods": [
    {
      "name": "Dana",
      "method": "dana",      
      "fee": 100,
      "min": 10000,
      "max": 1000000
    }
  ],
  "instant_methods": [
    {
      "name": "Dana",
      "method": "dana",
      "fee": 100,
      "min": 10000,
      "max": 1000000
    }
  ]
}
*/

F. Melakukan Withdraw

  • Method: GET
  • URL: /api/withdraw

Parameter:

  • apikey (string, wajib)
  • amount (integer, wajib)
  • method (string, wajib)
  • account_number (string, wajib)
  • instant (boolean, opsional, default false)

Contoh Request Manual:

const axios = require('axios');
axios.get('BASE_URL/api/withdraw?apikey=YOUR_API_KEY&amount=50000&method=dana&account_number=08123456789&instant=false')
  .then(response => console.log(response.data));

/*
Contoh response sukses (manual):
{
  "success": true,
  "message": "Permintaan penarikan berhasil diajukan.",
  "data": {
    "id": "WDc4e3f2a1b2c3",
    "amount": 50000,
    "fee": 1000,
    "method": "Dana",
    "account_number": "08123456789",
    "status": "pending",
    "created_at": "2025-01-01T12:00:00.000Z"
  }
}
*/

Contoh Request Instan:

const axios = require('axios');
axios.get('BASE_URL/api/withdraw?apikey=YOUR_API_KEY&amount=20000&method=gopay&account_number=08129876543&instant=true')
  .then(response => console.log(response.data));

/*
Contoh response sukses (instant):
{
  "success": true,
  "message": "Permintaan withdraw instan sedang diproses.",
  "data": {
    "id": "WDf3a1b2c3d4e5",
    "amount": 20000,
    "fee": 2000,
    "method": "GoPay",
    "account_number": "08129876543",
    "status": "pending",
    "created_at": "2025-01-01T12:05:00.000Z"
  }
}
*/

G. Cek Status Withdraw

  • Method: GET
  • URL: /api/withdraw/status

Parameter:

  • apikey (string, wajib)
  • id (string, wajib) – ID withdraw

Contoh Request:

const axios = require('axios');
axios.get('BASE_URL/api/withdraw/status?apikey=YOUR_API_KEY&id=WDc4e3f2a1b2c3')
  .then(response => console.log(response.data));

/*
Contoh response:
{
  "id": "WDc4e3f2a1b2c3",
  "amount": 50000,
  "fee": 1000,
  "method": "Dana",
  "account_number": "08123456789",
  "instant": false,
  "status": "success",
  "admin_note": null,
  "created_at": "2025-01-01T12:00:00.000Z",
  "completed_at": "2025-01-01T12:30:00.000Z"
}
*/

H. Nokos — Sewa Nomor Virtual OTP

Fitur Nokos memungkinkan kamu menyewa nomor virtual untuk menerima kode OTP secara programatik. Saldo akun otomatis terpotong sesuai harga (sudah termasuk markup) saat pesanan dibuat. Alur pemakaiannya mengikuti wizard di halaman /nokos: pilih aplikasi/layanan dulu, baru pilih negara, lalu pilih harga, baru buat pesanan.

1. Daftar Layanan / Platform (pilih aplikasi dulu)

  • Method: GET
  • URL: /api/nokos/services

Parameter:

  • apikey (string, wajib)
  • country_id (integer, opsional) — filter layanan tersedia untuk negara tertentu, kalau sudah tahu negaranya

Mengembalikan semua platform (WhatsApp, Telegram, Instagram, dll) beserta id (platform_id). Panggil endpoint ini pertama kali (tanpa country_id) supaya pengguna bisa pilih aplikasi dulu, sama seperti Step 1 di halaman /nokos.

2. Daftar Negara (setelah aplikasi dipilih)

  • Method: GET
  • URL: /api/nokos/countries

3. Daftar Produk / Harga (per Layanan & Negara)

  • Method: GET
  • URL: /api/nokos/products

Parameter:

  • apikey (string, wajib)
  • country_id (integer, wajib) — didapat dari endpoint Daftar Negara
  • platform_id (integer, sangat disarankan) — dari endpoint Daftar Layanan (misal WhatsApp = id 3), supaya harga yang ditampilkan sesuai aplikasi yang dipilih

4. Buat Pesanan (Beli Nomor)

  • Method: GET
  • URL: /api/nokos/order

Parameter:

  • apikey (string, wajib)
  • product_id (integer, wajib) — didapat dari endpoint Daftar Produk
  • country_id (integer, wajib)
  • platform_id (integer, sangat disarankan) — sama seperti yang dipakai di endpoint Daftar Produk, supaya sistem bisa memastikan produk terpilih benar-benar ditemukan dan tidak salah dianggap habis

5. Cek Status Pesanan / OTP

  • Method: GET
  • URL: /api/nokos/status

Parameter:

  • apikey (string, wajib)
  • id (string, wajib) — ID transaksi Nokos yang dikembalikan endpoint Buat Pesanan

Contoh Alur (Node.js):

const axios = require('axios');
const BASE = 'BASE_URL';
const apikey = 'YOUR_API_KEY';

// 1. Pilih aplikasi/layanan dulu (WhatsApp, Telegram, dll) — tanpa filter negara
const { data: services } = await axios.get(`${BASE}/api/nokos/services?apikey=${apikey}`);
const service = services.data.find(s => s.name === 'WhatsApp'); // atau pilih index 0
const platformId = service.id; // misal: 3

// 2. Baru pilih negara
const { data: countries } = await axios.get(`${BASE}/api/nokos/countries?apikey=${apikey}`);
const countryId = countries.data[0].id; // misal: 6 (Indonesia)

// 3. Ambil semua pilihan harga untuk aplikasi + negara tersebut, lalu tampilkan ke user
const { data: products } = await axios.get(`${BASE}/api/nokos/products?apikey=${apikey}&country_id=${countryId}&platform_id=${platformId}`);
console.log(products.data); // tampilkan tiap item sebagai opsi harga

// 4. Setelah user memilih salah satu harga, baru beli nomor (saldo otomatis terpotong)
const chosenProductId = products.data[0].id; // ganti dengan pilihan user
const { data: order } = await axios.get(`${BASE}/api/nokos/order?apikey=${apikey}&product_id=${chosenProductId}&country_id=${countryId}&platform_id=${platformId}`);
console.log(order.data.phoneNumber, order.data._id);

// 5. Polling status sampai OTP masuk & status jadi COMPLETED
const check = async () => {
  const { data: status } = await axios.get(`${BASE}/api/nokos/status?apikey=${apikey}&id=${order.data._id}`);
  console.log(status.data.status, status.data.otpCode);
  if (!['COMPLETED','CANCELED','EXPIRED'].includes(status.data.status)) setTimeout(check, 5000);
};
check();

Contoh Response — Buat Pesanan:

{
  "success": true,
  "data": {
    "_id": "NOKOSa1b2c3d4",
    "phoneNumber": "+6281234567890",
    "productName": "WhatsApp Indonesia",
    "sellPrice": 18000,
    "status": "ACTIVE",
    "expiresAt": "2026-09-17T10:20:00.000Z"
  }
}

Contoh Response — Cek Status (setelah OTP masuk):

{
  "success": true,
  "data": {
    "_id": "NOKOSa1b2c3d4",
    "phoneNumber": "+6281234567890",
    "status": "COMPLETED",
    "otpCode": "123456",
    "otpMessage": "Kode verifikasi WhatsApp kamu: 123456",
    "otpReceivedAt": "2026-09-17T10:05:00.000Z"
  }
}

Gacha Nokos — Nomor Virtual Acak Terkunci

Dokumentasi endpoint ini terkunci. Silakan daftar & dapatkan akses lewat halaman /gacha-nokos dulu — begitu akun kamu disetujui (ACC admin / otomatis / setelah bayar, tergantung mode pendaftaran yang aktif), dokumentasi lengkapnya otomatis terbuka di sini.

Fix No / Unban WA Terkunci

Dokumentasi endpoint ini terkunci. Buka akses fitur Fix No/Unban WA dulu lewat halaman /fix-no — begitu akses terbuka, dokumentasi lengkapnya otomatis muncul di sini.

I. Pterodactyl — Beli Panel Hosting Otomatis

Fitur ini menjual akses panel hosting (Pterodactyl) secara otomatis. Admin mengatur server panel (domain + API key) dan paket (RAM/Disk/CPU/Harga) di menu Admin → Pterodactyl. User beli paket pakai saldo; sistem otomatis membuatkan akun & server di panel (username, password, email), dan transaksinya tersimpan di database. Alur pemakaian: pilih server → pilih paket → beli → cek status/riwayat. Setiap transaksi juga punya garansi kalau akun/server ternyata hilang.

1. Daftar Server Panel

  • Method: GET
  • URL: /api/pterodactyl/panels

2. Daftar Paket

  • Method: GET
  • URL: /api/pterodactyl/packages

Parameter:

  • apikey (string, wajib)
  • panel_id (opsional) — filter paket milik satu server panel

3. Daftar Egg (Pilihan Egg) (opsional)

Mengambil daftar egg (tipe software, mis. Node.js, Python, dll) yang tersedia di Nest server panel tersebut. Nest mengikuti pengaturan admin: kalau paket punya Nest khusus dipakai Nest paket, kalau tidak dipakai Nest default server panel. Pakai id egg dari hasil endpoint ini sebagai egg_id di endpoint Beli Panel.

  • Method: GET
  • URL: /api/pterodactyl/eggs

Parameter:

  • apikey (string, wajib)
  • panel_id (wajib) — dari endpoint Daftar Server Panel
  • package_id (opsional) — dari endpoint Daftar Paket. Kirim kalau mau daftar egg mengikuti Nest & egg default paket tersebut

Contoh Request (cURL):

curl -s 'BASE_URL/api/pterodactyl/eggs?apikey=YOUR_API_KEY&panel_id=650f1a2b3c4d5e6f7a8b9c0d&package_id=650f1a2b3c4d5e6f7a8b9c0e'

Contoh Response:

{
  "success": true,
  "data": {
    "panel_id": "650f1a2b3c4d5e6f7a8b9c0d",
    "package_id": "650f1a2b3c4d5e6f7a8b9c0e",
    "nest_id": 5,
    "default_egg_id": 15,
    "eggs": [
      { "id": 15, "name": "Nodejs Generic", "is_default": true },
      { "id": 16, "name": "Python Generic", "is_default": false }
    ]
  }
}
  • nest_id — Nest yang dipakai (Nest paket kalau diset, kalau tidak Nest default server panel)
  • default_egg_id — egg default yang dipakai kalau egg_id tidak dikirim di Beli Panel
  • eggs — semua egg di Nest tersebut (is_default = true untuk egg default)

4. Beli Panel

  • Method: GET
  • URL: /api/pterodactyl/order

Parameter:

  • apikey (string, wajib)
  • panel_id (wajib) — dari endpoint Daftar Server Panel
  • package_id (wajib) — dari endpoint Daftar Paket
  • username (wajib) — huruf/angka/underscore, 3-20 karakter
  • email (wajib) — email pemilik akun panel
  • password (opsional) — 8-32 karakter tanpa spasi. Kalau tidak dikirim, password dibuatkan otomatis (acak & aman) dan dikembalikan di response.
  • egg_id (opsional) — pilih tipe software/egg tertentu, ambil id-nya dari endpoint Daftar Egg (harus salah satu egg yang ada di Nest paket/server tersebut). Kalau tidak dikirim atau id-nya tidak valid, otomatis pakai egg default paket/server.

Saldo otomatis terpotong sesuai harga paket. Kalau pembuatan akun/server gagal, saldo otomatis dikembalikan.

5. Cek Status Transaksi

  • Method: GET
  • URL: /api/pterodactyl/status

Parameter:

  • apikey (string, wajib)
  • id (wajib) — ID transaksi dari endpoint Beli Panel

6. Klaim Garansi

  • Method: GET
  • URL: /api/pterodactyl/claim-warranty

Parameter:

  • apikey (string, wajib)
  • id (wajib) — ID transaksi

Sistem cek dulu apakah username transaksi masih ada di panel. Kalau masih ada, klaim ditolak (server dianggap masih normal). Kalau sudah tidak ada, akun & server dibuatkan ulang otomatis. Ditolak juga kalau jatah klaim habis atau garansi kedaluwarsa.

Contoh Alur (Node.js):

const axios = require('axios');
const BASE = 'BASE_URL';
const apikey = 'YOUR_API_KEY';

// 1. Pilih server panel
const { data: panels } = await axios.get(`${BASE}/api/pterodactyl/panels?apikey=${apikey}`);
const panelId = panels.data[0].id;

// 2. Ambil daftar paket untuk server tersebut
const { data: packages } = await axios.get(`${BASE}/api/pterodactyl/packages?apikey=${apikey}&panel_id=${panelId}`);
console.log(packages.data); // tampilkan tiap item sebagai opsi paket

// 3. (opsional) Pilih egg sesuai Nest paket
const chosenPackageId = packages.data[0].id;
const { data: eggRes } = await axios.get(`${BASE}/api/pterodactyl/eggs?apikey=${apikey}&panel_id=${panelId}&package_id=${chosenPackageId}`);
console.log(eggRes.data.eggs); // tampilkan tiap item sebagai opsi egg
const eggId = eggRes.data.eggs[0].id;

// 4. Beli paket yang dipilih (password & egg_id opsional — kosongkan kalau mau ikut default)
const { data: order } = await axios.get(`${BASE}/api/pterodactyl/order?apikey=${apikey}&panel_id=${panelId}&package_id=${chosenPackageId}&username=budi123&email=budi@gmail.com&password=RahasiaAman123!&egg_id=${eggId}`);
console.log(order.data.panelUsername, order.data.panelPassword);

// 5. (opsional) klaim garansi kalau akun/server ternyata hilang
const { data: claim } = await axios.get(`${BASE}/api/pterodactyl/claim-warranty?apikey=${apikey}&id=${order.data._id}`);
console.log(claim.data);

Contoh Response — Beli Panel:

{
  "success": true,
  "data": {
    "_id": "PTEROa1b2c3d4",
    "panelName": "Panel Node 1",
    "packageName": "Paket Bronze",
    "ram": 1024, "disk": 2048, "cpu": 50,
    "price": 15000,
    "panelUsername": "budi123ab12",
    "panelPassword": "Xy7dK2pqAa1!",
    "panelEmail": "budi@gmail.com",
    "status": "ACTIVE",
    "warrantyMaxClaims": 3,
    "warrantyClaimsUsed": 0,
    "warrantyExpiresAt": "2026-10-17T10:00:00.000Z"
  }
}

J. Aplikasi Premium — Beli Akun Premium Otomatis

Fitur ini menjual akun aplikasi premium (Capcut, Netflix, Alight Motion, dll) yang diambil realtime dari katalog produk pemasok. Saldo akun otomatis terpotong sesuai harga (sudah termasuk markup) saat pesanan dibuat, lalu akun (username/password) dikirim otomatis begitu transaksi selesai. Alur pemakaiannya: lihat daftar produk → buat pesanan → cek status sampai akun tersedia.

1. Daftar Produk / Harga

  • Method: GET
  • URL: /api/premium/products

Parameter:

  • apikey (string, wajib)

Mengembalikan seluruh produk yang berstatus tersedia lengkap dengan nama, deskripsi, gambar, stok realtime, dan harga (sudah termasuk markup admin).

2. Cek Stok Produk Spesifik (opsional)

  • Method: GET
  • URL: /api/premium/stock

Parameter:

  • apikey (string, wajib)
  • product_id (integer, wajib) — didapat dari endpoint Daftar Produk

3. Buat Pesanan (Beli Akun)

  • Method: GET
  • URL: /api/premium/order

Parameter:

  • apikey (string, wajib)
  • product_id (integer, wajib) — didapat dari endpoint Daftar Produk
  • qty (integer, opsional, default 1) — jumlah akun yang ingin dibeli sekaligus

4. Cek Status Pesanan / Ambil Akun

  • Method: GET
  • URL: /api/premium/status

Parameter:

  • apikey (string, wajib)
  • id (string, wajib) — ID transaksi Aplikasi Premium yang dikembalikan endpoint Buat Pesanan

Contoh Alur (Node.js):

const axios = require('axios');
const BASE = 'BASE_URL';
const apikey = 'YOUR_API_KEY';

// 1. Ambil daftar produk yang tersedia
const { data: products } = await axios.get(`${BASE}/api/premium/products?apikey=${apikey}`);
console.log(products.data); // tampilkan tiap item sebagai pilihan produk

// 2. Setelah user memilih produk, buat pesanan (saldo otomatis terpotong)
const chosenProductId = products.data[0].id; // ganti dengan pilihan user
const { data: order } = await axios.get(`${BASE}/api/premium/order?apikey=${apikey}&product_id=${chosenProductId}&qty=1`);
console.log(order.data._id, order.data.premkuInvoice);

// 3. Polling status sampai akun tersedia (status jadi success)
const orderId = order.data._id;
const check = async () => {
  const { data: status } = await axios.get(`${BASE}/api/premium/status?apikey=${apikey}&id=${orderId}`);
  console.log(status.data.status, status.data.accounts);
  if (!['success','failed','canceled'].includes(status.data.status)) setTimeout(check, 5000);
};
check();

Contoh Response — Buat Pesanan:

{
  "success": true,
  "data": {
    "_id": "PREMa1b2c3d4",
    "premkuInvoice": "API-20260918194500-a1b2c3d4",
    "productName": "Capcut Pro 1 Bulan",
    "qty": 1,
    "sellPrice": 11500,
    "status": "pending"
  }
}

Contoh Response — Cek Status (setelah akun tersedia):

{
  "success": true,
  "data": {
    "_id": "PREMa1b2c3d4",
    "productName": "Capcut Pro 1 Bulan",
    "status": "success",
    "accounts": [
      { "username": "email@example.com", "password": "pass123" }
    ]
  }
}

K. Suntik Sosmed — Followers / Likes / Views Otomatis

Fitur ini menjual jasa penambah Followers, Likes, Views, Comment, Subscribe, dll untuk Instagram, TikTok, Facebook, YouTube, dan platform sosial media lainnya, diambil realtime dari katalog layanan pemasok. Saldo akun otomatis terpotong sesuai rate (sudah termasuk markup) saat pesanan dibuat. Alur pemakaiannya: lihat daftar layanan → buat pesanan → cek status sampai selesai → (opsional) ajukan refill kalau jumlahnya turun setelah selesai.

1. Daftar Layanan

  • Method: GET
  • URL: /api/sosmed/services

Parameter:

  • apikey (string, wajib)

Mengembalikan seluruh layanan lengkap dengan ID layanan, nama, kategori, batas min/max jumlah, harga per 1000 (sudah termasuk markup admin), dan apakah layanan mendukung refill.

2. Buat Pesanan

  • Method: GET
  • URL: /api/sosmed/order

Parameter:

  • apikey (string, wajib)
  • service_id (integer, wajib) — didapat dari endpoint Daftar Layanan
  • target (string, wajib) — link/username/ID target yang mau ditambah
  • quantity (integer, wajib) — harus di antara min/max layanan tersebut

3. Cek Status Pesanan

  • Method: GET
  • URL: /api/sosmed/status

Parameter:

  • apikey (string, wajib)
  • id (string, wajib) — ID transaksi Suntik Sosmed yang dikembalikan endpoint Buat Pesanan

4. Ajukan Refill (opsional, cuma untuk layanan yang mendukung refill)

  • Method: GET
  • URL: /api/sosmed/refill

Parameter:

  • apikey (string, wajib)
  • id (string, wajib) — ID transaksi Suntik Sosmed, hanya bisa diajukan kalau status pesanan sudah completed

5. Cek Status Refill

  • Method: GET
  • URL: /api/sosmed/refill/status

Parameter:

  • apikey (string, wajib)
  • id (string, wajib) — ID transaksi Suntik Sosmed (bukan ID refill) yang sudah pernah diajukan refill-nya

Contoh Alur (Node.js):

const axios = require('axios');
const BASE = 'BASE_URL';
const apikey = 'YOUR_API_KEY';

// 1. Ambil daftar layanan yang tersedia
const { data: services } = await axios.get(`${BASE}/api/sosmed/services?apikey=${apikey}`);
console.log(services.data); // tampilkan tiap item sebagai pilihan layanan

// 2. Setelah user pilih layanan + isi target & jumlah, buat pesanan (saldo otomatis terpotong)
const chosenServiceId = services.data[0].id; // ganti dengan pilihan user
const { data: order } = await axios.get(`${BASE}/api/sosmed/order?apikey=${apikey}&service_id=${chosenServiceId}&target=https://instagram.com/username&quantity=100`);
console.log(order.data._id, order.data.fayupediaOrderId);

// 3. Polling status sampai pesanan selesai
const orderId = order.data._id;
const checkStatus = async () => {
  const { data: status } = await axios.get(`${BASE}/api/sosmed/status?apikey=${apikey}&id=${orderId}`);
  console.log(status.data.status, status.data.remains);
  if (!['completed','canceled','failed'].includes(status.data.status)) setTimeout(checkStatus, 5000);
};
checkStatus();

// 4. (Opsional) Ajukan refill kalau jumlahnya turun setelah selesai
const { data: refill } = await axios.get(`${BASE}/api/sosmed/refill?apikey=${apikey}&id=${orderId}`);
console.log(refill.data.refillStatus);

// 5. (Opsional) Cek status refill
const { data: refillStatus } = await axios.get(`${BASE}/api/sosmed/refill/status?apikey=${apikey}&id=${orderId}`);
console.log(refillStatus.data.refillStatus);

Contoh Response — Buat Pesanan:

{
  "success": true,
  "data": {
    "_id": "SOSa1b2c3d4",
    "fayupediaOrderId": "123456",
    "serviceName": "Instagram Followers Indo [Real]",
    "target": "https://instagram.com/username",
    "quantity": 100,
    "sellPrice": 12000,
    "status": "pending",
    "canRefill": true
  }
}

Contoh Response — Cek Status (setelah selesai):

{
  "success": true,
  "data": {
    "_id": "SOSa1b2c3d4",
    "status": "completed",
    "startCount": 1520,
    "remains": 0
  }
}

L. Produk — Khusus Role Panel (Reseller / Admin Panel)

Endpoint di bagian ini berbeda dari endpoint API lainnya: hanya bisa dipakai oleh akun yang sudah membeli Role Panel di menu Role Panel dashboard — baik role reseller (Seller) maupun adminpanel (Admin Panel). Akun yang belum beli role panel apa pun (masih role user) akan mendapat respons 403. Produk adalah item digital yang diinput manual oleh admin (bukan produk API pihak ketiga), dibeli memakai saldo akun.

⚠️ Kalau role panel akun kamu belum aktif (belum pernah beli Reseller/Admin Panel, atau paketnya sudah kedaluwarsa), semua endpoint di bagian L dan M akan menolak request dengan error 403.

1. Daftar Produk

  • Method: GET
  • URL: /api/produk/list
  • Role: reseller atau adminpanel

Parameter:

  • apikey (string, wajib)

2. Beli Produk

  • Method: GET
  • URL: /api/produk/beli
  • Role: reseller atau adminpanel

Parameter:

  • apikey (string, wajib)
  • id (string, wajib) — ID produk, didapat dari endpoint Daftar Produk

Kalau harga produk 0, dianggap gratis (saldo tidak dipotong). Kalau harga > 0, saldo akan otomatis terpotong sesuai harga produk.

3. Cek Status / Detail Transaksi

  • Method: GET
  • URL: /api/produk/status
  • Role: reseller atau adminpanel

Parameter:

  • apikey (string, wajib)
  • id (string, wajib) — ID transaksi (order_id) dari endpoint Beli Produk

Contoh Response — Beli Produk:

{
  "success": true,
  "data": {
    "order_id": "PRDa1b2c3d4",
    "produk_name": "Nama Produk",
    "price": 15000,
    "group_link": null,
    "download_link": "https://..."
  }
}

Contoh Response — Ditolak (role panel belum aktif):

{
  "error": "Fitur ini khusus akun dengan role panel: reseller / adminpanel. Role panel kamu saat ini: user."
}

M. Panel Role — Reseller (Pilihan Egg & Add Server) & Admin Panel (Create Admin)

Endpoint di bagian ini membungkus fitur yang sama dengan menu Kelola Panel (Reseller) dan Admin Panel di dashboard, supaya bisa dipanggil lewat API. Sama seperti bagian L, endpoint ini baru aktif setelah akun membeli role panel yang sesuai. Kalau server offline atau data tidak valid, endpoint akan balas error dengan pesan yang sama seperti di dashboard.

1. Daftar Server Reseller Aktif

  • Method: GET
  • URL: /api/panel/servers
  • Role: reseller atau adminpanel

Parameter:

  • apikey (string, wajib)

Contoh Request (cURL):

curl 'BASE_URL/api/panel/servers?apikey=YOUR_API_KEY'

Contoh Response:

{
  "success": true,
  "data": [
    { "slot": 1, "name": "Server 1", "nestId": 5 },
    { "slot": 2, "name": "Server 2", "nestId": 5 }
  ]
}

2. Daftar Egg (Pilihan Egg) (role Reseller / Admin Panel)

Mengambil daftar egg (tipe software, mis. Node.js, Python, dll) yang tersedia di Nest pada server (slot) yang dipilih. Nest ID ditentukan oleh admin di pengaturan server reseller dan tidak bisa diubah dari API — jadi daftar yang kamu dapat selalu sesuai Nest yang sudah diset admin. Pakai id egg dari hasil endpoint ini sebagai egg_id di Add Server.

  • Method: GET
  • URL: /api/panel/eggs
  • Role: reseller atau adminpanel

Parameter (query):

  • apikey (string, wajib)
  • slot (integer, wajib) — 1, 2, atau 3, didapat dari endpoint Daftar Server

Contoh Request (cURL):

curl 'BASE_URL/api/panel/eggs?apikey=YOUR_API_KEY&slot=1'

Contoh Response:

{
  "success": true,
  "data": {
    "slot": 1,
    "server_name": "Server 1",
    "nest_id": 5,
    "default_egg_id": 15,
    "eggs": [
      { "id": 15, "name": "Nodejs Generic", "is_default": true },
      { "id": 16, "name": "Python Generic", "is_default": false }
    ]
  }
}
  • nest_id — Nest yang diset admin untuk server ini
  • default_egg_id — egg default yang dipakai kalau egg_id tidak dikirim di Add Server
  • eggs — semua egg yang ada di Nest tersebut (is_default = true untuk egg default)

3. Add Server (role Reseller / Admin Panel)

Menambah server baru ke akun panel (Pterodactyl) yang sudah pernah dibuat akun ini sebelumnya lewat fitur Create Panel, di server (slot) yang sama. account_id wajib sudah tercatat di riwayat panel akun ini sendiri — ini untuk mencegah penambahan server ke akun milik orang lain.

  • Method: POST
  • URL: /api/panel/add-server
  • Role: reseller atau adminpanel

Parameter (body atau query):

  • apikey (string, wajib)
  • slot (integer, wajib) — 1, 2, atau 3, didapat dari endpoint Daftar Server
  • account_id (integer, wajib) — ID akun panel (Pterodactyl user ID) yang sudah dibuat sebelumnya via Create Panel
  • ram (string, wajib) — angka 1-10 (GB) atau unlimited
  • egg_id (integer, opsional) — id egg dari endpoint Daftar Egg. Harus salah satu egg yang ada di Nest server tersebut (sesuai Nest ID yang diset admin). Kalau kosong atau id-nya tidak ada di Nest, otomatis pakai egg default server.

Contoh Request (cURL):

curl -X POST 'BASE_URL/api/panel/add-server' \
  -d 'apikey=YOUR_API_KEY' \
  -d 'slot=1' \
  -d 'account_id=12' \
  -d 'ram=4' \
  -d 'egg_id=16'

Contoh Response:

{
  "success": true,
  "data": {
    "domain": "panel.contoh.com",
    "server_name": "Server 1",
    "account_id": 12,
    "username": "reselleruser",
    "email": "reselleruser@gmail.com",
    "server_id": 45,
    "server_identifier": "a1b2c3d4",
    "ram": "4 GB",
    "egg_id": 16
  }
}

4. Create Admin (khusus role Admin Panel — dibatasi 1x per akun)

⚠️ Setiap akun dengan role adminpanel hanya boleh membuat SATU akun Admin (root_admin) seumur hidup akunnya — sama seperti batas di menu Admin Panel pada dashboard. Kalau sudah pernah berhasil dibuat, endpoint ini akan balas error 400 (jatah habis), bukan membuat akun baru. Kalau proses gagal di tengah jalan, jatah tidak terpakai dan kamu boleh coba lagi.

  • Method: POST
  • URL: /api/panel/create-admin
  • Role: adminpanel

Parameter (body atau query):

  • apikey (string, wajib)
  • slot (integer, wajib) — server tujuan pembuatan akun Admin
  • username (string, wajib) — huruf, angka, underscore (3-20 karakter)
  • email (string, wajib)

Contoh Request (cURL):

curl -X POST 'BASE_URL/api/panel/create-admin' \
  -d 'apikey=YOUR_API_KEY' \
  -d 'slot=1' \
  -d 'username=adminbaru' \
  -d 'email=adminbaru@gmail.com'

Contoh Response:

{
  "success": true,
  "key_status": "ok",
  "data": {
    "domain": "panel.contoh.com",
    "username": "adminbaru",
    "email": "adminbaru@gmail.com",
    "password": "********",
    "ptla": "ptla_xxxxxxxx",
    "ptlc": "ptlc_xxxxxxxx",
    "key_error": null
  }
}

Contoh Response — Jatah Sudah Habis:

{
  "error": "Akun kamu sudah pernah membuat Admin Panel. Pembuatan hanya bisa 1x (jatah habis)."
}