Перейти к основному содержанию
API CSBoard применяет лимиты запросов на каждый ключ, чтобы сохранять стабильность сервиса для всех пользователей. Если вы превышаете лимит, то сразу получаете ответ 429 — ни один запрос не обрабатывается частично. Реализуйте клиент так, чтобы он считывал заголовок Retry-After и делал паузу перед повтором, а не долбил эндпоинт в плотном цикле.

Лимиты по эндпоинтам

Все лимиты действуют на API-ключ и сбрасываются в скользящем окне 60 секунд.
ЛимитЭндпоинт(ы)
30 / минListings, prices, currency, balance и статус ордера — все стандартные эндпоинты GET
30 / минPOST /v1/orders (размещает ордер на покупку и расходует реальные деньги)
1 / минGET /v1/prices/snapshot.ndjson.gz (массовый сжатый снапшот)
Отправка более 30 запросов с неверными или отсутствующими API-ключами с одного IP-адреса в течение одной минуты автоматически приводит к 5-минутному бану на уровне IP. Во время бана каждый запрос с этого IP возвращает 401 too_many_failed_auth независимо от того, какой ключ используется. Переключитесь на действительный ключ и дождитесь окончания cooldown перед повтором.

Формат ответа 429

При превышении лимита стандартного эндпоинта API возвращает:
HTTP/1.1 429 Too Many Requests
Retry-After: 14
Content-Type: application/json

{ "code": "rate_limit_exceeded", "detail": "Rate limit exceeded. Retry after 14 seconds." }
Значение заголовка Retry-After — целое число секунд, которые необходимо подождать, прежде чем следующий запрос будет успешным. Эндпоинт массового снапшота использует отдельный код ошибки при превышении лимита:
{ "code": "snapshot_rate_limited", "detail": "Snapshot rate limit exceeded. Retry after 60 seconds." }

Обработка 429 в клиенте

Считывайте Retry-After и спите как минимум столько секунд, прежде чем повторять запрос. Ниже показан простой цикл повторов на bash:
while true; do
  RESPONSE=$(curl -si https://csboard.com/v1/listings \
    -H "Authorization: Bearer csb_pub_...")

  STATUS=$(echo "$RESPONSE" | head -1 | awk '{print $2}')

  if [ "$STATUS" = "429" ]; then
    RETRY_AFTER=$(echo "$RESPONSE" | grep -i "retry-after" | awk '{print $2}' | tr -d '\r')
    echo "Rate limited. Waiting ${RETRY_AFTER}s..."
    sleep "$RETRY_AFTER"
  else
    echo "$RESPONSE" | tail -1  # print body
    break
  fi
done
Добавьте небольшое случайное смещение (например, sleep $((RETRY_AFTER + RANDOM % 5))) при запуске нескольких воркеров параллельно, чтобы они не возобновляли работу одновременно и не срабатывали по лимиту снова.

Повышение лимитов

Стандартные лимиты подходят для большинства интеграций, но если у вас сценарий с высокой нагрузкой — например, конвейер данных или высокочастотный торговый бот — свяжитесь с нами, чтобы обсудить более высокий лимит на ключ для вашей учётной записи.