---
name: email-validation
description: Validate email addresses with the email-validation.org API (REST, MCP or A2A) using an API key. Use it to check whether an address is deliverable, undeliverable, risky (catch-all, disposable, role) or unknown before you send mail, add a contact to a CRM or accept a sign-up, and to clean lists of addresses.
license: Proprietary. Terms at https://email-validation.org/legal/terms/
compatibility: Needs HTTPS access to api.email-validation.org and an email-validation.org API key.
metadata:
  publisher: email-validation.org
  docs: https://email-validation.org/docs/
---

# Email validation with email-validation.org

Check whether email addresses can receive mail before you send to them, store them or accept them at sign-up.

## Before you start

- You need an API key (`ev_live_…`). A person creates it in the email-validation.org dashboard; see
  https://email-validation.org/auth.md for the steps. Never put the key in a URL, a shared prompt or committed code.
- Send the key on every call as `Authorization: Bearer <key>`.
- One credit checks one address. Results with status `unknown`, errors, malformed addresses and test
  addresses are free. New accounts get 500 free credits.
- Never send an email to an address to "test" it: that is what this check is for.

## Pick an interface

| You are | Use |
|---|---|
| Any HTTP client | REST: `POST https://api.email-validation.org/v1/validate` (OpenAPI: https://api.email-validation.org/openapi.json) |
| An MCP client | MCP server `https://api.email-validation.org/mcp` (Streamable HTTP), tools `validate_email`, `get_credits`, `create_bulk_job`, `get_bulk_job` |
| An A2A agent | A2A `https://api.email-validation.org/a2a` (JSON-RPC, `A2A-Version: 1.0`); agent card https://api.email-validation.org/.well-known/agent-card.json |

All three use the same key, credits, limits and results.

## Validate one address (REST)

```bash
curl -s https://api.email-validation.org/v1/validate \
  -H "Authorization: Bearer $EV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "jane@example.com"}'
```

Optional fields: `ip_address` (the IP the person used when they gave you the address) and `timeout`
(5–15 seconds, default 15).
A check that runs out of time returns `unknown` and is free.

## Validate one address (A2A)

```json
{"jsonrpc": "2.0", "id": 1, "method": "SendMessage",
 "params": {"message": {"messageId": "1", "role": "ROLE_USER",
   "parts": [{"data": {"email": "jane@example.com"}, "mediaType": "application/json"}]}}}
```

POST it to `https://api.email-validation.org/a2a` with `A2A-Version: 1.0`. The result is the data part of the
completed task's artifact.

## Read the result

Act on `action`; `status` and `reason` say why.

| status | meaning | action | reasons |
|---|---|---|---|
| `deliverable` | The mailbox exists and accepted our check, so mail sent to it should arrive. | `send` | `accepted`, `alias`, `normalized`, `low_engagement`, `high_engagement`, `trusted_catch_all`, `ai_agent` |
| `undeliverable` | Mail sent to this address will not arrive, so it should come off your list. | `remove` | `no_mailbox`, `no_inbound_mail`, `invalid_syntax`, `likely_typo`, `no_dns`, `mailbox_full`, `unroutable` |
| `risky` | The address may accept mail, but sending to it can hurt your bounce rate or sender reputation. | `send_with_caution` | `catch_all`, `role_account`, `role_catch_all`, `disposable`, `toxic`, `forwarding_domain`, `suppressed`, `possible_trap`, `spamtrap`, `complainer` |
| `unknown` | We could not get a definite answer this time, so no credit is used and a later retry often succeeds. | `retry_later` | `server_unavailable`, `temporary_error`, `greylisted`, `anti_spam_block`, `timeout`, `internal_error` |

- `send`: Keep the address and send to it as usual.
- `send_with_caution`: Send only if the address matters to you, and watch bounces and complaints for this segment.
- `remove`: Remove the address from your list or ask for another one.
- `retry_later`: Check the address again later; the answer often becomes definite on a second try.

Other useful fields: `did_you_mean` (a likely typo fix), `disposable`, `role_account`,
`catch_all_domain`, `free_email`, `mx_found` and `credits_used` (0 or 1).
Reason details: https://email-validation.org/docs/statuses/

## Lists

For more than a few dozen addresses, do not loop single checks: create a bulk job (`POST https://api.email-validation.org/v1/bulk`
or the MCP tool `create_bulk_job`), poll it until it is `completed`, then download the results.
Bulk jobs need a key with the `bulk` scope. Guide: https://email-validation.org/docs/bulk/

## Credits, limits and errors

- Balance: `GET https://api.email-validation.org/v1/credits` (or `get_credits`). Credits expire 24
  months after they are granted; the soonest-expiring are spent first.
- Rate limit: up to 500 requests per second per account after a purchase
  (20 before). Keys can have lower limits and a daily credit cap.
- Errors use `{"error": {"code", "message", "request_id"}}`. On `429` or `503`, wait for
  `Retry-After` and retry once; do not retry other 4xx errors. `402 insufficient_credits` means the
  account owner must buy credits. Errors never use credits.

## Test without spending credits

Addresses at `sandbox.email-validation.org` return a fixed answer for each reason, free: for example
`accepted@sandbox.email-validation.org` (deliverable) or `catch_all@sandbox.email-validation.org` (risky).
List: https://email-validation.org/docs/test-addresses/

## More

- Docs: https://email-validation.org/docs/ · AI agents: https://email-validation.org/docs/ai-agents/
- The free checker on https://email-validation.org/email-checker/ is for people (5 checks a day, bot check); agents
  should use the API.
