Sample responses

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.

Run your first email check

How to act on a verdict

VerdictSuggested handling
domain_accepts_mailRoute the lead. The domain accepts mail; the mailbox was not checked.
risky with a suggestionAsk the person to confirm the address, offering the suggestion.
risky with dns_status: implicitRoute it, marked deliverability uncertain: the domain has only an A record.
disposableHold the lead and ask for a work address.
undeliverableDrop 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 examples

A work address at a domain that accepts mail

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"
}

A role account

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"
}

A free-provider address

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"
}

A likely typo of a common provider

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"
}

A disposable domain

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"
}

A domain that declares it accepts no mail

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"
}

A domain that does not exist

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"
}

A malformed address

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"
}

The resolver failed (503, not charged)

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"
}