Rate Limits
The Routebase API limits how many requests a client can send in a time window. This page lists the limits and explains how to handle a rejected request.
The same values are available as a machine-readable file at governance/rate-limits.yaml.
Limits
| Budget | Requests | Window | Counted per |
|---|---|---|---|
| Authenticated requests | 5,000 | 60 seconds | User |
| Requests without a user | 100 | 60 seconds | IP address |
| MCP endpoint | 200 | 60 seconds | User |
These limits are the same on every plan.
How requests are counted
Each window is a sliding window, so it moves with every request instead of resetting at a fixed time.
API keys share the budget of their user. Creating a second key for the same user does not add requests, because both keys count against one budget.
SCIM requests count as requests without a user. A SCIM token identifies an organization and not a user, so these requests use the budget of the IP address they come from. Your identity provider and anything else behind the same address share those 100 requests.
The MCP endpoint has its own budget. MCP Authentication explains how that budget applies to agents.
When you exceed a limit
The API rejects the request instead of queueing it. The response has these properties:
- The status is HTTP 429.
- The
Retry-Afterheader holds the number of seconds to wait. - The body is JSON in the problem details format, and its
retryAfterfield holds the same number.
{
"type": "https://httpstatuses.io/429",
"title": "Too Many Requests",
"status": 429,
"detail": "Rate limit exceeded. Please try again later.",
"instance": "/api/projects",
"traceId": "0HNPRV4VQP40T:0000000D",
"retryAfter": 12
}
Handling HTTP 429
- Read
Retry-Afterfrom the response. - Wait at least that many seconds before you send the request again.
- Add a small random delay when several workers share a budget, so they don't all retry at the same moment.
Reading your remaining budget
Responses from the REST API and from SCIM carry two headers that show your budget before you reach the limit. They follow the IETF draft draft-ietf-httpapi-ratelimit-headers:
RateLimit-Policy: "authenticated";q=5000;w=60
RateLimit: "authenticated";r=4873
RateLimit-Policynames the budget, with its quota inqand its window in seconds inw.RateLimitholds the requests you have left inr. On a 429 response it also holdst, which is the same number of seconds asRetry-After.
A response can arrive without these headers, so treat a missing header as an unknown budget and not as an exhausted one. The MCP endpoint doesn't send them.
Related
- API Deprecation Policy explains how changes to the public API are announced.
- Idempotency Keys explains how to retry a write without creating a duplicate.
- API Keys explains how to create and scope a key.
- MCP Authentication covers the budget of the MCP endpoint.