Skip to main content

Rate Limits

Rate limits protect the API from abuse and ensure fair usage across all customers. Understanding and properly handling rate limits is essential for building reliable integrations.

Rate Limit Strategy

Rate limits are applied per API key and are calculated using a sliding window algorithm.

Rate Limit Tiers

Rate limits vary by plan tier and endpoint type.

PlanRequests/minRequests/dayBurst Limit
Starter6010,000100
Professional300100,000500
Enterprise1,0001,000,0002,000
CustomUnlimited*Unlimited*Custom

* Subject to fair use policy and infrastructure capacity

Endpoint-Specific Limits

EndpointRate LimitNotes
/v1/leads/verifyStandardReal-time verification
/v1/leads/batch10/minMax 1000 leads per batch
/v1/ping2x StandardHigher limit for ping/post
/v1/analytics30/minHeavy computation queries

Response Headers

Every API response includes headers to help you track your rate limit status.

Rate Limit Headers
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 245
X-RateLimit-Reset: 1705312800
X-RateLimit-Window: 60
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
X-RateLimit-WindowWindow size in seconds

Handling 429 Errors

When you exceed the rate limit, the API returns a 429 Too Many Requests response.

429 Response
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
Retry-After: 30

{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded. Please retry after 30 seconds.",
    "retry_after": 30
  }
}

Implementing Retry Logic

Exponential Backoff Example
async function apiRequestWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    const response = await fetch(url, options);
    
    if (response.status === 429) {
      const retryAfter = response.headers.get('Retry-After') || 
        Math.pow(2, attempt) * 1000;
      
      console.log(`Rate limited. Retrying in ${retryAfter}ms`);
      await new Promise(r => setTimeout(r, retryAfter));
      continue;
    }
    
    return response;
  }
  
  throw new Error('Max retries exceeded');
}

Best Practices

Implement exponential backoff

Start with short delays and increase exponentially on repeated failures.

Monitor rate limit headers

Track remaining requests and proactively slow down before hitting limits.

Use batch endpoints

Process multiple leads in a single request to reduce API calls.

Add jitter to retries

Add randomness to retry delays to prevent thundering herd problems.

Requesting Higher Limits

If your use case requires higher rate limits, contact our team to discuss custom plans.

Enterprise customers can request custom rate limits based on their specific needs and infrastructure requirements.

Contact Sales