---
title: Rate limits
description: Per-token and per-IP request limits, and how to handle 429 responses.
url: https://developers.wpengine.com/docs/ai/api/rate-limits/
image: https://developers.wpengine.com/og/docs/ai/api/rate-limits.png
---

# Rate limits

Rate limits are enforced at the edge load balancer, before a request reaches the API. When you exceed a limit, you get HTTP `429`.

## Current limits (AI Beta)

| Bucket                               | Limit          |
| ------------------------------------ | -------------- |
| Per `Authorization` value (any auth) | 600 req / 60 s |
| Per IP (unauthenticated)             | 60 req / 60 s  |

These limits apply across the entire `/v1/*` surface — **not per-endpoint**.

## The 429 response

The `429` response body is generated by the load balancer as a short HTML page rather than the standard JSON error envelope, and there is no `Retry-After` header:

```http
HTTP/2 429
content-type: text/html; charset=UTF-8


<!doctype html>…<title>429</title>429 Too Many Requests
```

A `429` can also come from the model provider when it is busy. That one uses the [standard error envelope](https://developers.wpengine.com/docs/ai/api/errors/#model-provider-errors) with `"type": "rate_limit_error"`. It means the model is busy, not that you hit your limit, but you handle it the same way.

> **Caution**
>
> Do **not** parse the body. Rely on the status code alone to detect throttling.

## Recommended client behavior

1. **Catch `429` responses explicitly.**
2. **Back off exponentially with jitter** — e.g. start at 1 s, double on each retry up to a 30 s ceiling, plus 0–500 ms jitter.
3. **Cap total retries** at a number that matches your SLO — typically 3 to 5 attempts.
4. **Do not retry** on `400`, `401`, `402`, `403`, or `404`. Those will not succeed on a second attempt.

## Streaming and long requests

Streaming chat completions count as a single request against the rate limit regardless of duration. If you exceed the limit while a stream is in progress, the in-flight stream completes; only the next request is throttled.

Calls to the model provider are also subject to a server-side timeout (currently 110 seconds). A request that exceeds it returns `504` with `"type": "timeout_error"` rather than `429`. For a streaming request, the timeout covers the wait for the stream to start, not its full duration.

---

> #### Staying inside the budget
>
> - [Errors — the response envelope shared by every failure](https://developers.wpengine.com/docs/ai/api/errors/)
> - [Stream a chat completion — long requests count once](https://developers.wpengine.com/docs/ai/api/stream-chat-completions/)
> - [Getting started — make your first call](https://developers.wpengine.com/docs/ai/api/getting-started/)

## Was this helpful?

Thanks for the feedback!

```json
{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://developers.wpengine.com/#website","name":"WP Engine Product Documentation","url":"https://developers.wpengine.com/","description":"Resources for developing, deploying, and scaling on WP Engine.","inLanguage":"en-US","keywords":["API documentation","product documentation","headless WordPress","managed WordPress hosting"],"publisher":{"@id":"https://wpengine.com/#organization"}}]}
```
