Overview
The API enforces three independent rate limits to ensure fair usage and system stability. All must pass for a request to proceed.
| Limit | Value |
|---|---|
| Requests per minute | 500 per API key |
| Request timeout | 60 seconds |
| Complexity budget | 750 points per API key, refills every 15 seconds |
| Max operation complexity | 750 points per operation |
| Mutation cost multiplier | 5x query complexity |
| Mutations per minute | 60 per API key |
Request rate limit
Each API key can make up to 500 requests per minute. This limit applies regardless of query complexity or operation type, every request counts as one.
Response headers
Every response includes request rate limit headers:
| Header | Description | Example |
|---|---|---|
X-RateLimit-Remaining | Requests remaining in the current window | 487 |
X-RateLimit-Reset | When the rate limit window resets (RFC 1123) | Sun, 02 Mar 2026 15:30:45 UTC |
Complexity rate limit
In addition to the request limit, each API key has a complexity budget. Every operation has a complexity score based on the fields and nesting depth you request. The more data your operation asks for, the higher its cost.
- Your budget starts at 750 points and refills fully every 15 seconds (50 points per second).
- Each operation consumes points equal to its complexity score, with a minimum cost of one point.
- Mutations are more expensive and they consume 5x the complexity points of an equivalent query. For a typical single-field mutation this means a cost of 5 points instead of 1.
- Operations with a complexity score above 750 are rejected before execution.
How complexity is calculated
Complexity is determined by static analysis of your query before it runs. Deeper nesting and more fields increase the score. The X-Complexity-Cost header on every response tells you what your query cost.
Response headers
Every response includes complexity rate limit headers:
| Header | Description | Example |
|---|---|---|
X-Complexity-Cost | Complexity score consumed by this query | 46 |
X-Complexity-Remaining | Points remaining in your complexity budget | 704 |
X-Complexity-Limit | Maximum budget capacity | 750 |
X-Complexity-Reset | When the next complexity point restores (RFC 1123) | Sun, 02 Mar 2026 15:30:45 UTC |
Write rate limit
Mutations have a dedicated rate limit of 60 per minute per API key, in addition to the request rate limit and complexity budget. This limit only applies to mutations, queries are not affected.
Response headers
Mutation responses include write rate limit headers:
| Header | Description | Example |
|---|---|---|
X-Write-RateLimit-Limit | Maximum mutations allowed per minute | 60 |
X-Write-RateLimit-Remaining | Mutations remaining in the current window | 54 |
X-Write-RateLimit-Reset | When the write rate limit window resets (RFC 1123) | Sun, 02 Mar 2026 15:30:45 UTC |
Handling rate limits
When you receive a 429 Too Many Requests response, you have exceeded the request limit, the complexity budget, or the write rate limit.
- Check the
Retry-Afterheader to determine when to retry - Back off and retry after the indicated time
- Do not retry immediately, repeated 429s will not reset the window
When throttled by the complexity budget, the response body includes a GraphQL error:
{
"errors": [
{
"message": "Complexity budget exhausted. Try a less complex query or wait for your budget to restore.",
"extensions": {
"code": "THROTTLED"
}
}
]
}Best practices
- Batch related data into a single query. GraphQL lets you request multiple fields in one request, use this to reduce your request count.
- Request only the fields you need. Smaller queries have lower complexity scores so you can make more of them before exhausting your budget.
- Monitor your headers. Watch
X-RateLimit-Remaining,X-Complexity-Remaining, andX-Write-RateLimit-Remainingto slow down before hitting limits rather than reacting to 429s. - Avoid deeply nested queries. Nesting increases complexity quickly so if you need data from multiple levels consider breaking it into separate queries.
Need help?
If you run into any issues or have questions, please reach out to our Support Engineering team by opening a ticket via the Dashboard: https://dashboard.meter.com/support