OTPGet API Docs –
SMS OTP, Rental, Cheap & Email
Buy virtual phone numbers for OTP verification, get ultra-fast cheap numbers, rent long-term SMS numbers across 200+ countries, and get temporary Gmail addresses — all via one simple REST API.
All requests must include your API Key in the query string.
The APIs use different response formats. Make sure your code handles each correctly.
handler_api.php
PLAIN TEXT
ACCESS_NUMBER:abc123:9230012345
STATUS_OK:847293
STATUS_WAIT_CODE
BAD_KEY
Most actions: plain text. Exception: getCountries + getServices return JSON.
cheap_handler.php
PLAIN TEXT + JSON
ORD_abc,923001234,900
STATUS_OK:847293
STATUS_WAIT_CODE
LOW_BALANCE
Most actions: plain text. getServers + getServices return JSON.
rental-handler.php
JSON
"message": "...",
... data fields}
Check status === "200" for success.
email_handler.php
JSON
"message": "...",
... data fields}
202 = waiting. 300 = cancelled.
Base URL: https://otpget.com/stubs/handler_api.php
| # | Action | Key Params | Description |
|---|---|---|---|
| 1 | getBalance | — | Get wallet balance |
| 2 | getCountries | type | List countries by provider (1–6) |
| 3 | getServices | country, type | List services for a country |
| 4 | getNumber | service, country, type | Buy a virtual number for OTP |
| 5 | getStatus | id | Poll for received SMS code |
| 6 | setStatus | id, status | Complete (3/6) or cancel & refund (8 — after 2 min) |
Check your account balance in PKR. Returns plain text: ACCESS_BALANCE:500.00
echo file_get_contents($url);
url = "https://otpget.com/stubs/handler_api.php"
params = {"api_key": "YOUR_API_KEY", "action": "getBalance"}
print(requests.get(url, params=params).text)
List all available countries. You can filter by provider type (1, 2, 3, 4, 5 or 6).
echo file_get_contents($url);
url = "https://otpget.com/stubs/handler_api.php"
params = {"api_key": "YOUR_API_KEY", "action": "getCountries", "type": "1"}
print(requests.get(url, params=params).text)
{"id": "33", "name": "Canada"},
{"id": "15", "name": "England"},
{"id": "61", "name": "Pakistan"},
{"id": "12", "name": "USA"},
... 30+ more countries
],
"2": [ ... Provider 2 ... ]}
Get available services for a specific country and provider.
echo file_get_contents($url);
url = "https://otpget.com/stubs/handler_api.php"
params = {"api_key": "YOUR_API_KEY", "action": "getServices", "country": "61", "type": "1"}
print(requests.get(url, params=params).text)
"102": "WhatsApp - 60 PKR",
"103": "Instagram - 55 PKR"}
Order a new phone number to receive SMS. This will deduct PKR from your balance.
| Parameter | Type | Description |
|---|---|---|
| service | string | Numeric DB ID from getServices e.g. 101, 102 |
| country | int | Country ID from getCountries — e.g. 61 (Pakistan), 12 (USA) |
| type | int | Provider (1–6) |
echo file_get_contents($url);
url = "https://otpget.com/stubs/handler_api.php"
params = {"api_key": "YOUR_API_KEY", "action": "getNumber", "service": "101", "country": "61", "type": "1"}
print(requests.get(url, params=params).text)
ACCESS_NUMBER:order_id:phone_number
Check if an SMS has been received for an order ID.
echo file_get_contents($url);
url = "https://otpget.com/stubs/handler_api.php"
params = {"api_key": "YOUR_API_KEY", "action": "getStatus", "id": "abc123xyz"}
print(requests.get(url, params=params).text)
STATUS_WAIT_CODE
STATUS_OK:$code
Complete a successful activation (status 3 or 6 — OTP must already be received), or cancel for a refund (status 8 — only after 2 minutes, no OTP received).
echo file_get_contents($url);
url = "https://otpget.com/stubs/handler_api.php"
params = {"api_key": "YOUR_API_KEY", "action": "setStatus", "id": "abc123xyz", "status": "8"}
print(requests.get(url, params=params).text)
| Status Code | Meaning |
|---|---|
| 3 | Complete Activation (OTP must already be received) |
| 6 | Complete Activation (OTP must already be received) |
| 8 | Cancel and Refund — only allowed after 2 minutes from purchase, no SMS received yet |
Balance refunded
NO_SMS_RECEIVED
STATUS_ALREADY_CHANGED
Base URL: https://otpget.com/stubs/rental-handler.php
| # | Action | Required Params | Description |
|---|---|---|---|
| 1 | getRentalCountries | — (optional: provider) | List all countries available for rental |
| 2 | getRentalPricing | country_code, provider | Get pricing tiers for a country |
| 3 | getAvailableRentals | country_code, provider | Live stock availability check |
| 4 | rentNumber | country_code, provider, duration_hours | Buy a rental number |
| 5 | getMyRentals | — | List all your rentals |
| 6 | getRentalSMS | order_id | Fetch SMS messages on a rented number |
| 7 | renewRental | rental_id, duration_hours | Extend rental period |
provider=1 = Server 1 | provider=2 = Server 2duration_hours:
12 · 24 · 168 · 720 · 4320 · 8640
List all countries available for rental. Filter by provider or omit to get all servers.
$data = json_decode(file_get_contents($url), true);
foreach($data['countries'] as $c) { echo $c['name'] . ' (' . $c['country_code'] . ')' . PHP_EOL; }
r = requests.get("https://otpget.com/stubs/rental-handler.php", params={"api_key":"YOUR_API_KEY","action":"getRentalCountries","provider":"2"})
for c in r.json()['countries']: print(c['name'], c['country_code'])
{"id":"1","provider":"2","name":"Canada","country_code":"ca"},
{"id":"6","provider":"2","name":"United States of America","country_code":"us"}
]}
Get all available pricing tiers for a country.
$data = json_decode(file_get_contents($url), true);
foreach($data['pricing'] as $p) { echo $p['duration_hours'] . 'h — ' . $p['price'] . ' PKR' . PHP_EOL; }
r = requests.get("https://otpget.com/stubs/rental-handler.php", params={"api_key":"YOUR_API_KEY","action":"getRentalPricing","country_code":"ca","provider":"2"})
for p in r.json()['pricing']: print(p['duration_hours']+'h —', p['price'], 'PKR')
{"id":"1","duration_hours":"720","price":"840.00","country_name":"Canada"},
{"id":"2","duration_hours":"4320","price":"5040.00","country_name":"Canada"}
]}
Check live stock availability for a country before buying.
$data = json_decode(file_get_contents($url), true);
foreach($data['available'] as $a) { echo $a['area_title'] . ': ' . $a['available'] . ' numbers' . PHP_EOL; }
r = requests.get("https://otpget.com/stubs/rental-handler.php", params={"api_key":"YOUR_API_KEY","action":"getAvailableRentals","country_code":"ca","provider":"2"})
for a in r.json()['available']: print(a['area_title'], a['available'], 'available')
{"area_code":"ca","area_title":"Canada","available":3338,"min_month":1}
]}
Purchase a phone number for rental. Check getRentalPricing first to confirm valid duration_hours.
$data = json_decode(file_get_contents($url), true);
if($data['status'] == '200') {
echo 'Phone: ' . $data['phone'] . PHP_EOL;
echo 'Order ID: ' . $data['order_id'] . PHP_EOL;
}
r = requests.get("https://otpget.com/stubs/rental-handler.php", params={"api_key":"YOUR_API_KEY","action":"rentNumber","country_code":"ca","provider":"2","duration_hours":"720"})
d = r.json()
if d['status'] == '200': print('Phone:', d['phone'])
"phone":"3434337545","order_id":"2673093356180000583",
"duration_hours":720,"price_paid":"840.00","new_balance":"4220.00",
"expires":"2026-04-09 21:55:55"}
List all your rented numbers. Use order_id to fetch SMS. Use id to renew.
$data = json_decode(file_get_contents($url), true);
foreach($data['rentals'] as $r) { echo $r['phone_number'] . ' | ' . $r['status'] . PHP_EOL; }
r = requests.get("https://otpget.com/stubs/rental-handler.php", params={"api_key":"YOUR_API_KEY","action":"getMyRentals"})
for rental in r.json()['rentals']: print(rental['phone_number'], rental['status'])
"id":"27","server":"Server 2","phone_number":"3434337545",
"order_id":"2673093356180000583","status":"active",
"country_code":"ca","expiry_time":"2026-04-09 21:55:55"
}]}
Fetch all SMS messages received on a rented number. Use order_id from rentNumber or getMyRentals.
$data = json_decode(file_get_contents($url), true);
foreach($data['messages'] as $msg) { echo 'Code: ' . $msg['code'] . ' | Text: ' . $msg['text'] . PHP_EOL; }
r = requests.get("https://otpget.com/stubs/rental-handler.php", params={"api_key":"YOUR_API_KEY","action":"getRentalSMS","order_id":"2673093356180000583"})
for msg in r.json()['messages']: print('Code:', msg['code'])
"from":"Server 2","text":"Your WhatsApp code 740-279","code":"","timestamp":"2026-03-09T20:57:32Z"
}]}
Extend the rental period on an active number. Use id from getMyRentals as rental_id.
$data = json_decode(file_get_contents($url), true);
if($data['status'] == '200') { echo 'New expiry: ' . $data['new_expiry'] . PHP_EOL; }
r = requests.get("https://otpget.com/stubs/rental-handler.php", params={"api_key":"YOUR_API_KEY","action":"renewRental","rental_id":"5","duration_hours":"720"})
d = r.json()
if d['status'] == '200': print('New expiry:', d['new_expiry'])
"phone_number":"3434337545","duration_hours":720,
"price_paid":"840.00","new_balance":"3440.00","new_expiry":"2026-05-09 21:55:55"}
Buy cheap phone numbers instantly for OTP verification. Numbers are valid for 15 minutes with 100% refund on cancel. All cheap number endpoints use the base URL below.
getServers and getServices return JSON.
Base URL: https://otpget.com/stubs/cheap_handler.php
| # | Action | Key Params | Description |
|---|---|---|---|
| 1 | getBalance | — | Get wallet balance (PKR) |
| 2 | getServers | type | List available cheap number servers (type=1 for Server1) |
| 3 | getServices | server, type | Get services & prices for a server |
| 4 | buyNumber | server, type | Buy a cheap number — deducts PKR balance |
| 5 | getStatus | id | Poll for received OTP on a cheap order |
| 6 | setStatus | id, status | Cancel & refund (8) after 2 min, or complete (3/6) |
getServers e.g. server=1type param:
type=1 = Server 1 (currently supported)
Check your PKR wallet balance. Returns plain text: ACCESS_BALANCE:500.00
echo file_get_contents($url);
r = requests.get("https://otpget.com/stubs/cheap_handler.php", params={"api_key":"YOUR_API_KEY","action":"getBalance"})
print(r.text)
List all available cheap number servers. Use the returned id as the server param in subsequent calls.
| Parameter | Required | Description |
|---|---|---|
| type | Optional | 1 = Server 1. Omit to get all Servers. |
$data = json_decode(file_get_contents($url), true);
foreach($data['1'] as $server) {
echo $server['id'] . ' — ' . $server['name'] . PHP_EOL;
}
r = requests.get("https://otpget.com/stubs/cheap_handler.php", params={"api_key":"YOUR_API_KEY","action":"getServers","type":"1"})
for s in r.json().get("1", []): print(s['id'], '—', s['name'])
{"id": "1", "name": "Random Facebook - Free"},
{"id": "2", "name": "Pakistan - Server 2"}
]}
Get services and pricing for a specific server. Returns JSON with service name and price in PKR (₨).
| Parameter | Required | Description |
|---|---|---|
| server | Required | Server ID from getServers e.g. 1 |
| type | Required | 1 = Server 1 |
$data = json_decode(file_get_contents($url), true);
foreach($data as $id => $label) { echo $id . ': ' . $label . PHP_EOL; }
r = requests.get("https://otpget.com/stubs/cheap_handler.php", params={"api_key":"YOUR_API_KEY","action":"getServices","server":"1","type":"1"})
for id, label in r.json().items(): print(id, ':', label)
"2": "Pakistan Server 2 — ₨50.00"}
Purchase a cheap phone number. Balance is deducted in PKR. The number is valid for 15 minutes. Returns order_id,number,expires_in as plain text.
| Parameter | Required | Description |
|---|---|---|
| server | Required | Server ID from getServers e.g. 1 |
| type | Required | 1 = Server 1 |
$res = file_get_contents($url);
// Success format: "ORDER_ID,PHONE_NUMBER,900"
if(strpos($res, ',') !== false) {
[$order_id, $number, $expires] = explode(',', trim($res));
echo 'Number: +' . $number . PHP_EOL;
echo 'Order ID: ' . $order_id . PHP_EOL;
echo 'Valid for: ' . ($expires/60) . ' minutes' . PHP_EOL;
} else {
echo 'Error: ' . $res;
}
r = requests.get("https://otpget.com/stubs/cheap_handler.php", params={"api_key":"YOUR_API_KEY","action":"buyNumber","server":"1","type":"1"})
res = r.text.strip()
if ',' in res:
order_id, number, expires = res.split(',')
print('Number: +' + number)
print('Order ID:', order_id)
else:
print('Error:', res)
# format: order_id,number,expires_in_seconds
NO_NUMBERS
BAD_SERVER
BAD_KEY
order_id — you'll need it for getStatus and setStatus. Number expires in 15 minutes (900 seconds).
Poll every 5–10 seconds after buying to check if an OTP has been received. Use the order_id from buyNumber as the id param.
| Parameter | Required | Description |
|---|---|---|
| id | Required | The order_id returned from buyNumber |
$url = "https://otpget.com/stubs/cheap_handler.php?api_key=YOUR_API_KEY&action=getStatus&id=$order_id";
// Poll every 5 seconds
for($i = 0; $i < 30; $i++) {
$res = file_get_contents($url);
if(strpos($res, 'STATUS_OK:') === 0) {
$otp = explode(':', $res)[1];
echo 'OTP: ' . $otp; break;
} elseif($res === 'STATUS_CANCEL') {
echo 'Expired or cancelled'; break;
}
sleep(5);
}
params = {"api_key":"YOUR_API_KEY","action":"getStatus","id":"ORD_6830abc123_741"}
for _ in range(30):
res = requests.get("https://otpget.com/stubs/cheap_handler.php", params=params).text.strip()
if res.startswith('STATUS_OK:'): print('OTP:', res.split(':')[1]); break
elif res == 'STATUS_CANCEL': print('Expired'); break
time.sleep(5)
Complete a successful activation or cancel for a refund. Cancel (status=8) is only allowed after 2 minutes from purchase and only if no OTP was received.
| Parameter | Required | Description |
|---|---|---|
| id | Required | The order_id from buyNumber |
| status | Required | 8 = Cancel & refund | 3 or 6 = Complete (OTP must be received) |
$url = 'https://otpget.com/stubs/cheap_handler.php?api_key=YOUR_API_KEY&action=setStatus&id=ORD_6830abc123_741&status=8';
$res = file_get_contents($url);
// ACCESS_READY = cancelled + refunded
// ACCESS_FINISH = completed successfully
// EARLY_CANCEL_DENIED = less than 2 min since purchase
echo $res;
curl "https://otpget.com/stubs/cheap_handler.php?api_key=YOUR_API_KEY&action=setStatus&id=ORD_6830abc123_741&status=8"
# Complete
curl "https://otpget.com/stubs/cheap_handler.php?api_key=YOUR_API_KEY&action=setStatus&id=ORD_6830abc123_741&status=6"
params = {"api_key":"YOUR_API_KEY","action":"setStatus","id":"ORD_6830abc123_741","status":"8"}
r = requests.get("https://otpget.com/stubs/cheap_handler.php", params=params)
print(r.text) # ACCESS_READY = cancelled & refunded
PKR refunded to wallet
NO_SMS_RECEIVED
BAD_ID
| Status Code | Meaning | Condition |
|---|---|---|
| 8 | Cancel & Refund | Only after 2 min from purchase, no OTP received yet |
| 3 | Complete Activation | OTP must already be received |
| 6 | Complete Activation | Same as status 3 — alternative code |
Buy temporary email addresses from Server 1 (specific services like Gmail OTP for Instagram, Telegram etc.) or Server 2 (multiple email domains — gmail.com, mail.com, gmx.com and more). Add server=1 or server=2 to all requests.
Server 1: returns available services (Instagram, Telegram etc.) for a domain. Server 2: returns available email domains with prices.
$data = json_decode(file_get_contents($url), true);
foreach($data['services'] as $svc) { echo $svc['service_name'] . ' — ' . $svc['price'] . PHP_EOL; }
r = requests.get("https://otpget.com/stubs/email_handler.php", params={"api_key":"YOUR_API_KEY","action":"getEmailServices","server":"1","domain":"gmail.com"})
for svc in r.json()['services']: print(svc['service_name'], svc['price'])
{"service_code":"ig","service_name":"Instagram","price":120.00,"count":48},
{"service_code":"tg","service_name":"Telegram","price":95.00,"count":120}
]}
| service_id | Service | service_id | Service | service_id | Service |
|---|---|---|---|---|---|
| oi | Tinder | ig | tg | Telegram | |
| fb | tw | vk | VK / Mail.ru | ||
| mm | Microsoft | am | Amazon | wc | Craigslist |
| lf | TikTok | ka | Shopee | ds | Discord |
| wb | bigl | Biglion | sn | OLX | |
| hb | Twitch | xd | Tokopedia | ya | Yandex |
| wx | Apple | kc | Vinted | fu | Snapchat |
| vz | Hinge | dr | OpenAI / ChatGPT | do | Leboncoin |
| cn | Fiverr | yi | Yemeksepeti | rr | Wolt |
| xy | Depop | vd | Betfair | us | IRCTC |
| se | Feeld | fk | BLIBLI | cw | PaddyPower |
| bn | Alfagift | ee | Twilio | pr | Trendyol |
| gx | Hepsiburada | lc | Subito | ebay_kl | Kleinanzeigen |
| ot | Any Other | wr | Walmart | acz | Claude AI |
| abd | Beboo | ahb | Ubisoft | amb | Vercel |
| nuum | Nuum.ru | dns | DNS | aos | Loloo |
| olxkz | OLX Kazakhstan | olxua | OLX Ukraine | olxpl | OLX Poland |
| talk | Talkatone | etsy | Etsy | olxro | OLX Romania |
| olxbg | OLX Bulgaria | olxpt | OLX Portugal | git | GitHub |
| olxuz | OLX Uzbekistan | fbb | Facebook Business | sls | Streamlabs |
| uns | Unstop | swl | Swarail | tum | Tumblr |
| aud | Audible | rap | RapidAPI | ser | SerpAPI |
| bol | Bosslike | fmc | FMCPay | awv | Wallapop |
| mml | MMLive | bnl | skls | Skills | |
| crsr | Cursor | aws | Amazon AWS | avk | Quoka |
| fpx | 500px | qql | QQLive | clg | Clubgg |
| pla | PolloAI | tln | Toluna | kck | Kick |
| bbf | Neosurf | klb | Kolotibablo | rch | Research 360 |
| wmb | Wamba | tnx | Telnyx | grk | Grok |
| yab | Brevistay | dgo | DigitalOcean | nne | OneOne |
| ttn | Textnow | bfl | Black Forest Labs | kt | KakaoTalk |
$data = json_decode(file_get_contents($url), true);
foreach($data['domains'] as $d) { echo $d['domain'] . ' — ' . $d['price'] . ' PKR (' . $d['count'] . ' available)' . PHP_EOL; }
r = requests.get("https://otpget.com/stubs/email_handler.php", params={"api_key":"YOUR_API_KEY","action":"getEmailServices","server":"2","site":"telegram.com"})
for d in r.json()['domains']: print(d['domain'], d['price'], 'PKR')
{"domain":"gmail.com","price":15.60,"count":82000},
{"domain":"mail.com","price":1.17,"count":990125},
{"domain":"gmx.com","price":1.17,"count":1615245}
]}
Purchase a temporary email address. Server 1 requires service_id + domain. Server 2 requires domain + site.
$data = json_decode(file_get_contents($url), true);
if($data['status'] == '200') { echo 'Email: ' . $data['email'] . ' | ID: ' . $data['email_id']; }
r = requests.get("https://otpget.com/stubs/email_handler.php", params={"api_key":"YOUR_API_KEY","action":"buyEmail","server":"1","service_id":"ig","domain":"gmail.com"})
d = r.json()
if d['status'] == '200': print('Email:', d['email'], 'ID:', d['email_id'])
"email_id":"7291834","email":"temp.abc123@gmail.com",
"service":"Instagram","domain":"gmail.com","price":120.00,"balance":4880.00,"server":1}
$data = json_decode(file_get_contents($url), true);
if($data['status'] == '200') { echo 'Email: ' . $data['email'] . ' | ID: ' . $data['email_id']; }
r = requests.get("https://otpget.com/stubs/email_handler.php", params={"api_key":"YOUR_API_KEY","action":"buyEmail","server":"2","domain":"gmail.com","site":"telegram.com"})
d = r.json()
if d['status'] == '200': print('Email:', d['email'], 'ID:', d['email_id'])
"email_id":"48291034","email":"cudaqibeve@gmx.com",
"service":"Email Activation","domain":"gmx.com","price":1.17,"balance":1739.25,"server":2}
| Parameter | Server 1 | Server 2 |
|---|---|---|
| server | 1 | 2 |
| service_id | Required (e.g. ig, tg) | Not used |
| domain | Optional (default: gmail.com) | Required (e.g. gmail.com, mail.com) |
| site | Not used | Optional — website you want to register on (e.g. telegram.com) |
Poll this endpoint after buying an email to retrieve the verification code. Call every 5–10 seconds until code arrives.
for($i=0; $i<24; $i++) {
$data = json_decode(file_get_contents($url), true);
if($data['status']=='200' && !empty($data['messages'])) { echo 'OTP: ' . $data['messages'][0]['code']; break; }
sleep(5);
}
params = {"api_key":"YOUR_API_KEY","action":"getEmailCode","email_id":"7291834"}
for _ in range(24):
d = requests.get("https://otpget.com/stubs/email_handler.php", params=params).json()
if d['status']=='200' and d.get('messages'): print('OTP:', d['messages'][0]['code']); break
time.sleep(5)
200 Code received |
202 Still waiting — keep polling |
300 Cancelled
Cancel an email activation. If OTP already received → returns code. If still waiting → cancels and refunds.
$data = json_decode(file_get_contents($url), true);
echo $data['message'];
r = requests.get("https://otpget.com/stubs/email_handler.php", params={"api_key":"YOUR_API_KEY","action":"cancelEmail","email_id":"7291834"})
print(r.json()['message'])
Retrieve your past email purchases. Supports pagination (20 records per page).
$data = json_decode(file_get_contents($url), true);
foreach($data['history'] as $h) { echo $h['email_address'] . ' | ' . $h['status'] . PHP_EOL; }
r = requests.get("https://otpget.com/stubs/email_handler.php", params={"api_key":"YOUR_API_KEY","action":"getEmailHistory","page":"1"})
for h in r.json()['history']: print(h['email_address'], h['status'])
Base URL: https://otpget.com/stubs/email_handler.php
server=1 (default) for Server 1 or server=2 for Server 2 to all requests.
| # | Action | Key Params | Description |
|---|---|---|---|
| 13 | getEmailServices | server, domain (s1), site (s2) | Server 1: list services. Server 2: list available domains |
| 14 | buyEmail | server, service_id+domain (s1) or domain+site (s2) | Buy temp email — returns email_id |
| 15 | getEmailCode | email_id, server | Poll for OTP (200=got it, 202=waiting, 300=cancelled) |
| 16 | cancelEmail | email_id, server | Cancel & refund if no OTP; complete if OTP received |
| 17 | getEmailHistory | page | Paginated purchase history (includes server field) |
Error Codes
All APIs return consistent responses. Use the status field (JSON APIs) or the response string (plain text APIs) to detect errors.
| Response | When it happens |
|---|---|
| BAD_KEY | API key missing, invalid or blocked account |
| ACCOUNT_BLOCKED | Account suspended by admin |
| BAD_ACTION | Unknown action parameter |
| BAD_SERVICE | Service code not found for given country/type |
| BAD_COUNTRY | Country ID not found or missing |
| BAD_TYPE | Provider type must be 1–6 |
| BAD_ID | Order ID missing on getStatus/setStatus |
| BAD_STATUS | Status value not 3, 6 or 8 |
| NO_BALANCE | Insufficient wallet balance |
| NO_ACTIVATION | Order ID not found or doesn't belong to you |
| STATUS_WAIT_CODE | SMS not received yet — keep polling |
| STATUS_OK:CODE | SMS received — code after the colon |
| STATUS_CANCEL | Activation cancelled — no SMS available |
| STATUS_ALREADY_CHANGED | setStatus already called for this order |
| EARLY_CANCEL_DENIED | Cancel attempted within first 2 minutes |
| NO_SMS_RECEIVED | Tried to complete (3/6) but no OTP yet |
| ERROR_PRICE_CHANGE | Provider price exceeded your balance — auto-cancelled |
| ERROR_PROVIDER_1..6 | Upstream provider error — raw response appended after colon |
| Response | When it happens |
|---|---|
| BAD_KEY | API key missing or invalid |
| ACCOUNT_BLOCKED | Account suspended by admin |
| BAD_ACTION | Unknown action parameter |
| BAD_SERVER | Server ID missing, not found or inactive |
| BAD_TYPE | Type value not 1 or 2 |
| BAD_ID | Order ID missing on getStatus/setStatus |
| BAD_STATUS | Status not 3, 6 or 8 |
| LOW_BALANCE | Insufficient PKR balance to buy number |
| NO_NUMBERS | Provider has no numbers available right now |
| NO_SERVERS | No active servers found for given type |
| NO_SERVICES | No services found for given server/type |
| NO_ACTIVATION | Order ID not found or doesn't belong to you |
| DATABASE_ERROR | DB insert failed — balance was not deducted |
| STATUS_WAIT_CODE | OTP not received yet — keep polling |
| STATUS_OK:OTP | OTP received — code after the colon |
| STATUS_CANCEL | Number expired or was cancelled |
| ACCESS_READY | Cancelled successfully — balance refunded |
| ACCESS_FINISH | Activation completed successfully |
| EARLY_CANCEL_DENIED | Cancel attempted within first 2 minutes |
| NO_SMS_RECEIVED | Tried to complete (3/6) but no OTP yet |
| status | message | When it happens |
|---|---|---|
| 401 | Invalid API key. | Invalid or missing API key |
| 403 | Account is blocked or inactive. | Account suspended |
| 400 | Unknown action: … | Unrecognized action value |
| 400 | country_code / provider / duration_hours is required. | Missing required params |
| 400 | Server 2 only supports monthly durations… | Server 2: only 720, 4320, 8640 accepted |
| 402 | Insufficient balance. | Balance too low |
| 404 | No pricing found… | No pricing for that country/provider/duration |
| 404 | Rental not found or does not belong to you. | Wrong rental_id on renewRental |
| 503 | Server 1/2 is currently unavailable. | Provider disabled by admin |
| 502 | Server 1/2 error: … | Upstream provider error |
| 500 | Database error: … | DB transaction failed — balance not deducted |
| status | message | When it happens |
|---|---|---|
| 401 | BAD_KEY | Invalid or missing API key |
| 403 | ACCOUNT_BLOCKED | Account suspended by admin |
| 400 | BAD_ACTION / service_id/email_id is required | Missing params or unknown action |
| 402 | Insufficient balance. Need: X — Have: Y | Balance too low |
| 404 | Service not available / No stock available / Email activation not found | Service issue or wrong email_id |
| 500 | API connection error / No email available / Database error | Provider or DB failure |
| 503 | Email service not configured / disabled | Admin config issue |
| 200 | — | Success on all actions |
| 202 | Waiting for code... | getEmailCode: OTP not arrived yet — keep polling |
| 300 | Cancelled | Activation was cancelled |