API Key Anda

Sertakan di setiap request. Jangan bagikan ke siapapun.

Login untuk melihat API Key Anda

Base URL

https://yourdomain.com/api/v1
Semua endpoint menggunakan prefix /api/v1. Semua response JSON dengan field success: true/false.

Autentikasi

Semua endpoint memerlukan header X-API-Key. API key didapat dari halaman dashboard.

Contoh penggunaan (curl)
curl -X GET "https://yourdomain.com/api/v1/countries" \
    -H "X-API-Key: vn_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
HeaderKeterangan
X-API-KeywajibAPI Key dari halaman dashboard Anda
Content-TypeGunakan application/json untuk POST dengan body JSON

Rate Limit

Batas 60 request/menit per API key. Melebihi batas โ†’ HTTP 429. Saat polling OTP gunakan interval minimal 3 detik.

Katalog

GET /api/v1/countries Daftar semua negara aktif

Mengambil daftar semua negara yang tersedia. Gunakan id sebagai country_id di endpoint lain.

Request
curl "https://yourdomain.com/api/v1/countries" \
    -H "X-API-Key: vn_xxxx"
Response 200
{
    "success": true,
    "data": [
      { "id": 6,  "code": "ID", "name": "Indonesia",      "dial_code": "+62", "emoji": "๐Ÿ‡ฎ๐Ÿ‡ฉ" },
      { "id": 1,  "code": "US", "name": "United States",  "dial_code": "+1",  "emoji": "๐Ÿ‡บ๐Ÿ‡ธ" }
    ]
  }
GET /api/v1/services Layanan per negara

Platform/aplikasi tersedia untuk negara tertentu (WhatsApp, Telegram, dll).

ParameterTipeKeterangan
country_idwajibintegerID dari /countries
Request
curl "https://yourdomain.com/api/v1/services?country_id=6" \
    -H "X-API-Key: vn_xxxx"
Response 200
{
    "success": true,
    "data": [
      { "id": 1, "name": "WhatsApp",  "icon": "https://..." },
      { "id": 2, "name": "Telegram",  "icon": "https://..." },
      { "id": 3, "name": "Instagram", "icon": "https://..." }
    ]
  }
GET /api/v1/products Daftar produk & stok

Produk nomor virtual tersedia beserta stok dan harga. Gunakan id saat membuat order.

ParameterTipeKeterangan
country_idwajibintegerID negara
platform_idwajibintegerID layanan
pageopsionalintegerDefault: 1
limitopsionalintegerDefault: 50, maks: 100
Request
curl "https://yourdomain.com/api/v1/products?country_id=6&platform_id=1" \
    -H "X-API-Key: vn_xxxx"
Response 200
{
    "success": true,
    "data": [
      {
        "id": 142,
        "name": "WhatsApp Indonesia",
        "available": 42,
        "price": 16500
      }
    ],
    "meta": { "page": 1, "limit": 50, "total": 1 }
  }

Order

POST /api/v1/orders Buat order baru

Membuat order nomor virtual baru. Saldo dipotong otomatis. Setelah dibuat, polling /orders/:id untuk menunggu OTP.

Body (JSON)TipeKeterangan
product_idwajibintegerID produk dari /products
Request
curl -X POST "https://yourdomain.com/api/v1/orders" \
    -H "X-API-Key: vn_xxxx" \
    -H "Content-Type: application/json" \
    -d '{"product_id": 142}'
Response 200
{
    "success": true,
    "data": {
      "id": "ord-abc123",
      "phoneNumber": "+628123456789",
      "productName": "WhatsApp Indonesia",
      "price": 16500,
      "status": "ACTIVE",
      "otpCode": null,
      "expiresAt": "2024-01-15T10:30:00.000Z",
      "createdAt": "2024-01-15T10:00:00.000Z"
    }
  }
GET /api/v1/orders Daftar order saya
ParameterTipeKeterangan
statusopsionalstringACTIVE ยท OTP_RECEIVED ยท COMPLETED ยท CANCELED
pageopsionalintegerDefault: 1
limitopsionalintegerDefault: 20
Request
curl "https://yourdomain.com/api/v1/orders?status=ACTIVE" \
    -H "X-API-Key: vn_xxxx"
Response 200
{
    "success": true,
    "data": [
      {
        "id": "ord-abc123",
        "status": "ACTIVE",
        "phoneNumber": "+628123456789",
        "productName": "WhatsApp Indonesia",
        "price": 16500,
        "otpCode": null,
        "createdAt": "2024-01-15T10:00:00.000Z"
      }
    ],
    "meta": { "page": 1, "limit": 20, "total": 3 }
  }
