e
EBUT Developer Portal 이벗 API 통합 문서 · v3 · api.ebut.co.kr
핵심 개념 · Rate Limits

Rate Limits

이벗 API 게이트웨이는 안정적인 서비스 운영을 위해 인증 방식별 호출 제한을 적용합니다. 한도를 초과하면 HTTP 429 가 반환되며, Retry-After 헤더에 명시된 시간 후 재시도하시면 됩니다.

인증 방식별 제한

인증 / 클라이언트 제한 비고
API Key 200 req/min 키 단위 집계. 자사 ERP·배치 자동화 기준.
JWT 300 req/min 토큰(사용자) 단위 집계. 웹·앱 대화형 사용 기준.
MCP 세션 10 req/s (600/min) AI 에이전트 세션 단위 집계. 게이트웨이 경유 필수.
한도가 부족한가요? 요금제(Pricing) 상향 또는 엔터프라이즈(help@ebut.co.kr) 별도 협의로 한도를 늘릴 수 있습니다.

응답 헤더로 잔여 확인

모든 응답에는 현재 사용량을 알려주는 헤더가 포함됩니다.

헤더 의미
X-RateLimit-Limit분당 허용량 (예: 200)
X-RateLimit-Remaining남은 호출 수
X-RateLimit-Reset한도 초기화 시각 (Unix epoch 초)
Retry-After429 응답에만 포함. 대기 권장 초 (예: 30)

429 응답 처리

HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 200
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1718352000

{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "요청 한도를 초과했습니다. 30초 후 다시 시도해주세요."
  }
}

Node.js 재시도 예시

async function callWithRetry(url, options, maxRetry = 3) {
  for (let i = 0; i < maxRetry; i++) {
    const res = await fetch(url, options);
    if (res.status !== 429) return res;

    // 429 — Retry-After 만큼 대기 (없으면 지수 백오프)
    const wait = res.headers.get("Retry-After");
    const ms = wait ? parseInt(wait) * 1000 : Math.pow(2, i) * 1000;
    await new Promise(r => setTimeout(r, ms));
  }
  throw new Error("Rate limit retry exhausted");
}

모범 사례

1. 지수 백오프 (Exponential Backoff)

429 응답을 받으면 즉시 재시도하지 말고, 대기 시간을 점차 늘려가며 재시도하세요. 여러 클라이언트가 동시에 차단됐다가 한꺼번에 재시도하는 "썬더링 허드" 문제를 방지할 수 있습니다.

대기 시간:  1초 → 2초 → 4초 → 8초 → 16초 ... (최대 60초)
지터 추가:  ±20% 랜덤 가산 (동시 재시도 분산)

2. 배치 호출 활용

같은 종류 데이터를 N개 가져올 때는 개별 호출 대신 페이징을 활용하세요.

3. 캐싱

자주 변하지 않는 데이터(상품 마스터, 공급사 정보 등)는 클라이언트에 캐싱하여 호출 자체를 줄이세요. 일반적인 TTL 기준:

4. 비동기 큐

대량 호출(수천 건 일괄 동기화)은 동기적으로 한 번에 처리하지 말고 작업 큐(예: BullMQ, Sidekiq, Celery)에 분산시켜 분당 한도를 지키며 순차 처리하세요.

5. 변경 감지 후 호출 (Polling 최소화)

같은 endpoint 를 짧은 주기로 반복 호출(polling)하지 마세요. updated_after 같은 변경 시각 필터를 활용해 새로 변경된 데이터만 가져오는 것이 한도와 부하 면에서 유리합니다.

한도 초과 모니터링

반복적으로 429 를 받는 경우 다음을 확인하세요.