Rate Limits & Quotas

Every plan has an hourly rate limit, a per-minute burst limit, and a monthly quota. All three apply at once, and every API key on your account shares them.

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.

PlanPer hourPer minute (burst)Steady rateMonthly quotaOverage
MCP600600.17 req/sec500None
Trial3,6001201 req/sec1,000 (trial total)None
Developer3,6001201 req/sec1,000$0.05/call
Startup7,2002402 req/sec20,000$0.04/call
Pro18,0006005 req/sec50,000$0.03/call
Pro+36,0001,20010 req/sec150,000$0.02/call
Enterprise120,0002,00033.33 req/secSet by contractSet 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=100 is 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.

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 dateModifiedFrom only 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.

ResponseCauseWhat to do
429 rate-limit-exceededHourly or per-minute limit reached.Wait for Retry-After plus jitter, then retry. Lower your request rate.
429 origin_admission_limitedToo 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-exceededTrial or MCP plan quota used up.Do not retry. Subscribe to a plan to continue.
403 quota-hard-capMonthly quota reached on an account with a hard cap.Do not retry. Contact your account manager.

When you retry:

  • Wait at least Retry-After seconds, 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.

HeaderDescriptionExample (Pro plan)
RateLimit-PolicyYour 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
RateLimitCurrent 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-AfterSent 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."
  }
}
FieldDescription
planYour plan.
quotaCalls included this period, including any bonus or custom allowance. null means unlimited.
usedCalls / remainingCallsCalls used and calls left this period. remainingCalls is null when unlimited.
overageCallsCalls above the quota this period.
periodStart / periodEndStart and end of the current billing period (ISO 8601).
periodSourceHow the period was determined: openmeter, anchor (your subscription start date), or calendar (calendar month).
limitType / blocksAtQuotasoft (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.

PlanOverage rateInvoiced 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

Last updated Oct 1, 2026