No subscription50 free credits to start. Buy more only when you need them.

See pricing →
Developers

Email verification API.

The same scoring engine that powers bulk runs, exposed as a small HTTP API. Drop it into your signup form today.

POST /v1/verify

curl https://api.cleanmylist.io/v1/verify \
  -H "Authorization: Bearer $CML_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"sasha@thoughtbox.io"}'

Endpoints

A small surface, on purpose.

Verify one address, verify a small batch, or fetch the OpenAPI contract.

MethodPathWhat it does
POST/v1/verifyVerify a single address.
POST/v1/verify/bulkVerify up to 100 addresses in one call.
GET/v1/openapi.jsonFetch the OpenAPI contract.

Batch checks

Verify a small batch in one request.

Use the bulk endpoint for signup imports and small forms. For full CSV cleaning, use the dashboard list runner.

POST /v1/verify/bulk

curl https://api.cleanmylist.io/v1/verify/bulk \
  -H "Authorization: Bearer $CML_KEY" \
  -H "Content-Type: application/json" \
  -d '{"emails":["one@example.com","two@example.com"]}'

Response shape

One JSON object, every time.

Every verification returns the same shape — a verdict, a score, the reason, and a per-stage breakdown. The fields are stable; we add, we never remove.

  • verdict — deliverable | risky | undeliverable
  • score — 0 to 100, with feature contributions on request
  • reason — single canonical string for the verdict
  • checks — per-stage signals, useful for audit logs
  • latency_ms — total ms spent on the address
  • model_version — for reproducibility on re-verification
{
  "verdict": "deliverable",
  "score": 98,
  "reason": "All checks passed",
  "reason_code": "ok",
  "checks": [
    { "name": "syntax", "status": "pass", "message": "Syntax OK" },
    { "name": "mx_records", "status": "pass", "message": "MX records found" }
  ],
  "latency_ms": 657,
  "model_version": "v1.0-heuristic",
  "ran_at": "2026-05-18T10:22:18Z"
}

Examples

Copy-pasteable HTTP examples.

SDKs can come later. V1 keeps the public contract small and easy to call from any stack.

curlHTTP
curl -X POST https://api.cleanmylist.io/v1/verify ...
Node.jsfetch
await fetch('/v1/verify', { method: 'POST', ... })
Pythonhttpx
httpx.post('https://api.cleanmylist.io/v1/verify', ...)

Rate limits + reliability

Honest numbers, in writing.

Limits are per workspace, not per key. Need higher throughput or a dedicated probe pool? Talk to us — volume customers get bespoke limits.

P50 verify latency

Measuring

P99 verify latency

Measuring

Default rate limit

1,000 / min

Bulk API batch cap

100

Dashboard list cap

1,000,000

Status

Published

Ship a verify endpoint into your signup today.

Get an API key, add one HTTP call, and ship the diff before standup. We will refund the credits if it does not feel right.