> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.v2.rasen.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.v2.rasen.ai/_mcp/server.

# Rate limits

Every authenticated request counts, including one the operation then refuses. A request refused by
the rate limit itself does not count.

## Ceilings per minute

| Class                                                          | Per key | Per workspace |
| -------------------------------------------------------------- | ------- | ------------- |
| Reads (including `POST /calls/search` and `POST /usage/query`) | 60      | 600           |
| Call starts (`createCall`)                                     | 10      | 60            |
| Authoring writes                                               | 30      | 120           |
| Ingestion, discovery and provisioning                          | 5       | 20            |

Lower limits of the platform (admission, quota and capacity) apply first when they are tighter.

## Headers

| Header                | Meaning                                                                    |
| --------------------- | -------------------------------------------------------------------------- |
| `RateLimit-Limit`     | Requests allowed in the current window, for the tightest applicable limit. |
| `RateLimit-Remaining` | Requests left in the current window.                                       |
| `RateLimit-Reset`     | Seconds until the current window resets.                                   |
| `Retry-After`         | On a `429`: seconds to wait before retrying.                               |

## When you hit a limit

The API answers `429 rate_limited` with `Retry-After`. `details` names the `limit`, the `scope` and
the window (`window_s`). Wait `Retry-After` seconds, then resend the same request; for a mutation, keep
the same `Idempotency-Key`.

`429 quota_exceeded` is a different refusal: a usage quota, not a request rate. It also carries
`Retry-After`, and `details` describes the meter and period.

```json
{
  "error": {
    "code": "rate_limited",
    "message": "The request rate limit has been reached.",
    "details": {"limit": 60, "scope": "key", "window_s": 60},
    "request_id": "req_01j00000000000000000000000",
    "retry": "retry_after"
  }
}
```