Ограничения частоты запросов
Лимиты на уровне кошелька для операций с заявками и API-запросов.
Обзор
Ограничение частоты работает на фиксированных 60-секундных окнах. Лимиты кошелька определяются его уровнем (tier) и применяются к:
- Выставлению заявок (
POST /order,PUT /order, WebSocketPlaceOrderи отправка заявок по перпам через маршрут TEE) - Отмене заявок (
DELETE /order,DELETE /order_cloidи отмены по перпам через маршрут TEE) - API-запросам (чтение в разрезе кошелька и прочие подписанные операции записи)
К отменам, авторизации агентов, записи настроек MMP и публичным риск-симуляциям применяются отдельные лимиты по сетевому источнику с общим потолком на уровне процесса.
Счётчики хранятся в памяти каждого API-процесса и не разделяются между репликами. Поэтому опубликованные значения следует рассматривать как максимум, который пропустит один процесс, а не как бюджет на весь кластер.
Лимиты по умолчанию
| Уровень | Заявок/мин | Отмен/мин | API-запросов/мин | Макс. открытых заявок | Макс. позиций |
|---|---|---|---|---|---|
| По умолчанию | 60 | 120 | 600 | 100 | 50 |
| Tier 1 | 30 | 60 | 300 | 50 | 20 |
| Tier 2 | 120 | 300 | 1 200 | 500 | 200 |
| Маркетмейкер | 1 200 | 2 400 | 6 000 | 5 000 | Без ограничений |
Новые кошельки получают лимиты по умолчанию. Для повышения уровня обратитесь в поддержку. Текущий лимит API-запросов возвращается в заголовке X-RateLimit-Limit любого запроса на чтение в разрезе кошелька, например GET /orders?wallet=....
Ответ при превышении лимита
При превышении лимита API возвращает 429 Too Many Requests:
{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded for OrderPlacement: 60 per minute, retry after 45 seconds",
"retry_after_secs": 45,
"limit": 60
}
Заголовки ответа
Эндпоинты с лимитами на уровне кошелька возвращают следующие заголовки. Ответ 429 содержит X-RateLimit-Limit, X-RateLimit-Remaining: 0 и Retry-After, но не X-RateLimit-Reset:
| Заголовок | Описание | Пример |
|---|---|---|
X-RateLimit-Limit | Максимальное число запросов в окне | 60 |
X-RateLimit-Remaining | Оставшееся число запросов в текущем окне | 42 |
X-RateLimit-Reset | Unix-время в секундах, когда окно сбрасывается (только в успешных ответах) | 1737312060 |
Retry-After | Число секунд до повторной попытки (только при 429) | 45 |
Пример заголовков ответа
Успешный запрос:
HTTP/1.1 200 OK
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 42
X-RateLimit-Reset: 1737312060
Запрос, отклонённый по лимиту:
HTTP/1.1 429 Too Many Requests
Retry-After: 45
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
Категории лимитов
Лимиты учитываются отдельно для каждого типа действия:
Выставление заявок
Учитывается по кошельку в счёт лимита «Заявок/мин» для его уровня:
POST /orderиPUT /order- WebSocket
PlaceOrder POST /v1/tee-perp/orders/submitи прочие отправки заявок по перпам, учитываются по менеджеру аккаунта
POST /bulk_order и PUT /bulk_order ограничены 50 позициями в одном запросе.
Отмена заявок
Учитывается по кошельку в счёт лимита «Отмен/мин» для его уровня:
DELETE /orderиDELETE /order_cloid- Отмены по перпам, учитываются по подписывающему API-кошельку
Каждый маршрут отмены, включая DELETE /bulk_order и DELETE /bulk_order_cloid, дополнительно ограничивается ещё до проверки подписи: 6 000 отменяемых позиций на сетевой источник и 60 000 на процесс в минуту. Пакетная отмена засчитывает одну позицию за каждый элемент.
API-запросы
Учитываются по кошельку в счёт лимита «API-запросов/мин» для его уровня:
- Чтение в разрезе кошелька, ключ берётся из query-параметра
wallet - Подписанные операции записи, не перечисленные выше, например настройка MMP и режима маржи
Отправка RFQ
POST /rfq/request и WebSocket-команды отправки RFQ ограничены 10 запросами на кошелёк в минуту независимо от уровня.
Риск-симуляции
Публичные симуляции портфеля и заявок (POST /risk/simulate/portfolio,
POST /risk/simulate/orders и предпросмотр для перпов POST /v1/tee-perp/preview)
имеют отдельные лимиты: 60 запросов на сетевой источник и 600 запросов
на процесс в минуту. В одном API-процессе одновременно выполняется не более четырёх
симуляций. Запрос, превысивший квоту
или заставший все обработчики симуляций занятыми, получает 429 Too Many Requests.
Авторизация агентов
POST /approve-agent, DELETE /revoke-agent и DELETE /revoke-all-agents ограничиваются ещё до проверки подписи: 120 запросов на сетевой источник и 1 200 запросов на процесс в минуту.
Запись настроек MMP
Запись конфигурации MMP ограничивается ещё до проверки подписи: 120 запросов на сетевой источник и 1 200 запросов на процесс в минуту, в дополнение к лимиту API-запросов кошелька.
Лимиты на позиции и заявки
Помимо ограничений частоты, для кошельков действуют лимиты на максимальное число открытых заявок и позиций:
| Тип лимита | Описание | Отклонение |
|---|---|---|
| Макс. открытых заявок | Максимальное число одновременно открытых заявок | Новая заявка отклоняется, пока кошелёк находится на лимите |
| Макс. позиций | Максимальное число уникальных позиций (-1 = без ограничений) | Заявка отклоняется, если она откроет новую позицию |
Это отклонения заявок, а не HTTP-ошибки. Ответ на заявку возвращается с HTTP 200, status: "REJECTED" и полем reason, например:
max_open_orders_exceeded: current=100, limit=100
max_positions_exceeded: wallet 0x... has 50 positions, limit is 50
Рекомендации
Обработка лимитов
- Отслеживайте заголовки: заранее контролируйте
X-RateLimit-Remaining - Соблюдайте Retry-After: выжидайте указанное время перед повторной попыткой
- Используйте backoff: применяйте экспоненциальную задержку при повторяющихся 429
import time
def place_order_with_retry(order, max_retries=3):
for attempt in range(max_retries):
response = api.place_order(order)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
time.sleep(retry_after)
continue
return response
raise RateLimitError("Max retries exceeded")
Экономия запросов
- Используйте пакетные эндпоинты:
POST /bulk_orderдля нескольких заявок в одном запросе - Отменяйте пакетами:
DELETE /bulk_orderилиDELETE /bulk_order_cloidвместо множества запросовDELETE /order - WebSocket для обновлений: подписывайтесь на обновления заявок вместо опроса
GET /orders
Мониторинг
Отслеживайте на стороне клиента следующие метрики:
- Частоту запросов по типам действий
- Динамику
X-RateLimit-Remaining - Частоту ответов 429
- Среднюю длительность
Retry-After
Справочник ошибок
| HTTP-статус | Код ошибки | Описание |
|---|---|---|
| 429 | rate_limit_exceeded | Лимит превышен, повторите попытку через указанное время |
Полный справочник ошибок см. в разделе Ошибки.