# Verify a single email

> Runs (or reuses a cached) verification for one address. Cached results are returned instantly and are not billable; a fresh check consumes one verification…

Source: https://warmerly.com/docs/verify/verify-a-single-email

```text
POST /verify
```

Runs (or reuses a cached) verification for one address. Cached results are returned instantly and are **not billable**; a fresh check consumes one verification from your plan's quota.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `email` | string | Yes | The address to verify, 3 to 320 characters. |
| `force` | boolean | No | Skip the cache and run a fresh SMTP probe even if a cached result exists. A result confirmed from real mail (for example a bounce or a reply) is never re-probed, so it is still served from cache. |

```bash
curl https://app.warmerly.com/api/v1/verify \
  -X POST \
  -H "X-Api-Key: wmv_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{ "email": "jane@example.com" }'
```

```json
{
  "result": {
    "email": "jane@example.com",
    "status": "valid",
    "confidence": 95,
    "reason": "mailbox_accepts",
    "checks": {
      "syntax": true,
      "mx": ["aspmx.l.google.com"],
      "smtpConnectable": true,
      "smtpAccepted": true,
      "catchAll": false,
      "disposable": false,
      "roleBased": false,
      "freeProvider": false,
      "provider": "google",
      "didYouMean": null,
      "smtpCode": 250,
      "smtpMessage": "2.1.5 OK"
    },
    "durationMs": 812,
    "checkedAt": "2026-07-02T10:14:03.000Z",
    "cached": false,
    "retryable": false
  },
  "checkId": "b2b7c9a0-1e3f-4a2b-9c1d-4e8f0a2b3c4d"
}
```

Every call (cached or not) is saved to your [history](https://warmerly.com/docs/verify/verify-a-single-email#verification-history) as `checkId`. Errors: `400 bad_request` (`invalid_body`) for an invalid body, `403 channel_not_included` if your plan does not include email features, and `402 payment_required` if you're out of verification quota. The 402 `message` is `plan_limit_reached` (or `free_trial_limit_reached` when you have no active plan), and `details` holds `used`, `limit` and `label`.

```json
{ "error": { "code": "payment_required", "message": "plan_limit_reached", "details": { "used": 5000, "limit": 5000, "label": "email verifications" } } }
```

## More from Verify

- [The verification object](https://warmerly.com/docs/verify/the-verification-object): The verification object in the Warmerly Verify API reference.
- [Bulk verification](https://warmerly.com/docs/verify/bulk-verification): Submit a list of addresses as an asynchronous batch, then poll for results. Quota for the full batch size is…
- [Verification history](https://warmerly.com/docs/verify/verification-history): Returns the recent single verifications (from POST /verify) recorded against your active workspace, most…
