Rate Limits
Understand API rate limits, response headers, and best practices for handling rate limit errors gracefully.
Overview
Rate limits protect the API from abuse and ensure fair usage for all customers. Each API key has a request quota that resets hourly. When you exceed your limit, requests will return a 429 (Too Many Requests) error until the limit resets.
Default Limits
Standard rate limits per API key: | Limit Type | Limit | Reset Period | |------------|-------|-------------| | Requests | 1,000/hour | Hourly | | Burst | 100/minute | Per minute | | Batch size | 100 items | Per request | **Per-endpoint limits:** • Email verification: 1,000/hour • Email finding: 500/hour • Enrichment: 200/hour • Lead search: 500/hour • SEO analysis: 200/hour Need higher limits? Contact support to discuss enterprise options.
Rate Limit Headers
Every response includes rate limit information in the headers: ``` X-RateLimit-Limit: 1000 X-RateLimit-Remaining: 856 X-RateLimit-Reset: 1709046000 Retry-After: 3600 ``` | Header | Description | |--------|-------------| | `X-RateLimit-Limit` | Maximum requests allowed per hour | | `X-RateLimit-Remaining` | Requests remaining in current window | | `X-RateLimit-Reset` | Unix timestamp when limit resets | | `Retry-After` | Seconds until you can retry (only on 429) |
Handling Rate Limits
When you receive a 429 response, implement retry logic: ```javascript async function makeRequest(url, options) { const response = await fetch(url, options); if (response.status === 429) { const retryAfter = response.headers.get('Retry-After') || 60; await sleep(retryAfter * 1000); return makeRequest(url, options); // Retry } return response; } ``` **Exponential backoff:** For repeated failures, use exponential backoff with jitter: ```javascript const delay = Math.min(baseDelay * 2 ** attempt + randomJitter, maxDelay); ```
Best Practices
Optimize your API usage to avoid rate limits: • **Use batch endpoints** - Verify 100 emails in one request instead of 100 requests • **Cache responses** - Don't re-fetch data you already have • **Spread requests** - Don't burst all requests at once • **Monitor headers** - Track remaining quota proactively • **Handle errors gracefully** - Implement proper retry logic • **Use webhooks** - For async operations, wait for callbacks instead of polling **Queue-based approach:** ```javascript // Process requests with rate limiting const queue = new RateLimitedQueue({ maxConcurrent: 10, minDelay: 100 // ms between requests }); await queue.addAll(requests); ```
Related Articles
Error Handling
Handle 429 errors and other API errors gracefully.
Authentication
API key management and security best practices.
SEO Endpoints
Generate SEO reports, analyze performance, track keyword rankings, and monitor Core Web Vitals.
AI Personalization API
Generate AI-written email hooks and subject lines through the API. Learn when to use sync vs batch, the idempotency and polling patterns, pricing, and error codes.