API для SMS-активации
Два варианта: эндпоинт, совместимый с протоколом sms-activate, чтобы существующее ПО переходило заменой URL и ключа, и JSON REST API для новых интеграций. Оба используют один и тот же API-ключ из вашей панели.
Получите API-ключ
Создайте аккаунт, откройте панель и сгенерируйте ключ в разделе «Доступ к API». Храните его в секрете: любой, у кого есть ключ, может тратить ваш баланс.
РегистрацияТипичный сценарий
- Вызовите getNumber с сервисом и страной.
- Используйте номер в целевом приложении.
- Опрашивайте getStatus каждые несколько секунд, пока не получите STATUS_OK.
- Вызовите setStatus с 6 для завершения или с 8 для отмены, если код не пришёл.
Эндпоинт, совместимый с sms-activate
Отправляйте GET- или POST-запросы с параметрами api_key и action. Ответы — простой текст, в точности как у sms-activate.
https://smsrota.com/stubs/handler_api.php?api_key=KEY&action=getNumber&service=wa&country=187
Действия
| Действие | Параметры | Ответ |
|---|---|---|
| getBalance | — | ACCESS_BALANCE:12.5000 |
| getPrices | service?, country? | {"187":{"wa":{"cost":0.4,"count":1563}}} |
| getNumber | service, country, maxPrice? | ACCESS_NUMBER:48151623:15550123456 |
| getStatus | id | STATUS_WAIT_CODE · STATUS_WAIT_RETRY:code · STATUS_OK:code · STATUS_CANCEL |
| setStatus | id, status | ACCESS_RETRY_GET · ACCESS_ACTIVATION · ACCESS_CANCEL |
| getRentNumber | service, country, rent_time (4/24/72/168/720) | {"status":"success","phone":{"id":31,"endDate":"…","number":"447700900001"}} |
| getRentStatus | id | {"status":"success","quantity":"1","values":{"0":{"phoneFrom":"WhatsApp","text":"…"}}} |
| setRentStatus | id, status (1 = finish, 2 = cancel) | {"status":"success"} |
| continueRentNumber | id, rent_time | {"status":"success","phone":{…}} |
Значения setStatus
- 3
- Запросить ещё один код на тот же номер
- 6
- Завершить активацию
- 8
- Отменить и вернуть деньги (через две минуты после покупки)
JSON REST API
Передавайте ключ в заголовке Authorization как "Bearer KEY". Суммы — строки в долларах США с четырьмя знаками после запятой.
GET https://smsrota.com/v1/balance
GET https://smsrota.com/v1/prices?service=wa
POST https://smsrota.com/v1/activations {"service":"wa","country":"187"}
GET https://smsrota.com/v1/activations/:id
POST https://smsrota.com/v1/activations/:id/retry
POST https://smsrota.com/v1/activations/:id/complete
POST https://smsrota.com/v1/activations/:id/cancel
GET https://smsrota.com/v1/rent/prices?service=wa&hours=24
POST https://smsrota.com/v1/rentals {"service":"full","country":"16","hours":24}
GET https://smsrota.com/v1/rentals/:id
POST https://smsrota.com/v1/rentals/:id/extend {"hours":24}
POST https://smsrota.com/v1/rentals/:id/finish
POST https://smsrota.com/v1/rentals/:id/cancel
POST https://smsrota.com/v1/rentals/:id/dispute {"reason":"no_sms"}
PUT https://smsrota.com/v1/webhook {"url":"https://example.com/sms-webhook"}
POST https://smsrota.com/v1/webhook/test
GET https://smsrota.com/v1/webhook/eventsВебхуки
Укажите URL в разделе «Доступ к API» в панели. Для каждого события мы отправляем POST с телом JSON. Ответьте любым статусом 2xx в течение 10 секунд; иначе повторим через 1, 5, 30, 120, 360 и 720 минут.
- activation.sms_received
- Пришёл код для купленного номера.
- activation.cancelled
- Номер отменён или истёк, и деньги вернулись на баланс.
- rental.sms_received
- На арендованный номер пришло SMS.
- rental.ended
- Аренда закончилась или отменена.
Пример тела
{
"id": "evt_1042",
"type": "activation.sms_received",
"createdAt": "2026-11-01T10:00:00.000Z",
"data": {
"activationId": 48151623,
"service": "wa",
"country": "187",
"phone": "15550123456",
"code": "123456"
}
}Проверка подписи
В каждом запросе есть заголовок X-Webhook-Signature вида t=1730000000,v1=…, где v1 — шестнадцатеричный HMAC-SHA256 от "t.body", вычисленный с вашим секретом подписи. Отклоняйте запрос, если подпись не совпадает или t старше 5 минут.
import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody: the request body exactly as received, before JSON parsing.
function verify(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
return fresh && v1.length === expected.length && timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}Ошибки
- BAD_KEY
- API-ключ неверный или был заменён.
- NO_NUMBERS
- Сейчас нет номеров для этого сервиса и страны.
- NO_BALANCE
- Недостаточно средств на балансе для этого номера.
- EARLY_CANCEL_DENIED
- Отмена возможна через две минуты после покупки.
- NO_ACTIVATION
- Активация с таким id не существует или не принадлежит вам.