Rate Limits

The VerifyEmail.io API uses rate limiting to ensure fair usage and system stability. This page explains how limits work and how to handle them gracefully.

Per-Plan Limits

Each plan has a monthly request quota. When you reach your limit, requests return HTTP 429 until the next billing cycle.

Email Verification API

Plan Monthly Limit
Unauthenticated 1 request/day per IP
Free (authenticated) 100 requests/month
Paid plans Varies by tier. See Pricing.

Contact Finder API

Plan Monthly Limit
Unauthenticated 1 request/day per IP
Free (authenticated) 5 requests/month
Paid plans Varies by tier. See Pricing.

Rate Limit Headers

Every API response includes headers that tell you your current rate limit status. Use these to proactively manage your usage.

Header Description Example
X-RateLimit-Limit The maximum number of requests allowed in the current period. 100
X-RateLimit-Remaining The number of requests remaining in the current period. 87
X-RateLimit-Reset Unix timestamp (in seconds) when the rate limit resets. 1717200000
Example Response Headers
HTTP/1.1 200 OK
Content-Type: application/json
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1717200000

HTTP 429: Too Many Requests

When you exceed your rate limit, the API returns a 429 status code with details about when you can retry.

429 Response Example
{ "error": true, "message": "Rate limit exceeded. Please try again later.", "status": 429 }

The X-RateLimit-Reset header will indicate when your quota resets. Wait until that time before retrying.

Handling 429 in JavaScript
const response = await fetch(url, { headers });

if (response.status === 429) {
  const resetTime = response.headers.get('X-RateLimit-Reset');
  const waitMs = (resetTime * 1000) - Date.now();
  console.log(`Rate limited. Retry in ${Math.ceil(waitMs / 1000)}s`);
}

Best Practices

Cache verification results

Store results locally and avoid re-verifying the same email within a reasonable window (e.g., 24-72 hours). Email validity rarely changes within hours.

Implement exponential backoff

If you receive a 429, wait before retrying. Double the wait time on each consecutive 429 (e.g., 1s, 2s, 4s, 8s) up to a maximum of 60 seconds.

Monitor the rate limit headers

Check X-RateLimit-Remaining in each response. When it approaches zero, slow down or queue requests for later.

Deduplicate before sending

If verifying a list, remove duplicate email addresses first. Each duplicate counts against your quota.

Use bulk verification for large lists

For verifying hundreds or thousands of emails, use the bulk import tool in your dashboard instead of individual API calls.