Quickstart
Verify your first email address in a few minutes.
-
Get an API key. In the dashboard, open API keys and create a key. Copy the secret key (it starts with
sk_) — you won’t be able to see it again. -
Make a verification request. Replace
sk_your_api_keywith your key.timeoutis how many seconds the request waits for the verdict (default5, up to90);sourceis an optional label stored with the result so you can tell your integrations apart.Terminal window curl -X POST "https://api.tryverifyemail.com/v1/email-verifications?timeout=25" \-H "Authorization: Bearer sk_your_api_key" \-H "Content-Type: application/json" \-d '{"email":"jane@example.com","source":"quickstart"}'const res = await fetch("https://api.tryverifyemail.com/v1/email-verifications?timeout=25",{method: "POST",headers: {Authorization: "Bearer sk_your_api_key","Content-Type": "application/json",},body: JSON.stringify({ email: "jane@example.com", source: "quickstart" }),},);const body = await res.json();if (res.status === 200) {console.log(body.result.verdict, body.result.quality_score);} else {console.log("still running, poll", res.headers.get("Location"));}import requestsres = requests.post("https://api.tryverifyemail.com/v1/email-verifications",params={"timeout": 25},headers={"Authorization": "Bearer sk_your_api_key"},json={"email": "jane@example.com", "source": "quickstart"},)body = res.json()if res.status_code == 200:print(body["result"]["verdict"], body["result"]["quality_score"])else:print("still running, poll", res.headers["Location"]) -
Read the response. A
200means the check finished; the verdict is nested underresult.{"id": "5f1c9d2e-8b1a-4f5e-9c3d-2a7b6e4d1f08","status": "completed","result": {"email": "jane@example.com","normalized_email": "jane@example.com","verdict": "deliverable","sub_status": "mailbox_exists","quality_score": 95,"confidence": 92,"provider": "google","primary_mx": "aspmx.l.google.com","signals": {"syntax": "pass","domain": "pass","mx": "pass","smtp": "pass","catch_all": "pass","role_account": "pass","disposable": "pass","dnsbl": "pass","toxic": "pass","greylisting": "pass"},"verified_at": "2026-09-05T06:35:01.000Z"}}If the mail server has not answered when your
timeoutruns out you get a202with"status": "pending"instead, and noresultyet:{"id": "5f1c9d2e-8b1a-4f5e-9c3d-2a7b6e4d1f08","status": "pending","poll_after_ms": 2000,"next_retry_at": "2026-09-05T06:35:03.000Z"}The check keeps running. Wait
poll_after_msmilliseconds, thenGETthe URL in the response’sLocationheader (/v1/email-verifications/{id}), optionally with its own?timeout=, until it answers200. The poll reference has a complete loop.A mail server that never answers inside our 180-second budget closes the check as
"verdict": "unknown","sub_status": "timeout". That result is terminal and costs nothing.See Understanding results for what each field means.
-
Check your balance.
GET /v1/mereturns the account behind the key, its plan and the credits it can spend:Terminal window curl https://api.tryverifyemail.com/v1/me \-H "Authorization: Bearer sk_your_api_key"{"email": "you@example.com","plan": "growth","credits_available": 48210,"api_key": { "id": "key_01J8YV3Q2M7X9K4R6T1W5N8B0D", "label": "Quickstart", "mode": "live" }}
Next steps
Section titled “Next steps”- Authentication — keys, headers, environments
- Verify a single email — full endpoint reference
- Poll a pending verification — what to do with a
202 - Account —
GET /v1/me - Bulk jobs — verify lists at scale
- SDKs & libraries — official clients