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

# レート制限

> Sorsaのレート制限は、どのプランでも毎秒20リクエストです。その仕組みと制限を守る方法を説明します。

Sorsaは、すべてのユーザーに高速で安定したサービスを提供するため、共通のレート制限を設けています。エンドポイント別の区分やローリングウィンドウはなく、1つの上限に合わせて設計できます。

## 基本ルール：毎秒20リクエスト

各APIキーの上限は**毎秒20リクエスト**です。レート制限はこれだけで、エンドポイント別の上限、15分単位のウィンドウ、1時間ごとのリセット、プラン間の違いはありません。

同じキーを使うすべてのワーカーの合計リクエスト頻度を管理してください。個々の処理で送信間隔を調整していても、`429`レスポンスへの対処は必要です。

次の点も確認してください。

* 上限はIPアドレス単位ではなく、**APIキー単位**です。複数のキーがある場合、それぞれ毎秒20リクエストまで使えます。
* **すべてのリクエストを同じように数えます。** `/info`の1回の呼び出しも、100ツイートを取得する`/tweet-info-bulk`の1回の呼び出しも、1リクエストです。
* **スライディングウィンドウではありません。** カウントは毎秒リセットされます。`T+0.00`で20リクエストを送信した場合、`T+1.00`でさらに20リクエストを送信できます。

## 上限を超えた場合

1秒間に20件を超えて送信すると、超過分には`429 Too Many Requests`が返ります。データが失われたり、キーにペナルティが課されたりすることはありません。次の秒まで待って再試行してください。

`x-ratelimit-remaining`や`x-ratelimit-reset`ヘッダーはありません。毎秒リセットされるため、ヘッダーで残りの件数を追跡しても実用上の利点が少なく、処理が複雑になるためです。

## 上限内に収める方法

通常の処理で毎秒20リクエストに近づくことはあまりありません。バッチ処理や大規模データセットを扱う場合は、次の2つの方法が使えます。

### 方法1：リクエスト間に一定の待機時間を入れる

単一のワーカーで順番に処理する場合、各レスポンスの後に50ms以上待機することで送信速度を制限できます。余裕を持たせるには、待機時間を長くしてください。同じキーを複数のワーカーで共有する場合は、共通のレートリミッターを1つ使います。各ワーカーが個別に50ms待つだけでは、合計を毎秒20リクエスト以内に抑えられません。

**Python**

```python theme={null}
import time
import requests

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.sorsa.io/v3"

usernames = ["elonmusk", "naval", "paulg", "vaborsh"]

for username in usernames:
    response = requests.get(
        f"{BASE_URL}/info",
        params={"username": username},
        headers={"ApiKey": API_KEY},
        timeout=30,
    )
    response.raise_for_status()
    print(response.json()["display_name"])
    time.sleep(0.05)  # 50ms between requests
```

**JavaScript**

```javascript theme={null}
const API_KEY = "YOUR_API_KEY";
const BASE_URL = "https://api.sorsa.io/v3";

const usernames = ["elonmusk", "naval", "paulg", "vaborsh"];

for (const username of usernames) {
  const res = await fetch(`${BASE_URL}/info?username=${username}`, {
    headers: { ApiKey: API_KEY },
  });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  const data = await res.json();
  console.log(data.display_name);
  await new Promise((r) => setTimeout(r, 50)); // 50ms between requests
}
```

### 方法2：429を受け取ったら再試行する

最大速度で実行し、制限に達したときに対応したい場合は、`429`を検出して短時間待機してから再試行します。

**Python**

```python theme={null}
import time
import requests

def fetch_with_retry(url, headers, max_retries=3):
    for attempt in range(max_retries):
        response = requests.get(url, headers=headers, timeout=30)

        if response.status_code == 429:
            time.sleep(1)
            continue

        response.raise_for_status()
        return response.json()

    raise Exception("Rate limit: max retries exceeded")
```

**JavaScript**

```javascript theme={null}
async function fetchWithRetry(url, headers, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const res = await fetch(url, { headers });

    if (res.status === 429) {
      await new Promise((r) => setTimeout(r, 1000));
      continue;
    }

    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    return await res.json();
  }
  throw new Error("Rate limit: max retries exceeded");
}
```

実際には両方を組み合わせると効果的です。短い待機時間で`429`を予防し、再試行処理で取りこぼしに備えます。

## バッチエンドポイントで必要な送信量を減らす

速度を最適化する前に、バッチエンドポイントで総リクエスト数を減らせないか確認してください。

* `/info-batch`は1リクエストで最大100件のユーザープロフィールを取得します
* `/tweet-info-bulk`は1リクエストで最大100件のツイートを取得します

バッチリクエストも通常のリクエストと同じく、レート制限と割り当て量の両方で1件として数えます。多数のユーザーやツイートを取得する場合、個別のリクエストを並列で送るより、ほとんどの場合バッチ処理のほうが効率的です。詳しくは[API利用の最適化](https://docs.sorsa.io/ja/optimizing-api-usage)を参照してください。

## より高い上限が必要な場合

リアルタイム監視のパイプラインで毎秒100リクエスト以上など、毎秒20リクエストを超える継続的な処理が必要な場合は、[営業へのお問い合わせ](https://api.sorsa.io/talk-to-sales)または[Discord](https://discord.com/invite/uwAefKCj7X)で、専用インフラとカスタムプランをご相談ください。

## 次のステップ

* [ページネーション](https://docs.sorsa.io/ja/pagination)：レート制限内で大量のデータを効率的に取得する
* [エラーコード](https://docs.sorsa.io/ja/error-codes)：400、401、403、404、429、500レスポンスの完全なリファレンス
