API Documentation
http://tes.sannxyz.my.id/api/v1
Autentikasi: Sertakan API key di setiap request via header.
X-API-Key: nk_xxxxxxxxxxxxxxxx
atau via query: ?api_key=nk_xxx
GET http://tes.sannxyz.my.id/api/v1/balance

Mendapatkan informasi saldo dan profil akun.

Endpoint
Method GET
URL /api/v1/balance
Response JSON
Contoh Response
{
  "success": true,
  "message": "OK",
  "data": {
    "balance": 50000,
    "balance_idr": "Rp 50.000",
    "name": "John Doe",
    "email": "john@example.com"
  }
}
GET http://tes.sannxyz.my.id/api/v1/services

Mendapatkan semua layanan OTP aktif beserta harga. Gunakan ?search= untuk filter nama layanan.

Endpoint
Method GET
URL /api/v1/services
Response JSON
Parameter
search string Opsional Filter nama layanan, contoh: ?search=whatsapp
Contoh Response
{
  "success": true,
  "message": "OK",
  "data": [
    {
      "service_id": "whatsapp",
      "name": "WhatsApp",
      "country": "id",
      "operator": "any",
      "price": 600,
      "price_idr": "Rp 600"
    }
  ]
}
GET http://tes.sannxyz.my.id/api/v1/order/create

Membuat order OTP baru via query string. Saldo dipotong otomatis sesuai harga layanan.

Endpoint
Method GET
URL /api/v1/order/create
Response JSON
Parameter
service_id string Wajib service_id dari Daftar Layanan, contoh: whatsapp
number_id string Wajib ID nomor yang tersedia dari RumahOTP
provider_id string Wajib ID provider dari RumahOTP
country string Opsional Kode negara (default: id)
Contoh Response
{
  "success": true,
  "message": "Order berhasil dibuat.",
  "data": {
    "order_code": "OTP-1234567890-ABCDE",
    "rumahotp_order_id": "ro_xxxxxxxxxxxx",
    "service_id": "whatsapp",
    "service_name": "WhatsApp",
    "phone_number": "+62878xxxxxxxx",
    "country": "id",
    "status": "pending",
    "amount": 600,
    "expires_at": "2026-06-05T10:30:00+07:00"
  }
}
GET http://tes.sannxyz.my.id/api/v1/order/status

Mengecek status order langsung ke RumahOTP. Cocok untuk polling OTP secara realtime.

Endpoint
Method GET
URL /api/v1/order/status
Response JSON
Parameter
order_code string Opsional order_code dari sistem (contoh: OTP-1234567890-ABCDE)
rumahotp_id string Opsional rumahotp_order_id jika sudah diketahui
Contoh Response
{
  "success": true,
  "message": "OK",
  "data": {
    "order_code": "OTP-1234567890-ABCDE",
    "rumahotp_order_id": "ro_xxxxxxxxxxxx",
    "local_status": "pending",
    "otp_code": null,
    "sms_code": null,
    "rumahotp_response": {}
  }
}
GET http://tes.sannxyz.my.id/api/v1/order/{code}

Mendapatkan detail lengkap satu order berdasarkan order_code atau ID.

Endpoint
Method GET
URL /api/v1/order/{code}
Response JSON
Parameter
{code} string Wajib order_code atau ID order (di URL path, bukan query)
Contoh Response
{
  "success": true,
  "message": "OK",
  "data": {
    "id": 1,
    "order_code": "OTP-1234567890-ABCDE",
    "rumahotp_order_id": "ro_xxxxxxxxxxxx",
    "service_id": "whatsapp",
    "service_name": "WhatsApp",
    "phone_number": "+62878xxxxxxxx",
    "country": "id",
    "status": "success",
    "otp_code": "123456",
    "sms_code": null,
    "sms_text": "Your WhatsApp code is 123456",
    "amount": 600,
    "expires_at": "2026-06-05T10:30:00+07:00",
    "created_at": "2026-06-05T10:00:00+07:00",
    "updated_at": "2026-06-05T10:05:00+07:00"
  }
}
GET http://tes.sannxyz.my.id/api/v1/order/cancel

Membatalkan order OTP yang masih berstatus pending. Saldo akan dikembalikan otomatis.

Endpoint
Method GET
URL /api/v1/order/cancel
Response JSON
Parameter
order_code string Opsional order_code dari sistem (contoh: OTP-1234567890-ABCDE)
rumahotp_id string Opsional rumahotp_order_id jika sudah diketahui. Wajib salah satu.
Contoh Response
{
  "success": true,
  "message": "Order berhasil dibatalkan. Saldo dikembalikan.",
  "data": {
    "order_code": "OTP-1234567890-ABCDE",
    "status": "cancelled",
    "refund": 600,
    "refund_idr": "Rp 600",
    "new_balance": 50600,
    "rumahotp_response": {}
  }
}
GET http://tes.sannxyz.my.id/api/v1/orders

Mendapatkan daftar order milik akun, diurutkan dari yang terbaru. Mendukung filter status dan pagination.

Endpoint
Method GET
URL /api/v1/orders
Response JSON
Parameter
limit integer Opsional Jumlah data per halaman (max 50, default 10)
page integer Opsional Nomor halaman (default 1)
status string Opsional Filter status: pending | success | cancelled | expired
Contoh Response
{
  "success": true,
  "message": "OK",
  "data": {
    "total": 42,
    "page": 1,
    "limit": 10,
    "orders": [
      {
        "id": 1,
        "order_code": "OTP-1234567890-ABCDE",
        "service_id": "whatsapp",
        "service_name": "WhatsApp",
        "phone_number": "+62878xxxxxxxx",
        "country": "id",
        "status": "success",
        "otp_code": "123456",
        "sms_code": null,
        "amount": 600,
        "expires_at": "2026-06-05T10:30:00+07:00",
        "created_at": "2026-06-05T10:00:00+07:00"
      }
    ]
  }
}

Daftar HTTP status code yang mungkin dikembalikan oleh API.

401 Unauthorized API key tidak valid, tidak aktif, atau tidak disertakan.
403 Forbidden IP tidak termasuk dalam whitelist.
400 Bad Request Parameter tidak valid atau saldo tidak cukup.
404 Not Found Order atau layanan tidak ditemukan.
422 Unprocessable Gagal membuat order di RumahOTP.
429 Too Many Requests Rate limit terlampaui (60 request/menit).
502 Bad Gateway Gagal koneksi ke RumahOTP.