These are fixed examples, recorded on 2026-10-26 from the screening code and the DNS answers of that day. This page is not a live check: opening it calls nothing and charges nothing. A test in our repository re-runs the screening code against the recorded DNS answers and fails if any example drifts from what the service returns.
Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.
| Verdict | Suggested handling |
|---|---|
domain_accepts_mail | Route the lead. The domain accepts mail; the mailbox was not checked. |
risky with a suggestion | Ask the person to confirm the address, offering the suggestion. |
risky with dns_status: implicit | Route it, marked deliverability uncertain: the domain has only an A record. |
disposable | Hold the lead and ask for a work address. |
undeliverable | Drop it or ask for the address again; the reasons say why. |
unknown (HTTP 503) | The check could not be made and you were not charged. Keep the lead and retry after the Retry-After delay. |
role_account and free_provider are flags for your own rules; they never change the verdict.
The common case: the domain publishes mail exchangers. Route it. The mailbox itself was not checked.
GET https://api.paywallwatch.com/v1/email/verify?email=jane%40iana.org
HTTP 200: charged $0.003, settled on the network you paid on
{
"email": "jane@iana.org",
"valid_syntax": true,
"dns_status": "ok",
"has_mx": true,
"disposable": false,
"role_account": false,
"free_provider": false,
"suggestion": null,
"verdict": "domain_accepts_mail",
"reasons": [],
"mailbox_verified": false,
"screening_note": "Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.",
"checked_at": "2026-10-26T18:25:37Z"
}
role_account is a flag for your own rules (a shared inbox, not a person), never a rejection by itself.
GET https://api.paywallwatch.com/v1/email/verify?email=sales%40iana.org
HTTP 200: charged $0.003, settled on the network you paid on
{
"email": "sales@iana.org",
"valid_syntax": true,
"dns_status": "ok",
"has_mx": true,
"disposable": false,
"role_account": true,
"free_provider": false,
"suggestion": null,
"verdict": "domain_accepts_mail",
"reasons": [],
"mailbox_verified": false,
"screening_note": "Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.",
"checked_at": "2026-10-26T18:25:37Z"
}
free_provider is information: many real buyers use one. The verdict is still domain_accepts_mail.
GET https://api.paywallwatch.com/v1/email/verify?email=jane.doe%40gmail.com
HTTP 200: charged $0.003, settled on the network you paid on
{
"email": "jane.doe@gmail.com",
"valid_syntax": true,
"dns_status": "ok",
"has_mx": true,
"disposable": false,
"role_account": false,
"free_provider": true,
"suggestion": null,
"verdict": "domain_accepts_mail",
"reasons": [],
"mailbox_verified": false,
"screening_note": "Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.",
"checked_at": "2026-10-26T18:25:37Z"
}
gamil.com exists and has a mail exchanger, so mail would go somewhere, but the typo list suggests gmail.com: ask the person to confirm.
GET https://api.paywallwatch.com/v1/email/verify?email=jane%40gamil.com
HTTP 200: charged $0.003, settled on the network you paid on
{
"email": "jane@gamil.com",
"valid_syntax": true,
"dns_status": "ok",
"has_mx": true,
"disposable": false,
"role_account": false,
"free_provider": false,
"suggestion": "jane@gmail.com",
"verdict": "risky",
"reasons": [
"typo_suspected"
],
"mailbox_verified": false,
"screening_note": "Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.",
"checked_at": "2026-10-26T18:28:22Z"
}
The domain is on the public disposable list. Hold the lead and ask for a work address.
GET https://api.paywallwatch.com/v1/email/verify?email=jane%40mailinator.com
HTTP 200: charged $0.003, settled on the network you paid on
{
"email": "jane@mailinator.com",
"valid_syntax": true,
"dns_status": "ok",
"has_mx": true,
"disposable": true,
"role_account": false,
"free_provider": false,
"suggestion": null,
"verdict": "disposable",
"reasons": [
"disposable_domain"
],
"mailbox_verified": false,
"screening_note": "Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.",
"checked_at": "2026-10-26T18:25:37Z"
}
example.com publishes the RFC 7505 null MX record ("0 ."): mail to it cannot be delivered.
GET https://api.paywallwatch.com/v1/email/verify?email=jane%40example.com
HTTP 200: charged $0.003, settled on the network you paid on
{
"email": "jane@example.com",
"valid_syntax": true,
"dns_status": "null_mx",
"has_mx": false,
"disposable": false,
"role_account": false,
"free_provider": false,
"suggestion": null,
"verdict": "undeliverable",
"reasons": [
"null_mx"
],
"mailbox_verified": false,
"screening_note": "Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.",
"checked_at": "2026-10-26T18:28:22Z"
}
NXDOMAIN from the resolver: drop it, or ask for the address again.
GET https://api.paywallwatch.com/v1/email/verify?email=jane%40no-such-domain-paywallwatch-example.invalid
HTTP 200: charged $0.003, settled on the network you paid on
{
"email": "jane@no-such-domain-paywallwatch-example.invalid",
"valid_syntax": true,
"dns_status": "nxdomain",
"has_mx": false,
"disposable": false,
"role_account": false,
"free_provider": false,
"suggestion": null,
"verdict": "undeliverable",
"reasons": [
"domain_not_found"
],
"mailbox_verified": false,
"screening_note": "Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.",
"checked_at": "2026-10-26T18:25:37Z"
}
It contains an @ so it reaches the paid check, which answers undeliverable without any DNS lookup. This one is charged: screen syntax yourself first if you want to avoid that.
GET https://api.paywallwatch.com/v1/email/verify?email=jane%40%40iana.org
HTTP 200: charged $0.003, settled on the network you paid on
{
"email": "jane@@iana.org",
"valid_syntax": false,
"dns_status": "not_checked",
"has_mx": false,
"disposable": false,
"role_account": false,
"free_provider": false,
"suggestion": null,
"verdict": "undeliverable",
"reasons": [
"invalid_syntax"
],
"mailbox_verified": false,
"screening_note": "Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.",
"checked_at": "2026-10-26T18:25:37Z"
}
gmial.com's name servers did not answer (SERVFAIL). Nothing is known about the domain, so the service answers 503 with Retry-After and cancels settlement. The typo suggestion is still returned. Keep the lead and run the check again later.
GET https://api.paywallwatch.com/v1/email/verify?email=jane%40gmial.com
HTTP 503: not charged. Retry-After 5 seconds; keep the lead and run the check again later
{
"email": "jane@gmial.com",
"valid_syntax": true,
"dns_status": "error",
"has_mx": false,
"disposable": false,
"role_account": false,
"free_provider": false,
"suggestion": "jane@gmail.com",
"verdict": "unknown",
"reasons": [
"dns_lookup_failed",
"typo_suspected"
],
"mailbox_verified": false,
"screening_note": "Screening only: syntax, DNS mail exchanger, disposable-domain list, role-account and typo heuristics. It does not verify that the mailbox exists or that mail will be delivered.",
"error": "dns_unavailable",
"checked_at": "2026-10-26T18:25:37Z"
}