Developer API даёт программный доступ к активациям и аренде виртуальных номеров Simdrop: цены, покупка, получение SMS-кодов, история, баланс и webhook о входящих SMS. Это REST API поверх HTTPS с JSON-телами: понятные строковые статусы, цены в вашей валюте и флаги доступных действий у каждой активации.
Базовый URL
text
https://simdrop.io/api/v1
Быстрый старт
Создайте API-ключ в кабинете (страница «API»). Ключ показывается один раз — сохраните его.
Запросите цены: GET /prices?service=tg — в ответе priceId для каждого ценового уровня.
Купите номер: POST /activations с service, country и priceId (или maxPrice).
Дождитесь кода: укажите webhook в кабинете (придёт POST с кодом) или опрашивайте GET /activations/{id} раз в 3–5 секунд.
Завершите активацию POST /activations/{id}/finish (или отмените DELETE, если код не пришёл, — деньги вернутся).
Каждый запрос подписывается API-ключом в заголовке X-Api-Key (альтернатива — Authorization: Bearer <key>). Передавать ключ в query-строке нельзя: он попадёт в логи прокси и историю браузера.
http
GET /api/v1/account/balance HTTP/1.1
Host: simdrop.io
X-Api-Key: sdk_2f9c1e...
Accept-Language: ru
Несколько ключей и права
В кабинете можно создать до 5 ключей — например, отдельный ключ для каждого сервера или бота. У каждого ключа свои права (scopes), список разрешённых IP, валюта по умолчанию и срок действия. Ключ можно перевыпустить (старый перестаёт работать сразу) или отозвать.
Scope
Даёт доступ к
read
справочники, цены, баланс, история, чтение активаций и SMS
Баланс аккаунта ведётся в рублях. Все суммы в ответах API (цены, баланс, операции) можно получать в RUB или USD: добавьте параметр ?currency=USD к любому запросу либо задайте валюту по умолчанию для ключа в кабинете. Поле currency в каждом объекте с суммой показывает, в какой валюте выражено число.
USD пересчитывается по курсу USDT/RUB (CoinGecko, кэш 5 минут). Текущий курс — в GET /account/balance?currency=USD (usdRubRate).
Округление: RUB — 2 знака, USD — 4 знака.
maxPrice при покупке интерпретируется в валюте запроса.
Если курс временно недоступен, а запрошен USD, придёт 503 EXCHANGE_RATE_UNAVAILABLE — повторите или используйте RUB.
Ошибка — объект с машинным кодом error (стабильный контракт), человекочитаемым message (язык по заголовку Accept-Language: ru или en) и необязательными details.
json
{
"error": "NO_NUMBERS",
"message": "No numbers available right now. Try another price tier, operator or country",
"details": {
"service": "tg",
"country": 0
}
}
infoДаты — ISO 8601 в UTC (2026-09-13T20:41:12Z). Идентификаторы активаций — 64-битные целые: в JavaScript читайте их как числа осторожно или используйте BigInt.
Лимиты защищают вас и нас от случайных циклов и злоупотреблений. Они считаются в Redis и действуют на все реплики API одновременно.
Уровень
Лимит
Применяется к
На ключ
120 запросов / минуту
всем запросам с ключом
Покупки
20 / минуту и 1500 / час
POST /activations, /rent, replace, reactivate, prolong
Тяжёлые справочники
40 / минуту
GET /prices, /rent/prices, /services, /rent/services, /operators
На IP
600 / минуту
всем запросам с адреса, независимо от ключа
Перебор ключей
20 неудачных авторизаций / 10 минут
невалидным ключам с одного IP
Каждый ответ содержит X-RateLimit-Limit и X-RateLimit-Remaining (общий лимит ключа). При 429 приходит Retry-After в секундах — подождите и повторите. Кроме того, действует лимит одновременно активных активаций на аккаунт — от 10 до 100 в зависимости от ранга (ACTIVE_LIMIT_REACHED) и одна покупка за раз (PURCHASE_IN_PROGRESS).
warning_amberНе опрашивайте активацию чаще раза в 3 секунды. Лучший вариант — вебхуки: код придёт вам в момент получения без единого лишнего запроса.
infoСправочники и цены (/countries, /services, /operators, /prices, /rent/*) кэшируются на нашей стороне на 45–300 секунд. Поэтому количество доступных номеров может обновляться с небольшой задержкой — это нормально; при покупке цена и наличие всегда проверяются по факту.
Завершена (подтверждена вами или истекла с полученным кодом)
CANCELLED
Отменена, деньги возвращены (в т.ч. истекла без SMS)
REPLACED
Номер заменён — работайте с новой активацией
Правила
Разовая активация живёт 20 минут. Если SMS не пришло — она отменяется автоматически с возвратом средств.
Отмена (DELETE) возможна через 2 минуты после покупки и только пока код не получен.
Замена номера (replace) бесплатна, доступна в статусе WAITING через 2 минуты после покупки, не более 3 раз. Старая активация становится REPLACED, ответ содержит новую.
Аренду можно отменить в окне 2–20 минут после покупки, если не было SMS. Завершить досрочно (finish) — в любой момент, без возврата.
Поле actions в каждой активации показывает, какие действия доступны прямо сейчас — по тем же правилам, что кнопки в кабинете.
Вебхук — это HTTPS POST на ваш адрес в момент, когда на ваш номер пришло SMS (или звонок с кодом). У аккаунта один webhook-адрес, он задаётся в кабинете на странице «API»; там же есть кнопка тестовой доставки и журнал доставок.
Событие
Когда отправляется
sms.received
Получено SMS или звонок с кодом по активной активации или аренде
Суммы в payload всегда в RUB. Ответьте любым статусом 2xx в течение 10 секунд — тело ответа не читается. Любой другой ответ или таймаут считается неудачей: повторы через 30 с, 2 мин, 10 мин, 30 мин, 2 ч (всего 6 попыток). После 100 неудач подряд адрес отключается автоматически — включите его снова в кабинете после починки.
Проверка отправителя по IP
Вебхуки всегда приходят с одного из двух IP-адресов. Если хотите убедиться, что запрос действительно от Simdrop, разрешите на своём сервере только их (например, в nginx или в коде обработчика). Обрабатывайте доставки идемпотентно по полю id: при сетевых сбоях одно событие может прийти дважды.
IP-адреса отправителя
93.127.155.137
45.80.7.136
Node.js (Express)
import express from"express";
const ALLOWED_IPS = new Set(["93.127.155.137","45.80.7.136"]);
const app = express();
app.set("trust proxy", true); // если перед приложением стоит nginx/балансировщик
app.post("/simdrop/webhook", express.json(), (req, res) => {
if (!ALLOWED_IPS.has(req.ip)) {
return res.status(403).end();
}
const event = req.body;
if (event.event === "sms.received") {
console.log("code for activation", event.data.activation.id, "=", event.data.sms.code);
}
res.status(200).end();
});
Python (Flask)
from flask import Flask, request, abort
ALLOWED_IPS = {"93.127.155.137", "45.80.7.136"}
app = Flask(__name__)
@app.post("/simdrop/webhook")
def webhook():
ip = request.headers.get("X-Forwarded-For", request.remote_addr).split(",")[0].strip()
if ip notin ALLOWED_IPS:
abort(403)
event = request.get_json()
if event["event"] == "sms.received":
print("code:", event["data"]["sms"]["code"])
return"", 200
warning_amberТребования к адресу: только https://, публичный хост (localhost и приватные сети не принимаются), без логина/пароля в URL, редиректы не выполняются.
Предложения по сервису — по всем странам или по одной. Каждое содержит ценовые уровни (prices[]) с priceId для покупки, количеством номеров и доставляемостью SMS. Уровни с requiredRank выше вашего ранга помечены available=false.
keyscope: read
Query-параметры
servicestringобязательный
Код сервиса Пример: tg
countryinteger
ID страны Пример: 0
verificationTypestringsms | call
Только цены для SMS или для звонка
currencystringRUB | USD
Валюта сумм в ответе; по умолчанию — валюта ключа
Ответы
GET/prices
curl-X GET 'https://simdrop.io/api/v1/prices?service=tg&country=0' \
-H'X-Api-Key: sdk_YOUR_API_KEY'
Выдаёт номер и списывает его стоимость с баланса. Цена выбирается одним из способов: priceId — конкретный уровень из GET /prices; maxPrice — самый дешёвый доступный уровень не выше указанной цены; ничего — самый дешёвый доступный уровень.
keyscope: activationsspeedлимит покупок
infoОдновременно у аккаунта может быть от 10 до 100 активных активаций (зависит от ранга лояльности) и одна покупка за раз — вторая параллельная покупка получит 409 PURCHASE_IN_PROGRESS.
Тело запроса (JSON)
servicestringобязательный
Код сервиса Пример: tg
countryintegerобязательный
ID страны Пример: 0
operatorstring
Оператор (по умолчанию любой) Пример: mts
verificationTypestringsms | call
Способ получения кода: sms (по умолчанию) или call
priceIdinteger
ID ценового уровня из GET /prices Пример: 88102
maxPricenumber
Максимальная цена в валюте запроса Пример: 30
orderIdstring
Ваш идентификатор заказа (до 100 символов) Пример: order-7781
Бесплатно выдаёт другой номер вместо текущего (антибан). Только в статусе WAITING, через 2 минуты после покупки, не более 3 раз. Старая активация получает статус REPLACED; в ответе — новая активация с новым id.
keyscope: activationsspeedлимит покупок
Параметры пути
idintegerобязательный
ID активации Пример: 3051287731
Query-параметры
currencystringRUB | USD
Валюта сумм в ответе; по умолчанию — валюта ключа
Ответы
POST/activations/{id}/replace
curl-X POST 'https://simdrop.io/api/v1/activations/3051287731/replace' \
-H'X-Api-Key: sdk_YOUR_API_KEY'
Аренда номера на часы или дни с приёмом всех SMS. Арендованный номер — активация с type=rent: статус, SMS, отмена и завершение — через /activations/{id}.