{"openapi":"3.1.0","info":{"title":"Email Validation API (syntax, MX, disposable, typo check)","version":"1.0.0","description":"Check an email address before you store it or send to it: RFC 5321/5322 syntax, domain existence and MX records (live DNS), null-MX and no-mail domains, 9,000+ disposable / temporary email domains (plus disposable mail servers), role mailboxes (info@, sales@...), no-reply addresses, free providers (Gmail, Outlook, Yahoo...) and typo suggestions (gmial.com -> gmail.com). Returns a 0-100 score and a verdict: valid, risky, invalid or unknown. No SMTP probing: the API never connects to the recipient's mail server, so the mailbox itself and catch-all behaviour are not checked (`mailboxChecked: false`, `catchAll: null`).\n\nAll endpoints accept GET (query string) or POST (JSON body). Errors use one shape: `{\"success\": false, \"error\": {\"code\", \"message\", \"retryable\"}}`. When a numeric `Retry-After` header is present, `error.retryAfterSeconds` is included.","contact":{"name":"TidyTools","url":"https://apify.com/tidytools"}},"servers":[{"url":"https://webcapture-api.yukailin.workers.dev","description":"Origin (reachable only through the marketplace gateway)"}],"tags":[{"name":"Email"}],"paths":{"/api/v1/email/validate":{"get":{"operationId":"validateEmailGet","summary":"Validate one email address (GET)","description":"Syntax, DNS (MX, A/AAAA fallback, null MX), disposable, role, no-reply, free-provider and typo checks for one address. `reason` is the most important finding; `reasons` lists them all.","tags":["Email"],"parameters":[{"name":"email","schema":{"type":"string"},"description":"The address to check. `Name <address>` and `mailto:` forms are accepted. Alias: `address`.","required":true,"example":"info@stripe.com","in":"query"}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"email":{"type":"string"},"normalized":{"type":"string"},"syntaxValid":{"type":"boolean"},"localPart":{"type":"string"},"domain":{"type":"string"},"verdict":{"type":"string"},"score":{"type":"integer"},"reason":{"type":"string"},"reasons":{"type":"array","items":{"type":"string"}},"didYouMean":{"type":"string","nullable":true},"domainExists":{"type":"boolean"},"hasMx":{"type":"boolean"},"acceptsMail":{"type":"boolean"},"mxRecords":{"type":"array","items":{"type":"object","properties":{"priority":{"type":"integer"},"host":{"type":"string"}}}},"mailProvider":{"type":"string"},"disposable":{"type":"boolean"},"role":{"type":"boolean"},"noReply":{"type":"boolean"},"freeProvider":{"type":"boolean"},"tag":{"type":"string","nullable":true},"catchAll":{"type":"boolean","nullable":true},"mailboxChecked":{"type":"boolean"},"disposableList":{"type":"object","properties":{"domains":{"type":"integer"},"updated":{"type":"string"},"source":{"type":"string"}}}}},"example":{"success":true,"email":"info@stripe.com","normalized":"info@stripe.com","syntaxValid":true,"localPart":"info","domain":"stripe.com","verdict":"valid","score":80,"reason":"domain accepts e-mail; mailbox not verified (no SMTP check)","reasons":["domain accepts e-mail; mailbox not verified (no SMTP check)","role or shared mailbox (not a person)"],"didYouMean":null,"domainExists":true,"hasMx":true,"acceptsMail":true,"mxRecords":[{"priority":10,"host":"aspmx.l.google.com"},{"priority":20,"host":"alt1.aspmx.l.google.com"},{"priority":20,"host":"alt2.aspmx.l.google.com"},{"priority":30,"host":"aspmx2.googlemail.com"},{"priority":30,"host":"aspmx3.googlemail.com"}],"mailProvider":"Google","disposable":false,"role":true,"noReply":false,"freeProvider":false,"tag":null,"catchAll":null,"mailboxChecked":false,"disposableList":{"domains":9189,"updated":"2026-10-01","source":"github.com/disposable-email-domains (CC0)"}}}}},"400":{"description":"Invalid parameter (`invalid_request`) or a private/local target (`url_not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"url_not_allowed","message":"private, local and reserved hosts are not allowed"}}}}},"413":{"description":"Request body or target document too large (`too_large`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The target site refused (`target_blocked`), could not be reached or its domain does not resolve (`target_unreachable`), the page does not exist (`target_error`, HTTP 404/410), or returned unsupported content.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"target_blocked","message":"The target refused the request: target returned HTTP 403","details":{"targetStatus":403,"finalUrl":"https://www.g2.com/"}}}}}},"502":{"description":"Temporary failure on our side (`upstream_error`); safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The target did not respond in time (`timeout`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"validateEmail","summary":"Validate one email address","description":"Syntax, DNS (MX, A/AAAA fallback, null MX), disposable, role, no-reply, free-provider and typo checks for one address. `reason` is the most important finding; `reasons` lists them all.\n\nThe same parameters as the GET form, sent as a JSON body.","tags":["Email"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"The address to check. `Name <address>` and `mailto:` forms are accepted. Alias: `address`."}},"required":["email"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"email":{"type":"string"},"normalized":{"type":"string"},"syntaxValid":{"type":"boolean"},"localPart":{"type":"string"},"domain":{"type":"string"},"verdict":{"type":"string"},"score":{"type":"integer"},"reason":{"type":"string"},"reasons":{"type":"array","items":{"type":"string"}},"didYouMean":{"type":"string","nullable":true},"domainExists":{"type":"boolean"},"hasMx":{"type":"boolean"},"acceptsMail":{"type":"boolean"},"mxRecords":{"type":"array","items":{"type":"object","properties":{"priority":{"type":"integer"},"host":{"type":"string"}}}},"mailProvider":{"type":"string"},"disposable":{"type":"boolean"},"role":{"type":"boolean"},"noReply":{"type":"boolean"},"freeProvider":{"type":"boolean"},"tag":{"type":"string","nullable":true},"catchAll":{"type":"boolean","nullable":true},"mailboxChecked":{"type":"boolean"},"disposableList":{"type":"object","properties":{"domains":{"type":"integer"},"updated":{"type":"string"},"source":{"type":"string"}}}}},"example":{"success":true,"email":"info@stripe.com","normalized":"info@stripe.com","syntaxValid":true,"localPart":"info","domain":"stripe.com","verdict":"valid","score":80,"reason":"domain accepts e-mail; mailbox not verified (no SMTP check)","reasons":["domain accepts e-mail; mailbox not verified (no SMTP check)","role or shared mailbox (not a person)"],"didYouMean":null,"domainExists":true,"hasMx":true,"acceptsMail":true,"mxRecords":[{"priority":10,"host":"aspmx.l.google.com"},{"priority":20,"host":"alt1.aspmx.l.google.com"},{"priority":20,"host":"alt2.aspmx.l.google.com"},{"priority":30,"host":"aspmx2.googlemail.com"},{"priority":30,"host":"aspmx3.googlemail.com"}],"mailProvider":"Google","disposable":false,"role":true,"noReply":false,"freeProvider":false,"tag":null,"catchAll":null,"mailboxChecked":false,"disposableList":{"domains":9189,"updated":"2026-10-01","source":"github.com/disposable-email-domains (CC0)"}}}}},"400":{"description":"Invalid parameter (`invalid_request`) or a private/local target (`url_not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"url_not_allowed","message":"private, local and reserved hosts are not allowed"}}}}},"413":{"description":"Request body or target document too large (`too_large`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The target site refused (`target_blocked`), could not be reached or its domain does not resolve (`target_unreachable`), the page does not exist (`target_error`, HTTP 404/410), or returned unsupported content.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"target_blocked","message":"The target refused the request: target returned HTTP 403","details":{"targetStatus":403,"finalUrl":"https://www.g2.com/"}}}}}},"502":{"description":"Temporary failure on our side (`upstream_error`); safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The target did not respond in time (`timeout`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/email/validate/batch":{"get":{"operationId":"validateEmailBatchGet","summary":"Validate up to 50 email addresses (GET)","description":"The same checks for up to 50 addresses in one call, with one DNS lookup per distinct domain. Results keep the input order; `summary` counts the verdicts.","tags":["Email"],"parameters":[{"name":"emails","schema":{"type":"array","items":{"type":"string"},"maxItems":50},"style":"form","explode":false,"required":true,"description":"Up to 50 addresses: a JSON array in the POST body, or comma-separated in the query string (GET).","example":["jane@gmail.com","info@stripe.com"],"in":"query"}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"count":{"type":"integer"},"summary":{"type":"object","properties":{"valid":{"type":"integer"},"risky":{"type":"integer"},"invalid":{"type":"integer"},"unknown":{"type":"integer"}}},"results":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"normalized":{"type":"string"},"syntaxValid":{"type":"boolean"},"localPart":{"type":"string"},"domain":{"type":"string"},"verdict":{"type":"string"},"score":{"type":"integer"},"reason":{"type":"string"},"reasons":{"type":"array","items":{"type":"string"}},"didYouMean":{"type":"string","nullable":true},"domainExists":{"type":"boolean"},"hasMx":{"type":"boolean"},"acceptsMail":{"type":"boolean"},"mxRecords":{"type":"array","items":{"type":"object","properties":{"priority":{"type":"integer"},"host":{"type":"string"}}}},"mailProvider":{"type":"string"},"disposable":{"type":"boolean"},"role":{"type":"boolean"},"noReply":{"type":"boolean"},"freeProvider":{"type":"boolean"},"tag":{"type":"string","nullable":true},"catchAll":{"type":"boolean","nullable":true},"mailboxChecked":{"type":"boolean"}}}},"disposableList":{"type":"object","properties":{"domains":{"type":"integer"},"updated":{"type":"string"},"source":{"type":"string"}}}}},"example":{"success":true,"count":6,"summary":{"valid":2,"risky":2,"invalid":2,"unknown":0},"results":[{"email":"jane@gmail.com","normalized":"jane@gmail.com","syntaxValid":true,"localPart":"jane","domain":"gmail.com","verdict":"valid","score":90,"reason":"domain accepts e-mail; mailbox not verified (no SMTP check)","reasons":["domain accepts e-mail; mailbox not verified (no SMTP check)"],"didYouMean":null,"domainExists":true,"hasMx":true,"acceptsMail":true,"mxRecords":[{"priority":5,"host":"gmail-smtp-in.l.google.com"},{"priority":10,"host":"alt1.gmail-smtp-in.l.google.com"},{"priority":20,"host":"alt2.gmail-smtp-in.l.google.com"},{"priority":30,"host":"alt3.gmail-smtp-in.l.google.com"},{"priority":40,"host":"alt4.gmail-smtp-in.l.google.com"}],"mailProvider":"Google","disposable":false,"role":false,"noReply":false,"freeProvider":true,"tag":null,"catchAll":null,"mailboxChecked":false},{"email":"info@stripe.com","normalized":"info@stripe.com","syntaxValid":true,"localPart":"info","domain":"stripe.com","verdict":"valid","score":80,"reason":"domain accepts e-mail; mailbox not verified (no SMTP check)","reasons":["domain accepts e-mail; mailbox not verified (no SMTP check)","role or shared mailbox (not a person)"],"didYouMean":null,"domainExists":true,"hasMx":true,"acceptsMail":true,"mxRecords":[{"priority":10,"host":"aspmx.l.google.com"},{"priority":20,"host":"alt1.aspmx.l.google.com"},{"priority":20,"host":"alt2.aspmx.l.google.com"},{"priority":30,"host":"aspmx2.googlemail.com"},{"priority":30,"host":"aspmx3.googlemail.com"}],"mailProvider":"Google","disposable":false,"role":true,"noReply":false,"freeProvider":false,"tag":null,"catchAll":null,"mailboxChecked":false},{"email":"tester@mailinator.com","normalized":"tester@mailinator.com","syntaxValid":true,"localPart":"tester","domain":"mailinator.com","verdict":"risky","score":20,"reason":"disposable (temporary) e-mail domain","reasons":["disposable (temporary) e-mail domain"],"didYouMean":null,"domainExists":true,"hasMx":true,"acceptsMail":true,"mxRecords":[{"priority":1,"host":"mail.mailinator.com"},{"priority":1,"host":"mail2.mailinator.com"}],"mailProvider":null,"disposable":true,"role":false,"noReply":false,"freeProvider":false,"tag":null,"catchAll":null,"mailboxChecked":false}],"disposableList":{"domains":9189,"updated":"2026-10-01","source":"github.com/disposable-email-domains (CC0)"}}}}},"400":{"description":"Invalid parameter (`invalid_request`) or a private/local target (`url_not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"url_not_allowed","message":"private, local and reserved hosts are not allowed"}}}}},"413":{"description":"Request body or target document too large (`too_large`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The target site refused (`target_blocked`), could not be reached or its domain does not resolve (`target_unreachable`), the page does not exist (`target_error`, HTTP 404/410), or returned unsupported content.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"target_blocked","message":"The target refused the request: target returned HTTP 403","details":{"targetStatus":403,"finalUrl":"https://www.g2.com/"}}}}}},"502":{"description":"Temporary failure on our side (`upstream_error`); safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The target did not respond in time (`timeout`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"validateEmailBatch","summary":"Validate up to 50 email addresses","description":"The same checks for up to 50 addresses in one call, with one DNS lookup per distinct domain. Results keep the input order; `summary` counts the verdicts.\n\nThe same parameters as the GET form, sent as a JSON body.","tags":["Email"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"emails":{"type":"array","items":{"type":"string"},"maxItems":50,"description":"Up to 50 addresses: a JSON array in the POST body, or comma-separated in the query string (GET)."}},"required":["emails"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"count":{"type":"integer"},"summary":{"type":"object","properties":{"valid":{"type":"integer"},"risky":{"type":"integer"},"invalid":{"type":"integer"},"unknown":{"type":"integer"}}},"results":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"normalized":{"type":"string"},"syntaxValid":{"type":"boolean"},"localPart":{"type":"string"},"domain":{"type":"string"},"verdict":{"type":"string"},"score":{"type":"integer"},"reason":{"type":"string"},"reasons":{"type":"array","items":{"type":"string"}},"didYouMean":{"type":"string","nullable":true},"domainExists":{"type":"boolean"},"hasMx":{"type":"boolean"},"acceptsMail":{"type":"boolean"},"mxRecords":{"type":"array","items":{"type":"object","properties":{"priority":{"type":"integer"},"host":{"type":"string"}}}},"mailProvider":{"type":"string"},"disposable":{"type":"boolean"},"role":{"type":"boolean"},"noReply":{"type":"boolean"},"freeProvider":{"type":"boolean"},"tag":{"type":"string","nullable":true},"catchAll":{"type":"boolean","nullable":true},"mailboxChecked":{"type":"boolean"}}}},"disposableList":{"type":"object","properties":{"domains":{"type":"integer"},"updated":{"type":"string"},"source":{"type":"string"}}}}},"example":{"success":true,"count":6,"summary":{"valid":2,"risky":2,"invalid":2,"unknown":0},"results":[{"email":"jane@gmail.com","normalized":"jane@gmail.com","syntaxValid":true,"localPart":"jane","domain":"gmail.com","verdict":"valid","score":90,"reason":"domain accepts e-mail; mailbox not verified (no SMTP check)","reasons":["domain accepts e-mail; mailbox not verified (no SMTP check)"],"didYouMean":null,"domainExists":true,"hasMx":true,"acceptsMail":true,"mxRecords":[{"priority":5,"host":"gmail-smtp-in.l.google.com"},{"priority":10,"host":"alt1.gmail-smtp-in.l.google.com"},{"priority":20,"host":"alt2.gmail-smtp-in.l.google.com"},{"priority":30,"host":"alt3.gmail-smtp-in.l.google.com"},{"priority":40,"host":"alt4.gmail-smtp-in.l.google.com"}],"mailProvider":"Google","disposable":false,"role":false,"noReply":false,"freeProvider":true,"tag":null,"catchAll":null,"mailboxChecked":false},{"email":"info@stripe.com","normalized":"info@stripe.com","syntaxValid":true,"localPart":"info","domain":"stripe.com","verdict":"valid","score":80,"reason":"domain accepts e-mail; mailbox not verified (no SMTP check)","reasons":["domain accepts e-mail; mailbox not verified (no SMTP check)","role or shared mailbox (not a person)"],"didYouMean":null,"domainExists":true,"hasMx":true,"acceptsMail":true,"mxRecords":[{"priority":10,"host":"aspmx.l.google.com"},{"priority":20,"host":"alt1.aspmx.l.google.com"},{"priority":20,"host":"alt2.aspmx.l.google.com"},{"priority":30,"host":"aspmx2.googlemail.com"},{"priority":30,"host":"aspmx3.googlemail.com"}],"mailProvider":"Google","disposable":false,"role":true,"noReply":false,"freeProvider":false,"tag":null,"catchAll":null,"mailboxChecked":false},{"email":"tester@mailinator.com","normalized":"tester@mailinator.com","syntaxValid":true,"localPart":"tester","domain":"mailinator.com","verdict":"risky","score":20,"reason":"disposable (temporary) e-mail domain","reasons":["disposable (temporary) e-mail domain"],"didYouMean":null,"domainExists":true,"hasMx":true,"acceptsMail":true,"mxRecords":[{"priority":1,"host":"mail.mailinator.com"},{"priority":1,"host":"mail2.mailinator.com"}],"mailProvider":null,"disposable":true,"role":false,"noReply":false,"freeProvider":false,"tag":null,"catchAll":null,"mailboxChecked":false}],"disposableList":{"domains":9189,"updated":"2026-10-01","source":"github.com/disposable-email-domains (CC0)"}}}}},"400":{"description":"Invalid parameter (`invalid_request`) or a private/local target (`url_not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"url_not_allowed","message":"private, local and reserved hosts are not allowed"}}}}},"413":{"description":"Request body or target document too large (`too_large`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The target site refused (`target_blocked`), could not be reached or its domain does not resolve (`target_unreachable`), the page does not exist (`target_error`, HTTP 404/410), or returned unsupported content.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"target_blocked","message":"The target refused the request: target returned HTTP 403","details":{"targetStatus":403,"finalUrl":"https://www.g2.com/"}}}}}},"502":{"description":"Temporary failure on our side (`upstream_error`); safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The target did not respond in time (`timeout`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["success","error"],"properties":{"success":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_configured","unauthorized","not_found","method_not_allowed","invalid_request","rate_limited","url_not_allowed","target_blocked","target_unreachable","target_error","unsupported_content","too_large","timeout","upstream_error","board_not_found","app_not_found"]},"message":{"type":"string"},"retryable":{"type":"boolean","description":"true for rate_limited, timeout, upstream_error and browser_busy; false for other errors."},"retryAfterSeconds":{"type":"integer","description":"Seconds to wait before retrying, when a numeric Retry-After header is present."},"details":{"type":"object","additionalProperties":true}}}}}}}}