Коды ошибок

API PolyTest использует стандартные HTTP-коды статуса. Все ответы с ошибкой возвращают JSON с полем error, описывающим проблему.

Формат ответа с ошибкой: все ошибки возвращают JSON-объект с единственным ключом "error", содержащим понятное человеку сообщение. Категорию ошибки показывает HTTP-код статуса.

400Bad Request

Запрос составлен неверно или в нём отсутствуют обязательные параметры.

{ "error": "timestamp query parameter is required" }

Частые причины

  • Отсутствует обязательный параметр запроса
  • Неверный формат параметра (например, метка времени не в формате ISO 8601)
  • Значение параметра вне допустимого диапазона

401Unauthorized

Ошибка аутентификации — в запросе нет действительных учётных данных.

{ "error": "Invalid API key" }

Частые причины

  • Отсутствует заголовок X-API-Key или заголовок Authorization
  • API-ключ не существует или недействителен
  • API-ключ отозван
  • Срок действия API-ключа истёк
  • JWT-токен недействителен или истёк

403Forbidden

Учётные данные действительны, но у них нет прав на это действие.

{ "error": "Admin access required" }

Частые причины

  • Попытка обратиться к эндпоинтам только для администраторов (sync, seed) без прав администратора
  • Область действия API-ключа не включает нужное разрешение

404Not Found

Запрошенный ресурс не существует.

{ "error": "Market not found" }

Частые причины

  • Рынок с таким ID не существует
  • Slug рынка не соответствует ни одной записи
  • Не найден снимок в пределах ±2 секунд от заданной метки времени

429Too Many Requests

Превышен лимит запросов. Сделайте паузу и повторите после указанного времени.

{ "error": "Rate limit exceeded" }

Частые причины

  • Превышен лимит запросов в минуту для вашего тарифа
  • Превышен лимит всплесков (слишком много запросов за короткое время)

500Internal Server Error

На сервере произошла непредвиденная ошибка. Такое бывает редко — если ошибка повторяется, обратитесь в поддержку.

{ "error": "Internal server error" }

Частые причины

  • Проблема подключения к базе данных
  • Сбой вышестоящего сервиса
  • Непредвиденное исключение на стороне сервера

Обработка ошибок

Ошибки клиента (4xx)

Не повторяйте запрос автоматически. Прежде чем повторять, исправьте параметры запроса или аутентификацию либо проверьте, что ресурс существует.

Ошибки сервера (5xx)

Можно безопасно повторять с экспоненциальной задержкой. Начните с задержки в 1 секунду и удваивайте её при каждой попытке, максимум 3 повтора.

import time
import requests

def api_request(url, headers, max_retries=3):
    for attempt in range(max_retries):
        response = requests.get(url, headers=headers)

        if response.status_code == 429:
            wait = int(response.headers.get("Retry-After", 2 ** attempt))
            time.sleep(wait)
            continue

        if response.status_code >= 500:
            time.sleep(2 ** attempt)
            continue

        return response

    raise Exception("Max retries exceeded")