TODAY SMS

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

waitingNumber ready, no SMS yet
receivedAt least one SMS arrived
finishedClosed after a code
canceledCanceled, refunded
expiredNo SMS in time, refunded
checkingSupplier 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"
}
unauthorizedMissing or wrong API key
not_allowedThe API opens after your first top-up
bad_requestA required field is missing or wrong
no_numbersNo numbers for this app and country right now
not_enough_balanceTop up first
too_many_openToo many open numbers; finish or cancel some
too_earlyCancel is allowed 120 seconds after buying
has_smsAn SMS arrived; the number cannot be canceled
not_foundNo such number on your account
try_againThe supplier did not confirm the cancel; try again in a minute
rate_limitedToo many requests in a minute