The future of
OTP verification.
Integrate the world's most reliable virtual, premium (call + SMS), Telegram VIP, long-term rental & email OTP API — with prices in any currency.
Every request — temp number or rental — must include your API Key in the query string.
Every response is JSON, except the Premium (Call + SMS) handler which uses a short plain-text protocol (shown below). The endpoints use slightly different envelopes, so check which one you're calling:
SMS OTP API — /stubs/handler_api.php
SUCCESSRental API — /stubs/rental-handler.php
SUCCESSTelegram VIP API — /stubs/telegram_handler.php
Premium (Call + SMS) API — /stubs/premium-handler.php
HTTP status codes are meaningful on both endpoints too (401 bad key, 402 insufficient balance, 404 not found, 502 upstream error) — but always check the JSON body (success or status) first, not just the HTTP code.
All prices and balances are in PKR by default. Add the optional currency parameter to any request to receive amounts converted into another currency. The rates are the same ones used by the website currency converter and are refreshed automatically. Use Get Currencies to see the supported codes.
How it works
| Case | Behaviour |
|---|---|
| currency missing / empty / PKR | Nothing changes — amounts are returned in PKR exactly as before. |
| currency=USD (valid code) | Amounts in the response are converted to that currency. Codes are case-insensitive. |
| Unknown code | Actions that return amounts reply with an error (BAD_CURRENCY on the SMS OTP and Premium handlers, status 400 on the JSON endpoints). Actions that carry no amounts ignore the parameter, so a typo can never block a cancel or refund. |
| Decimals | PKR amounts keep 2 decimals. Converted amounts use 4 decimals so small prices stay accurate. |
| Charging | Display only. Your wallet is always charged, refunded and held in PKR; the converted figure is what the PKR amount is worth at the current rate. |
Works on
getBalance, getServices / getCountries, getPrice and the purchase actions of every endpoint: SMS OTP, Premium, Telegram VIP, Rentals and Email OTP.
Examples
Lists every currency you can pass as ¤cy=, sorted A-Z by name, with the rate of 1 PKR in that currency. The same action exists on every endpoint (handler_api.php, premium-handler.php, telegram_handler.php, rental-handler.php, email-handler.php).
$res = json_decode(file_get_contents($url), true);
foreach ($res['data']['currencies'] as $c) echo $c['code'] . ' ' . $c['rate'] . "\n";
r = requests.get("https://smsfeel.com/stubs/handler_api.php", params={"api_key": "YOUR_KEY", "action": "getCurrencies"}).json()
print([c["code"] for c in r["data"]["currencies"]])
On the other four handlers the same body is returned without the success/data wrapper: { "status": "200", "default": "PKR", "count": 147, "currencies": [ ... ] }
Check your account balance in PKR (add ¤cy=XXX for another currency — see Currency) by entering this URL in your browser.
$url = 'https://smsfeel.com/stubs/handler_api.php?api_key=' . $apiKey . '&action=getBalance';
$res = json_decode(file_get_contents($url), true);
echo $res['data']['balance'];
url = "https://smsfeel.com/stubs/handler_api.php"
params = {"api_key": "YOUR_KEY", "action": "getBalance"}
print(requests.get(url, params=params).json())
Lists every server type (1-6) and whether it's currently active — check this before assuming a given type value has any countries/services behind it.
$url = 'https://smsfeel.com/stubs/handler_api.php?api_key=' . $apiKey . '&action=getServers';
$res = json_decode(file_get_contents($url), true);
foreach ($res['data'] as $s) { echo $s['name'] . ' — ' . ($s['active'] ? 'active' : 'inactive') . PHP_EOL; }
url = "https://smsfeel.com/stubs/handler_api.php"
params = {"api_key": "YOUR_KEY", "action": "getServers"}
print(requests.get(url, params=params).json())
{ "type": "1", "name": "Server 1", "active": true },
{ "type": "2", "name": "Server 2", "active": true },
{ "type": "5", "name": "Server 5", "active": true },
{ "type": "6", "name": "Server 6", "active": false }
] }
List all available countries for temp numbers. You can filter by server type (1-6). See Get Servers below to discover which types are currently active.
$url = 'https://smsfeel.com/stubs/handler_api.php?api_key=' . $apiKey . '&action=getCountries&type=1';
$res = json_decode(file_get_contents($url), true);
print_r($res['data']);
url = "https://smsfeel.com/stubs/handler_api.php"
params = {"api_key": "YOUR_KEY", "action": "getCountries", "type": "1"}
print(requests.get(url, params=params).json())
"success": true,
"action": "getCountries",
"data": {
"1": [{"id": "1", "name": "Russia"}, ...],
"2": [{"id": "1", "name": "USA"}, ...]
}
}
Get available services for a specific country and provider.
$url = 'https://smsfeel.com/stubs/handler_api.php?api_key=' . $apiKey . '&action=getServices&country=1&type=1';
$res = json_decode(file_get_contents($url), true);
print_r($res['data']);
url = "https://smsfeel.com/stubs/handler_api.php"
params = {"api_key": "YOUR_KEY", "action": "getServices", "country": "1", "type": "1"}
print(requests.get(url, params=params).json())
"success": true,
"action": "getServices",
"data": [
{ "id": "12", "name": "Telegram", "price": "45.00" },
{ "id": "13", "name": "WhatsApp", "price": "60.00" }
]
}
Price of ONE service — exactly what getNumber would charge — without buying. Add ¤cy=XXX for another currency.
| Parameter | Required | Description |
|---|---|---|
| service | Required | Service ID from Services |
| country | Required | Country ID from Countries |
| type | Optional | Server type 1-6 (default 1) |
| currency | Optional | Return amounts in this currency instead of PKR — see Currency |
$url = 'https://smsfeel.com/stubs/handler_api.php?api_key=' . $apiKey . '&action=getPrice&service=$SERVICE_ID&country=$COUNTRY_ID&type=$PROVIDER_ID';
$res = json_decode(file_get_contents($url), true);
echo $res['data']['price'];
url = "https://smsfeel.com/stubs/handler_api.php"
params = {"api_key": "YOUR_KEY", "action": "getPrice", "service": "$SERVICE_ID", "country": "$COUNTRY_ID", "type": "$PROVIDER_ID"}
print(requests.get(url, params=params).text)
Order a new phone number to receive SMS. This will deduct PKR from your balance.
| Parameter | Type | Description |
|---|---|---|
| service | string | Service id from Get Services |
| country | int | Country/server id from Get Countries |
| type | int | Server type (1-6), default 1 |
$url = 'https://smsfeel.com/stubs/handler_api.php?api_key=' . $apiKey . '&action=getNumber&service=$SERVICE_ID&country=$COUNTRY_ID&type=$PROVIDER_ID';
$res = json_decode(file_get_contents($url), true);
if ($res['success']) { echo $res['data']['phone']; }
url = "https://smsfeel.com/stubs/handler_api.php"
params = {"api_key": "YOUR_KEY", "action": "getNumber", "service": "1", "country": "1", "type": "1"}
print(requests.get(url, params=params).json())
"success": true,
"action": "getNumber",
"data": { "order_id": "a1b2c3...", "phone": "923001234567", "price": "45.00" }
}
Check if an SMS has been received for an order ID.
$url = 'https://smsfeel.com/stubs/handler_api.php?api_key=' . $apiKey . '&action=getStatus&id=YOUR_ORDER_ID';
$res = json_decode(file_get_contents($url), true);
echo $res['data']['status'];
url = "https://smsfeel.com/stubs/handler_api.php"
params = {"api_key": "YOUR_KEY", "action": "getStatus", "id": "YOUR_ORDER_ID"}
print(requests.get(url, params=params).json())
Cancel an activation for a refund or complete a successful one.
$url = 'https://smsfeel.com/stubs/handler_api.php?api_key=' . $apiKey . '&action=setStatus&id=YOUR_ORDER_ID&status=8';
$res = json_decode(file_get_contents($url), true);
echo $res['data']['status'];
url = "https://smsfeel.com/stubs/handler_api.php"
params = {"api_key": "YOUR_KEY", "action": "setStatus", "id": "YOUR_ORDER_ID", "status": "8"}
print(requests.get(url, params=params).json())
| Status Code | Meaning |
|---|---|
| 3 / 6 | Complete Activation (Success — only once an SMS/code has been received) |
| 8 | Cancel and Refund (only allowed 2 minutes after purchase) |
Long-term numbers you keep for weeks or months, instead of a single OTP. This is a separate endpoint from the SMS OTP API above — same api_key, different base URL and a different response shape.
Every response here uses a status string ("200" for success, an error code otherwise) rather than the success/data shape used by the SMS OTP API:
List all countries available for long-term number rentals.
$url = 'https://smsfeel.com/stubs/rental-handler.php?api_key=' . $apiKey . '&action=getRentalCountries';
$data = json_decode(file_get_contents($url), true);
foreach ($data['countries'] as $c) { echo $c['name'] . ' (' . $c['country_code'] . ')' . PHP_EOL; }
url = "https://smsfeel.com/stubs/rental-handler.php"
params = {"api_key": "YOUR_KEY", "action": "getRentalCountries"}
print(requests.get(url, params=params).json())
{"id":"1","provider":"1","name":"Canada","country_code":"ca"},
{"id":"3","provider":"1","name":"United States of America","country_code":"us"}
]}
Get all available duration/price tiers for a country.
| Parameter | Required |
|---|---|
| country_code | Yes |
$url = 'https://smsfeel.com/stubs/rental-handler.php?api_key=' . $apiKey . '&action=getRentalPricing&country_code=us';
$data = json_decode(file_get_contents($url), true);
foreach ($data['pricing'] as $p) { echo $p['duration_hours'] . 'h — ' . $p['price'] . ' PKR' . PHP_EOL; }
url = "https://smsfeel.com/stubs/rental-handler.php"
params = {"api_key": "YOUR_KEY", "action": "getRentalPricing", "country_code": "us"}
print(requests.get(url, params=params).json())
{"id":"7","duration_hours":"720","price":"2520.00","country_name":"United States of America"},
{"id":"8","duration_hours":"4320","price":"15120.00","country_name":"United States of America"}
]}
Live stock check for a country before buying.
| Parameter | Required |
|---|---|
| country_code | Yes |
$url = 'https://smsfeel.com/stubs/rental-handler.php?api_key=' . $apiKey . '&action=getAvailableRentals&country_code=us';
echo file_get_contents($url);
url = "https://smsfeel.com/stubs/rental-handler.php"
params = {"api_key": "YOUR_KEY", "action": "getAvailableRentals", "country_code": "us"}
print(requests.get(url, params=params).json())
{"area_code":"us","area_title":"United States of America","available":3338,"min_month":1}
]}
Purchase a phone number for rental. Check getRentalPricing first to confirm a valid duration_hours.
| Parameter | Required |
|---|---|
| country_code | Yes |
| duration_hours | Yes — 720, 4320 or 8640 |
$url = 'https://smsfeel.com/stubs/rental-handler.php?api_key=' . $apiKey . '&action=rentNumber&country_code=us&duration_hours=720';
$data = json_decode(file_get_contents($url), true);
if ($data['status'] == '200') { echo 'Phone: ' . $data['phone'] . PHP_EOL . 'Order ID: ' . $data['order_id']; }
url = "https://smsfeel.com/stubs/rental-handler.php"
params = {"api_key": "YOUR_KEY", "action": "rentNumber", "country_code": "us", "duration_hours": "720"}
print(requests.get(url, params=params).json())
"phone":"3434337545","order_id":"2673093356180000583","server":"Server 1",
"duration_hours":720,"price_paid":"2520.00","new_balance":"4220.00",
"expires":"2026-10-02 21:55:55"}
List all your rented numbers. Use order_id to fetch SMS. Use id to renew.
$url = 'https://smsfeel.com/stubs/rental-handler.php?api_key=' . $apiKey . '&action=getMyRentals';
$data = json_decode(file_get_contents($url), true);
foreach ($data['rentals'] as $r) { echo $r['phone_number'] . ' | ' . $r['status'] . PHP_EOL; }
url = "https://smsfeel.com/stubs/rental-handler.php"
params = {"api_key": "YOUR_KEY", "action": "getMyRentals"}
print(requests.get(url, params=params).json())
"id":"27","server":"Server 1","phone_number":"3434337545",
"order_id":"2673093356180000583","status":"active",
"country_code":"us","country_name":"United States of America",
"duration_hours":"720","price_paid":"2520.00","expiry_time":"2026-10-02 21:55:55"
}]}
Fetch all SMS messages received on a rented number. Use order_id from rentNumber or getMyRentals.
| Parameter | Required |
|---|---|
| order_id | Yes |
$url = 'https://smsfeel.com/stubs/rental-handler.php?api_key=' . $apiKey . '&action=getRentalSMS&order_id=YOUR_ORDER_ID';
$data = json_decode(file_get_contents($url), true);
foreach ($data['messages'] as $msg) { echo 'Code: ' . $msg['code'] . ' | Text: ' . $msg['text'] . PHP_EOL; }
url = "https://smsfeel.com/stubs/rental-handler.php"
params = {"api_key": "YOUR_KEY", "action": "getRentalSMS", "order_id": "YOUR_ORDER_ID"}
print(requests.get(url, params=params).json())
"from":"Server 1","text":"Your WhatsApp code 740-279","code":"740279","timestamp":"2026-09-02T20:57:32Z"
}]}
Extend the rental period on an active number. Use id from getMyRentals as rental_id.
| Parameter | Required |
|---|---|
| rental_id | Yes — the id field from getMyRentals |
| duration_hours | Yes |
$url = 'https://smsfeel.com/stubs/rental-handler.php?api_key=' . $apiKey . '&action=renewRental&rental_id=27&duration_hours=720';
$data = json_decode(file_get_contents($url), true);
if ($data['status'] == '200') { echo 'New expiry: ' . $data['new_expiry']; }
url = "https://smsfeel.com/stubs/rental-handler.php"
params = {"api_key": "YOUR_KEY", "action": "renewRental", "rental_id": "27", "duration_hours": "720"}
print(requests.get(url, params=params).json())
"phone_number":"3434337545","duration_hours":720,
"price_paid":"2520.00","new_balance":"1700.00","new_expiry":"2027-04-02 21:55:55"}
Cancel an active rental for a refund — only available within 20 minutes of purchase. This actually cancels the number with the upstream provider (not just a local flag) — the refund only happens once that succeeds. Use id from getMyRentals as rental_id.
| Parameter | Required |
|---|---|
| rental_id | Yes — the id field from getMyRentals |
$url = 'https://smsfeel.com/stubs/rental-handler.php?api_key=' . $apiKey . '&action=cancelRental&rental_id=27';
$data = json_decode(file_get_contents($url), true);
if ($data['status'] == '200') { echo 'Refunded: ' . $data['refunded']; }
url = "https://smsfeel.com/stubs/rental-handler.php"
params = {"api_key": "YOUR_KEY", "action": "cancelRental", "rental_id": "27"}
print(requests.get(url, params=params).json())
"refunded":"2520.00","new_balance":"4220.00"}
Numbers for Telegram verification, one product per country. JSON responses of the form { "status": "200", ... }. Prices are PKR by default (optional currency — see Currency).
| Action | Parameters | Purpose |
|---|---|---|
| getBalance | — | Wallet balance |
| getCurrencies | — | Currency codes + rates |
| getCountries | — | Countries with price and stock |
| getPrice | country | Price of one country |
| getNumber | country | Buy a number |
| getStatus | order_id | Poll for the code (200 / 300 / 410) |
| setStatus | order_id, status=8 | Cancel + refund |
200 code received · 300 still waiting · 410 order closed (cancelled / expired — refunded). A refund is given only after the cancel is confirmed, and an order whose code has arrived cannot be cancelled (409).
All countries with price and stock status.
| Parameter | Required | Description |
|---|---|---|
| currency | Optional | Return amounts in this currency instead of PKR — see Currency |
$url = 'https://smsfeel.com/stubs/telegram_handler.php?api_key=' . $apiKey . '&action=getCountries';
$res = json_decode(file_get_contents($url), true);
print_r($res['countries']);
url = "https://smsfeel.com/stubs/telegram_handler.php"
params = {"api_key": "YOUR_KEY", "action": "getCountries"}
print(requests.get(url, params=params).text)
Price of one country.
| Parameter | Required | Description |
|---|---|---|
| country | Required | Country ID |
| currency | Optional | Return amounts in this currency instead of PKR — see Currency |
$url = 'https://smsfeel.com/stubs/telegram_handler.php?api_key=' . $apiKey . '&action=getPrice&country=7';
$res = json_decode(file_get_contents($url), true);
echo $res['price'];
url = "https://smsfeel.com/stubs/telegram_handler.php"
params = {"api_key": "YOUR_KEY", "action": "getPrice", "country": "7"}
print(requests.get(url, params=params).text)
Buys a number. Not charged when the purchase fails.
| Parameter | Required | Description |
|---|---|---|
| country | Required | Country ID |
| currency | Optional | Return amounts in this currency instead of PKR — see Currency |
$url = 'https://smsfeel.com/stubs/telegram_handler.php?api_key=' . $apiKey . '&action=getNumber&country=7';
$res = json_decode(file_get_contents($url), true);
echo $res['order_id'] . ' ' . $res['phone'];
url = "https://smsfeel.com/stubs/telegram_handler.php"
params = {"api_key": "YOUR_KEY", "action": "getNumber", "country": "7"}
print(requests.get(url, params=params).text)
Poll for the code every 3-5 seconds.
| Parameter | Required | Description |
|---|---|---|
| order_id | Required | order_id from Get Number |
$url = 'https://smsfeel.com/stubs/telegram_handler.php?api_key=' . $apiKey . '&action=getStatus&order_id=YOUR_ORDER_ID';
$res = json_decode(file_get_contents($url), true);
echo $res['status'] == '200' ? $res['code'] : 'waiting';
url = "https://smsfeel.com/stubs/telegram_handler.php"
params = {"api_key": "YOUR_KEY", "action": "getStatus", "order_id": "YOUR_ORDER_ID"}
print(requests.get(url, params=params).text)
Cancels an order and refunds it — only while no code has arrived.
| Parameter | Required | Description |
|---|---|---|
| order_id | Required | order_id |
| status | Required | Only 8 (cancel) is supported |
$url = 'https://smsfeel.com/stubs/telegram_handler.php?api_key=' . $apiKey . '&action=setStatus&order_id=YOUR_ORDER_ID&status=8';
$res = json_decode(file_get_contents($url), true);
echo $res['message'];
url = "https://smsfeel.com/stubs/telegram_handler.php"
params = {"api_key": "YOUR_KEY", "action": "setStatus", "order_id": "YOUR_ORDER_ID", "status": "8"}
print(requests.get(url, params=params).text)
Temporary email addresses for OTP verification. A third, separate endpoint from SMS OTP and Rental — same api_key, own base URL and response shape.
Every request needs api_key, action, and server (1 or 2, default 1):
| Server | Flow |
|---|---|
| 1 | Service-based — e.g. Instagram/Telegram codes on gmail.com. Needs service_id + domain. |
| 2 | Domain-based — e.g. gmail.com, mail.com, gmx.com. Needs domain + site. Supports reorderEmail for a fresh code on the same mailbox. |
Response shape, same convention as Rental:
200 success · 202 still waiting · 300 cancelled · anything else is an error.
Server 1: services available for a domain. Server 2: domains available for a site.
$url = 'https://smsfeel.com/stubs/email-handler.php?api_key=' . $apiKey . '&action=getEmailServices&server=1&domain=gmail.com';
$data = json_decode(file_get_contents($url), true);
foreach ($data['services'] as $s) { echo $s['service_name'] . ' — ' . $s['price'] . PHP_EOL; }
url = "https://smsfeel.com/stubs/email-handler.php"
params = {"api_key": "YOUR_KEY", "action": "getEmailServices", "server": "1", "domain": "gmail.com"}
print(requests.get(url, params=params).json())
Price of ONE email product — exactly what buyEmail would charge — without buying.
| Parameter | Required | Description |
|---|---|---|
| server | Optional | 1 or 2 (default 1) |
| service_id | Optional | Server 1 only |
| domain | Optional | Domain (required for Server 2) |
| currency | Optional | Return amounts in this currency instead of PKR — see Currency |
$url = 'https://smsfeel.com/stubs/email-handler.php?api_key=' . $apiKey . '&action=getPrice&server=1&service_id=ig&domain=gmail.com';
$res = json_decode(file_get_contents($url), true);
echo $res['price'];
url = "https://smsfeel.com/stubs/email-handler.php"
params = {"api_key": "YOUR_KEY", "action": "getPrice", "server": "1", "service_id": "ig", "domain": "gmail.com"}
print(requests.get(url, params=params).text)
Server 1 needs service_id + domain. Server 2 needs domain + site.
$url = 'https://smsfeel.com/stubs/email-handler.php?api_key=' . $apiKey . '&action=buyEmail&server=1&service_id=ig&domain=gmail.com';
$data = json_decode(file_get_contents($url), true);
if ($data['status'] == '200') { echo 'Email: ' . $data['email'] . ' | ID: ' . $data['email_id']; }
url = "https://smsfeel.com/stubs/email-handler.php"
params = {"api_key": "YOUR_KEY", "action": "buyEmail", "server": "1", "service_id": "ig", "domain": "gmail.com"}
print(requests.get(url, params=params).json())
| Parameter | Server 1 | Server 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 — site you're registering on (e.g. telegram.com) |
Poll every 5–10 seconds after buying to retrieve the verification code.
$url = 'https://smsfeel.com/stubs/email-handler.php?api_key=' . $apiKey . '&action=getEmailCode&email_id=7291834';
for ($i=0; $i<24; $i++) {
$data = json_decode(file_get_contents($url), true);
if ($data['status']=='200') { echo 'Code: ' . $data['messages'][0]['code']; break; }
sleep(5);
}
url = "https://smsfeel.com/stubs/email-handler.php"
params = {"api_key": "YOUR_KEY", "action": "getEmailCode", "email_id": "7291834"}
print(requests.get(url, params=params).json())
Cancel an activation. If a code already arrived, this completes it instead. If still waiting, it cancels and refunds.
$url = 'https://smsfeel.com/stubs/email-handler.php?api_key=' . $apiKey . '&action=cancelEmail&email_id=7291834';
echo file_get_contents($url);
url = "https://smsfeel.com/stubs/email-handler.php"
params = {"api_key": "YOUR_KEY", "action": "cancelEmail", "email_id": "7291834"}
print(requests.get(url, params=params).json())
Request a fresh code on the same mailbox — the order stays open, it does not close/finish it. Only for Server 2 emails that already received a code. After a successful reorder the order flips back to "waiting" so you can poll getEmailCode again.
$url = 'https://smsfeel.com/stubs/email-handler.php?api_key=' . $apiKey . '&action=reorderEmail&server=2&email_id=7291834';
echo file_get_contents($url);
url = "https://smsfeel.com/stubs/email-handler.php"
params = {"api_key": "YOUR_KEY", "action": "reorderEmail", "server": "2", "email_id": "7291834"}
print(requests.get(url, params=params).json())
Retrieve your past email purchases. Paginated, 20 per page.
$url = 'https://smsfeel.com/stubs/email-handler.php?api_key=' . $apiKey . '&action=getEmailHistory&page=1';
$data = json_decode(file_get_contents($url), true);
foreach ($data['history'] as $h) { echo $h['email_address'] . ' | ' . $h['status'] . PHP_EOL; }
url = "https://smsfeel.com/stubs/email-handler.php"
params = {"api_key": "YOUR_KEY", "action": "getEmailHistory", "page": "1"}
print(requests.get(url, params=params).json())
Error Codes
SMS OTP API — /stubs/handler_api.php
| Code | Description |
|---|---|
| BAD_KEY | Missing or invalid API key. |
| ACCOUNT_BLOCKED | This account is suspended. |
| BAD_ACTION | Missing or unrecognized action. |
| BAD_COUNTRY / BAD_SERVICE / BAD_TYPE / BAD_ID / BAD_STATUS | A required parameter is missing, invalid, or has no matching record. |
| BAD_CURRENCY | Unknown currency code — see Get Currencies. |
| NO_SERVICE | getPrice: service not found for this country/type. |
| NO_BALANCE | Insufficient wallet balance for this purchase. |
| NO_WALLET | No wallet record found for this account. |
| NO_ACTIVATION | No activation found for this id on this account. |
| EARLY_CANCEL_DENIED | Numbers can only be cancelled 2 minutes after purchase. |
| NO_SMS_RECEIVED | Cannot finish the order — no SMS/code received yet. |
| STATUS_ALREADY_CHANGED | This activation was already finalized (finished or cancelled). |
| PROVIDER_NOT_CONFIGURED | The selected server has no credentials configured on this account. |
| ERROR_PROVIDER_1-4 | The upstream server returned an error — see message for details. |
Rental API — /stubs/rental-handler.php
| status | message | When it happens |
|---|---|---|
| 401 | Invalid API key / API key is required. | Missing or invalid api_key |
| 403 | Account is blocked or inactive. | Account suspended |
| 400 | Unknown action / a required param is missing / invalid currency / Cancel window expired. | Bad or missing action, country_code, duration_hours, etc. — or cancelRental called more than 20 minutes after purchase |
| 402 | Insufficient balance. | Wallet balance too low |
| 404 | No pricing found… / Rental not found… | No pricing for that country/duration, or wrong rental_id/order_id |
| 503 | Server 1 is currently unavailable/disabled. | Rentals switched off in admin settings |
| 502 | Server 1 error: … | Upstream error — see message |
| 500 | Database error: … | DB transaction failed — balance not deducted |
Email OTP API — /stubs/email-handler.php
| status | When it happens |
|---|---|
| 401 | Invalid or missing API key |
| 403 | Account suspended by admin |
| 400 | Missing/unknown action, or a required param (service_id, domain, email_id) is missing |
| 402 | Insufficient balance |
| 404 | Service/domain not available, or email activation not found |
| 500 | Server 1/2 connection error, or database error |
| 503 | Email service not configured or disabled |
| 200 | Success on all actions |
| 202 | getEmailCode: still waiting — keep polling |
| 300 | Activation was cancelled (by you or by the provider) |
Premium API — /stubs/premium-handler.php
| Response | Meaning |
|---|---|
| BAD_KEY / ACCOUNT_BLOCKED | Invalid API key / account suspended |
| BAD_ACTION / BAD_ID / BAD_SERVER / BAD_SERVICE / BAD_STATUS | Missing or invalid parameter (BAD_STATUS on setStatus 8 also means a code already arrived or the cancel could not be confirmed) |
| BAD_CURRENCY | Unknown currency code |
| LOW_BALANCE | Insufficient wallet balance |
| NO_NUMBERS / NO_SERVERS / NO_SERVICES / NO_SERVICE | Nothing available right now (you are not charged) |
| NO_ACTIVATION | No order with this id on this account |
| NO_SMS_RECEIVED | Cannot finish — no code yet |
| PROVIDER_NOT_CONFIGURED / PROVIDER_UNAVAILABLE | Premium is switched off or temporarily unreachable |
Telegram VIP API — /stubs/telegram_handler.php
| status | When it happens |
|---|---|
| 401 / 403 | Invalid or missing API key / account blocked |
| 400 | Unknown action, missing parameter or invalid currency |
| 402 | Insufficient balance |
| 404 | Country or order not found |
| 409 | Out of stock (getNumber) · code already received / order already closed (setStatus) |
| 410 | getStatus: order cancelled or expired (refunded) |
| 502 / 503 | Purchase failed (not charged) / service unavailable / cancel could not be confirmed yet — retry |