API Reference

All endpoints. No authentication required.

POST /

Validate a single email address.

{
  "email": "user@example.com",
  "quick": false,
  "force": false
}
FieldTypeDescription
emailstringRequired. Email address to validate.
quickbooleanSkip enrichment/security (Tier 1 only). Default false.
forcebooleanBypass cache. Default false.
powobjectProof-of-work solution (for unlimited access). See protocol →

POST /batch

Validate up to 20 emails in one request.

{
  "emails": ["user@example.com", "admin@test.org"],
  "quick": false
}

GET /health

Health check. Returns {"status":"ok","version":"1.0.0"}.

Response

The response has three top-level fields you care about:

{
  "email": "user@gmail.com",
  "action": "allow",       // allow | verify | block
  "confidence": "valid",   // valid | likely_valid | risky | invalid | unknown
  "validation": { ... },   // detailed signals
  "_meta": { ... }          // timing, cache status, version
}

The action field

This is the product. One field, three values:

  • allow — safe to accept. Good syntax, valid MX, not disposable.
  • verify — probably fine, but send a confirmation email. Catch-all provider, role account, etc.
  • block — reject at signup. Invalid syntax, no MX, disposable, or domain doesn't exist.

Validation signals

SignalTypeDescription
syntax_validbooleanRFC 5321 compliance
mx_foundbooleanDomain has MX records
null_mxbooleanDomain explicitly refuses email (RFC 7505)
disposablebooleanKnown disposable/temporary domain
privacy_relaybooleanApple HME, SimpleLogin, etc. (not disposable)
free_providerbooleanGmail, Yahoo, Outlook, etc.
role_accountbooleanadmin@, info@, support@, etc.
has_typobooleanDomain looks like a typo
typo_suggestionstring|nullCorrected email if typo detected
providerobject|nullIdentified email provider with behavior hints
subaddressedbooleanContains + tag (e.g. user+tag@)
is_ip_literalbooleanDomain is an IP literal ([1.1.1.1])
is_internationalizedbooleanUses internationalized characters (EAI/IDN)
is_punycodebooleanDomain contains punycode labels (xn--)
domain_typestring|null"domain" or "ip_literal"
catch_all_likelybooleanDomain likely accepts all addresses (catch-all)
catch_all_reasonstring|nullWhy catch-all is suspected ("provider_default")

Rate Limits

Free tier: 10 requests/hour + 50/day per IP.

Need more? Solve a proof-of-work challenge (SHA-256 hashcash, difficulty 20, ~2–8s CPU) and include the solution in your request. Unlimited with valid PoW. Full PoW protocol docs →

Cross-origin

Full CORS support. Access-Control-Allow-Origin: * on all responses.

Family links