Verify email

Evaluates an email address using explicitly selected, composable checks.

POST /v1/email/verify

Addresshttps://api.hanzo.ai/v1/email/verify
MethodPOST
Operationpost_email_verify
AuthAuthorization: Bearer $HANZO_API_KEY

Evaluates an email address using explicitly selected, composable checks.

A signed-in caller only: the SMTP check connects to the address's mail server from ours, so an anonymous caller could probe mailboxes and get our addresses blocked. Each caller may run 120 checks an hour and 20 of them SMTP probes, and the deployment 6,000 and 400; past either is 429.

POST /v1/email/verify

Request

6 fields, body application/json (required).

FieldInTypeRequiredDescription
checksbodystring[]—Checks explicitly selects which checks to run.
emailbodystring—Email is the address to evaluate.
from_emailbodystring—FromEmail sets sender used in MAIL FROM for SMTP probe when explicitly enabled.
hello_namebodystring—HelloName sets domain used in EHLO for SMTP probe when explicitly enabled.
proxy_uribodystring—ProxyURI sets optional proxy for network lookups.
suggestionsbodyboolean—Suggestions requests domain typo suggestions without altering the original email.

Response

StatusBodyMeaning
200email.VerificationResultok
defaultproblem-detailsrefused

200 body — 31 fields.

FieldInTypeAlwaysDescription
checksbodyemail.VerificationChecks—
checks.classificationbodyemail.ClassificationCheck—
checks.classification.disposablebodyboolean—Disposable reports whether the domain belongs to a temporary or throwaway provider.
checks.classification.freebodyboolean—Free reports whether the domain belongs to a free consumer webmail provider.
checks.classification.reasonbodystring—Reason describes the failure or skip reason when Status is not pass.
checks.classification.rolebodyboolean—Role reports whether the address is a generic role or distribution account.
checks.classification.statusbodystring—Status reports the check outcome: pass, fail, unknown, or skipped.
checks.domainbodyemail.DomainCheck—
checks.domain.reasonbodystring—Reason describes the failure or skip reason when Status is not pass.
checks.domain.statusbodystring—Status reports the check outcome: pass, fail, unknown, or skipped.
checks.mxbodyemail.MXCheck—
checks.mx.reasonbodystring—Reason describes the failure or skip reason when Status is not pass.
checks.mx.recordsbodystring[]—Records lists the discovered mail exchanger hostnames.
checks.mx.statusbodystring—Status reports the check outcome: pass, fail, unknown, or skipped.
checks.smtpbodyemail.SMTPCheck—
checks.smtp.catch_allbodyboolean—CatchAll reports whether the host accepts all recipient addresses.
checks.smtp.deliverablebodyboolean—Deliverable reports whether the mailbox accepted the test recipient address.
checks.smtp.disabledbodyboolean—Disabled reports whether the recipient mailbox is disabled or inactive.
checks.smtp.full_inboxbodyboolean—FullInbox reports whether the recipient mailbox is over quota.
checks.smtp.host_existsbodyboolean—HostExists reports whether the destination mail server host exists and responded.
checks.smtp.reasonbodystring—Reason describes the failure or skip reason when Status is not pass.
checks.smtp.statusbodystring—Status reports the check outcome: pass, fail, unknown, or skipped.
checks.syntaxbodyemail.SyntaxCheck—
checks.syntax.domainbodystring—Domain is the domain-part of the email address.
checks.syntax.reasonbodystring—Reason describes the failure or skip reason when Status is not pass.
checks.syntax.statusbodystring—Status reports the check outcome: pass, fail, unknown, or skipped.
checks.syntax.usernamebodystring—Username is the local-part of the email address.
emailbodystring—Email is the original submitted email address.
suggestionsbodyemail.Suggestion[]—Suggestions lists potential corrections when requested.
suggestions[].emailbodystring—Email is the suggested alternative address.
suggestions[].reasonbodystring—Reason describes why the suggestion was made (e.g. domain_typo).

Failure carries the platform error shape — see Errors.

Examples

hanzo email verify
import { Configuration, EmailApi } from 'hanzoai';

const api = new EmailApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postEmailVerify({ checks: ["<checks>"], email: "<email>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import EmailApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = EmailApi(client).post_email_verify(checks=["<checks>"], email="<email>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.EmailAPI.PostEmailVerify(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, email_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = email_api::post_email_verify(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.EmailApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new EmailApi(client).postEmailVerify();
curl -X POST https://api.hanzo.ai/v1/email/verify \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "checks": [
         "<checks>"
       ],
       "email": "<email>"
     }'

MCP reaches email through the email tool, which names its 8 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_emails"
         }
       }
     }'

Email API · All Hanzo APIs · Interactive reference

Was this page useful?
Broken link or missing step? Drop it in #docs on Discord or open a PR.