> ## Documentation Index
> Fetch the complete documentation index at: https://docs.factagora.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 요청 제한

> Factagora API의 요청 제한 및 사용 지침

## 개요

Factagora API는 공정한 사용과 서비스 안정성을 보장하기 위해 요청 제한을 적용합니다. 엔드포인트 유형에 따라 한도가 다르게 적용됩니다.

| 엔드포인트 유형                                                                                                                       | 제한                     |
| ------------------------------------------------------------------------------------------------------------------------------ | ---------------------- |
| 검색 엔드포인트 (예: `/fact-search`, `/search`)                                                                                        | API 키당 **600 req/min** |
| 분석 엔드포인트 (예: `/fact-checker`, `/evidence-finder`, `/generate`, `/deep-research`, `/timeseries`, `/causality-graph`, `/ingest`) | API 키당 **60 req/min**  |

## 응답 헤더

모든 API 응답에는 다음 헤더가 포함됩니다:

| 헤더                      | 설명                            |
| ----------------------- | ----------------------------- |
| `X-RateLimit-Limit`     | 분당 허용되는 최대 요청 수               |
| `X-RateLimit-Remaining` | 현재 윈도우에서 남은 요청 수              |
| `Retry-After`           | 재시도 전 대기 시간(초) (429 응답에서만 제공) |

## 요청 제한 초과

요청 제한을 초과하면 API가 `429 Too Many Requests` 응답을 반환합니다:

```json theme={null}
{
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Try again in 30s",
  "statusCode": 429
}
```

## 요청 제한 처리

`Retry-After` 헤더를 사용해 적절한 시간을 기다린 후 재시도하세요:

<CodeGroup>
  ```python Python theme={null}
  import requests
  import time

  def request_with_retry(url, headers, params):
      response = requests.get(url, headers=headers, params=params)

      if response.status_code == 429:
          retry_after = int(response.headers.get("Retry-After", 60))
          time.sleep(retry_after)
          return request_with_retry(url, headers, params)

      return response
  ```

  ```typescript TypeScript theme={null}
  async function requestWithRetry(url: string, headers: Record<string, string>) {
    const response = await fetch(url, { headers });

    if (response.status === 429) {
      const retryAfter = Number(response.headers.get("Retry-After") ?? 60);
      await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
      return requestWithRetry(url, headers);
    }

    return response;
  }
  ```
</CodeGroup>

<Note>
  요청 제한에 지속적으로 걸린다면 요청을 묶어서 보내거나 플랜 업그레이드를 고려하세요. 자세한 내용은 [크레딧 & 요금제](/ko/credits-pricing)를 참고하세요.
</Note>
