API
A JSON API over HTTPS. Send your API key in the Authorization header. Prices, refunds and the 20 minute countdown are the same as on the website.
Base address
https://today-sms.com/api/v1
Authentication
Header Authorization: Bearer YOUR_API_KEY. Create the key on the API key page after your first top-up. Up to 300 requests per minute.
curl https://today-sms.com/api/v1/balance \ -H "Authorization: Bearer YOUR_API_KEY"
GET /balance
Your balance in USD.
Example response
{
"balance": "42.5000",
"currency": "USD"
}GET /apps
Apps with numbers now: code, name, lowest price, countries.
Example response
[
{ "app": "telegram", "name": "Telegram", "from": "0.4515", "countries": 61 }
]GET /prices?app=telegram
Countries for one app, cheapest first: country code, ISO code, price, available numbers.
Example response
[
{ "country": "indonesia", "iso": "id", "price": "0.4515", "stock": 702866 }
]POST /numbers {"app":"telegram","country":"indonesia"}
Buys a number. The price is taken from your balance.
Example response
{
"id": 1042,
"phone": "+6281234567890",
"price": "0.4515",
"status": "waiting",
"expires_at": "2026-10-14T09:20:00Z"
}GET /numbers/{id}
Status and every SMS received so far.
Example response
{
"id": 1042,
"status": "received",
"sms": [ { "code": "482913", "text": "Your code is 482913", "at": "2026-10-14T09:02:11Z" } ]
}POST /numbers/{id}/cancel
Cancels a number with no SMS, 120 seconds after buying. Full refund.
Example response
{
"id": 1042,
"status": "canceled",
"refunded": "0.4515"
}POST /numbers/{id}/finish
Closes a number after you got the code.
Example response
{
"id": 1042,
"status": "finished"
}Statuses
| waiting | Number ready, no SMS yet |
| received | At least one SMS arrived |
| finished | Closed after a code |
| canceled | Canceled, refunded |
| expired | No SMS in time, refunded |
| checking | Supplier answer unclear; refunded at the end of the countdown if no number appears |
Errors
Errors return a non 2xx status and a JSON body with an error code.
{
"error": "not_enough_balance"
}| unauthorized | Missing or wrong API key |
| not_allowed | The API opens after your first top-up |
| bad_request | A required field is missing or wrong |
| no_numbers | No numbers for this app and country right now |
| not_enough_balance | Top up first |
| too_many_open | Too many open numbers; finish or cancel some |
| too_early | Cancel is allowed 120 seconds after buying |
| has_sms | An SMS arrived; the number cannot be canceled |
| not_found | No such number on your account |
| try_again | The supplier did not confirm the cancel; try again in a minute |
| rate_limited | Too many requests in a minute |