A simple API to automate OTP orders: check your balance, top up, fetch the list of services and countries, buy a number, receive the OTP, cancel, or finish an order.
https://kingotpgacor.site/api/v1
Every request must include your API key. Send it in one of these ways:
Authorization: Bearer YOUR_API_KEY
X-Api-Key: YOUR_API_KEY
?apikey=YOUR_API_KEY
🔑 Sign In then open API Settings to get your own key.
The key works on this domain only. Keep it secret — the key grants full access to your balance and orders.
| Reads (GET) | 120 requests / minute |
| Writes (POST) | 30 requests / minute |
The quota is counted per API key. If it is exceeded, the response is 429 Too Many Requests. Header Retry-After shows how many seconds to wait.
Always JSON. All money amounts are in Rupiah (IDR) as whole numbers.
{ "success": true, "data": ... }
{ "success": false, "message": "penjelasan error" }
HTTP codes: 200 ok · 401 invalid key · 422 bad input / failed · 429 too many requests · 504 slow connection (see the order note).
Customer balance. `held` = funds locked in active orders, `active_count` = number of running orders.
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://kingotpgacor.site/api/v1/balance
{ "success": true, "data": { "balance": 50000, "held": 3148, "active_count": 1 } }
List of services (WhatsApp, Telegram, etc.).
| q | search by service name |
| page | page (default 1) |
| limit | per page (default 10, max 50) |
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://kingotpgacor.site/api/v1/services?q=whatsapp&limit=20"
{ "success": true, "data": [
{ "id": 1, "name": "WhatsApp", "service_image": "https://..." }
] }
Countries available for a service, with their selling price (IDR). Use `country_id` when ordering.
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://kingotpgacor.site/api/v1/services/1/countries
{ "success": true, "data": [
{ "country_id": 6, "country_name": "Indonesia", "country_code": "id", "price": 1200 }
] }
Buy an OTP number. Your balance is charged the selected country's price.
| service_id * | service id |
| country_id * | country id |
| operator | a specific operator (default "any") |
| max_price_usd | price cap; picks the cheapest tier ≤ this value |
| request_id | idempotency key (see the 504 note) |
curl -X POST https://kingotpgacor.site/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"}'
{ "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"
} }
⚠️ If you get a 504 (retry_safe), do NOT place a new order — the number may already have been created. Retry with the same `request_id`, or check `/orders/active`.
All orders still running (waiting for an OTP or already holding one).
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://kingotpgacor.site/api/v1/orders/active
The status of one order plus its latest OTP. Poll it periodically (e.g. every 3–5 seconds) while waiting for the OTP. `sms_code` is filled in once the OTP arrives.
{ "success": true, "data": {
"id": 9001, "status": "active", "phone_number": "628123456789",
"sms_code": "123456",
"sms_data": [ { "text": "Your code is 123456", "code": "123456" } ]
} }
Cancel an order. Your balance is refunded if no SMS has arrived. Cancelling is not possible once the OTP has arrived (or for rented numbers).
curl -X POST https://kingotpgacor.site/api/v1/order/cancel \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"order_id":9001}'
Request a new SMS/OTP on the same number (only for orders that support it, after the first SMS).
curl -X POST https://kingotpgacor.site/api/v1/order/request-sms \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"order_id":9001}'
Mark an order as finished (an SMS must have arrived). Once finished, the order is archived to your history.
curl -X POST https://kingotpgacor.site/api/v1/order/finish \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"order_id":9001}'
Top up your balance. QRIS (pay in rupiah) or Crypto (pay in USD via the gateway). The balance is credited automatically once the payment is confirmed.
| method * | "qris" or "crypto" |
| amount | QRIS: amount in IDR (2,000 – 2,000,000) |
| amount_usd | Crypto: amount in USD (1 – 1000) |
curl -X POST https://kingotpgacor.site/api/v1/deposit \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"method":"qris","amount":10000}'
{ "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"
} }
Render `qr_image_base64` as an image, or build the QR yourself from `qr_string`. For Crypto the response contains `payment_url` — send the customer there.
curl -X POST https://kingotpgacor.site/api/v1/deposit \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"method":"crypto","amount_usd":5}'
The status of one deposit. `status` = "pending" (unpaid) / "paid" (settled → balance credited) / "expired". Poll it after creating a deposit, or simply watch /balance.
{ "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"
} }