JSON · HTTPS · Bearer key
Receive verification codes and send SMS with one SMS API
The TODAY SMS API is a developer API that combines an SMS verification API for receiving codes on one-time numbers and an SMS sending API for sending to 227 countries, with one API key and one balance. Every request and response is JSON, and prices and refund rules are the same as on the website.
$ curl -X POST https://today-sms.com/api/v1/numbers \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"app":"telegram","country":"indonesia"}'
{
"id": "N-7K2M-QX4P-9D3A",
"phone": "+6281234567890",
"price": "0.4515",
"status": "waiting",
"expires_at": "2026-10-18T09:20:00.000Z"
}
$ curl https://today-sms.com/api/v1/numbers/N-7K2M-QX4P-9D3A \
-H "Authorization: Bearer YOUR_API_KEY"
{
"id": "N-7K2M-QX4P-9D3A",
"status": "received",
"sms": [
{ "code": "482913", "text": "Your code is 482913", "at": "2026-10-18T09:02:11.000Z" }
]
}
$ curl -X POST https://today-sms.com/api/v1/messages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"to":["+14155550100","+447700900123"],"text":"Your code is 482913"}'
{
"id": "m_7Q2K9X",
"status": "queued",
"recipients": 2,
"parts": 1,
"encoding": "GSM-7",
"cost": "0.0136"
}
$ curl https://today-sms.com/api/v1/messages/m_7Q2K9X \
-H "Authorization: Bearer YOUR_API_KEY"
- 300 requests per minute
- One key to receive and send
- Failed or unreceived refunded to balance
- Top up with 12 crypto methods
What you can do with the SMS API
SMS verification API
Choose an app and country, buy a number and poll its status to get the verification code. If no SMS arrives, the full amount goes back to your balance when the time is up.
SMS sending API
Send your message to up to 1,000 recipients at once and get a delivery report for each recipient. Add a scheduled time to send it then.
Prices and stock API
Get countries and prices per app, number counts and the price per SMS for each country through the API, and show them as they are in your own service.
One balance
Receiving and sending use the same balance. Top it up with USDT and check it any time through the API.
Methods at a glance
Full docs| Method | What it does |
|---|---|
| GET/balance | Get balance |
| GET/apps | List apps |
| GET/prices?app=telegram | Countries and prices for an app |
| POST/numbers | Buy a number |
| GET/numbers/{id} | Number status and SMS |
| POST/numbers/{id}/cancel | Cancel a number |
| POST/numbers/{id}/finish | Finish a number |
| GET/messages/prices | SMS prices by country |
| POST/messages | Send SMS |
| GET/messages/{id} | Sending status and delivery reports |
| POST/messages/{id}/cancel | Cancel a scheduled send |
What is an SMS API?
An SMS API is a connection that lets your software receive or send SMS with HTTP requests. Code does what a person would click on a web screen, so repeated tasks such as automated sign-up tests, sending verification codes and order alerts run without anyone lifting a finger.
The TODAY SMS API offers two things together. One is an SMS verification API (SMS activation API) for receiving app verification codes on one-time numbers, and the other is an SMS sending API for sending SMS to mobile phones worldwide. Both use the same URL, the same API key and the same balance, so there is no separate sign-up or top-up.
How do I use the SMS verification API?
It takes four steps. Pick an app code with GET /apps and see countries and prices with GET /prices?app=CODE. Buy a number with POST /numbers to get the number and its id, then call GET /numbers/{id} every few seconds to check whether the code has arrived. Once you have the code, close the number with POST /numbers/{id}/finish.
Each number waits 20 minutes for SMS, and SMS to the same number in that time cost nothing extra. If no SMS arrives, the full amount goes back to your balance when the time is up, and if nothing has arrived you can cancel yourself with POST /numbers/{id}/cancel from 120 seconds after purchase. When you need app verification automation or a bulk virtual number API, just repeat this flow.
How do I use the SMS sending API?
Send a recipient list (to) and message text (text) to POST /messages and you get back the message id, number of recipients, number of parts and total cost. Enter recipients in international format with + and the country code, up to 1,000 per request. To schedule, put a UTC time in at.
After sending, check the delivery report for each recipient with GET /messages/{id}. There are four statuses: pending, sent, delivered and failed, and the amount for parts that end as failed is added to refunded and returned to your balance. Cancel a scheduled send that has not gone out yet with POST /messages/{id}/cancel.
Use the same method to send verification codes (OTP). Each code counts as one SMS with no separate verification fee, and you can get the price per SMS for each country with GET /messages/prices to work out your costs.
What should I look for in an affordable SMS API?
Look at the total you actually pay, not just the price per SMS on the price list. TODAY SMS has no monthly fee and takes only the parts you send, and failed parts and verification codes that never arrived are refunded to your balance.
Next, look at key management and limits. You get one API key per account and can create a new one any time, which blocks the old key right away. Requests are allowed up to 300 per minute, plenty for most automation. Finally, look at payment. You can top up with 12 crypto methods including USDT, USDC and BTC without a card, so you can start right away from any country.
How do I get an API key?
Create an account, and once your first top-up is credited you can create a key on the API key page. The key is shown only once when you create it, so store it somewhere safe. Send it with every request in the Authorization: Bearer header.
If you think your key has leaked, create a new key on the API key page. The old key stops working right away. Anyone with your key can buy numbers or send SMS with your balance, so never put it in browser code or a public repository.
Connect the SMS API today
Sign-up takes just one token. Once your first top-up is credited, create an API key, paste a sample from the docs and send your first request.