REST API Ready v1.0

API Documentation

Integrasikan layanan SpeedOTP ke aplikasi atau bot kamu.

Cara Mendapatkan API Key

API Key tersedia di halaman Profil setelah kamu login. Setiap akun memiliki API Key unik yang bisa di-reset kapan saja.

Base URL

https://speedotp.web.id/api/v1

Sertakan Authorization: Bearer {api_key} di setiap request.

Autentikasi

Setiap request wajib menyertakan API Key melalui header Authorization. Bisa juga via query param ?api_key=.

Authorization: Bearer YOUR_API_KEY_HERE

Jangan pernah membagikan API Key ke siapapun.

GET
Cek Saldo
/api/v1/balance

Mengambil informasi saldo akun yang terikat dengan API key.

Request
GET /api/v1/balance
Authorization: Bearer YOUR_API_KEY
Response
200 OK
{
  "success": true,
  "message": "OK",
  "data": {
    "balance": 50000,
    "balance_display": "Rp 50.000"
  }
}
GET
List Layanan
/api/v1/services

Mengambil daftar semua layanan yang tersedia.

Request
GET /api/v1/services
Authorization: Bearer YOUR_API_KEY
Response
200 OK
{
  "success": true,
  "data": [
    {
      "service_code": 1,
      "service_name": "WhatsApp"
    }
  ]
}
GET
List Negara
/api/v1/countries/{service_code}

Mengambil daftar negara dan harga tersedia untuk suatu layanan.

Parameter
{service_code} Integer Wajib Kode layanan dari /services (di URL path)
Request
GET /api/v1/countries/1
Authorization: Bearer YOUR_API_KEY
Response
200 OK
{
  "success": true,
  "data": [
    {
      "name": "Indonesia",
      "number_id": 101,
      "pricelist": [
        {
          "price": 2460,
          "invoice_id": "RO",
          "operator_id": 5,
          "stock": 10
        }
      ]
    }
  ]
}
GET
List Operator
/api/v1/operators

Mengambil daftar operator yang tersedia untuk kombinasi negara tertentu.

Parameter
country String Wajib Nama negara dari /countries (query string)
invoice_id String Wajib invoice_id dari pricelist /countries (query string)
Request
GET /api/v1/operators?country=Indonesia&invoice_id=RO
Authorization: Bearer YOUR_API_KEY
Response
200 OK
{
  "success": true,
  "data": [
    {
      "operator_id": 5,
      "name": "Telkomsel",
      "price": 2050
    }
  ]
}
POST
Buat Order
/api/v1/order/create

Membuat order OTP baru. Saldo langsung terpotong. Simpan order_id untuk polling status.

Parameter
service_code Integer Wajib Kode layanan dari /services
number_id Integer Wajib ID nomor dari /countries
invoice_id String Wajib invoice_id dari pricelist /countries
operator_id Integer Wajib ID operator dari /operators
Request
POST /api/v1/order/create
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

{
  "service_code": 1,
  "number_id": 101,
  "invoice_id": "RO",
  "operator_id": 5
}
Response
200 OK
{
  "success": true,
  "message": "Order berhasil dibuat.",
  "data": {
    "order_id": "RO0004690696",
    "phone_number": "+62831xxxxxxx",
    "service_name": "WhatsApp",
    "country": "Indonesia",
    "price": 2460,
    "expired_at": "2026-06-01 10:15:00",
    "status": "received"
  }
}
GET
Cek Status Order
/api/v1/order/status/{order_id}

Cek status order secara berkala (polling ringan). Gunakan endpoint ini untuk menunggu OTP masuk.

Parameter
{order_id} String Wajib ID order dari response /order/create
Request
GET /api/v1/order/status/RO0004690696
Authorization: Bearer YOUR_API_KEY
Response
200 OK
{
  "success": true,
  "data": {
    "order_id": "RO0004690696",
    "status": "completed",
    "status_label": "completed",
    "otp_code": "441613",
    "otp_msg": "Kode verifikasi kamu: 441613",
    "expired_at": "2026-06-01 10:25:00"
  }
}
GET
Detail Order
/api/v1/order/check/{order_id}

Mengambil detail lengkap order beserta OTP jika sudah masuk.

Parameter
{order_id} String Wajib ID order
Request
GET /api/v1/order/check/RO0004690696
Authorization: Bearer YOUR_API_KEY
Response
200 OK
{
  "success": true,
  "data": {
    "order_id": "RO0004690696",
    "service_name": "WhatsApp",
    "country": "Indonesia",
    "operator": "Telkomsel",
    "phone_number": "+62831xxxxxxx",
    "price": 2460,
    "status": "completed",
    "status_label": "completed",
    "otp_code": "441613",
    "otp_msg": "Kode verifikasi kamu: 441613",
    "expired_at": "2026-06-01 10:25:00",
    "created_at": "2026-06-01 10:05:00"
  }
}
POST
Cancel Order
/api/v1/order/cancel/{order_id}

Membatalkan order yang masih aktif. Saldo dikembalikan otomatis.

Parameter
{order_id} String Wajib ID order yang dibatalkan
Request
POST /api/v1/order/cancel/RO0004690696
Authorization: Bearer YOUR_API_KEY
Response
200 OK
{
  "success": true,
  "message": "Order dibatalkan. Saldo dikembalikan.",
  "data": {
    "order_id": "RO0004690696",
    "refund": 2460,
    "new_balance": 52460
  }
}

Status Order

received Menunggu OTP masuk.
waiting Menunggu OTP (state alternatif).
expiring Hampir expired, OTP belum masuk.
completed OTP diterima. Ambil dari field otp_code.
canceled Dibatalkan manual.
expired Kedaluwarsa tanpa OTP. Saldo direfund. (nilai dari status_label)

HTTP Error Codes

401 API Key tidak valid atau tidak disertakan.
402 Saldo tidak mencukupi.
403 Akun atau IP diblokir.
404 Order atau layanan tidak ditemukan.
429 Terlalu banyak request. Coba lagi.
500 Kesalahan server. Coba beberapa saat lagi.
502 Gagal terhubung ke sistem OTP. Coba lagi.