# レート制限と上限

> このページの値は、公式の文字おこしくん（`moji.kaitoranma.com`）の今の値で、予告なく変わることがあります。上限に当たったときの扱いは[エラーコード](errors/index.md)にあります。

## WebSocket

| 対象 | 上限 | 超えたとき |
|---|---|---|
| 1 メッセージ（テキスト・バイナリ） | 64 KiB | 文字おこしくんが fatal な `invalid_message` を送って、接続を切る |
| 同時接続数（Ingest + Subscribe、文字おこしくんの API 全体） | 4,096 | 文字おこしくんが upgrade を HTTP 503（`too_many_connections`）で断る |
| 同時接続数（同じ送信元アドレスから） | 1,024 | 文字おこしくんが upgrade を HTTP 429（`too_many_connections`）で断る |
| `hello` が届くまで | 10 秒 | 文字おこしくんが `invalid_message` を送って、接続を切る |
| 1 セッションを同時に購読できる接続（Subscribe） | 100 | 文字おこしくんが fatal な `rate_limited` を送る |
| 送信待ちの詰まり（Subscribe。受け手の受信が遅い） | 文字おこしくんは、送信待ちが 64 KiB になると `partial` を間引き、1 MiB になると接続を切る | 文字おこしくんが非 fatal な `rate_limited` を送ってから、接続を切る（再接続すると、新しい `welcome` から始まる） |
| `welcome.recent` の発話 | 直近 50 件 | — |
| 1 セッションの Ingest 接続 | 1 本 | 文字おこしくんが古い接続を `superseded` で切る |
| 1 接続のトラック（Ingest） | 64 本 | 文字おこしくんが非 fatal な `track_limit_exceeded` を返す |
| 同時に開いているトラック（Ingest。API キーで作ったセッション全部の合計。ほかの利用者の API キーを含む） | 20 本 | 文字おこしくんが非 fatal な `track_limit_exceeded` を返し、新しいトラックを開かない。クライアントは、時間をおいてから、文字おこしくんが開かなかったトラックを開き直す。文字おこしくんは、公式の Discord ボットのセッションのトラックを数えない |
| 1 接続の話者（Ingest） | 256 人 | 文字おこしくんが非 fatal な `rate_limited` を返す |

## サーバーごとの上限（テナント = Discord サーバーごと）

| 項目 | 公式の文字おこしくんの値 | 超えたとき |
|---|---|---|
| 記録の保持期間 | セッションの終了から、Discord サーバーのレベルの日数（30・90・180・365 日。[利用規約 第6条](../legal/terms.html#levels)）。日数は終了した時点のレベルで決まる。その後にレベルが上がると、文字おこしくんは、まだ消していない記録の保持期限（`retainUntil`）も、終了から上がったレベルの日数まで延ばす。レベルが下がっても、文字おこしくんは保持期限を早めない | 文字おこしくんは、期間を過ぎた記録を消す（そのセッションへの要求には `404 session_not_found` を返す） |
| API キーの利用 | 可（どの Discord サーバーでも） | 文字おこしくんの運営者がその Discord サーバーの API キーの利用を止めたときだけ、文字おこしくんが `403 api_access_disabled` を返す |
| 有効な API キーの数 | 25 個（Discord サーバーごと） | Discord サーバーの管理者は、管理画面で新しいキーを作れない（使っていないキーを取り消してから作る） |
| Webhook の送信先の数 | 5 個（Discord サーバーごと。止めている送信先も数える） | Discord サーバーの管理者は管理画面で新しい送信先を追加できない（使っていない送信先を削除してから追加する） |

- 利用量は**音声認識にかけた音声の秒数**で、文字おこしくんは利用量をトラックごとに数えて足します（3 人が同時に話せば 3 倍になります）。今の利用量は [`GET /v1/usage`](http.md#getUsage)（`usage:read` の API キー）で分かります。公式の文字おこしくん（`moji.kaitoranma.com`）には、1 日の利用量の上限と、Discord サーバーごとの同時トラック数の上限はありません。
- Discord サーバーのメンバーは、[管理画面](/app/)の「利用状況」で、その Discord サーバーの日ごとの発話の時間を確かめられます。
- Webhook の送り直しの間隔と回数は [Webhook リファレンスの送り直し](webhooks.md#retries)に、応答を待つ時間は[応答のしかた](webhooks.md#respond)にあります。
- 上限を変えたいときは、[contact@kaitoranma.com](mailto:contact@kaitoranma.com) へご連絡ください。

## HTTP API

| 対象 | 既定 | 超えたとき |
|---|---|---|
| API キーごと | 1 分あたり 120 要求（使える要求の数は、毎秒 2 ずつ戻り、最大 120 までたまる） | `429 rate_limited`（`Retry-After`） |
| 送信元 IP ごと（API キーを使わない要求: セッショントークンでの書き出しと ChatGPT への転送（`/chatgpt`）・認証に失敗した要求など） | 1 分あたり 120 要求 | `429 rate_limited`（`Retry-After`） |
| 書き出し（`/transcript`）の同時実行 | 文字おこしくんの API 全体で 2 本 | `429 rate_limited`（`Retry-After: 5`） |
| 本文の大きさ | 16 KiB | `413 payload_too_large` |
| セッションの一覧の 1 ページ（`limit`） | 既定 20、最大 100 | `400 invalid_request` |
| 利用量の期間（`from`〜`to`） | 両端を含めて 366 日まで | `400 invalid_request` |
| `Idempotency-Key` を覚える期間 | 24 時間 | — |

`RateLimit` ヘッダー・`Retry-After` の読み方と `Idempotency-Key` の使い方は、[HTTP API リファレンス](http.md#レート制限)にあります。

### セッショントークンの有効期間

| 発行のしかた | 既定 | 最大 |
|---|---|---|
| API キーで `POST /v1/sessions/{sessionId}/tokens`（`ttlSeconds`） | 1 時間（3,600 秒） | 24 時間（86,400 秒） |
| API キーで `POST /v1/sessions`（応答の `ingest.token` / `subscribe.token`）・Discord の `/link`（返答のボタンで開くオーバーレイの URL） | 24 時間 | — |
| API キーで `POST /v1/sessions/{sessionId}/downloads`（書き出しのリンクの `transcript:download` のトークン。`ttlSeconds`） | 1 時間（3,600 秒） | 24 時間（86,400 秒）。文字おこしくんは、期限を記録の保存期限より後にしません |

**文字おこしくんには、トークンを 1 つずつ取り消す仕組みがありません**（流出したトークンは、期限まで使えてしまいます）。トークンの有効期間は、必要な長さより長くしないでください。
