Skip to main content

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

PlanRequests/MinuteRequests/DayEnrichments/Month
Free550250
Starter601,000
Growth30010,000
EnterpriseCustomCustomCustom

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:

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');
}

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-Remaining proactively, 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.