Check an email address
Whether an address is worth sending to, before the first message.
Runs any of 2 calls on your workspace.
GET /tools/address
Whether an address is worth sending to, before the first message.
Example
Needs no scope. result is valid, risky, invalid or unknown, and reasons says why: wrong syntax, a domain that takes no mail, a throwaway or shared mailbox, or a likely typo, with the correction in suggestion. With emails:read, workspace adds what this workspace knows about the address.
curl "$OE/tools/[email protected]" -H "$AUTH"{ "object": "address_check", "email": "[email protected]", "normalized": "[email protected]", "result": "risky", "reasons": ["typo_suspected"], "suggestion": "[email protected]", "checks": { "syntax": true, "mx": { "status": "found", "hosts": ["mx.gmial.com"] }, "nullMx": false, "disposable": false, "role": false, "freeProvider": false, "mailbox": null }, "workspace": { "suppressed": false, "lastBouncedAt": null, "lastDeliveredAt": null }, "checkedAt": "2026-10-11T09:41:00.000Z"}An address whose syntax is wrong is not an error. It answers 200 with result set to invalid.
deep=true also asks whether the mailbox exists, in checks.mailbox. It needs emails:send and is billed per address through pay as you go. With pay as you go off it is a 409 deep_check_unavailable, and nothing is billed.
Check a list
POST /tools/addresses takes up to 100 addresses in emails and answers with one check for each, in the order they were sent. deep applies to all of them.
curl -X POST "$OE/tools/addresses" -H "$AUTH" -H "Content-Type: application/json" \ -d '{ "emails": ["[email protected]", "[email protected]"] }'{ "object": "list", "data": [ { "object": "address_check", "email": "[email protected]", "result": "valid", "reasons": [] }, { "object": "address_check", "email": "[email protected]", "result": "risky", "reasons": ["role_address"] } ]}More than 100 addresses, or none, is a 422 invalid_parameter on emails.