GET /api/v1/orders/:id Detail & cek OTP
Alur polling OTP: Buat order โ†’ poll endpoint ini tiap 3โ€“5 detik โ†’ saat status = "OTP_RECEIVED" โ†’ baca otpCode.
Request
curl "https://yourdomain.com/api/v1/orders/ord-abc123" \
    -H "X-API-Key: vn_xxxx"
Response โ€” Menunggu OTP
{
    "success": true,
    "data": {
      "id": "ord-abc123",
      "status": "ACTIVE",
      "phoneNumber": "+628123456789",
      "otpCode": null,
      "expiresAt": "2024-01-15T10:30:00.000Z"
    }
  }
Response โ€” OTP Diterima โœ“
{
    "success": true,
    "data": {
      "id": "ord-abc123",
      "status": "OTP_RECEIVED",
      "phoneNumber": "+628123456789",
      "otpCode": "123456",
      "expiresAt": "2024-01-15T10:30:00.000Z"
    }
  }
POST /api/v1/orders/:id/cancel Batalkan order

Batalkan order berstatus ACTIVE. Tidak ada request body.

Request
curl -X POST "https://yourdomain.com/api/v1/orders/ord-abc123/cancel" \
    -H "X-API-Key: vn_xxxx"
Response 200
{ "success": true, "data": { "id": "ord-abc123", "status": "CANCELED" } }

Deposit

POST /api/v1/deposit Buat deposit QRIS

Buat transaksi deposit baru, mendapat QRIS untuk dibayar. Poll /deposit/:id/check untuk cek status.

Body (JSON)TipeKeterangan
amountwajibintegerNominal Rupiah. Min: Rp 10.000
Request
curl -X POST "https://yourdomain.com/api/v1/deposit" \
    -H "X-API-Key: vn_xxxx" \
    -H "Content-Type: application/json" \
    -d '{"amount": 50000}'
Response 200
{
    "success": true,
    "data": {
      "id": "dep-xyz789",
      "amount": 50000,
      "totalAmount": 51500,
      "qrisImage": "https://payqris.web.id/qr/...",
      "status": "PENDING",
      "expiredAt": "2024-01-15T10:15:00.000Z"
    }
  }
GET /api/v1/deposit/:id/check Cek status bayar

Poll tiap 5 detik. Status SUCCESS โ†’ saldo otomatis ditambahkan.

Request
curl "https://yourdomain.com/api/v1/deposit/dep-xyz789/check" \
    -H "X-API-Key: vn_xxxx"
Response 200
{
    "success": true,
    "data": {
      "id": "dep-xyz789",
      "status": "SUCCESS",
      "amount": 50000,
      "paidAt": "2024-01-15T10:05:23.000Z"
    }
  }
POST /api/v1/deposit/:id/cancel Batalkan deposit

Batalkan deposit berstatus PENDING. Tidak ada body.

Request
curl -X POST "https://yourdomain.com/api/v1/deposit/dep-xyz789/cancel" \
    -H "X-API-Key: vn_xxxx"
Response 200
{ "success": true }

Status

Order
StatusKeterangan
ACTIVEOrder aktif, menunggu OTP
OTP_RECEIVEDOTP diterima โ€” baca field otpCode
COMPLETEDOrder selesai
CANCELEDDibatalkan oleh user
EXPIREDKedaluwarsa sebelum OTP masuk
Deposit
StatusKeterangan
PENDINGMenunggu pembayaran QRIS
SUCCESSBayar berhasil, saldo ditambahkan
FAILEDPembayaran gagal
EXPIREDQRIS kedaluwarsa tanpa dibayar

Error

Format error standar
{
    "success": false,
    "error": "INSUFFICIENT_BALANCE",
    "message": "Saldo tidak mencukupi"
  }
HTTPError CodeKeterangan
401MISSING_API_KEYHeader X-API-Key tidak ada
401INVALID_API_KEYAPI Key tidak valid
400INSUFFICIENT_BALANCESaldo tidak cukup
400INVALID_AMOUNTNominal tidak valid / di bawah minimum
400INVALID_PRODUCTProduk tidak ada atau stok habis
400INVALID_STATUSAksi tidak bisa dilakukan pada status ini
404NOT_FOUNDData tidak ditemukan
429RATE_LIMITEDTerlalu banyak request
500API_ERRORKesalahan server atau provider