> ## Documentation Index
> Fetch the complete documentation index at: https://developers.essal.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Rate Limits

> Understand Essal API rate limits, burst allowances, and how to handle 429 responses gracefully.

The Essal API enforces rate limits to ensure fair usage and platform stability. Limits are applied per API key, per app, and per endpoint tier.

## Limit Tiers

| Tier            | Endpoints                        | Limit           |
| --------------- | -------------------------------- | --------------- |
| **Standard**    | Most `GET` endpoints             | 1,000 req / min |
| **Write**       | `POST`, `PUT`, `PATCH` endpoints | 300 req / min   |
| **Destructive** | `DELETE` endpoints               | 60 req / min    |
| **Bulk**        | Batch and export operations      | 10 req / min    |

Limits are calculated on a **rolling 60-second window** per API key. Workspace-level burst allowances of 2× the standard limit are available for up to 10 seconds.

## Rate Limit Headers

Every response includes headers that communicate your current usage:

```http theme={null}
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1720780860
X-RateLimit-Window: 60
```

| Header                  | Description                                    |
| ----------------------- | ---------------------------------------------- |
| `X-RateLimit-Limit`     | Maximum requests allowed in the current window |
| `X-RateLimit-Remaining` | Requests remaining before you are throttled    |
| `X-RateLimit-Reset`     | Unix timestamp when the window resets          |
| `X-RateLimit-Window`    | Window duration in seconds                     |

## Handling 429 Responses

When a rate limit is exceeded, the API returns `HTTP 429 Too Many Requests`. The `Retry-After` header indicates how many seconds to wait before retrying.

```json theme={null}
{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "You have exceeded the request limit for this endpoint. Please retry after 14 seconds.",
    "retry_after": 14
  }
}
```

Implement exponential backoff with jitter in your client:

```js theme={null}
async function requestWithBackoff(fn, maxRetries = 5) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await fn();
    } catch (err) {
      if (err.status !== 429 || attempt === maxRetries - 1) throw err;
      const retryAfter = parseInt(err.headers["retry-after"] ?? "2", 10);
      const jitter = Math.random() * 1000;
      await new Promise((r) => setTimeout(r, retryAfter * 1000 + jitter));
    }
  }
}
```

<Tip>
  Use the official Essal SDKs — they handle rate limit retries, exponential backoff, and `Retry-After` parsing automatically.
</Tip>

## Per-App Limits

Each of the six apps may apply additional limits on specific high-throughput endpoints, such as real-time collaboration events in Office or bulk import operations in Sales. Consult the relevant API reference page for per-endpoint details.

## Increasing Limits

Enterprise workspaces can request higher rate limit tiers. Contact [support.essal.cloud](https://support.essal.cloud) to discuss your usage requirements.
