Ошибки API
Каждый эндпоинт под https://litport.net/api/v1 (Токены и использование, Пакеты и Оплата за ГБ) возвращает ошибки в формате JSON, описанном на этой странице. Сбои самого проксируемого соединения используют отдельные числовые коды ошибок прокси, а публичный API бесплатных прокси здесь не рассматривается.
Формат ошибки#
{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication failed.",
"requestId": "req_example",
"docsUrl": "https://litport.net/docs/api/errors",
"retryable": false
}
}
Тот же ID запроса передаётся в заголовке X-Request-ID. Записывайте его в лог вместе с HTTP-статусом и кодом ошибки. Никогда не записывайте в лог заголовок Authorization.
409 с ожиданием также добавляет nextChangeAt — метку времени ISO-8601 в UTC: это CHANGE_LIMIT при смене локации токена или получении нового IP.
retryable есть всегда и равен true или false. true означает, что тот же запрос, отправленный снова без изменений после Retry-After (или nextChangeAt, если он есть в ошибке), может завершиться успешно, и его безопасно отправить повторно: ничего не было сделано (RATE_LIMITED, CONCURRENT_CHANGE, CHANGE_LIMIT, ALLOWANCE_CONFLICT) или это 503 на запрос, который можно безопасно повторять. false означает, что сначала нужно что-то изменить: запрос, аккаунт или токен. 503 на запрос, который небезопасно повторять, — тоже false: прочитайте текущее состояние, прежде чем решать (см. Алгоритм повторов).
Справочник статусов#
| Статус | Коды | Действие клиента |
|---|---|---|
400 |
INVALID, INVALID, INVALID, INVALID_TYPE, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID_POOL, INVALID, INVALID, GEO, GEO, INVALID_IP, IPV6, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, FIELD |
Исправьте запрос. Не повторяйте его без изменений. |
401 |
UNAUTHORIZED |
Передайте действующий API-ключ по схеме Bearer. Ответ не раскрывает, существует ли ключ или пользователь |
402 |
INSUFFICIENT |
Пополните баланс и отправьте запрос снова. Баланс нужен только для создания прокси и его включения. |
403 |
ACCOUNT |
Пока аккаунт заблокирован |
404 |
TOKEN, PACKAGE |
Проверьте ID и принадлежность |
404 |
NOT_FOUND |
Исправьте маршрут: он не существует. |
405 |
METHOD |
Используйте один из методов из заголовка Allow. |
409 |
NOT, PACKAGE, CONCURRENT, LOCATION, NOT, CHANGE_LIMIT, ALLOWED, TOKEN, TOKEN, ALLOWANCE, POOL |
См. соответствующее описание ниже; CONCURRENT и ALLOWANCE означают, что нужно повторить тот же запрос, CHANGE_LIMIT — что нужно дождаться указанного nextChangeAt и повторить; у всех трёх retryable: true. |
413 |
INVALID |
Тело превышает 4 КиБ. Отправьте тело меньшего размера. |
415 |
INVALID |
Для записи с телом отправляйте Content-Type: application. |
429 |
RATE_LIMITED |
Учитывайте Retry-After и используйте экспоненциальную задержку с джиттером. retryable равен true. |
503 |
SERVICE, TOKEN, ALLOWED |
Учитывайте Retry-After. Повторяйте с ограниченной экспоненциальной задержкой, когда retryable равен true, затем обратитесь в поддержку, указав ID запроса. |
Алгоритм повторов#
Повторяйте автоматически, только когда retryable равен true: подождите Retry-After (и до nextChangeAt, если он есть в ошибке), добавьте джиттер и отправьте тот же запрос снова. Ограничьте число попыток и сделайте общий бюджет повторов видимым для вызывающей стороны. Если retryable равен false, сначала что-нибудь измените или — после неясного сбоя запроса, который небезопасно повторять (см. ниже), — прочитайте текущее состояние, прежде чем решать.
Любую запись в этом API можно безопасно повторять, кроме new-ip, POST /tokens без externalRef, POST /tokens/{tokenId}/credentials без requestId, PUT /tokens/{tokenId}/location с {"random": true} и двух POST-запросов API поддержки (POST /support/conversations и POST /support/conversations/{conversationId}/messages). Любую другую запись, получившую 409 CONCURRENT_CHANGE или неоднозначный ответ (тайм-аут, потерянный ответ, 503), можно просто отправить снова, потому что последняя запись всегда побеждает, а любая другая запись ничего не меняет, если уже применена. 503 на запрос, который небезопасно повторять, приходит с retryable: false, потому что работа могла быть выполнена до сбоя.
Для new-ip у статического токена неоднозначный результат означает, что сначала нужно прочитать GET /tokens/{tokenId}/location и повторять, только если nextChangeAt ещё не позже текущего времени. Слепой повтор в течение недели вернёт только 409 CHANGE_LIMIT.
Создание можно безопасно повторить, если в нём есть externalRef: повтор вернёт уже существующий прокси. Без него повтор может создать второй прокси. Перевыпуск можно безопасно повторить, если в нём есть requestId: повтор вернёт данные для подключения, выданные первым вызовом. Без него повтор выдаёт новую пару. См. Создание и управление прокси.
У токена с ротацией new-ip нельзя проверить через GET /tokens/{tokenId}/location: его canChangeNow и nextChangeAt относятся к местоположению и ничего не говорят об ожидании между новыми IP. Повторная отправка после Retry-After безвредна: она просто даёт ещё один новый IP. 409 CHANGE_LIMIT сразу после потерянного ответа не доказывает, что смена прошла, потому что ответ 409 LOCATION_UNAVAILABLE тоже расходует ожидание.
PUT /tokens/{tokenId}/location с {"random": true} каждый раз выбирает новую локацию, поэтому повтор снова перемещает прокси везде, где нет ожидания. После потерянного ответа сначала прочитайте GET /tokens/{tokenId}/location и отправляйте запрос снова, только если прокси не там, где вам нужно. У двух POST-запросов API поддержки нет ключа идемпотентности, а 503 может прийти уже после того, как сообщение сохранено: прочитайте диалог, прежде чем отправлять сообщение снова.
Подробности по кодам ошибок#
Недопустимое тело запроса#
400, если тело не разбирается как JSON или не проходит собственную проверку структуры эндпоинта (например, PUT /tokens/{tokenId}/rotation требует ровно {"intervalSec": <integer>}). В POST /tokens, PATCH /tokens/{tokenId} и POST /tokens/{tokenId}/credentials тело должно быть JSON-объектом, содержащим только поля, которые принимает этот вызов, а для PATCH нужно хотя бы одно. 413, если тело превышает 4 КиБ.
Недопустимый тип содержимого#
INVALID_CONTENT_TYPE означает, что запись с телом отправлена без Content-Type: application/json.
Недопустимый лимит#
INVALID_LIMIT означает, что limit — не целое число от 1 до 100 включительно.
Недопустимый курсор#
INVALID_CURSOR означает, что непрозрачный курсор имеет неверный формат, изменён, не проходит проверку подлинности или выдан для другого эндпоинта. Начните пагинацию заново без курсора.
Недопустимый тип#
INVALID_TYPE означает, что type в GET /tokens не является ни unlimited, ни ppg.
Недопустимый статус#
INVALID_STATUS означает, что status в GET /tokens не является одним из значений active, expired или disabled.
Недопустимые ID токенов#
INVALID_TOKEN_IDS означает, что tokenIds в GET /usage — не список положительных ID прокси либо в нём больше 100 ID.
Недопустимый ID пакета#
INVALID_PACKAGE_ID означает, что фильтр packageId в GET /tokens — не положительное целое число. packageId в пути URL никогда не даёт 400: неизвестный или чужой даёт 404 PACKAGE_NOT_FOUND.
Недопустимый диапазон времени#
INVALID_TIME_RANGE означает, что метка времени не в каноническом UTC, from не раньше to или запрошенный интервал слишком велик.
Недопустимая группировка#
INVALID_GROUP_BY означает, что groupBy не является одним из значений hour, day или month.
Недопустимое расширение#
INVALID_INCLUDE означает, что запрошенное расширение несовместимо с токеном или группировкой; компоненты списаний требуют PPG-токена и почасовых интервалов.
Недопустимый пул#
INVALID_POOL означает, что pool в GET /pay-per-gb/geo, POST /tokens или PATCH /tokens/{tokenId} отсутствует там, где он обязателен, пуст или содержит ключ авторизации, который не соответствует пулу, доступному для выбора клиентом.
Недопустимый уровень#
INVALID_LEVEL означает, что level — не одно из значений, которые принимает эндпоинт: region/city для вариантов локации токена или country/region/city для гео оплаты за ГБ.
Недопустимый родительский объект#
INVALID_PARENT означает, что отсутствует обязательная родительская география: для location/options?level=city токена нужен region; для GET /pay-per-gb/geo нужен country при level=region и при level=city.
Геотаргетинг не включён#
GEO_NOT_ENABLED означает, что у запрошенного пула геотаргетинг выключен.
Уровень гео не поддерживается#
GEO_LEVEL_UNSUPPORTED означает, что запрошенный пул не поддерживает запрошенный level. Проверьте geoLevels пула на странице Оплата за ГБ.
Недопустимый IP#
INVALID_IP означает, что переданный адрес — не точный публичный литерал IPv4.
IPv6 не поддерживается#
IPV6_UNSUPPORTED означает, что IPv6-адрес отправлен в запись разрешённых IP пакета; обратитесь в поддержку.
Недопустимая локация#
INVALID_LOCATION означает, что запрошенный регион, город или оператор — не то значение, которое может использовать этот токен, либо country передан со значением, отличным от "us".
Недопустимая ротация#
INVALID_ROTATION означает, что intervalSec в PUT /tokens/{tokenId}/rotation не входит в перечисленные options токена.
Недопустимая метка#
INVALID_LABEL означает, что label — не текст длиной до 255 символов и не null (чтобы очистить метку).
Недопустимая внешняя ссылка#
INVALID_EXTERNAL_REF означает, что externalRef — не строка из 1–128 печатаемых символов.
Недопустимый ID запроса#
INVALID_REQUEST_ID означает, что requestId в POST /tokens/{tokenId}/credentials — не строка из 1–64 символов: букв, цифр, подчёркивания или дефиса.
Недопустимое включение#
INVALID_ENABLED означает, что enabled — не true и не false.
Недопустимый срок действия#
INVALID_EXPIRY означает, что expiresAt — не дата и время ISO 8601 с часовым поясом, не дата, которая ещё впереди, и не null.
Недопустимый лимит трафика#
INVALID_ALLOWANCE означает, что allowanceBytes — не целое число не меньше 1 (байт) и не null (чтобы снять лимит).
Поле не разрешено#
FIELD_NOT_ALLOWED означает, что PATCH /tokens/{tokenId} отправил для прокси пакета поле, отличное от label. Прокси пакета включаются и выключаются самим пакетом.
Не авторизован#
UNAUTHORIZED охватывает отсутствующие, неверно сформированные, неизвестные, прошедшие ротацию и не имеющие владельца ключи, не раскрывая, какой именно случай имел место.
Токен не найден#
TOKEN_NOT_FOUND охватывает отсутствующий, не принадлежащий вам или не поддающийся разбору tokenId в любом маршруте токена. Ответ одинаков во всех случаях, поэтому он никогда не раскрывает токен другого пользователя.
Пакет не найден#
PACKAGE_NOT_FOUND охватывает отсутствующий, не принадлежащий вам или не поддающийся разбору packageId в любом маршруте пакета, включая разрешённые IP пакета.
Не найдено#
NOT_FOUND означает, что запрошенного маршрута /api/v1 не существует.
Метод не разрешён#
METHOD_NOT_ALLOWED означает, что известный эндпоинт получил неподдерживаемый метод. Ответ содержит его поддерживаемые методы в Allow.
Не поддерживается#
NOT_SUPPORTED означает, что у этого токена нет такой возможности: его локацию нельзя изменить, его интервал ротации нельзя изменить или (new-ip) это не серверный или ISP-прокси. Для токена «Мультилокация» интервал ротации всегда отвечает NOT_SUPPORTED, потому что его задаёт телефон, на котором работает прокси. DELETE /tokens/{tokenId} для прокси пакета тоже отвечает этим кодом: удалять можно только прокси с оплатой за ГБ.
Недостаточный баланс#
INSUFFICIENT_BALANCE — это 402. Для создания прокси и его включения нужен положительный баланс. Всё остальное работает и при пустом балансе: выключение, смена метки, смена срока действия или лимита, перевыпуск данных для подключения и удаление.
Аккаунт заблокирован#
ACCOUNT_BANNED — это 403. Заблокированный аккаунт не может создать прокси или включить его. Выключение, перевыпуск данных для подключения и удаление по-прежнему работают. Обратитесь в поддержку.
Достигнут лимит токенов#
TOKEN_LIMIT_REACHED означает, что в аккаунте уже максимально допустимое число прокси с оплатой за ГБ. Удалите ненужный прокси или обратитесь в поддержку, чтобы увеличить лимит.
Токен нельзя изменить#
TOKEN_NOT_EDITABLE означает, что прокси больше нельзя изменять, например потому что он был удалён во время выполнения записи. Ничего не изменилось. Прочитайте прокси, чтобы увидеть его состояние.
Конфликт лимита трафика#
ALLOWANCE_CONFLICT означает, что лимит трафика не удалось сохранить. Ничего не изменилось. Отправьте тот же запрос ещё раз.
Для входа по IP нужен пул#
POOL_REQUIRED_FOR_IP_AUTH означает, что pool: null отправлен для прокси, который входит по разрешённому IP. Этот прокси сохраняет один пул.
Пакет неактивен#
PACKAGE_INACTIVE означает, что оплаченный период токена или пакета сейчас не активен.
Одновременное изменение#
CONCURRENT_CHANGE означает, что другая запись в тот же токен или пакет прошла в тот же момент. Повторите тот же запрос.
Локация недоступна#
LOCATION_UNAVAILABLE означает, что у запрошенной локации сейчас нет доступного IP или рабочего устройства. Ничего не изменилось.
Не в состоянии fallback#
NOT_IN_FALLBACK — ответ на POST /tokens/{tokenId}/location/return, когда токен не находится вне сохранённой локации, так что возвращать нечего. Повтор запроса, который уже сработал, попадает сюда и не выдаёт второй IP. Ничего не изменилось.
Лимит изменений#
CHANGE_LIMIT означает, что лимит на изменение или замену уже исчерпан: раз в неделю для нового IP или смены локации статического серверного/ISP-прокси, раз в 48 часов для смены локации стандартного US Shared Mobile. Для нового IP у серверного/ISP-токена с ротацией ожидание равно наименьшему значению rotation.options токена и отсчитывается от последнего запроса. Ошибка содержит nextChangeAt и соответствующий Retry-After.
Достигнут лимит разрешённых IP#
ALLOWED_IPS_LIMIT_REACHED означает, что список разрешённых IP пакета уже достиг своего limit (1 или 50). Обратитесь в поддержку, чтобы увеличить его.
Ограничено по частоте#
RATE_LIMITED означает, что API-ключ (для GET /usage — его собственное ограничение в 10 запросов за 60 секунд), для записи разрешённых IP — пакет, а для POST /tokens — аккаунт (его лимит на создание новых прокси в минуту, общий для всех его ключей и личного кабинета), исчерпал текущее окно. Ничего не было сделано. Учитывайте Retry-After; retryable равен true.
Сервис недоступен#
SERVICE_UNAVAILABLE означает, что зависимость API временно недоступна. Учитывайте Retry-After. retryable равен false, когда запрос небезопасно повторять; см. Алгоритм повторов.
Недопустимые данные токена#
TOKEN_DATA_INVALID означает, что сохранённые метаданные токена временно нечитаемы. Повторите позже, затем сообщите ID запроса.
Разрешённые IP недоступны#
ALLOWED_IPS_UNAVAILABLE означает, что хранилище разрешённых IP, конфигурация или выделение портов недоступны, в том числе когда у пакета временно закончились назначаемые порты.
Сбои аутентификации#
API намеренно возвращает один и тот же ответ 401 для неверно сформированных, неизвестных, прошедших ротацию и не имеющих владельца ключей. Создайте API-ключ или выполните его ротацию на странице Настройки. Ротация сразу делает недействительным предыдущий активный ключ.