Rate limits and quotas
Each plan has a quota of requests per period and a burst limit per minute. Each successful (2xx) response counts as one request, whatever the endpoint. Errors, 429 responses and /openapi.json are not counted.
| Plan | Requests | Burst limit | When it resets |
|---|---|---|---|
| Free | 1,000 in total | 30 per minute | Never |
| Starter | 1,000 per month | 60 per minute | Monthly, on your billing date |
| Pro | 10,000 per month | 300 per minute | Monthly, on your billing date |
| Enterprise | Custom | Custom | Monthly, on your billing date |
When you reach a limit
- Quota used up:
429with typequota-exceeded. Requests resume when the next period starts, or straight away after an upgrade. There is no overage billing - Burst limit reached:
429with typerate-limitedand aRetry-Afterheader. The burst limit is applied per key and per Cloudflare location, so treat it as approximate
Headers
Every counted response carries the state of your quota:
| Header | Example | Meaning |
|---|---|---|
RateLimit-Policy | "quota";q=1000;w=2592000 | Your quota and its window in seconds (IETF draft format) |
RateLimit | "quota";r=874;t=1209600 | Requests remaining and seconds until the quota resets |
X-Quota-Remaining | 874 | Requests remaining in this period |
The free trial has no reset, so its headers omit the window and reset time.
Caching
Calendar responses change at most once a week, when we refresh the data, so cache them on your side. A year of holidays for one market is one request. Status responses are marked max-age=5; other responses max-age=60.