Verify
Validate a single address in real time. Runs the (blocking, DNS-touching) engine in a threadpool so the event loop stays free.
Request body · application/json
| Field | Type | Description |
|---|---|---|
| emailreq | string | The address to verify. Parsed, normalised and probed as sent. |
| check_dnsopt | boolean | Override the engine's DNS setting for this call. With DNS off, nothing past layer 3 can run and the verdict comes back Unknown. |
| check_smtpopt | boolean | Override the engine's SMTP setting for this call. With the probe off, a deliverable-looking address is still reported Unknown rather than guessed at. |
Response · 200
| Field | Type | Description |
|---|---|---|
| emailreq | string | The address exactly as it was sent. |
| statusreq | string | The verdict: deliverable, risky, unknown or undeliverable. |
| sub_statusreq | string | The reason under the verdict, such as no_mx, role_account or catch_all. |
| scorereq | integer | Confidence in the verdict, 0 to 100. |
| normalized_emailopt | string | The address with provider-specific spelling collapsed: Gmail dots and plus tags removed, case folded. |
| dedupe_keyopt | string | The key two spellings of one mailbox share. Count this, not the address, to count people. |
| domainopt | string | The domain part, lower-cased. |
| suggested_correctionopt | string | A likely intended address when the domain looks misspelled. A suggestion, never an automatic substitution. |
| is_disposablereq | boolean | The domain is on the vendored disposable list. |
| is_rolereq | boolean | The local part reaches a desk rather than a person. |
| is_freereq | boolean | The domain is a free consumer provider. |
| is_catch_allreq | boolean | The domain accepts every recipient, so its acceptance of this one proves nothing. |
| mx_foundreq | boolean | The domain published usable MX records. |
| tagsreq | string[] | Flags raised along the way, as a list. |
| checksreq | object | One entry per layer that ran, in order, with what it returned. This is the trace behind the verdict. |
curl -X POST https://validrow.inboxrow.com/v1/verify \ -H "X-API-Key: $VALIDROW_KEY" \ -H "Content-Type: application/json" \ -d '{ "email": "john.doe@gmail.com" }'
import os import requests KEY = os.environ["VALIDROW_KEY"] r = requests.post( "https://validrow.inboxrow.com/v1/verify", headers={"X-API-Key": KEY}, json={ "email": "john.doe@gmail.com", }, ) r.raise_for_status() print(r.json())
const key = process.env.VALIDROW_KEY const res = await fetch("https://validrow.inboxrow.com/v1/verify", { method: "POST", headers: { "X-API-Key": key, "Content-Type": "application/json", }, body: JSON.stringify({ "email": "john.doe@gmail.com" }), }) const data = await res.json()
{
"email": "john@gmial.com",
"status": "undeliverable",
"sub_status": "no_mx",
"score": 4,
"normalized_email": "john@gmial.com",
"dedupe_key": "john@gmial.com",
"domain": "gmial.com",
"suggested_correction": "john@gmail.com",
"is_disposable": false,
"is_role": false,
"is_free": false,
"is_catch_all": false,
"mx_found": false,
"tags": [
"typo_suspected"
],
"checks": {
"mx": "none",
"normalize": "ok",
"syntax": "ok",
"typo": "gmial.com -> gmail.com"
}
}