Rate Limits & Quotas
How the Limits Work
- Hourly rate limit. The maximum number of requests per hour. Capacity refills continuously, so your steady rate is the hourly limit divided by 3,600 (for example, 3,600 per hour is one request per second).
- Per-minute burst limit. Caps short spikes. You can briefly go faster than your steady rate, but not past this number in any minute.
- Monthly quota. The number of successful calls included in your billing period. On plans with an overage rate, requests keep working after you pass the quota and the extra calls are billed as overage. Trial and MCP plan requests stop at the quota. Enterprise and other contract accounts follow their agreement; an account with a hard cap stops at its quota with
403 quota-hard-cap.
Limits apply to your account, not to each key. All API keys, all teammates, and both REST and MCP requests draw from the same hourly, per-minute, and monthly counters. Creating more keys does not add capacity.
Only successful (2xx) responses count toward your monthly quota. Errors, including 429 responses, do not.
Limits by Plan
All prices are in USD.
| Plan | Per hour | Per minute (burst) | Steady rate | Monthly quota | Overage |
|---|---|---|---|---|---|
| MCP | 600 | 60 | 0.17 req/sec | 500 | None |
| Trial | 3,600 | 120 | 1 req/sec | 1,000 (trial total) | None |
| Developer | 3,600 | 120 | 1 req/sec | 1,000 | $0.05/call |
| Startup | 7,200 | 240 | 2 req/sec | 20,000 | $0.04/call |
| Pro | 18,000 | 600 | 5 req/sec | 50,000 | $0.03/call |
| Pro+ | 36,000 | 1,200 | 10 req/sec | 150,000 | $0.02/call |
| Enterprise | 120,000 | 2,000 | 33.33 req/sec | Set by contract | Set by contract |
Enterprise limits are set by contract. The Enterprise values above are defaults.
Parallel Requests
Parallel requests do not raise your limits. They only reach them sooner.
- Default to one request at a time. A single sequential loop with
perPage=100is fast enough for seeding and delta sync on every plan. - Fetch pages in order. Request page 1, then page 2, and so on. Do not request several pages of the same query at once.
- If you add workers, budget them together. Split work by query (for example, one worker per country with its own watermark), add workers one at a time, and keep the combined rate under your plan’s steady rate. Every worker and every key counts against the same limits.
- Back off as a group. When any worker gets a 429, slow down all workers, not just the one that was rejected.
Large queries have a separate company-wide limit
Catalog list requests (/events, /artists, /venues, /festivals, /streams), delta scans with dateModifiedFrom, and past-date queries also count against a limit on how many can run at the same time for your company. This is separate from the hourly limit and is set per company.
If too many run at once, the API can return 429 with code origin_admission_limited. Reduce parallel requests and retry the same page after Retry-After. Detail lookups by ID are not affected.
Staying Within Quota
Most unexpected overage comes from sync jobs that download more than they need to.
- Seed once, then sync changes. After the first full download, request only what changed with
dateModifiedFrom. Do not re-download the full catalog on a schedule. See Bulk Ingest & Delta Sync. - Use
perPage=100. It is the maximum. The default of 40 uses two and a half times as many calls for the same data. - Use list endpoints for bulk work. One list page returns up to 100 events. Looking up the same events one ID at a time costs up to 100 calls.
- Save the watermark only after a clean run. Record the run’s start time, page through every result, and store it as the next
dateModifiedFromonly after every page succeeds. After a 429, error, or incomplete page, retry that page; do not skip ahead. - Match the schedule to your needs. An hourly delta sync suits most production apps. Sync every 5 to 15 minutes only if your product needs near-real-time updates.
- Do not retry other 4xx errors. A 400, 401, 403, or 404 returns the same result every time.
- Watch your usage. Check GET /v3/quota from your job or the Usage page in your account.
Handling 429 Responses
Errors use application/problem+json. Check the type or code before retrying.
| Response | Cause | What to do |
|---|---|---|
429 rate-limit-exceeded | Hourly or per-minute limit reached. | Wait for Retry-After plus jitter, then retry. Lower your request rate. |
429 origin_admission_limited | Too many large queries running at once for your company. | Wait for Retry-After plus jitter, reduce parallel requests, then retry the same page. |
429 quota-exceeded | Trial or MCP plan quota used up. | Do not retry. Subscribe to a plan to continue. |
403 quota-hard-cap | Monthly quota reached on an account with a hard cap. | Do not retry. Contact your account manager. |
When you retry:
- Wait at least
Retry-Afterseconds, then add a random delay so workers do not retry at the same moment. - Stop after a fixed number of attempts (five is reasonable).
- Retry the same request. Do not advance your checkpoint past it.
async function fetchWithBackoff(url, init, maxAttempts = 5) {
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
const res = await fetch(url, init);
if (res.status !== 429) return res;
const problem = await res.clone().json().catch(() => ({}));
if (String(problem.type ?? "").endsWith("/quota-exceeded")) return res; // not retryable
const retryAfter = Number(res.headers.get("Retry-After")) || 2 ** attempt;
const jitterMs = Math.random() * 1000;
await new Promise((r) => setTimeout(r, retryAfter * 1000 + jitterMs));
}
throw new Error("Still rate limited after " + maxAttempts + " attempts");
}Rate Limit Headers
Every response reports both windows using the IETF RateLimit header draft. These headers describe the hourly and per-minute limits, not your monthly quota.
| Header | Description | Example (Pro plan) |
|---|---|---|
RateLimit-Policy | Your limits. q is the number of requests allowed and w is the window in seconds. | hour;q=18000;w=3600, minute;q=600;w=60 |
RateLimit | Current state. r is requests remaining. t is seconds until the window is full again, or, after a 429, seconds until the next request will be accepted. | hour;r=17842;t=2734, minute;r=587;t=44 |
Retry-After | Sent with 429 responses. Seconds to wait before retrying. | 12 |
Pace your client by whichever window has the lower r. The API does not send X-RateLimit-* headers.
Quota Endpoint
GET /v3/quota returns your account’s quota and usage for the current billing period.
Authenticate with your API key or an OAuth Bearer token. Calls to this endpoint do not count toward your quota. It has its own limit of 3,600 requests per hour and 60 per minute.
{
"plan": "developer",
"quota": 1000,
"usedCalls": 1240,
"remainingCalls": 0,
"overageCalls": 240,
"periodStart": "2026-03-01T00:00:00.000Z",
"periodEnd": "2026-04-01T00:00:00.000Z",
"periodSource": "anchor",
"limitType": "soft",
"blocksAtQuota": false,
"notes": {
"rateLimitHeaders": "Rate-limit headers describe short windows, not monthly quota counters.",
"overage": "Overage calls are not a final invoice balance."
}
}| Field | Description |
|---|---|
plan | Your plan. |
quota | Calls included this period, including any bonus or custom allowance. null means unlimited. |
usedCalls / remainingCalls | Calls used and calls left this period. remainingCalls is null when unlimited. |
overageCalls | Calls above the quota this period. |
periodStart / periodEnd | Start and end of the current billing period (ISO 8601). |
periodSource | How the period was determined: openmeter, anchor (your subscription start date), or calendar (calendar month). |
limitType / blocksAtQuota | soft (overage allowed), hard (requests stop at quota), or unlimited, and whether requests are blocked at quota. |
If usage data is temporarily unavailable, the endpoint returns 503 quota_usage_unavailable; retry later. overageCalls is a running count, not a final invoice amount.
Overage Billing
Calls above your monthly quota are billed at your plan’s overage rate.
On self-serve plans with an overage rate, requests are not blocked when you pass your quota. Contract accounts follow their agreement. To avoid a large bill at the end of the cycle, we invoice accrued overage as soon as it reaches your plan’s threshold and start counting again. This can happen more than once in a cycle. Any remaining overage is billed when the cycle closes.
| Plan | Overage rate | Invoiced early when overage reaches |
|---|---|---|
| Developer | $0.05/call | $150 |
| Startup | $0.04/call | $750 |
| Pro | $0.03/call | $2,500 |
| Pro+ | $0.02/call | $2,500 |
See the pricing FAQ for billing details. If you expect to exceed your quota regularly, a higher plan is usually cheaper than overage.
Next Steps
- Bulk Ingest & Delta Sync: seed a local copy and keep it current with few calls
- Error Handling: error format and status codes
- Pagination: paging through large result sets
- Pricing: compare plan limits