Skip to main content
Every API operation has rate limits. Limits are per-organization, not per-key. If two keys belong to the same org, they share the same quota.

Per-plan rate limits

These values come directly from the plan configuration. Per-minute limits protect against bursts. Monthly limits cap total usage.

Secret scans

FreeDeveloperProEnterprise
Per minute102030100
Per hour1003005002,000
Per month1,0005,00010,000Unlimited

Vulnerability scans

FreeDeveloperProEnterprise
Per minute551050
Per hour501002001,000
Per month5002,5005,000Unlimited

Policy evaluations

FreeDeveloperProEnterprise
Per minute204060200
Per hour2005001,0005,000
Per month5,00020,000UnlimitedUnlimited

Auto-fix generation

FreeDeveloperProEnterprise
Per minute5102050
Per hour501503001,000
Per month5002,5005,000Unlimited

API requests

FreeDeveloperProEnterprise
Per minute3060120500
Per hour5002,5005,00020,000
Per month10,00050,000100,000Unlimited

Webhook deliveries

FreeDeveloperProEnterprise
Per minute102030100
Per hour2005001,0005,000
Per month5,00025,00050,000Unlimited

Rate limit headers

Every response includes these headers:
HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets
Retry-AfterSeconds to wait before retrying (only on 429 responses)

Handling rate limits

When you receive a 429:
HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1710360000
  1. Read the Retry-After header.
  2. Wait that many seconds.
  3. Retry the request.
Do not retry in a tight loop. Implement exponential backoff if you are batching requests.
async function requestWithRetry(url: string, options: RequestInit, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, options);

    if (response.status !== 429) return response;

    const retryAfter = Number(response.headers.get("Retry-After") ?? 30);
    await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
  }

  throw new Error("Rate limit exceeded after max retries");
}

Overage behavior

  • Free plan: Hard-capped. When you hit the monthly limit, requests return 403 FORBIDDEN with code PLAN_LIMIT_REACHED until the next billing cycle.
  • Developer and Pro plans: Overage is billed at $0.02 per credit. You are not cut off mid-request. Usage is billed at the end of the billing cycle.
  • Enterprise plans: Unlimited credits. No overage charges.

Credit costs

Every operation consumes credits from your included balance:
OperationCredits
Shield scan1
Real-time scan1
Sentinel review2
Fix suggestion3
Code review5
Policy evaluation1
See Plan Comparison for included credit amounts per plan.
If you consistently hit rate limits, check your plan’s monthly allowance first. Per-minute limits reset quickly, but monthly limits don’t. Upgrading your plan is usually more cost-effective than optimizing around limits.