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.

● Versi 1.0 ● Stable Release

Base URL

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

Semua response menggunakan format JSON yang konsisten:

JSON
{
  "success": true,
  "data": { ... },
  "message": null
}

Autentikasi

Setiap request wajib menyertakan header X-API-Key. Dapatkan API key kamu di halaman Profil → Developer Tools.

CURL
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:

KategoriLimit
Create / cancel order5 request / 10 detik
Cek status order (polling)1 request / 2 detik per order_id
Cek saldo10 request / 10 detik
List layanan / negara / operator30 request / 10 detik

Melebihi limit akan mendapat response HTTP 429 dengan header Retry-After.


Get Balance

GET /balance

Mengambil saldo akun kamu saat ini.

CURL
curl https://speedotp.web.id/api/v1/balance \
  -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
Response 200 OK
{
  "success": true,
  "data": { "balance": 25000 },
  "message": null
}

List Services

GET /services

Mengambil daftar semua layanan yang tersedia beserta service_id-nya. Gunakan service_id ini di endpoint /countries.

CURL
curl https://speedotp.web.id/api/v1/services \
  -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
Response 200 OK
{
  "success": true,
  "data": [
    { "service_id": 13, "service_name": "WhatsApp" },
    { "service_id": 21, "service_name": "TikTok" }
  ],
  "message": null
}

List Countries

GET /countries

Mengambil daftar negara dan harga untuk layanan tertentu. Harga yang dikembalikan sama persis dengan yang tampil di dashboard SpeedOTP.

QUERY PARAMETERS

ParameterTipeKeterangan
service_idintegerWajib. Didapat dari endpoint /services.
CURL
curl "https://speedotp.web.id/api/v1/countries?service_id=13" \
  -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
Response 200 OK
{
  "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

GET /operators

Mengambil daftar operator yang tersedia untuk kombinasi negara & provider tertentu.

QUERY PARAMETERS

ParameterTipeKeterangan
countrystringWajib. Nama negara dari endpoint /countries.
provider_idstringWajib. Dari pricelist endpoint /countries.
CURL
curl "https://speedotp.web.id/api/v1/operators?country=Indonesia&provider_id=3837" \
  -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
Response 200 OK
{
  "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

POST /order

Membuat order nomor virtual baru. Saldo akan langsung terpotong sesuai harga.

BODY (JSON)

FieldTipeKeterangan
service_idintegerWajib
number_idintegerWajib. Dari endpoint /countries
provider_idstringWajib. Dari pricelist
server_idstringOpsional
operator_idintegerWajib. Dari endpoint /operators
countrystringWajib
operatorstringWajib
priceintegerWajib. Harga jual dari pricelist — divalidasi ulang di server
CURL
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
  }'
Response 200 OK
{
  "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

GET /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
curl https://speedotp.web.id/api/v1/order/SO20260802103045123 \
  -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
Response 200 OK
{
  "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

POST /order/{order_id}/cancel

Membatalkan order yang belum menerima OTP. Saldo akan dikembalikan penuh. Order hanya bisa dibatalkan minimal 3 menit setelah dibuat.

CURL
curl -X POST https://speedotp.web.id/api/v1/order/SO20260802103045123/cancel \
  -H "X-API-Key: sotp_xxxxxxxxxxxxxxxxxxxx"
Response 200 OK
{
  "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:

Response 401 Unauthorized
{
  "success": false,
  "data": null,
  "message": "API key tidak valid."
}
KodeArti
400Parameter tidak valid / tidak lengkap
401API key tidak ada / tidak valid
403IP diblokir atau tidak ada di whitelist
404Data tidak ditemukan
429Rate limit tercapai
502Gagal terhubung ke provider, coba lagi
500Kesalahan server internal

Butuh bantuan?

Hubungi tim support kami kalau ada pertanyaan soal integrasi API.

Kelola API Key