# Giới hạn tỷ lệ

API MoreLogin thực thi các giới hạn tốc độ để đảm bảo mức sử dụng hợp lý và độ ổn định của hệ thống.

## Giới hạn

| Loại API | Giới hạn tỷ lệ | Cửa sổ |
|  --- | --- | --- |
| **API cục bộ** | 120 yêu cầu | mỗi phút |
| **API mở** | 120 yêu cầu | mỗi phút |


## Phản hồi giới hạn tỷ lệ

Khi bạn vượt quá giới hạn tốc độ, API sẽ trả về:

**Trạng thái HTTP**: `429 Too Many Requests`

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

## Thực tiễn tốt nhất

### 1. Triển khai Thử lại với Backoff

```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. Hoạt động hàng loạt

Thay vì thực hiện các lệnh gọi API riêng lẻ, hãy sử dụng điểm cuối hàng loạt khi có sẵn:

```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. Phản hồi bộ đệm

Đối với dữ liệu không thay đổi thường xuyên (ví dụ: danh sách múi giờ, danh sách nền tảng), hãy lưu trữ phản hồi cục bộ:

```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
```

## Giám sát việc sử dụng của bạn

Theo dõi tần suất lệnh gọi API của bạn. Nếu bạn liên tục đạt đến giới hạn, hãy cân nhắc:

- Trải đều các yêu cầu trong từng phút
- Sử dụng webhooks (sắp ra mắt) thay vì bỏ phiếu
- Kết hợp nhiều thao tác thành các cuộc gọi hàng loạt