Developers Receive SMS codes
from code.
A small REST API: rent a number, poll for the code, done. You pay only when a code arrives; timed-out activations refund automatically, so failed routes cost your scripts nothing. The numbers come from real carrier ranges, so they clear the checks that reject VoIP, which is the difference between this and a general-purpose SMS API.
Base URL and authentication
https://app.mariosms.com/api/v1
Pass your API key (from your profile in the app) in the X-API-Key header, or
as an api_key query parameter. All responses are JSON.
curl -H "X-API-Key: YOUR_KEY" https://app.mariosms.com/api/v1/balance
{ "balance": 100.00 } Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /balance | Get current account balance |
| GET | /countries | List available countries |
| GET | /services | List available services |
| GET | /prices | Get prices for country/service combinations |
| POST | /activation | Create an activation (rent a number). activationType: SMS (default), CALL_VOICE, CALL_FLASH |
| GET | /activation/:id | Get activation details and the SMS code |
| GET | /activations | List all activations (paginated) |
| GET | /activations/active | List active activations |
| POST | /activation/:id/cancel | Cancel an activation and get a refund |
| POST | /activation/:id/complete | Mark an activation as completed |
| GET | /transactions | List transaction history (paginated) |
The core loop
Rent a number for one verification, then poll until the code arrives:
# 1. Rent a US number for a Telegram verification
curl -X POST -H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" \
-d '{"country": "us", "service": "tg"}' \
https://app.mariosms.com/api/v1/activation
{
"id": "507f1f77bcf86cd799439011",
"phone": "12025551234",
"service": "tg",
"country": "us",
"price": 1.32,
"status": "pending",
"activationType": "SMS",
"expiresAt": "2026-08-22T10:55:00Z"
}
# 2. Poll until status is "received"
curl -H "X-API-Key: YOUR_KEY" https://app.mariosms.com/api/v1/activation/507f1f77bcf86cd799439011
{
"status": "received",
"smsCode": "123456",
"smsText": "Your Telegram code is 123456"
}
# 3. Or cancel before an SMS arrives for a full refund
curl -X POST -H "X-API-Key: YOUR_KEY" \
https://app.mariosms.com/api/v1/activation/507f1f77bcf86cd799439011/cancel
{ "message": "activation cancelled", "refund": 1.32 } activationType accepts SMS (default), CALL_VOICE,
and CALL_FLASH; an optional operator field pins a specific
carrier.
Client libraries and tutorials
- Python tutorial: full loop with
requests - Node.js tutorial: native
fetch, zero dependencies - Go tutorial: standard library client with context timeouts
- PHP tutorial: plain cURL, no framework
Compatibility API (handler_api protocol)
For scripts and tools written against the classic protocol used across the industry, MarioSMS exposes a compatibility endpoint. Most legacy integrations migrate with a base-URL change: same actions, same response formats.
https://app.mariosms.com/stubs/handler_api.php
Authentication is the api_key query parameter. Actions:
| Action | Purpose | Response format |
|---|---|---|
getBalance | Account balance | ACCESS_BALANCE:44.60 |
getCountries | List countries with numeric IDs | JSON object keyed by country ID |
getNumbersStatus | Available numbers per service in a country | {"telegram_0": 76, ...} |
getPrices | Prices for all services across countries | JSON: country → service → {count, price} |
getNumber | Rent a number (deducts the price) | ACCESS_NUMBER:activationId:phone |
getStatus | Poll an activation for the code | STATUS_OK:CODE / STATUS_WAIT_CODE / … |
getFullSms | Full SMS text, not just the code | FULL_SMS:[vk] 877613 |
setStatus | Finish (status=6) or cancel (status=8) | ACCESS_ACTIVATION / ACCESS_CANCEL |
Renting and polling, classic style
# Balance
curl "https://app.mariosms.com/stubs/handler_api.php?api_key=KEY&action=getBalance"
ACCESS_BALANCE:44.60
# Rent a Telegram number (country accepts a numeric ID or ISO code)
curl "https://app.mariosms.com/stubs/handler_api.php?api_key=KEY&action=getNumber&country=48&service=tg"
ACCESS_NUMBER:8601705018416664:33774545375
# Voice call instead of SMS: add &activationType=2 (1 = flash call, 0 = SMS default)
# Poll for the code
curl "https://app.mariosms.com/stubs/handler_api.php?api_key=KEY&action=getStatus&id=8601705018416664"
STATUS_OK:877613
# Full SMS text
curl "https://app.mariosms.com/stubs/handler_api.php?api_key=KEY&action=getFullSms&id=8601705018416664"
FULL_SMS:[vk] 877613
# Finish (6) or cancel for refund (8)
curl "https://app.mariosms.com/stubs/handler_api.php?api_key=KEY&action=setStatus&id=8601705018416664&status=8"
ACCESS_CANCEL getStatus responses
| Response | Meaning |
|---|---|
STATUS_OK:CODE | SMS received; CODE is the verification code |
STATUS_WAIT_CODE | Waiting for the SMS |
STATUS_WAIT_RETRY:LASTCODE | Waiting for the next SMS; LASTCODE is the previous code |
STATUS_CANCEL | Activation was cancelled |
Error codes
| Error | Meaning |
|---|---|
BAD_ACTION | Invalid or missing action parameter |
BAD_KEY | Invalid API key |
NO_BALANCE | Insufficient balance to purchase a number |
NO_NUMBERS | No numbers available for this country/service |
NO_ACTIVATION | Activation not found or not owned by you |
TOO_MANY_ACTIVE_RENTALS | Rate limit for active activations exceeded |
Service codes
Both APIs identify services by short codes. The most-used ones:
| Code | Service | Code | Service |
|---|---|---|---|
tg | Telegram | wa | |
go | fb | ||
ig | tw | X (Twitter) | |
lf | TikTok | ds | Discord |
am | Amazon | mm | Microsoft |
mb | Yahoo | oi | Tinder |
ub | Uber | fu | Snapchat |
bw | Signal | ts | PayPal |
vi | Viber | dh | eBay |
vk | VK | tx | Bolt |
wb | ab | Alibaba | |
hx | AliExpress | tn | |
nf | Netflix | mt | Steam |
ya | Yandex | dr | OpenAI |
hb | Twitch | kt | KakaoTalk |
kc | Vinted | ot | Other |
The full live catalog (hundreds of services) with current codes comes from
GET /api/v1/services, and per-country availability from
action=getPrices. Country IDs come from action=getCountries;
the REST API uses ISO codes (us, de, gb) directly.
HTTP status codes
| Status | Meaning |
|---|---|
200 | Success |
400 | Bad request: invalid parameters |
401 | Unauthorized: invalid or missing API key |
402 | Payment required: insufficient balance |
404 | Not found |
429 | Too many requests: rate limit exceeded |
503 | Service unavailable: no numbers available |
Automation is welcome for QA, testing, and accounts you're entitled to create; bulk abuse is not. See the acceptable use policy.