Public API v1
Public API SpeedOTP memungkinkan kamu mengintegrasikan pembelian nomor virtual OTP langsung dari aplikasi, bot, atau website milikmu sendiri — dengan harga yang sama persis seperti yang tampil di dashboard SpeedOTP.
Base URL
https://speedotp.web.id/api/v1
Semua response menggunakan format JSON yang konsisten:
{
"success": true,
"data": { ... },
"message": null
}
Autentikasi
Setiap request wajib menyertakan header X-API-Key. Dapatkan API key kamu di halaman
Profil → Developer Tools.
curl https://speedotp.web.id/api/v1/balance \ -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
⚠️ Jaga kerahasiaan API key
Jangan bagikan API key ke siapa pun. Jika bocor, segera generate ulang lewat halaman Profil — key lama otomatis tidak berlaku.
Rate Limit
Setiap endpoint memiliki batas jumlah request untuk menjaga stabilitas layanan:
| Kategori | Limit |
|---|---|
| Create / cancel order | 5 request / 10 detik |
| Cek status order (polling) | 1 request / 2 detik per order_id |
| Cek saldo | 10 request / 10 detik |
| List layanan / negara / operator | 30 request / 10 detik |
Melebihi limit akan mendapat response HTTP 429 dengan header Retry-After.
Get Balance
/balance
Mengambil saldo akun kamu saat ini.
curl https://speedotp.web.id/api/v1/balance \ -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
{
"success": true,
"data": { "balance": 25000 },
"message": null
}
List Services
/services
Mengambil daftar semua layanan yang tersedia beserta service_id-nya. Gunakan service_id ini di endpoint /countries.
curl https://speedotp.web.id/api/v1/services \ -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
{
"success": true,
"data": [
{ "service_id": 13, "service_name": "WhatsApp" },
{ "service_id": 21, "service_name": "TikTok" }
],
"message": null
}
List Countries
/countries
Mengambil daftar negara dan harga untuk layanan tertentu. Harga yang dikembalikan sama persis dengan yang tampil di dashboard SpeedOTP.
QUERY PARAMETERS
| Parameter | Tipe | Keterangan |
|---|---|---|
service_id | integer | Wajib. Didapat dari endpoint /services. |
curl "https://speedotp.web.id/api/v1/countries?service_id=13" \ -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
{
"success": true,
"data": [
{
"number_id": 340437,
"name": "Indonesia",
"pricelist": [
{
"provider_id": "3837",
"server_id": "3",
"stock": 103,
"price": 1300,
"available": true
}
]
}
],
"message": null
}
List Operators
/operators
Mengambil daftar operator yang tersedia untuk kombinasi negara & provider tertentu.
QUERY PARAMETERS
| Parameter | Tipe | Keterangan |
|---|---|---|
country | string | Wajib. Nama negara dari endpoint /countries. |
provider_id | string | Wajib. Dari pricelist endpoint /countries. |
curl "https://speedotp.web.id/api/v1/operators?country=Indonesia&provider_id=3837" \ -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
{
"success": true,
"data": [
{ "operator_id": 5, "operator": "Telkomsel" },
{ "operator_id": 8, "operator": "XL Axiata" }
],
"message": null
}
Gunakan operator_id dan operator dari sini saat memanggil /order.
Create Order
/order
Membuat order nomor virtual baru. Saldo akan langsung terpotong sesuai harga.
BODY (JSON)
| Field | Tipe | Keterangan |
|---|---|---|
service_id | integer | Wajib |
number_id | integer | Wajib. Dari endpoint /countries |
provider_id | string | Wajib. Dari pricelist |
server_id | string | Opsional |
operator_id | integer | Wajib. Dari endpoint /operators |
country | string | Wajib |
operator | string | Wajib |
price | integer | Wajib. Harga jual dari pricelist — divalidasi ulang di server |
curl -X POST https://speedotp.web.id/api/v1/order \
-H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"service_id": 13,
"number_id": 340437,
"provider_id": "3837",
"operator_id": 5,
"country": "Indonesia",
"operator": "Telkomsel",
"price": 1300
}'
{
"success": true,
"data": {
"order_id": "SO20260802103045123",
"phone_number": "+6281234567890",
"price": 1300,
"status": "received",
"expired_at": "2026-08-02 10:40:45",
"new_balance": 23700
},
"message": "Order berhasil dibuat."
}
Harga jual (price) selalu divalidasi ulang oleh server berdasarkan data terbaru — kirim nilai yang persis sama dengan hasil /countries untuk menghindari order ditolak.
Get Order Status
/order/{order_id}
Cek status order dan kode OTP yang masuk. Gunakan order_id (invoice) yang didapat dari response Create Order. Disarankan polling setiap 2–3 detik.
curl https://speedotp.web.id/api/v1/order/SO20260802103045123 \ -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
{
"success": true,
"data": {
"order_id": "SO20260802103045123",
"status": "completed",
"service_name": "WhatsApp",
"country": "Indonesia",
"operator": "Telkomsel",
"phone_number": "+6281234567890",
"otp_code": "482910",
"otp_msg": "482910 is your WhatsApp code",
"price": 1300,
"expired_at": "2026-08-02 10:40:45",
"created_at": "2026-08-02 10:30:45"
},
"message": null
}
Nilai status: received, waiting, expiring, completed, canceled, expired.
Cancel Order
/order/{order_id}/cancel
Membatalkan order yang belum menerima OTP. Saldo akan dikembalikan penuh. Order hanya bisa dibatalkan minimal 3 menit setelah dibuat.
curl -X POST https://speedotp.web.id/api/v1/order/SO20260802103045123/cancel \ -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
{
"success": true,
"data": { "new_balance": 25000 },
"message": "Order dibatalkan. Saldo dikembalikan."
}
Error Codes
Kalau request gagal, success akan bernilai false dan message berisi keterangan error. Berikut contoh response error:
{
"success": false,
"data": null,
"message": "API key tidak valid."
}
| Kode | Arti |
|---|---|
400 | Parameter tidak valid / tidak lengkap |
401 | API key tidak ada / tidak valid |
403 | IP diblokir atau tidak ada di whitelist |
404 | Data tidak ditemukan |
429 | Rate limit tercapai |
502 | Gagal terhubung ke provider, coba lagi |
500 | Kesalahan server internal |