Signup forms
Check the submitted address on your server. Ask the visitor to fix invalid syntax or a domain typo, then use your own confirmation flow to establish ownership. Keep temporary DNS failures from locking out a real customer.
Verify an address from your application with explicit syntax, mail-routing, disposable-domain and mailbox signals. The authenticated API uses your workspace's verification credits.
Check the submitted address on your server. Ask the visitor to fix invalid syntax or a domain typo, then use your own confirmation flow to establish ownership. Keep temporary DNS failures from locking out a real customer.
Verify each contact with a stable import-row identifier. Store its status beside the source record. Send risky and unknown results to a review queue instead of deleting them automatically.
Recheck a consented list before your next send. Compare the new result with the previous check and keep a separate suppression list for unsubscribes and confirmed bounces.
Use deep: false for syntax, DNS and risk checks. Set deep: true to request SMTP and catch-all probes too. Providers can block or limit probes, so a requested check may remain inconclusive.
API access is available with Growth and Pro when paid plans launch. Open your workspace, create a labelled API key, and copy it once. Store it on your server as a secret. Never put a key in browser JavaScript, a mobile bundle, or a public repository. Revoke a compromised key in the workspace and create a replacement.
Send JSON to POST https://www.emailvalidly.com/v1/verify. Include a Bearer token and an Idempotency-Key for every request.
curl https://www.emailvalidly.com/v1/verify \
-H "Authorization: Bearer $EMAILVALIDLY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: signup-unique-event-001" \
-d '{"email":"person@example.com","deep":false}'email is required, up to 254 characters. deep is optional and defaults to false; true requests SMTP and catch-all probing. A deeper check costs the same one credit. The returned result may still be unknown when the receiving system refuses a probe.
The example below illustrates a domain that explicitly does not accept mail; it is not a successful inbox verification.
{
"email": "person@example.com",
"status": "invalid",
"checks": {
"syntax": true, "domain": true, "mx": false,
"disposable": true, "role": true,
"mailbox": null, "catch_all": null
}
}| Status | Meaning | Suggested handling |
|---|---|---|
| valid | Mailbox probe accepted the address without a detected risk flag. | Continue normal consent and delivery checks. |
| likely_valid | Syntax and mail routing look usable; no conclusive mailbox result. | Keep uncertainty visible. |
| risky | Disposable, role-based or catch-all signal. | Review in context; a role address can be legitimate. |
| invalid | Invalid syntax, nonexistent domain, explicit null MX, or mailbox rejection. | Ask for a correction or suppress after review. |
| unknown | Insufficient or temporary DNS/SMTP evidence. | Retry later; do not treat as definitely invalid. |
The boolean fields disposable and role are pass checks: true means not disposable or not role-based. For catch_all, true means a random address was accepted. A null value means the check was not performed or was inconclusive. The numeric score is a heuristic summary, not a measured probability of delivery.
Use a unique Idempotency-Key of 8–100 letters, digits, underscores or hyphens per logical verification. Reusing it with the same input returns the stored result without another charge. Reusing it for a different email or deep setting returns 409. If an in-flight request returns 409, wait and retry with the same key. Use a fresh key only when you intentionally want a new verification.
One credit is reserved before verification. Insufficient balance returns 402 before a probe starts. Internal verification exceptions are refunded. An inconclusive but completed DNS or SMTP check is still a verification and uses a credit.
| HTTP code | Action |
|---|---|
| 400 | Correct the input or idempotency key. |
| 401 | Check the API key and active plan. |
| 402 | Add credits when billing becomes available. |
| 409 | Retry an in-flight request or correct a reused key. |
| 429 | Wait for the Retry-After interval. |
| 500 / 503 | Retry with backoff and the same idempotency key. |
The current API limit is 120 requests per minute per IP. Apply exponential backoff with jitter and cap concurrency. Responses are private and are not cacheable by shared HTTP caches.
The public website uses rate-limited endpoints for individual checks. They do not require API keys and are intended for interactive tools, not a substitute for the paid API.
No endpoint sends a message. SMTP probes stop before the message body stage. Acceptance is not proof of ownership, permission to contact, or future inbox placement. Use a confirmation email in your own application when ownership matters. Review the data handling policy before submitting a list.
Add an HTTPS endpoint in your dashboard. Each completed saved list creates a list.completed event with id, list_id, total and completed fields. Email addresses are not included. Endpoints must resolve to a public IPv4 address on port 443. Redirects are not followed.
Save the signing secret when creating the endpoint. Verify the EmailValidly-Signature header: parse t and v1, reject timestamps more than five minutes from your server clock, and compare v1 with HMAC-SHA256(secret, timestamp + "." + raw request body) using a constant-time comparison. Verify the raw bytes before parsing JSON.
{"id":"event-uuid","type":"list.completed","list_id":"list-uuid","total":100,"completed":100}Return a 2xx response within five seconds. Delivery is at least once: deduplicate by the event id, which is also sent in EmailValidly-Event-Id. Failed deliveries retry up to five attempts with exponential backoff. The dashboard shows delivery status and HTTP responses. Delete an endpoint to stop its pending deliveries.
Pro owners can schedule a completed list every 7 or 30 days. A run creates a fresh saved list, preserves the source list and debits one credit per address. Insufficient credits pause the schedule; resume it from the dashboard after adding credits. Pro includes five additional members. Viewers can read and export lists; editors can also upload and delete them. Billing, keys, invitations and automation remain owner-only.
Create the identifier once per operation and save it before the call. Reuse it after a network timeout. Do not generate a fresh identifier inside a retry loop.
A completed unknown result is different from a failed HTTP request. Store the response evidence; only retry failures according to the HTTP handling rules above.
Route browser submissions through your backend. Mask addresses and tokens in logs, restrict access to exported lists and revoke unused credentials.
The authenticated endpoint verifies one address per request. Process a list with bounded concurrency and a separate identifier for each row. The free public bulk endpoint is limited to 100 addresses and the daily allowance.
No. The score is a rule-based summary. It is not a delivery probability, a consent check or a promise of inbox placement.
Paid plans are not open for purchase yet. You can inspect the OpenAPI document and try the free website tools while preparing your integration.
See the checks in the free tool, then use the same evidence in your workflow.