Kopi Susu OTP
🇮🇩ID
Dokumentasi API

API sederhana untuk order OTP secara otomatis: cek saldo, top-up, ambil daftar layanan & negara, beli nomor, terima OTP, batalkan, atau selesaikan order.

Base URL

https://kopisusuotp.store/api/v1

Autentikasi

Setiap permintaan wajib menyertakan API key kamu. Kirim lewat salah satu cara:

Authorization: Bearer YOUR_API_KEY
X-Api-Key: YOUR_API_KEY
?apikey=YOUR_API_KEY

🔑 Masuk lalu buka Pengaturan API untuk mendapatkan key milikmu.

Key berlaku hanya di domain ini. Rahasiakan — key = akses penuh ke saldo & order kamu.

Rate limit

Baca (GET)120 permintaan / menit
Mutasi (POST)30 permintaan / menit

Kuota dihitung per API key. Jika terlampaui, respons 429 Too Many Requests. Header Retry-After menunjukkan jeda detik.

Format respons

Selalu JSON. Semua nominal uang dalam Rupiah (IDR), bilangan bulat.

Sukses

{ "success": true, "data": ... }

Gagal

{ "success": false, "message": "penjelasan error" }

Kode HTTP: 200 ok · 401 key salah · 422 input salah / gagal · 429 kebanyakan request · 504 koneksi lambat (lihat catatan order).

Endpoint

GET/balance

Saldo pelanggan. `held` = dana tertahan di order aktif, `active_count` = jumlah order berjalan.

Contoh

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://kopisusuotp.store/api/v1/balance

Respons

{ "success": true, "data": { "balance": 50000, "held": 3148, "active_count": 1 } }
GET/services

Daftar layanan (WhatsApp, Telegram, dst).

Query (opsional)

qcari nama layanan
pagehalaman (default 1)
limitper halaman (default 10, maks 50)

Contoh

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://kopisusuotp.store/api/v1/services?q=whatsapp&limit=20"

Respons

{ "success": true, "data": [
  { "id": 1, "name": "WhatsApp", "service_image": "https://..." }
] }
GET/services/{service_id}/countries

Negara yang tersedia untuk sebuah layanan, beserta harga jual (IDR). Gunakan `country_id` untuk order.

Contoh

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://kopisusuotp.store/api/v1/services/1/countries

Respons

{ "success": true, "data": [
  { "country_id": 6, "country_name": "Indonesia", "country_code": "id", "price": 1200 }
] }
POST/order

Beli nomor OTP. Saldo dipotong sebesar harga negara terpilih.

Body

service_id *id layanan
country_id *id negara
operatoroperator tertentu (default "any")
max_price_usdbatas harga; pilih tier termurah ≤ nilai ini
request_idkunci idempotensi (lihat catatan 504)

Contoh

curl -X POST https://kopisusuotp.store/api/v1/order \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"service_id":1,"country_id":6,"request_id":"my-uniq-123"}'

Respons

{ "success": true, "data": {
  "id": 9001, "phone_number": "628123456789",
  "service_name": "WhatsApp", "country_name": "Indonesia",
  "price": 1200, "status": "active",
  "sms_code": null, "sms_data": [], "expired_at": "2026-07-13T21:20:00+07:00"
} }

⚠️ Jika balasan 504 (retry_safe), JANGAN order baru — nomor mungkin sudah dibuat. Ulangi dengan `request_id` yang sama, atau cek `/orders/active`.

GET/orders/active

Semua order yang masih berjalan (menunggu / sudah menerima OTP).

Contoh

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://kopisusuotp.store/api/v1/orders/active
GET/order/{id}

Status satu order + OTP terbaru. Panggil berkala (mis. tiap 3–5 detik) untuk menunggu OTP masuk. `sms_code` terisi saat OTP diterima.

Respons (OTP sudah masuk)

{ "success": true, "data": {
  "id": 9001, "status": "active", "phone_number": "628123456789",
  "sms_code": "123456",
  "sms_data": [ { "text": "Your code is 123456", "code": "123456" } ]
} }
POST/order/cancel

Batalkan order. Saldo dikembalikan bila belum ada SMS. Tidak bisa dibatalkan jika OTP sudah masuk (atau nomor sewa).

curl -X POST https://kopisusuotp.store/api/v1/order/cancel \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"order_id":9001}'
POST/order/request-sms

Minta SMS/OTP baru pada nomor yang sama (hanya untuk order yang mendukung, setelah SMS pertama).

curl -X POST https://kopisusuotp.store/api/v1/order/request-sms \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"order_id":9001}'
POST/order/finish

Tandai order selesai (wajib sudah ada SMS). Setelah selesai, order diarsipkan ke riwayat.

curl -X POST https://kopisusuotp.store/api/v1/order/finish \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"order_id":9001}'
POST/deposit

Top-up saldo. QRIS (bayar rupiah) atau Crypto (bayar USD via gateway). Saldo bertambah otomatis setelah pembayaran dikonfirmasi.

Body

method *"qris" atau "crypto"
amountQRIS: nominal IDR (2.000 – 2.000.000)
amount_usdCrypto: nominal USD (1 – 1000)

Contoh (QRIS)

curl -X POST https://kopisusuotp.store/api/v1/deposit \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"method":"qris","amount":10000}'

Respons (QRIS)

{ "success": true, "data": {
  "id": 5501, "code": "RCD-XXXX", "amount": 10000,
  "qr_string": "00020101...6304ABCD",
  "qr_image_base64": "data:image/png;base64,iVBOR...",
  "expired_at": "2026-07-13T21:40:00+07:00"
} }

Tampilkan `qr_image_base64` sebagai gambar, atau buat QR sendiri dari `qr_string`. Untuk Crypto, respons berisi `payment_url` — arahkan pelanggan ke sana.

Contoh (Crypto)

curl -X POST https://kopisusuotp.store/api/v1/deposit \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"method":"crypto","amount_usd":5}'
GET/deposit/{id}

Status satu deposit. `status` = "pending" (belum dibayar) / "paid" (lunas → saldo sudah masuk) / "expired". Panggil berkala setelah membuat deposit, atau cukup pantau /balance.

Respons

{ "success": true, "data": {
  "id": 5501, "code": "RCD-XXXX", "amount": 10000,
  "status": "paid", "method": "iskapay",
  "paid_at": "2026-07-13T21:31:00+07:00", "expired_at": "2026-07-13T21:40:00+07:00"
} }

Alur order umum

  1. GET /services → pilih `id` layanan.
  2. GET /services/{id}/countries → pilih `country_id`.
  3. POST /order → dapat `id` order + nomor.
  4. GET /order/{id} berulang sampai `sms_code` terisi (OTP masuk).
  5. POST /order/finish (selesai) atau /order/cancel (jika OTP tak masuk → refund).
CS