# レート制限

> フォームごとのレート制限のプリセットの正確な数値、回復の仕組み、429 の内容。

レート制限は、1 人の訪問者や 1 つのスクリプトがフォームに大量送信するのを防ぎます。どのフォームにもプリセットがあり、すべての制限はボディを読む前に正確にカウントされます。拒否された送信は許容量を消費しません。

## プリセット

| プリセット | 訪問者とフォームごと | 向いている用途 |
| --- | --- | --- |
| 標準（デフォルト） | 1 分に 5 件、10 秒に最大 3 件 | ほとんどのフォーム |
| 緩め | 1 分に 20 件 | ログインが必要なフォーム、社内ツール、共有 Wi-Fi のイベント |
| 厳しめ | 10 分ごとに 2 件 | お問い合わせや営業のフォーム。繰り返しはダブルクリックかボット |
| カスタム | 10 秒、1 分、10 分、1 時間、1 日ごとに 1〜1,000 件 | 1 人 1 回の応募、キオスク端末などの特殊なケース |

## プリセットの比較

2 分間、1 秒に 1 回送信ボタンを押す訪問者の場合に通る送信の数です。Ikiform と同じアルゴリズムでシミュレーションしています:

| プリセット | 120 件中の受け付け数 | 受け付けた秒 |
| --- | --- | --- |
| 標準 | 14 | 0, 1, 2, 4, 7, 12, 24, 36, 48, 60, 72, 84, ... |
| 緩め | 59 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... |
| 厳しめ | 2 | 0, 1 |

## 制限の回復の仕組み

制限は固定の時間枠ではなく、なめらかに回復する許容量です。しばらく送信していない訪問者は許容量が満タンの状態から始まり、すぐに使い切ることもできます。その後は、時間枠を上限で割った間隔ごとに 1 件ずつ送信できるようになります。標準なら 12 秒ごと、緩めなら 3 秒ごと、厳しめなら 5 分ごとです。時間枠いっぱい送信がなければ、許容量は再び満タンになります。

標準には 10 秒に 3 件というバーストのルールもあるので、最初のバーストは 5 件ではなく 3 件です。緩め、厳しめ、カスタムには別のバーストのルールはありません。

## 常に適用される制限

| ルール | 制限 | カウント単位 |
| --- | --- | --- |
| 大量送信ガード（フォームの検索前） | 1 分に 600 件 | IP（全フォーム合計） |
| フォーム横断 | 1 分に 30 件、またはカスタムの 1 分あたりのレートがそれより高い場合はそのレート | IP（全フォーム合計） |
| フォーム全体 | 1 分に 300 件、またはカスタムの上限 1〜10,000 件 | フォーム（全訪問者合計） |
| `GET /f/<formId>/schema` | 1 分に 60 件 | IP とフォーム |
| Ikiform の確認フレーム | 1 分に 60 件 | IP とフォーム |
| REST API | 1 分に 100 件 | API キー |

大量送信ガードより速いカスタムのレートは、保存時に拒否されます。たとえば 10 秒の時間枠なら最大 100 件です。フォームのスキーマや人間確認の読み込みが、送信の許容量を消費することはありません。

## カスタム

- **Submissions per visitor**（訪問者ごとの送信数）: 1〜1,000 の整数と、10 秒、1 分、10 分、1 時間、1 日のいずれかの時間枠。
- **Form-wide cap per minute**（フォーム全体の 1 分あたりの上限）: 任意で、1〜10,000。フォーム全体のデフォルトである 1 分に 300 件を置き換えます。
- 1 時間や 1 日の時間枠は、プレゼント企画や出欠確認など、1 人 1 回のフォームに向いています。オフィスやイベントなどでは、多くの人が 1 つの IP を共有することがある点に注意してください。

## 制限に達した場合

送信は `429 rate_limited` で拒否され、次の送信が許可されるまでの秒数（整数）を示す `Retry-After` ヘッダーが付きます。ブラウザーからのフォーム送信には、ホストされた「Slow down」ページが表示されます。Ikiform が CORS で公開しているので、`fetch` のコードは `Retry-After` を読み取れます。

`429 Too Many Requests`:

```http
HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-Request-Id: req_01k7v2c9t3e8m5q4x6z0a1b2c3
Content-Type: application/json; charset=utf-8

{"ok":false,"error":{"code":"rate_limited","message":"Too many requests. Please slow down."},"request_id":"req_01k7v2c9t3e8m5q4x6z0a1b2c3"}
```

1. もう一度送る前に、`Retry-After` の秒数だけ待ちます。
2. 通常の訪問者が制限に達する場合は、フォームを緩めかカスタムに切り替えます。
3. サーバーが訪問者の代わりに送信する場合、すべての送信がサーバーの IP を共有します。[サーバーから送信する](https://ikiform.com/ja/docs/guides/server.md#what-changes)を参照してください。

> レート制限の設定は非公開です。スキーマのエンドポイントや REST API で公開されることはありません。
