# レート制限

MoreLogin API は、公平な使用とシステムの安定性を確保するためにレート制限を適用します。

## 限界

| API タイプ | レート制限 | 窓 |
|  --- | --- | --- |
| **ローカル API** | 120件のリクエスト | 毎分 |
| **オープンAPI** | 120件のリクエスト | 毎分 |


## レート制限応答

レート制限を超えると、API は次を返します。

**HTTP ステータス**: `429 Too Many Requests`

```json
{
  "code": 429,
  "msg": "Rate limit exceeded",
  "data": null,
  "requestId": "..."
}
```

## ベストプラクティス

### 1.バックオフ付きリトライの実装

```python
import time
import requests

def api_request_with_retry(url, payload, max_retries=3):
    for attempt in range(max_retries):
        response = requests.post(url, json=payload)
        if response.status_code == 429:
            wait_time = 2 ** attempt  # 1s, 2s, 4s
            print(f"Rate limited. Retrying in {wait_time}s...")
            time.sleep(wait_time)
            continue
        return response
    raise Exception("Max retries exceeded")
```

### 2. バッチ操作

個別の API 呼び出しを行う代わりに、利用可能な場合はバッチ エンドポイントを使用します。

```python
# Bad: 100 individual calls
for env_id in env_ids:
    requests.post(f"{BASE}/api/env/start", json={"envId": env_id})

# Good: Use batch endpoints
requests.post(f"{BASE}/api/env/updateGroup/batch", json={
    "envIds": env_ids,
    "groupId": "target-group"
})
```

### 3. 応答のキャッシュ

頻繁に変更されないデータ (タイムゾーン リスト、プラットフォーム リストなど) の場合は、応答をローカルにキャッシュします。

```python
# Cache timezone/language data — it rarely changes
timezone_data = requests.post(f"{BASE}/api/env/advanced/timezone").json()
# Reuse timezone_data for subsequent profile creations
```

## 使用状況の監視

API 呼び出しの頻度を追跡します。常に限界に近づいている場合は、次のことを考慮してください。

- リクエストを分単位で均等に分散する
- ポーリングの代わりに Webhook を使用する (近日公開予定)
- 複数の操作をバッチ呼び出しに結合する