The API limits how many requests you can make in a minute, so one client cannot slow the service down for everybody.
Limits #
| Who | Limit | Counted per |
|---|---|---|
| A request with a token | 600 requests per minute | The token |
| A request without a token, such as login and registration | 60 requests per minute | The address the request comes from |
The window is 60 seconds long and starts with the first request. When it ends, the count starts at zero.
These do not count:
OPTIONSrequests, which browsers send before a request from another origin.- The webhooks of GitHub and GitLab,
/integrations/github/webhookand/integrations/gitlab/webhook/{projectId}. - The routes that an MCP tool calls. The request to
/mcpitself counts as one.
Headers #
Every response says where you stand:
| Header | Meaning |
|---|---|
RateLimit-Limit | The number of requests allowed in the window |
RateLimit-Remaining | How many are left in the window |
RateLimit-Reset | Seconds until the window ends |
Retry-After | Only on 429: seconds to wait. The same as RateLimit-Reset |
Browsers on other origins can read these headers.
When you are over the limit #
POST /auth/logout is never rate limited, so signing out always works.
The API answers 429 with rate_limited and does not run the request:
HTTP/1.1 429 Too Many Requests
RateLimit-Limit: 600
RateLimit-Remaining: 0
RateLimit-Reset: 23
Retry-After: 23{
"type": "https://docs.continuous-translations.com/api/errors#rate_limited",
"title": "Too Many Requests",
"status": 429,
"error": "rate_limited"
}Wait Retry-After seconds and send the request again. Requests you send while you are over the limit count too, so do not retry in a tight loop.
Staying under the limit #
- Send one push with all keys instead of a request per key. A push takes up to 20000 keys.
- Use Pull translations for a whole language instead of reading keys one by one.
- Use one token for one job. The limit is per token, so separate pipelines with their own project keys do not share it.