Ручное получение SMS-кодов — узкое место любого масштабного процесса верификации. Когда нужно зарегистрировать 500 аккаунтов или автоматически обрабатывать входящие OTP в production-системе, API провайдера виртуальных номеров становится ключевым инструментом. Разбираем архитектуру интеграции, типовые сценарии и практические примеры кода.
Базовые концепции API виртуальных номеров
Два режима работы
Большинство API провайдеров поддерживают два принципиально разных режима:
- Polling (опрос) — ваше приложение периодически запрашивает статус SMS. Проще в реализации, но создаёт задержку и нагрузку на API
- Webhook (push) — провайдер сам отправляет HTTP-запрос на ваш эндпоинт при поступлении SMS. Мгновенно, эффективно, рекомендуется для production
Жизненный цикл номера через API
- GET /numbers/available — получить список доступных номеров по стране/сервису
- POST /numbers/activate — арендовать/активировать номер
- GET /sms/{activation_id} — проверить входящие SMS (polling)
- POST /numbers/{id}/status — подтвердить получение SMS или отменить
- DELETE /numbers/{id} — освободить номер
Пример интеграции: Python + polling
Базовый скрипт для получения OTP-кода при регистрации в сервисе:
- Запрос номера для нужного сервиса (например, Instagram)
- Передача номера в процесс регистрации на сайте
- Polling каждые 5 секунд в течение 5 минут
- Извлечение кода из тела SMS регуляркой
- Подтверждение получения (чтобы номер не списался повторно)
Ключевые параметры запроса активации:
| Параметр | Тип | Описание |
|---|---|---|
| country | string | Код страны: "us", "gb", "de", "ru" |
| service | string | Идентификатор сервиса: "instagram", "google", "fb" |
| operator | string (optional) | Конкретный оператор: "att", "tmobile" |
| forward_url | string (optional) | Webhook URL для push-уведомлений |
Архитектура webhook-интеграции
Схема взаимодействия
Production-архитектура для высоконагруженной системы:
- Nginx принимает webhook-запросы от провайдера на HTTPS-эндпоинт
- FastAPI/Express разбирает тело запроса, проверяет подпись Secret
- Сообщение кладётся в очередь (Redis/RabbitMQ) для асинхронной обработки
- Worker извлекает OTP-код регуляркой, обновляет статус в БД
- Основной процесс регистрации получает код через callback или polling Redis
Пример payload от провайдера
Типичная структура webhook-запроса:
activation_id— ID активации в системе провайдераphone— номер телефона, получивший SMSfrom— отправитель (например, "GOOGLE" или "+18005551234")text— полный текст SMScreated_at— Unix timestamp получения
Параллельная массовая регистрация
Архитектура для 100+ регистраций одновременно
Наивный подход — последовательная регистрация — даёт 1 аккаунт в минуту. Параллельная архитектура:
| Компонент | Технология | Функция |
|---|---|---|
| Task Queue | Celery / BullMQ | Очередь задач регистрации |
| Workers | 10–50 параллельных | Каждый ведёт 1 регистрацию |
| API Pool | Rate limiter + retry | Контроль лимитов провайдера |
| SMS Listener | Webhook + Redis pub/sub | Распределяет SMS по воркерам |
| Storage | PostgreSQL / MongoDB | Аккаунты, статусы, логи |
При 50 параллельных воркерах и среднем времени регистрации 3 минуты — 1000 аккаунтов за 1 час. Лимитирующий фактор: rate limit API провайдера и скорость целевого сайта.
Обработка ошибок и retry-логика
Типовые ошибки при работе с API
- SMS не пришло за таймаут (5 мин) — номер нужно отменить и запросить новый. Причина: сервис отправил SMS на другой номер или произошла задержка оператора
- Номер уже использован для этого сервиса — провайдер должен это контролировать, но иногда пропускает. Детект: сервис говорит «этот номер уже зарегистрирован»
- Rate limit API — реализуйте exponential backoff с jitter: 1s, 2s, 4s, 8s...
- Временная недоступность провайдера — circuit breaker паттерн: после 3 ошибок подряд ждать 30 секунд перед следующей попыткой
Интеграция с антидетект-браузером через Playwright/Selenium
Полная автоматизация регистрации = API номеров + headless browser:
- Python-скрипт запрашивает номер через API
- Playwright открывает браузер с нужным fingerprint и прокси
- Заполняет форму регистрации, вставляет полученный номер
- Webhook или polling ждёт SMS с кодом
- Playwright вводит код в форму верификации
- Аккаунт сохраняется в БД с логином/паролем/номером/прокси
Rate limits и best practices
| Рекомендация | Почему важно |
|---|---|
| Кешируйте список доступных номеров (TTL 60 сек) | Снижает нагрузку на API, ускоряет работу |
| Проверяйте подпись webhook-запросов | Защита от поддельных SMS |
| Логируйте все SMS, включая нераспознанные | Помогает при отладке и спорных ситуациях |
| Не держите активированный номер дольше 20 мин без SMS | Избегаете списания за неиспользованные активации |
| Используйте connection pooling для HTTP-клиента | Снижает латентность при параллельных запросах |
SDK и готовые библиотеки
Большинство профессиональных провайдеров предоставляют официальные SDK для Python, Node.js, PHP, Go. Это экономит время на написание HTTP-обёрток и обработку ошибок. Проверяйте наличие SDK при выборе провайдера — это показатель зрелости API.
Документация API turbon.rent включает примеры запросов на основных языках, описание всех эндпоинтов и webhooks — достаточно для интеграции в течение нескольких часов.
API виртуальных номеров — это не просто удобство, это разница между бизнесом, который масштабируется в 100x, и ручным трудом, который упирается в потолок производительности одного человека.