# Giới hạn tốc độ và Header

> Giới hạn tốc độ, hạn mức và các header response của Fleetwork API.

Source: https://docs.fleetwork.vn/vi/introduction/rate-limits

## Giới hạn theo gói

| Giới hạn | Free | Premium | Internal |
|---|---|---|---|
| Request mỗi giây | 2 | 10 | 100 |
| Request mỗi phút | 60 | 500 | 5,000 |
| Request mỗi giờ | 1,000 | 20,000 | Không giới hạn |
| Request mỗi ngày | 10,000 | 200,000 | Không giới hạn |
| Request mỗi tháng | 100,000 | 5,000,000 | Không giới hạn |
| Hạn mức hàng tháng | 100,000 | 5,000,000 | Không giới hạn |
| Số API Key tối đa | 1 | 5 | 20 |
| Mức cho phép burst | 5 | 50 | 200 |

## Header Giới hạn tốc độ

Mỗi response cho request được xác thực bằng API Key đều bao gồm:

| Header | Mô tả |
|---|---|
| `X-RateLimit-Limit` | Số request tối đa mỗi phút cho khoá (`0` = không giới hạn) |
| `X-RateLimit-Remaining` | Số request còn lại trong cửa sổ hiện tại |
| `X-RateLimit-Reset` | Timestamp ISO 8601 khi cửa sổ reset |
| `Retry-After` | _(Chỉ HTTP 429)_ Số giây cần chờ trước khi thử lại |

## Header Hạn mức

| Header | Mô tả |
|---|---|
| `X-Quota-Limit` | Giới hạn hạn mức hàng tháng |
| `X-Quota-Remaining` | Hạn mức còn lại trong tháng này |
| `X-Quota-Used` | Hạn mức đã dùng trong tháng này |

## Header thông tin

| Header | Mô tả |
|---|---|
| `X-API-Key-Id` | UUID của API Key đã xác thực |
| `X-Module-Id` | UUID của module được truy cập |
| `X-Module-Name` | Tên của module được truy cập |

## Ví dụ response

### Response bình thường

```http
HTTP/1.1 200 OK
X-RateLimit-Limit: 500
X-RateLimit-Remaining: 497
X-Quota-Limit: 5000000
X-Quota-Remaining: 4999823
X-Quota-Used: 177
X-API-Key-Id: 3513c8c9-6ea7-47c3-ba37-188b842fa590
X-Module-Name: Job Management
Content-Type: application/json
```

### Response bị giới hạn

```http
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 0
Retry-After: 45
Content-Type: application/json
```

## Xử lý Giới hạn tốc độ

```javascript
async function apiCallWithRetry(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch(url, options);

    if (response.status === 429) {
      const retryAfter = parseInt(response.headers.get('Retry-After') || '1');
      await new Promise(r => setTimeout(r, retryAfter * 1000));
      continue;
    }

    return response;
  }
  throw new Error('Max retries exceeded');
}
```
