---
title: "Verify addresses before writing to them"
method: POST
path: "/api/v1/verify"
tags: ["Emails"]
---

# Verify addresses before writing to them

`POST /api/v1/verify`

## Request

- Base URL: `https://mailcheer.com`
- URL: `https://mailcheer.com/api/v1/verify`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-Api-Key`

Checks one address (`email`) or up to 100 (`emails`) without sending anything: syntax, a domain that receives mail, a mailbox that already hard-bounced on Mailcheer, disposable and role mailboxes, and DNS signals of a dead mailbox. No SMTP probe: `valid` means nothing known stands against the address, not that the mailbox exists. Limit: 20,000 addresses per workspace per day. Requires `emails:send`.

## Request body

- object
  - `email` string
  - `emails` string[]

## Response `200`

One verification for `email`, a list with `summary` for `emails`.

- union
  - object
    - `object` 'email_verification'
    - `email` string
    - `verdict` 'valid' | 'risky' | 'invalid' | 'unknown': invalid: writing to it will bounce · risky: may bounce, or is not a person · unknown: DNS did not answer in time · valid: nothing known stands against it.
    - `reasons` string[]
    - `domain` string, nullable
    - `mail_provider` string, nullable: The mail provider recognized from the MX records (google, microsoft, ovh-mxplan…), or null.
    - `suppressed` string, nullable: The reason, if the address is on this workspace's suppression list.
  - object
    - `object` 'list'
    - `data` object[]
      - `object` 'email_verification'
      - `email` string
      - `verdict` 'valid' | 'risky' | 'invalid' | 'unknown': invalid: writing to it will bounce · risky: may bounce, or is not a person · unknown: DNS did not answer in time · valid: nothing known stands against it.
      - `reasons` string[]
      - `domain` string, nullable
      - `mail_provider` string, nullable: The mail provider recognized from the MX records (google, microsoft, ovh-mxplan…), or null.
      - `suppressed` string, nullable: The reason, if the address is on this workspace's suppression list.
    - `summary` object
      - `valid` integer
      - `risky` integer
      - `invalid` integer
      - `unknown` integer

## Other responses

- `401`: Key missing, unknown or revoked.
- `403`: The key does not have the requested permission, or the workspace cannot send: `sending_blocked` (suspended, blocked or banned — nothing goes out, through any channel), `commitment_required` (the anti-spam commitment is not accepted), `reputation_blocked` (too many bounces or complaints).
- `422`: Malformed field, unverified domain, or recipient on the suppression list.
- `429`: More than 600 requests per minute for this key (`rate_limit_exceeded` — a batch of N subscribers counts as N), or a new workspace reached its daily limit (`daily_quota_exceeded`: 1,000 emails per rolling 24 hours until it is verified). `Retry-After` always says how many seconds to wait.

---

[API](https://skmtc.dev/mailcheer/apis/mailcheer-api.md) · [All operations](https://skmtc.dev/mailcheer/apis/mailcheer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mailcheer/apis/mailcheer-api/revisions/ba64b7ef2170?raw)
