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.
Only definitive results count
A validation counts against your quota only when its result is definitive: deliverable or undeliverable. Results with the state unknown (the mail server gave no definitive answer, or a timeout or error on our side) and addresses rejected as invalid_format are free within a fair-use allowance. Validation errors (e.g., a wrong parameter), a catch_all=1 request on a plan without catch-all detection (403), requests to the status endpoint and requests made with sandbox API keys are free as well.
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
+tagdo not make it a different address). X-Costalways 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-Monthreport your monthly quota and how much of it is left.X-RateLimit-Limit-Quota-Minute/X-RateLimit-Remaining-Quota-Minuteare 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-Minuteshows 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-Minuteis what is left on that node.X-Costtells you how many requests the call counted against your quota (0for 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-Monthinstead 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-Monthin 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, orgrace_quota_exceededon a grace quota), andquota.requiredin 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
429too. - 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.