Rate Limits
Rate limits protect the API and ensure fair usage. Limits are per team and vary by plan.
Headers
Every response includes rate limit info:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
X-RateLimit-Reset: 1705320000
Retry-After: 60 (only on 429 responses)
Limits by Plan
| Plan | Requests/Minute | Requests/Day | Enrichments/Month |
|---|---|---|---|
| Free | 5 | 50 | 250 |
| Starter | 60 | — | 1,000 |
| Growth | 300 | — | 10,000 |
| Enterprise | Custom | Custom | Custom |
What counts: Only POST /api/enrich requests count. Polling (GET /jobs/{id}) and duplicate domain submissions do not count.
Handling 429 Responses
When you exceed your limit, implement retry with backoff:
- JavaScript
- Python
async function enrichWithRetry(domain, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch('https://api.veraenrich.com/enrich', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.VERA_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ url: domain })
});
if (response.status === 429) {
const retryAfter = parseInt(response.headers.get('Retry-After') || '60');
console.log(`Rate limited. Retrying in ${retryAfter}s...`);
await new Promise(r => setTimeout(r, retryAfter * 1000));
continue;
}
return response.json();
}
throw new Error('Max retries exceeded');
}
import os, time, requests
def enrich_with_retry(domain, max_retries=3):
for i in range(max_retries):
response = requests.post(
'https://api.veraenrich.com/enrich',
headers={'Authorization': f'Bearer {os.environ["VERA_API_KEY"]}'},
json={'url': domain}
)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
print(f'Rate limited. Retrying in {retry_after}s...')
time.sleep(retry_after)
continue
return response.json()
raise Exception('Max retries exceeded')
Best Practices
- Cache results — Company data changes infrequently. Cache for 24+ hours.
- Use bulk API for large volumes — one request instead of hundreds.
- Monitor usage — Check
X-RateLimit-Remainingproactively, alert when low. - Queue requests — For high-volume apps, use a job queue with rate limiting built in.
If you consistently hit limits, upgrade your plan or contact us for custom enterprise limits.