Skip to main content

Easy Email Verification for Python

Official Python client for the Easy Email Verification API: check whether email addresses exist and are safe to send to, one by one, in batches of 50 or as bulk lists of up to 16 MB. No email is sent to the addresses you verify.

  • No dependencies (standard library only), Python 3.8+
  • Type hints included
  • Free sandbox key to test without an account or credits

Install

pip install easyemailverification

Quick start

from easyemailverification import Client, SANDBOX_API_KEY, decide

# Use SANDBOX_API_KEY to try it, or your own key (by default read from EEV_API_KEY)
eev = Client(SANDBOX_API_KEY)

result = eev.verify("valid@sandbox.easyemailverification.com")
print(result["result"], result["reason"], result["safe_to_send"])  # valid accepted_email True
print(decide(result))  # accept

Get your API key in the dashboard under API settings and keep it on the server, in the EEV_API_KEY environment variable.

Results

Every verification returns result (valid, invalid or unknown), a reason and risk signals:

Field Meaning
result valid: the mail server accepted the mailbox. invalid: it will bounce. unknown: no reliable answer (not invalid).
reason Why, for example accepted_email, rejected_email, invalid_domain, no_mx_record, timeout.
safe_to_send Overall recommendation. False for invalid and unknown results, catch-all domains and disposable addresses.
did_you_mean Corrected address when a typo is detected (gmial.com → gmail.com), otherwise "".
disposable, accept_all, role, free Risk signals: temporary inbox, catch-all domain, role address (info@), free provider.

decide(result) turns a result into "accept", "reject", "suggest" (show did_you_mean) or "review" (unknown, catch-all or disposable: your policy decides). Every result code is explained at easyemailverification.com/en-US/help/result-codes.

Batch: up to 50 addresses

for r in eev.verify_batch(["anna@example.com", "mark@gmial.com"]):
    print(r["email"], decide(r))

Bulk lists

For files with thousands of addresses (TXT or CSV, one address per line, up to 16 MB). The account needs enough credits for every address. Bulk does not work with the sandbox key.

job = eev.bulk.upload("leads.csv")          # a path, or bytes with the contents
done = eev.bulk.wait(job["list_id"])        # polls until completed (or failed)
if done["status"] == "completed":
    csv_text = eev.bulk.download(job["list_id"])  # Email,Result,Reason,...,IsSafeToSend,DidYouMean,...
eev.bulk.list()                             # all jobs of the account
eev.bulk.delete(job["list_id"])             # results are also deleted after 30 days

Credits

print(eev.credits()["credits_remaining"])  # free call

Each verified address uses one credit; unknown results do not. The free plan includes 50 verifications a day. See pricing.

Errors

API errors raise EEVError with the HTTP status and the API message:

from easyemailverification import EEVError

try:
    eev.verify("someone@example.com")
except EEVError as e:
    if e.status == 402:
        ...  # no credits left
Status Meaning
400 Missing key or parameter, or a non-sandbox address with the sandbox key
401 Unknown key, or a widget-only key
402 No credits left
404 Bulk job not found
429 Sandbox rate limit
0 Raised by the client (network error, timeout, more than 50 addresses in a batch)

Do not retry verifications in a tight loop: a request that timed out may already have used a credit.

Sandbox addresses

With SANDBOX_API_KEY, these addresses return fixed answers: valid@, invalid@, unknown@, disposable@, catchall@, role@, quota@ (402) and ratelimit@ (429) at sandbox.easyemailverification.com, plus typo@gmial.com (did you mean). Sandbox calls are limited to 60 per minute per IP.

License

MIT

Metadata

Release files for easyemailverification 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for easyemailverification 1.0.0
File Size Uploaded
easyemailverification-1.0.0.tar.gz 8.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for easyemailverification 1.0.0
File Interpreter ABI Platform
easyemailverification-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 16.4 kB

Release files / easyemailverification-1.0.0.tar.gz

Download URL easyemailverification-1.0.0.tar.gz
Size 8.9 kB
Tags Source
SHA-256 checksum
How to use checksums
22f084b1a8b263fd6500dfd09232f74d7957dd27eb4651ac1316449e8e42d9bb
BLAKE2b-256 checksum
How to use checksums
c9b52c90fd34f297e38eb70d258f5c8f3b30152a29ddbcd9210c758f6604ba86
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

Release files / easyemailverification-1.0.0-py3-none-any.whl

Download URL easyemailverification-1.0.0-py3-none-any.whl
Size 7.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
19ac6af8eeda61b7ba6ed4ad52327246bebb515e875720e3d64c6fa40d810d0e
BLAKE2b-256 checksum
How to use checksums
74dc16a61264be9b4d831f1b4db9005f8c8b2f724b1fe41dd7a41616d96f2308
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page