Rate Limit & Quotas

You can use a certain number of requests per month, defined by your plan.

Once you go over this quota, the API returns a 429 HTTP status code, and you either need to upgrade your plan or wait until the end of the month. We also enforce a minute rate limit on the free plan: up to 10 requests per minute. Every validation request and every bulk job you submit counts once against it, over the REST API or the MCP server, including free ones and requests answered with an error; requests made with sandbox API keys do not count. If you exceed this, the API returns a 429 HTTP status code with the code rate_limit_exceeded. You then have to wait until the end of the minute to make more requests; the Retry-After header says how many seconds that is. Paid plans have no minute rate limit. Not every request counts towards your monthly request volume.

Your account can also run only a limited number of validations at the same time: 5 on the free plan, 25 on paid plans. A validation sent while that many are still running is answered with a 429 HTTP status code (concurrency_limit_exceeded, with a Retry-After header) and does not count against your quota; send it again once one of them has finished.

Unknown results

Free unknown results are limited per account, so that they cannot be used for unlimited mail server checks:

  • Up to 2% of your monthly quota per hour, 20% per day and 30% per month are free, at least 5 per hour, 10 per day and 30 per month. The month counts the free unknown results of the last 32 days, so no billing month gets more. The daily and monthly allowances are shared with the unknown results refunded on bulk jobs. Past one of them, unknown results count like definitive ones until its period is over; the hour and the day start with your first free unknown result.
  • Checking the same address again within an hour after an unknown result counts against your quota (letter case and a +tag do not make it a different address).
  • X-Cost always tells you what a call counted.

Response Headers

We attach specific headers to tell you your current monthly/minute quota and how much you have remaining in the period.

X-RateLimit-Limit-Quota-Minute: 5
X-RateLimit-Limit-Quota-Month: 100

X-RateLimit-Remaining-Quota-Minute: 3
X-RateLimit-Remaining-Quota-Month: 28

X-Cost: 1
  • X-RateLimit-Limit-Quota-Month / X-RateLimit-Remaining-Quota-Month report your monthly quota and how much of it is left.
  • X-RateLimit-Limit-Quota-Minute / X-RateLimit-Remaining-Quota-Minute are only present on plans that have a minute rate limit (e.g. the free plan); on plans without one, these headers are not sent. The minute headers count on the gateway node that answered the request: X-RateLimit-Limit-Quota-Minute shows that node's limit (5), and with our two gateway nodes that makes the 10 requests per minute of the free plan. X-RateLimit-Remaining-Quota-Minute is what is left on that node.
  • X-Cost tells you how many requests the call counted against your quota (0 for sandbox requests and free results). For a bulk job it is the number of unique, valid addresses in the list, charged when you submit it.

Grace & overage headers

In two situations your requests draw from a different quota bucket, reported by its own pair of headers:

  • While a billing issue (e.g. a failed payment) is being resolved, your account runs on a temporary grace quota and responses carry X-RateLimit-Limit-Grace-Month / X-RateLimit-Remaining-Grace-Month instead of the monthly headers.
  • If overage is enabled for your account and your monthly quota is used up, additional requests draw from your overage allowance and responses carry X-RateLimit-Limit-Overage-Month / X-RateLimit-Remaining-Overage-Month in addition to the (exhausted) monthly headers.

Bulk jobs

A bulk job costs one request per unique, syntactically valid address in the list, charged when you submit it. Duplicates and rows without a valid address are free. When the job completes, addresses we could not verify because of a failure on our side are refunded, and so are the other addresses whose result is unknown, within the fair-use allowance. Deleting a job refunds the addresses not verified yet. Refunds go back to your current quota and cannot raise it above its size, so a refund after your monthly quota reset gives back at most the requests you have used since the reset. Checking a job, listing jobs, downloading results and deleting jobs are free.

  • A list is only accepted if your monthly (or grace) quota has more requests left than the job costs. Otherwise the request is answered with 429 (quota_exceeded, or grace_quota_exceeded on a grace quota), and quota.required in the body says how many requests the job needs; nothing is stored or billed. Bulk jobs do not use the overage allowance.
  • Submitting a job counts as one request against the minute rate limit, whatever the size of the list. Checking a job, listing jobs and downloading results do not count, but while the minute's 10 requests are used up, they are answered with 429 too.
  • When your quota is used up, requests with your key are answered with 429, and that includes status checks and result downloads of bulk jobs. Download the results you need before your quota runs out.