API Reference

Rate Limits

Rate limits protect the API from abuse and ensure fair usage for all customers. Limits vary by subscription tier.

Limits by Tier

FeatureStarterFreeProfessional$99/moEnterpriseCustom
Monthly Requests100,0005,000,000Unlimited
Requests/Minute (RPM)603001,000+
Redaction FormatsToken onlyAll (Token, Hash, Synthetic)All (Token, Hash, Synthetic)
Custom PatternsNoUp to 50Unlimited
Audit Log Retention7 days30 days90 days

Rate Limit Headers

Every API response includes headers with your current rate limit status:

HeaderDescription
X-RateLimit-LimitMaximum requests per minute for your tier
X-RateLimit-RemainingRemaining requests in the current window
X-RateLimit-ResetUnix timestamp when the limit resets
Retry-AfterSeconds to wait before retrying (only on 429)
http
HTTP/1.1 200 OK
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 287
X-RateLimit-Reset: 1702000060
X-Request-ID: 01HXYZ123ABC

Handling Rate Limits

When you exceed your rate limit, you'll receive a 429 Too Many Requests response:

http
HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1702000090

{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit exceeded. Please wait 30 seconds before retrying.",
    "status": 429
  }
}

Best Practices

  • Implement exponential backoff - When receiving a 429, wait for the Retry-After duration, then retry with increasing delays.
  • Monitor headers proactively - Check X-RateLimit-Remainingand slow down before hitting the limit.
  • Use request queuing - Queue requests and process them at a controlled rate to stay within limits.
  • Batch when possible - Combine multiple operations into fewer API calls where the API design allows.
typescript
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) {
      const retryAfter = parseInt(response.headers.get('Retry-After') || '60');
      console.log(`Rate limited. Waiting ${retryAfter}s...`);
      await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
      continue;
    }

    return response;
  }

  throw new Error('Max retries exceeded');
}

Monthly Quotas

In addition to per-minute rate limits, each tier has a monthly request quota:

  • Starter: 100,000 requests/month
  • Professional: 5,000,000 requests/month
  • Enterprise: Unlimited (custom agreement)

Quotas reset on the first day of each billing cycle.

Need Higher Limits?

If you're hitting rate limits frequently, consider upgrading your plan or contact us for enterprise pricing with custom limits.