Domain validation

Three layers between a domain and your list

Before anyone asks whether a mailbox exists, Sortance asks whether the domain makes sense at all. Three layers answer that: rules that cost nothing, Sortance’s own second-opinion check, and a model that judges what the domain name looks like. Each one does a job the others cannot.

LayerWhat it checksWhere it runsCost
1. Local gateSyntax, MX records, the block tier of the disposable lists, your own domain rules, agent-inbox infrastructureEvery /v1/verify, /v1/decide and /v1/screenFree
2. Sortance checkThe signal tier the gate does not act on, as a second opinion inside the provider pool/v1/verify and /v1/decide, first in the poolFree
3. Jev domain checkWhether the name looks like a lookalike, a provider typo, a placeholder or a throwaway service/v1/screen onlyAbout $0.00002 per new domain, then cached

1. The local gate

Every address goes through the gate first, and most bad addresses stop here. It runs inside the Worker before any provider is called, so it adds no provider cost.

  • Syntax. A malformed address ends the request before any network call, including DNS.
  • MX. The domain’s mail servers are looked up over DNS-over-HTTPS and cached for six hours. A domain with no mail server cannot receive mail, and the answer says so with mx: "fail".
  • Disposable domains. The block tier of Sortance’s disposable lists, described below: tens of thousands of throwaway-inbox domains. A domain on it, or a subdomain of one, ends the check with disposable_domain. If the list cannot be read at all, a built-in seed of the most common throwaway domains still applies.
  • Your domain rules. Your account’s own blocklist and allowlist. A blocked domain ends the check with domain_blocklisted; an allowed one is exempt from the disposable lists. They apply to your account only, and outrank every list below. Rules for single addresses (address_blocklisted, address_allowlisted) outrank domain rules.
  • Agent inboxes. A separate, smaller list of mail infrastructure used by AI agents, which feeds actor_class rather than blocking anything.

Three tiers, not one list

A single blocklist has to choose between missing throwaway services and blocking real people. Sortance splits what it knows into three tiers instead, rebuilt every six hours from the sources on the trust page:

TierWhat is in itWhat it does to a check
BlockThe upstream disposable lists, minus the allowlist (major mail providers, relay and alias services, and reviewed real companies) and minus popular domains nobody has reviewed yetEnds the check in the gate: invalid, reason disposable_domain
SignalAnonymous-signup and alias services from the strict upstream list, and popular domains still waiting for reviewNever ends a check. The Sortance check reports it to the pool, with reason disposable_suspected
ArchiveLegacy email-check data, kept for the recordNothing. It is never read while a check runs

The popularity guard. Community lists sometimes catch real services: a domain registrar, a hosting company, an internet provider’s mail. So before an upstream domain can block anyone, it is compared with the top 100,000 sites by popularity. A popular domain goes to the signal tier, not the block tier, until a person has reviewed it, unless it is a known throwaway service such as mailinator.com. Popularity guard: Tranco (tranco-list.eu), a research-grade ranking, used only to decide which upstream entries need human review.

A bad download never replaces a good list. If any source fails to download, if the block tier would have fewer than 50,000 domains, or if more than 20% of the previous list would vanish at once, the refresh keeps the lists it already has.

The 3 sources and what each one contributes are listed on the trust page.

2. The Sortance check

The Sortance check is first in the provider pool on every verification. It runs inside the Sortance API itself: no network call, nothing sent anywhere, done in a few milliseconds. It looks at what the gate deliberately does not act on, the signal tier, so it can say disposable about a domain the gate let through. That is what makes it a second opinion rather than the gate’s answer under another name. It costs nothing, so the router can always afford it.

It has one rule that matters more than the rest: it never answers valid. It does not open an SMTP conversation, so it cannot know whether a mailbox exists. Saying “valid” would only repeat the gate’s own opinion under a different name, and would make two checks look like they agree when only one of them looked. So it answers invalid, disposable or unknown, and nothing else.

That is also why it is first in the list but not first in line for your budget. When mailbox checks (DeBounce, MyEmailVerifier, ZeroBounce) are available and fit your max_cost_usd, the router picks them first and adds the Sortance check alongside as corroboration. When none is available or affordable, the Sortance check may be the only one called. Because it never claims a mailbox exists, the probability then comes from what Sortance has observed for that kind of domain, with an interval to match, rather than from a borrowed “valid”.

Its answer appears in the response like any other, as providers.sortance. An illustrative example:

"providers": {
  "sortance": { "verdict": "unknown", "ms": 1, "cost": 0 },
  "debounce": { "verdict": "valid",   "ms": 180, "cost": 0.00045 }
}
Runs inside the API

The Sortance check runs inside the Sortance API, with no network call. Callers of the earlier standalone email-check service move to /v1/check and the domain endpoints.

3. The Jev domain check

Rules and blocklists only know domains someone has already listed. A domain registered last week to look like a bank, or a misspelling of a mail provider nobody has written down, passes both. The third layer judges the domain name itself, using TypeSafe’s Jev model, a model that answers from a fixed set of labels and never writes free text.

It sorts a domain into one of five kinds:

Jev’s answerExampledomain_checkResult
A real organisation or mail providerzerodha.comokallow
A look-alike of a known brandpaypa1.com, paypal-secure.netlookalikereview
A misspelt mail providerprotonmial.metypo_likereview
A placeholder or keyboard mashqwerty.com, asdfgh.complaceholderreview
A throwaway inbox servicemytempemail.comthrowaway_likereview

An answer below Jev’s confidence floor of 0.5 becomes uncertain, which adds no reason and sends nobody to review. Any of the four suspicious kinds adds the reason domain_suspicious, which means review, never a block.

When it runs, and what it sees

  • Only on /v1/screen. Verification never waits on a model. /v1/verify, /v1/decide and /v1/enrich make no model call at all.
  • Only after the gate passes and the MX resolves. A domain with no mail server is already answered.
  • The domain name only. The request carries the domain and its mail-provider label. Never the address, never the name.
  • Skipped for well-known mail providers such as gmail.com and outlook.com (matched by domain name, so a domain cannot opt out by pointing its MX at Gmail), and when the free typo check has already caught the domain.
  • Cached for 30 days per domain, as the label only. A domain is normally judged once a month, however many addresses use it.
  • Bounded. It shares a 600 ms deadline with the fake-name check. If Jev does not answer in time, the response still returns, with domain_check: "not_checked" and degraded: true.

How it was measured

Before the domain check was switched on, it was run against a test set of 1,164 domains: 674 real ones (companies, universities, governments and mail providers on six continents, each confirmed to have a live MX record) and 470 suspicious ones (generated look-alikes, provider misspellings, placeholders and known throwaway services). On that set, at the thresholds in production today:

SetFlagged suspicious
Real domains (674)0 of 674
Placeholder domains86%
Throwaway services83%
Brand look-alikes65%
Provider misspellings33%

The threshold was set so that no real domain was flagged; that is why it misses some suspicious ones rather than catching more and sending real signups to review. Provider misspellings score lowest because the free typo check catches the common ones first and offers the corrected address, so Jev mostly sees the rarer ones. These are figures from a test set Sortance built, measured on 7 October 2026, not a guarantee about your traffic.

How the layers fit together

A signup at emily.carter@paypa1.com passes the gate (valid syntax, the domain has a mail server, it is not on the disposable lists) and passes the Sortance check, because it is not on the signal tier either. Only the third layer sees what a person would: a domain dressed up as PayPal. A signup at mia@mailinator.com never gets that far. The gate knows it is disposable and answers for free.

Cheap and certain first, judgment last, and the judgment only ever asks for a human look. That ordering is the whole design.