EmailScore
Real-time email and domain checks

Know what's behind an email or domain before the request finishes.

One call from your signup, invite, trial, or domain-claim handler returns allow, challenge, or deny, plus the flags and facts that decided it.

POST /v1/email
Guest checks left today: 5 of 5
Emails
Domains
What comes back

A decision during the request, and the evidence behind it

Each of these is visible in the response above.

In the request path

Decide before the account exists

Call /v1/email or /v1/domain from the handler that creates the account, sends the invite, or accepts the domain. Mail DNS lookups run on a fixed time budget. If one doesn't finish you still get an answer, marked evidence: partial, with MX, SPF and DMARC reported as unknown rather than missing.

Evidence

Reasons and facts, not a black box

Every verdict lists the flags that drove it, such as DISPOSABLE_DOMAIN, ZERO_DAY_DOMAIN or NO_MX_RECORDS, and the facts behind them — registration date when on record, mail host, MX, SPF, DMARC, and a did_you_mean for typos. Use our decision, or apply your own thresholds to the score and flags.

One answer

Email and domain checks can't disagree

/v1/email runs the same domain check as /v1/domain and returns it as domain_verdict, at no extra credit. A workspace domain checked at claim time and its members' addresses checked later get their domain answer from one function.

Bulk

Re-check the users you already have

Domains expire, get parked and drop their mail servers after signup. Send up to 10,000 emails or domains per request to /v1/email/bulk or /v1/domain/bulk, 1 credit each.

Your policy, your thresholds

The check goes in your handler. The rules stay in your code.

ts
const r = await fetch('https://api.emailscore.io/v1/email', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.EMAILSCORE_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ email }),
  signal: AbortSignal.timeout(1500),              // your budget
}).then(res => res.json()).catch(() => null);

if (!r) return challenge('confirm-email');         // no answer: fall back, don't block
if (r.decision === 'deny') return reject(r.flags);  // show the user what to fix
if (r.domain_verdict.flags.includes('ZERO_DAY_DOMAIN')) return challenge('confirm-email');
if (r.decision === 'challenge') return challenge('confirm-email');
return createAccount();

Illustrative. The timeout and the fallback are yours to choose.

Where the check goes

Anywhere an email or domain turns into access

Check at the point where an address or domain becomes an account, an invite, a key, or a trust decision.

Account creation

Signups, trials, invites, API keys

Check the address before the account exists, the trial starts, the invite goes out, or a key is issued. Offer the typo fix instead of creating a dead account.

Signup screening →POST /v1/email
Domain trust

Workspace and custom domains

Before someone claims a domain for auto-join, SSO, or a custom domain, see its age when on record, its status, mail setup, and look-alike flags. Keep your ownership check; this tells you what the domain is.

Domain claims →POST /v1/domain
Onboarding

Partners, resellers, vendors

Check the contact address and the company domain on an application. A two-week-old domain or a free-mail contact for a claimed company is worth a second look.

Existing data

Users and domain lists you already have

Re-check accounts and customer domains in bulk, 1 credit each. Failed and unchecked rows stay marked.

Bulk re-check →10,000 per request

Practical questions

What does real-time mean here?

The answer comes back in the same request, so you can act before the account, invite, or claim exists. It does not mean every fact is fetched from scratch. Mail DNS comes from a live lookup or from a stored record refreshed in the background, and dns.resolution_status says which. Measure end-to-end time from your own servers.

What happens if a DNS lookup is slow?

Lookups have a fixed time budget. If one doesn't finish you still get a verdict, with evidence set to partial, a DNS_LOOKUP_INCOMPLETE flag, and MX, SPF and DMARC reported as unknown rather than missing. Your policy decides whether partial evidence is enough.

Does /v1/email check the domain too?

Yes. It runs the same domain check as /v1/domain and returns it as domain_verdict, at no extra credit. Call /v1/domain when you only have a domain, such as a workspace claim or a custom domain.

Can I set my own thresholds?

Yes. Treat decision as a default, or apply your own rules to score, flags, and the facts. For example, challenge any address whose domain carries ZERO_DAY_DOMAIN regardless of score.

Does a good result mean the mailbox exists?

No. EmailScore does not connect to the recipient's mail server. It reports address and domain facts and a risk recommendation. It does not prove the mailbox exists, who owns it, or that mail will arrive.

Does a good domain verdict prove someone owns the domain?

No. Keep your ownership check, such as a DNS TXT record or a confirmation email. EmailScore tells you what the domain is, not who controls it.

How do the checks on this page work without an account?

After a bot check you get a temporary token good for 5 single email or domain checks per day. Bulk requires an account. The free Developer plan includes 1,000 credits a month.

How do credits work?

An email check, a domain check, or one bulk entry uses 1 credit. A bounce diagnosis uses 5.

What about bounces?

Bounce diagnostics is a separate tool. It classifies a delivery error you already received and suggests a next action. It does not predict delivery.

How is submitted data handled?

Email checks process submitted addresses and may perform DNS lookups. Diagnostic processing can use an external service when configured, and debug logging can include submitted addresses. Review data-handling information before submitting personal data.

Get an API key

Put the check where the decision happens

The Developer plan includes 1,000 credits a month for email checks, domain checks, and bulk entries.