요청 제한
주문 작업 및 API 요청에 대한 지갑별 요청 제한(Rate Limit)입니다.
개요
요청 제한은 고정 윈도우(fixed-window) 알고리즘을 사용하여 지갑별로 적용됩니다. 제한이 적용되는 대상은 다음과 같습니다.
- 주문 접수 (
POST /order) - 주문 취소 (
DELETE /order) - API 요청 (일반 엔드포인트 사용)
제한은 60초마다 초기화됩니다.
기본 한도
| 등급 | 주문/분 | 취소/분 | API 요청/분 | 최대 미체결 주문 | 최대 포지션 |
|---|---|---|---|---|---|
| 기본 | 60 | 120 | 600 | 100 | 50 |
| 등급 1 | 30 | 60 | 300 | 50 | 20 |
| 등급 2 | 120 | 300 | 1,200 | 500 | 200 |
| 마켓메이커 | 600 | 1,200 | 6,000 | 2,000 | 무제한 |
신규 지갑에는 기본 한도가 적용됩니다. 등급 상향을 원하시면 지원팀에 문의하시기 바랍니다.
요청 제한 응답
요청 제한을 초과하면 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
}
응답 헤더
요청 제한이 적용되는 모든 엔드포인트는 성공 응답과 오류 응답 모두에 다음 헤더를 포함합니다.
| 헤더 | 설명 | 예시 |
|---|---|---|
X-RateLimit-Limit | 윈도우당 허용되는 최대 요청 수 | 60 |
X-RateLimit-Remaining | 현재 윈도우에서 남은 요청 수 | 42 |
X-RateLimit-Reset | 윈도우가 초기화되는 유닉스 타임스탬프 | 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
X-RateLimit-Reset: 1737312060
요청 제한 카테고리
요청 제한은 각 작업 유형별로 별도로 추적됩니다.
주문 접수
적용 대상:
POST /order(옵션 주문)POST /bulk_order(일괄 주문, 배치 내 각 주문이 개별적으로 집계됨)PUT /bulk_order(일괄 교체, 각 교체가 개별적으로 집계됨)
주문 취소
적용 대상:
DELETE /orderDELETE /bulk_order(일괄 취소, 각 취소가 개별적으로 집계됨)DELETE /bulk_order_cloid(클라이언트 주문 ID 기반 일괄 취소, 각 취소가 개별적으로 집계됨)
API 요청
인증이 필요한 모든 엔드포인트의 일반적인 API 사용에 적용됩니다.
포지션 및 주문 한도
요청 제한 외에도, 지갑에는 최대 미체결 주문 및 포지션 한도가 적용됩니다.
| 한도 유형 | 설명 | 거부 처리 |
|---|---|---|
| 최대 미체결 주문 | 동시에 유지할 수 있는 최대 미체결 주문 수 | 엔진에 도달하기 전에 주문 거부 |
| 최대 포지션 | 최대 고유 포지션 수 (-1 = 무제한) | 새 포지션이 생성되는 경우 주문 거부 |
한도를 초과하면 다음과 같이 반환됩니다.
{
"error": "limit_exceeded",
"message": "Maximum open orders limit exceeded (100)"
}
모범 사례
요청 제한 처리
- 헤더 모니터링:
X-RateLimit-Remaining을 사전에 추적합니다 - Retry-After 준수: 재시도하기 전에 지정된 시간만큼 대기합니다
- 백오프 구현: 429가 반복되면 지수 백오프(exponential backoff)를 사용합니다
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 /order요청 대신DELETE /bulk_order또는DELETE /bulk_order_cloid를 사용합니다 - 업데이트에는 WebSocket 사용:
GET /orders를 폴링하는 대신 주문 업데이트를 구독합니다
모니터링
클라이언트 측에서 다음 지표를 추적하시기 바랍니다.
- 작업 유형별 요청 비율
X-RateLimit-Remaining추이- 429 응답 빈도
- 평균
Retry-After시간
오류 참조
| HTTP 상태 | 오류 코드 | 설명 |
|---|---|---|
| 429 | rate_limit_exceeded | 요청 제한 초과, 지정된 시간 이후 재시도 |
전체 오류 참조는 오류를 참고하시기 바랍니다.