Справочник ошибок

Ошибки и Rate Limits

Полный справочник кодов ошибок, маппинга HTTP, политик rate limit и стратегий retry.

HTTP-коды статусов

Современный REST API использует стандартные HTTP-коды. Тело ответа включает структурированный объект ошибки.

КодСтатусЗначение
400Bad RequestВалидация запроса не пройдена (отсутствуют или некорректны параметры)
401UnauthorizedТребуется авторизация или ключ API неверен
402Payment RequiredНедостаточно средств в кошельке для выполнения
403ForbiddenАвторизован, но нет прав на этот ресурс
404Not FoundРесурс не найден (например, ID активации не существует)
409ConflictЗапрос конфликтует с текущим состоянием
422Unprocessable EntityЗапрос корректен по форме, но семантически невалиден
429Too Many RequestsПревышен rate limit — см. заголовок Retry-After
500Internal Server ErrorНеожиданная ошибка сервера — retry с экспоненциальной задержкой
503Service UnavailableUpstream-провайдер недоступен — retry позже

Структура ответа об ошибке (JSON)

HTTP/1.1 429 Too Many Requests
Content-Type: application/json
Retry-After: 27937
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 2026-05-10T00:00:00.000Z

{
  "error": "rate_limit_exceeded",
  "message": "Daily API limit reached. Contact support for higher tier.",
  "retryAfter": 27937,
  "limit": 10000,
  "usage": 10000
}

SMS-Activate текстовые коды

Совместимый с SMS-Activate эндпоинт возвращает plain text коды. Каждый код мапится на HTTP-статус.

Текст-кодHTTPЗначение
BAD_KEY401Неверный или отсутствующий API-ключ
BAD_ACTION400Параметр action отсутствует или некорректен
BAD_SERVICE400Код сервиса не распознан
BAD_COUNTRY400Параметр country не распознан
BAD_STATUS400Неверное значение status для setStatus
WRONG_ACTION400Имя действия не поддерживается
NO_BALANCE402Недостаточный баланс кошелька
NO_NUMBERS404Нет доступных номеров для этой комбинации
NO_ACTIVATION404ID активации не найден или не ваш
RATE_LIMITED429Превышен rate limit — замедлитесь или дождитесь сброса
ERROR_SQL500Внутренняя ошибка сервера — retry позже

Rate Limits

Throttle по API-ключу. Несколько серверов с одним ключом делят одну корзину.

Burst-лимиты

Три параллельных уровня защищают от всплесков и устойчивого злоупотребления. Достижение любого возвращает 429.

short
5
за 1 second
medium
30
за 10 seconds
long
100
за 60 seconds

Дневная квота

По умолчанию 10 000 запросов на API-ключ в день. Сброс в полночь UTC.

  • Публичные эндпоинты каталога (services, countries) освобождены от дневной квоты
  • Счётчик квоты увеличивается при каждом авторизованном запросе, независимо от статуса ответа
  • Pro-уровень с более высокими лимитами доступен — обратитесь в поддержку

Заголовки ответа

Каждый авторизованный ответ содержит rate limit заголовки, чтобы клиенты могли проактивно self-throttle.

X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9543
X-RateLimit-Reset: 2026-05-10T00:00:00.000Z
Retry-After: 27937

Стратегия Retry

Как обрабатывать временные сбои, не наводняя API и не теряя данные.

Делайте

  • Учитывайте заголовок Retry-After в ответах 429
  • Используйте экспоненциальный backoff для 5xx (1с, 2с, 4с, 8с)
  • До 5 попыток, затем покажите ошибку пользователю

Не делайте

  • Не делайте retry для 4xx, кроме 429 — они детерминированы
  • Не молотите API после 429 — дождитесь полного Retry-After
  • Не делайте retry POST /activations без проверки idempotency

Рекомендуемый паттерн retry

# Pseudocode — exponential backoff with Retry-After
attempt = 0
while attempt < 5:
    response = call_api()

    if response.status == 200:
        break  # success

    if response.status == 429:
        wait = response.headers.get('Retry-After', 2 ** attempt)
        sleep(wait)
        attempt += 1
        continue

    if response.status >= 500:
        sleep(2 ** attempt)  # exponential
        attempt += 1
        continue

    raise APIError(response)  # 4xx other than 429

Idempotency

Некоторые операции списывают с кошелька — наивный retry может привести к двойному списанию.

POST /activations не идемпотентен

Если вы делаете retry успешного POST /activations, создастся вторая активация и спишется дважды. При любом таймауте или неясном ответе используйте GET /activations для проверки состояния перед retry.

Нужно больше деталей?

Интерактивный справочник API показывает ответы ошибок для каждого эндпоинта.