SendlySendly
API ReferenceValidation

Validate a batch of email addresses

POST
/api/v1/email-validations

Check up to 50 addresses for whether they can receive mail, and for the signals that make one worth mailing. Billed per address.

The response publishes a verdict alongside the flags it was drawn from. Branch on the verdict: the two obvious readings of the flags are both wrong — a free-provider address (is_personal) and a role mailbox (is_role_address) are ordinary, deliverable addresses that real customers use, and refusing them would shrink a list for no reason. is_disposable is the only flag that lowers a verdict.

unknown means DNS did not answer in time, so that address was NOT checked. It is a separate value from undeliverable on purpose — acting on the two together deletes live contacts over a network hiccup.

The 50-address ceiling is a latency bound, not a payload one: every distinct DOMAIN in the batch costs a DNS round trip. To validate a whole list, use POST /api/v1/lists/{id}/validation-runs, which runs as a background job.

Requires the validation:write scope — Check whether email addresses can receive mail — this is billed per address.

Authorization

AuthorizationBearer <token>

API key authentication. Use a sk_* (FULL) or pk_* (SENDING_ONLY) key as the bearer token. Public keys (pk_*) are restricted to the email-send endpoints and the self-serve list subscribe/unsubscribe pair; every other endpoint — event tracking included — answers 403 for them. In scope terms (used by /api/v1/* operations): FULL keys hold every scope; SENDING_ONLY keys hold only emails:send.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X POST "https://example.com/api/v1/email-validations" \  -H "Content-Type: application/json" \  -d '{    "emails": [      "user@example.com"    ]  }'
{
  "results": [
    {
      "email": "string",
      "verdict": "deliverable",
      "is_disposable": true,
      "is_role_address": true,
      "is_personal": true,
      "has_mx_records": true,
      "reasons": [
        "string"
      ]
    }
  ]
}
{
  "type": "http://example.com",
  "title": "string",
  "status": 0,
  "detail": "string",
  "instance": "string",
  "code": "string",
  "request_id": "string",
  "errors": [
    {
      "pointer": "string",
      "code": "string",
      "message": "string"
    }
  ]
}
{
  "type": "http://example.com",
  "title": "string",
  "status": 0,
  "detail": "string",
  "instance": "string",
  "code": "string",
  "request_id": "string",
  "errors": [
    {
      "pointer": "string",
      "code": "string",
      "message": "string"
    }
  ]
}
{
  "type": "http://example.com",
  "title": "string",
  "status": 0,
  "detail": "string",
  "instance": "string",
  "code": "string",
  "request_id": "string",
  "errors": [
    {
      "pointer": "string",
      "code": "string",
      "message": "string"
    }
  ]
}
{
  "type": "http://example.com",
  "title": "string",
  "status": 0,
  "detail": "string",
  "instance": "string",
  "code": "string",
  "request_id": "string",
  "errors": [
    {
      "pointer": "string",
      "code": "string",
      "message": "string"
    }
  ]
}
{
  "type": "http://example.com",
  "title": "string",
  "status": 0,
  "detail": "string",
  "instance": "string",
  "code": "string",
  "request_id": "string",
  "errors": [
    {
      "pointer": "string",
      "code": "string",
      "message": "string"
    }
  ]
}