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

# Rate limits

> Per-key RPM limits, headers, backoff strategy, and how to raise limits.

Rimp enforces a sliding-window rate limit per API key. Limits are tied to your plan.

## Default limits

| Plan   | Requests / minute | Concurrent jobs |
| ------ | ----------------- | --------------- |
| Free   | 60                | 1               |
| Pro    | 300               | 10              |
| Studio | 600               | 25              |
| Team   | 1,200             | 30              |

You can have multiple API keys per organization, each with its own rate-limit bucket.

## Headers

Every response includes:

```http theme={null}
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 287
X-RateLimit-Reset: 1715900400
X-Request-Id: req_abc
```

`X-RateLimit-Reset` is a Unix timestamp (seconds) — wait until then to be safe.

## 429 response

```http theme={null}
HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1715900412

{
  "error": {
    "type": "rate_limited",
    "code": "rate_limited",
    "message": "Rate limit exceeded for this API key (300 rpm)",
    "request_id": "req_abc"
  }
}
```

Honor `Retry-After` (seconds). It's always smaller than 60 for RPM limits.

## Recommended backoff

```ts theme={null}
async function withRateLimitBackoff<T>(fn: () => Promise<T>): Promise<T> {
  while (true) {
    try {
      return await fn();
    } catch (err) {
      if (err.status !== 429) throw err;
      const retryAfter = Number(err.headers?.['retry-after'] ?? 1);
      await new Promise((r) => setTimeout(r, retryAfter * 1000));
    }
  }
}
```

## Anomaly detection

If your spending in any hour exceeds 10× your weekly hourly average, Rimp pauses new requests for 30 minutes and emits a `usage.anomaly_detected` webhook to your account. This protects against credential leaks and runaway loops.

You'll see:

```http theme={null}
HTTP/1.1 429 Too Many Requests
Retry-After: 1800
X-Request-Id: req_xyz

{
  "error": {
    "type": "rate_limited",
    "code": "anomaly_paused",
    "message": "Org temporarily paused due to spending anomaly. Resumes at 2026-05-19T16:30:00Z."
  }
}
```

To resume immediately, contact [support@rimp.example](mailto:support@rimp.example) with your `request_id`.

## Raising your limits

* **Pro / Studio**: limits raise automatically when you upgrade in `/billing`.
* **Team**: write to [sales@rimp.example](mailto:sales@rimp.example) with your expected RPM and concurrency.
* **Burst handling**: we don't charge for unused capacity — burst-bias your traffic into evening windows if practical.
