Email & domains
Email address checker
Coverage: Works with addresses from any country, including domains with accents or in other alphabets. Disposable domains come from an open list of thousands of throwaway email services; free email domains cover the big international and national providers.
Open toolOn this page
Purpose
Check an email address without writing to it: whether it’s well written, whether its domain exists and receives email, and whether it’s a disposable, role or free-mail address, with a suggestion if the domain looks mistyped.
Requirements
Anyone can read these guides, no account needed. Some tools require Pro, as indicated in each guide.
Before you write to an address or trust one, check it here. We look at how it’s written and at its domain: whether it exists, whether it receives email and what kind of address it is. We can’t tell whether the mailbox itself exists, because we never contact its mail server, and we don’t store the address.
How to use it
Type or paste the email address you want to check.
Press “Check the address”. We check how it’s written and look up its domain in public DNS.
Read the result and the signals. If we suggest another domain (for example gmail.com instead of gmial.com), confirm the address with whoever gave it to you.
Synthetic example
Invented example, not a real lookup. Do not call or open its links.
Interpret the result
This isn’t a valid email address: It doesn’t have the shape of an address: the @ or the domain is missing, or it has characters an address can’t use.
The domain of this address doesn’t exist: Nobody can receive email at it. If someone gave you this address, they may have mistyped it.
The domain doesn’t receive email: It exists, but it has no mail servers or it states that it accepts no email. A message to this address won’t arrive.
The domain receives email: The address is well written and its domain has mail servers. We can’t confirm that this particular mailbox exists, only that the domain can receive email.
The address isn’t written the way an email address has to be.
The domain doesn’t exist in DNS.
The domain states that it receives no email (“null MX”).
The domain has no mail servers.
The domain has no MX records, so email goes to its own address. It works, but it’s unusual.
It’s a disposable email service: these addresses last minutes or hours and are often used to sign up without giving a real address.
It’s a role address (info@, support@, noreply@…) that belongs to a team or a service, not to one person.
It’s a free email service (Gmail, Outlook, Yahoo…). Anyone can open an account, so a bank or a company won’t usually write to you from one.
The domain looks a lot like a well-known provider’s, so the address may have been mistyped.
Limitations
We don’t check whether this exact mailbox exists: that would mean contacting its mail server, which we never do. The address isn’t stored.
The address is sent to NoCall’s server only to look up its domain in public DNS, and it isn’t stored. We never contact its mail server.
Troubleshooting
That doesn’t look like an email address. Check that it has an @ and a domain.
DNS didn’t answer in time. Try again in a few seconds.
You’ve run a lot of checks in a row. Wait a minute and try again.
Use with the API
Needs an API key and credits. Each completed call costs 1 credit, even when there is no data. An active Pro account includes 20 credits per UTC calendar month, shared by every API route and spent first; unused monthly credits do not roll over. Credits bought on your account page work without Pro and never expire.
Errors are never charged: 401 invalid_api_key (missing or invalid key), 403 pro_required (no Pro credits and no purchased credits), 422 invalid input, 429 quota_exceeded (no credits left), rate_limit_exceeded or ai_busy (the AI of sms-check is at capacity), 503 tool_warming (the data is still being prepared) or tool or provider unavailable. After a 429 or 503, retry once the seconds in the Retry-After header have passed.
What can be known about an email address without contacting its mail server: syntax, whether the domain exists and receives email, its provider, and whether it is a disposable, role or free email address, with a suggestion for a mistyped provider domain. The mailbox itself is not checked, and the address is never stored or returned.
Send the JSON body to the tool's own route, or to POST /v2/tools with the tool field added. Both routes return the same result.
POST https://api.nocall.io/v2/email-verify
POST https://api.nocall.io/v2/tools {"tool":"email-verify","email":"[email protected]"}Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| string (3–320) | Yes | The address to check, up to 320 characters. Only its domain is looked up; the address is never stored or returned. |
REQUEST_ID="$(uuidgen)" && [ -n "$REQUEST_ID" ] &&
curl --request POST 'https://api.nocall.io/v2/email-verify' \
--header "Authorization: Bearer $NOCALL_API_KEY" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $REQUEST_ID" \
--data '{"email":"[email protected]"}'import json
import os
import urllib.request
import uuid
api_key = os.environ.get('NOCALL_API_KEY')
if not api_key:
raise SystemExit('Set NOCALL_API_KEY')
request = urllib.request.Request(
'https://api.nocall.io/v2/email-verify',
method='POST',
data=json.dumps({'email': '[email protected]'}).encode(),
headers={
'Authorization': 'Bearer ' + api_key,
'Content-Type': 'application/json',
'Idempotency-Key': str(uuid.uuid4()),
},
)
with urllib.request.urlopen(request, timeout=30) as response:
result = json.load(response)
print(result['data']['result'], result['meta']['unitsCharged'])import { randomUUID } from 'node:crypto';
const requestId = randomUUID();
const apiKey = process.env.NOCALL_API_KEY;
if (!apiKey) throw new Error('Set NOCALL_API_KEY');
const response = await fetch('https://api.nocall.io/v2/email-verify', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + apiKey,
'Content-Type': 'application/json',
'Idempotency-Key': requestId,
},
body: JSON.stringify({ email: '[email protected]' }),
});
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code ?? 'request_failed');
console.log(result.data.result, result.meta.unitsCharged);Example response (200)
This is the documented example from the API reference. Lookups use a fictional number, and aggregates and AI answers show the shape of the result, not live data.
{
"data": {
"tool": "email-verify",
"result": {
"domain": "outlok.com",
"domainAscii": "outlok.com",
"status": "domain_not_found",
"syntaxValid": true,
"acceptsMail": false,
"mx": {
"count": 0,
"provider": null,
"implicit": false,
"nullMx": false
},
"disposable": false,
"role": false,
"freeMail": false,
"suggestion": "outlook.com",
"signals": [
"domain_not_found",
"typo_domain"
],
"attention": true
}
},
"meta": {
"requestId": "req_example",
"unitsCharged": 1,
"usage": {
"periodStart": "2026-10-01",
"unitLimit": 20,
"unitsUsed": 3,
"unitsRemaining": 17
}
}
}Result fields (data.result)
| Field | Type | Description |
|---|---|---|
| domain | string | null | The address’s domain in Unicode; null when the address does not parse. |
| domainAscii | string | null | The same domain in ASCII (punycode), or null. |
| status | "invalid" | "domain_not_found" | "no_mail" | "accepts_mail" | invalid, domain_not_found, no_mail or accepts_mail. accepts_mail means the domain receives email, not that this mailbox exists. |
| syntaxValid | boolean | Whether the address is written the way an address has to be. |
| acceptsMail | boolean | Whether the domain receives email. |
| mx | object | The domain’s MX: count, provider, implicit (no MX, email goes to its address) and nullMx. |
| disposable | boolean | Whether the domain (or a parent) is on the open list of disposable email services. |
| role | boolean | Whether it is a role mailbox (info@, support@, noreply@…), not a person’s. |
| freeMail | boolean | Whether the domain is a free personal email provider (gmail.com, outlook.com…). |
| suggestion | string | null | The provider domain the address was probably meant for (gmial.com → gmail.com), or null. |
| signals | array<string (enum, 9)> | syntax_error, domain_not_found, null_mx, no_mx, implicit_mx, disposable_domain, role_address, free_mail or typo_domain. |
| attention | boolean | Whether the result deserves a look: the domain receives no email, or the address is disposable or probably mistyped. |
Frequently asked questions
Can you tell whether the mailbox exists?
No, and no service can do it reliably: the only way is to ask the domain’s mail server, many servers say yes to every address, and repeated probes end up blocked. We check everything that can be known without contacting it.
What is a disposable address?
An inbox that works for minutes or hours, used to sign up somewhere without giving a real address. If a customer or a contact gives you one, you won’t be able to reach them later.
What is a role address?
One that belongs to a function rather than a person: info@, support@, sales@, noreply@. Many people may read it, or nobody at all in the case of noreply@.
Is the address I check stored?
No. It’s used once to look up its domain in DNS and isn’t stored anywhere. We only note that a check was made and its kind of result (for example, “the domain receives email”), without the address.
