Reference

The free checks, and why an address failed them

POST /v1/check runs only the checks that cost nothing: syntax, the domain’s mail servers, Sortance’s disposable lists and your own domain and address rules. It answers with a reason from a short, closed list and says what kind of address it is (email_type); /v1/verify carries the same reasons and the same type.

POST /v1/check

curl -X POST https://api.sortance.com/v1/check \
  -H "Authorization: Bearer $SORTANCE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"test@mailinator.com"}'

An illustrative response:

{
  "email": "test@mailinator.com",
  "domain": "mailinator.com",
  "passes": false,
  "disposable": true,
  "suspected": false,
  "reason": "disposable_domain",
  "reasons": ["disposable_domain"],
  "checks": { "syntax": "pass", "mx": "pass", "disposable": "fail" },
  "esp": "self_hosted",
  "email_type": "disposable",
  "mx_hosts": ["mail.mailinator.com", "mail2.mailinator.com"],
  "mx_provider": "unknown",
  "latency_ms": 41,
  "trace_id": "ck_..."
}
  • No verdict and no probability. Nothing here asks the mailbox, so the response does not claim to know whether it exists. passes means syntax is valid, the domain has mail servers, it is not a disposable domain and you have not blocked the domain or the address. Use /v1/verify when you need a bounce probability.
  • Free. It does not count against your monthly quota. It shares the 600-a-minute rate limit of /v1/verify.
  • Nothing is stored. No trace row and no cache entry. The ck_ trace id matches a log line if you ask support, and the log line carries no address and no domain.
  • POST only. An address in a query string ends up in request logs. The same 4 KB body limit and address rules as /v1/verify apply.

Every field is listed in the API reference. The same object is returned by the MCP tool check_email, also free; see MCP server.

Reasons

reason is the first code that applies, in the order below, or null. reasons lists every code that applies, in the same order. The list is closed: a new code is added here before it can appear in a response.

CodeSet whenEnds the check?On /v1/screen
syntax_invalidThe address is not a valid address.Yes. invalid, bounce probability 0.99syntax_invalid
address_blocklistedThe address itself is on your account's own address blocklist. Matched by keyed hash; beats every other rule.Yes. invalid, 0.90address_blocklisted
domain_blocklistedThe domain, or a parent of it, is on your account's own blocklist.Yes. invalid, 0.90domain_blocklisted
no_mxDNS answered and the domain has no MX record, or a null MX (RFC 7505).Yes. invalid, 0.97domain_no_mx
mx_unresolvedThe DNS lookup itself failed or timed out. Nothing was learned about the domain.Nonone (domain.mx reads unknown)
disposable_domainThe domain, or a parent, is on Sortance's block tier and your allowlist does not cover it.Yes. invalid, 0.90disposable_domain
disposable_suspectedThe domain, or a parent, is on the signal tier: anonymous-signup and alias services, and popular domains still waiting for review.No. The Sortance check reports disposable to the poolnone
domain_allowlistedThe domain, or a parent, is on your account's own allowlist, so the disposable tiers were not applied.No. Informationaldomain_allowlisted
address_allowlistedThe address is on your account's own address allowlist, so the disposable tiers and your domain blocks were not applied. Syntax and MX still were.No. Informationaladdress_allowlisted

On /v1/verify and in the verification embedded in /v1/decide, a code that ends the check means Sortance answered from the free gate: verdict invalid, the probability in the table, no provider called and no cost. When the paid providers drove the answer, reason is often null; the reason for that answer is in providers. Reasons are worked out again on every request, including cache hits, so one account’s domain rules never show up in another account’s answer.

The block and signal tiers are explained in domain validation, and your own rules, for domains and for single addresses, in Blocklists (address rules). On /v1/screen, address_blocklisted means review.

Email type

email_type says what kind of address it is, from the same facts the checks above use. It is one of six values, and when several apply the first in this order wins:

email_typeMeans
disposableA throwaway domain: Sortance's block or signal tier, or a domain on your own blocklist.
relayA forwarding or alias service such as Apple Hide My Email, DuckDuckGo or SimpleLogin. The mailbox behind it is unknown.
roleA shared mailbox such as info@, sales@ or support@, on any domain, free providers included.
freeA consumer mailbox provider: Gmail, Outlook and Hotmail, Yahoo, Apple iCloud, AOL, Proton and the rest. Also called social or personal email.
businessA company's own mail: Google Workspace, Microsoft 365 or a self-hosted mail server.
unknownInvalid syntax, no mail server, or nothing matched.

So info@gmail.com is role and jane@gmail.com is free. Broken syntax, and a domain that answered with no mail server, are unknown. Your own rules are part of it: a domain you block reads disposable, and a domain or address you allow is never disposable.

The type never changes the verdict or passes: a Gmail address delivers fine. To turn away free, role, relay or disposable addresses, use the Email types switches on the dashboard’s Policy screen, which act in /v1/decide (see email types in policies), or read email_type yourself. The SDK has isBusinessEmail and emailType for that (SDK).

Moving from the standalone email-check service

The email check is part of the Sortance API and is maintained by Sortance. The earlier standalone email-check service is being shut down, and its routes are not reproduced. Each one maps to a native endpoint below. Every call needs a Sortance key as a bearer token, and the address always goes in a POST body, never in a URL.

Old routeUse nowWhat to read
GET or POST /verifyPOST /v1/checkpasses, disposable, reason, reasons, checks, mx_hosts, mx_provider
GET /validate?email=POST /v1/checkthe same fields; the source flags are not exposed
GET /check?domain=POST /v1/domains/checkeffective: blocked, allowed, disposable, suspected or none
GET /get?id=POST /v1/domains/checkdisposable when effective is blocked or disposable
POST /set?id=POST /v1/domains/blocklistadded to your own blocklist; see Blocklists
GET /mx?domain=POST /v1/checkmx_hosts, in priority order
GET /stats, GET /syncSortance operators onlythe list is rebuilt every six hours
# Is this domain disposable? (replaces GET /get?id=)
curl -X POST https://api.sortance.com/v1/domains/check \
  -H "Authorization: Bearer $SORTANCE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain":"mailinator.com"}'

# Block domains for your account (replaces POST /set?id=)
curl -X POST https://api.sortance.com/v1/domains/blocklist \
  -H "Authorization: Bearer $SORTANCE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domains":["new-burner.example"]}'