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.
passesmeans 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/verifywhen 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/verifyapply.
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.
| Code | Set when | Ends the check? | On /v1/screen |
|---|---|---|---|
syntax_invalid | The address is not a valid address. | Yes. invalid, bounce probability 0.99 | syntax_invalid |
address_blocklisted | The address itself is on your account's own address blocklist. Matched by keyed hash; beats every other rule. | Yes. invalid, 0.90 | address_blocklisted |
domain_blocklisted | The domain, or a parent of it, is on your account's own blocklist. | Yes. invalid, 0.90 | domain_blocklisted |
no_mx | DNS answered and the domain has no MX record, or a null MX (RFC 7505). | Yes. invalid, 0.97 | domain_no_mx |
mx_unresolved | The DNS lookup itself failed or timed out. Nothing was learned about the domain. | No | none (domain.mx reads unknown) |
disposable_domain | The domain, or a parent, is on Sortance's block tier and your allowlist does not cover it. | Yes. invalid, 0.90 | disposable_domain |
disposable_suspected | The 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 pool | none |
domain_allowlisted | The domain, or a parent, is on your account's own allowlist, so the disposable tiers were not applied. | No. Informational | domain_allowlisted |
address_allowlisted | The 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. Informational | address_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_type | Means |
|---|---|
disposable | A throwaway domain: Sortance's block or signal tier, or a domain on your own blocklist. |
relay | A forwarding or alias service such as Apple Hide My Email, DuckDuckGo or SimpleLogin. The mailbox behind it is unknown. |
role | A shared mailbox such as info@, sales@ or support@, on any domain, free providers included. |
free | A consumer mailbox provider: Gmail, Outlook and Hotmail, Yahoo, Apple iCloud, AOL, Proton and the rest. Also called social or personal email. |
business | A company's own mail: Google Workspace, Microsoft 365 or a self-hosted mail server. |
unknown | Invalid 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 route | Use now | What to read |
|---|---|---|
GET or POST /verify | POST /v1/check | passes, disposable, reason, reasons, checks, mx_hosts, mx_provider |
GET /validate?email= | POST /v1/check | the same fields; the source flags are not exposed |
GET /check?domain= | POST /v1/domains/check | effective: blocked, allowed, disposable, suspected or none |
GET /get?id= | POST /v1/domains/check | disposable when effective is blocked or disposable |
POST /set?id= | POST /v1/domains/blocklist | added to your own blocklist; see Blocklists |
GET /mx?domain= | POST /v1/check | mx_hosts, in priority order |
GET /stats, GET /sync | Sortance operators only | the 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"]}'