Skip to content
14 days of Pro, free.Sign up with your work email for 100 extra credits.Start free trial

Enrich email addresses via API

Pass a work email address and get back the complete person and company behind it: verified contact data, current title, seniority, employer firmographics, and email deliverability status. Reverse email lookup powered by 25+ providers.

An example call: POST to the email endpoint with a work email, the waterfall tries providers in cost order, and the response returns 16 fields.

  • 1 creditA verified work email, however many providers it took to find it.
  • 11 creditsEmail and phone number together, on the same call.
  • 25+ providersQueried in cost order. The waterfall stops at the first deliverable result.
  • 98% / 85%Verified work emails and phone numbers found on our 500-lead benchmark.

10,000+ users, from founders to full sales teams

  • Switched fromZoomInfo
  • Case study
  • HackerOneSwitched fromApollo
  • Switched fromClay
  • Case study
  • Sumo LogicSwitched fromClay
  • Switched fromApollo
  • Case study
  • Switched fromZoomInfo
  • Switched fromZoomInfo

What one call returns. Up to 16 fields.

A sample response for one email lookup, beside every field the record can carry.

Response200 OK · email
{
  "id": "ev_e2p5tf9",
  "status": "completed",
  "email": {
    "address": "sarah.park@growthco.com",
    "status": "valid",
    "mx_verified": true,
    "smtp_verified": true,
    "is_catch_all": false,
    "is_disposable": false,
    "is_role_based": false,
    "risk_score": 0.05,
    "first_name": "Sarah",
    "last_name": "Park",
    "title": "Head of Growth",
    "seniority": "director",
    "company_name": "GrowthCo",
    "company_domain": "growthco.com",
    "company_industry": "Marketing Technology",
    "company_size": "51-200"
  },
  "meta": {
    "credits_used": 1,
    "providers_queried": 25,
    "providers_matched": 7,
    "confidence": 0.94,
    "enriched_at": "2026-04-15T16:42:11Z"
  }
}
Field reference16 fields
  • addressstringThe email address that was verified.
  • statusenumVerification result: valid, invalid, risky, catch-all, disposable, role-based, unknown.
  • mx_verifiedbooleanWhether the domain has valid MX records configured for receiving email.
  • smtp_verifiedbooleanWhether the SMTP handshake confirmed the specific mailbox exists.
  • is_catch_allbooleanWhether the domain accepts mail to any address (catch-all configuration).
  • is_disposablebooleanWhether the address uses a temporary/disposable email service.
  • is_role_basedbooleanWhether the address is a group alias (info@, support@, admin@).
  • risk_scorefloat0.0 to 1.0 risk score. Lower = safer to send. Factors: catch-all probability, domain age, complaint history.
  • first_namestringContact first name associated with the email address.
  • last_namestringContact last name.
  • titlestringCurrent job title of the email owner.
  • seniorityenumSeniority level: entry, individual_contributor, manager, director, vp, c_level, owner.
  • company_namestringCompany name associated with the email domain.
  • company_domainstringCompany primary domain.
  • company_industrystringIndustry classification.
  • company_sizestringEmployee count range.

Call it from curl, Node or Python. Pay for what comes back.

It's one POST request. Credits come out of one wallet the whole team shares, and a call that finds nothing costs nothing.

RequestPOST · email

curl

curl -X POST https://api.cleanlist.ai/v1/enrich/email \
  -H "Authorization: Bearer $CLEANLIST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "jane@acme.com"}'

Node.js

const response = await fetch("https://api.cleanlist.ai/v1/enrich/email", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.CLEANLIST_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ email: "jane@acme.com" }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());

Python

import os
import requests

response = requests.post(
    "https://api.cleanlist.ai/v1/enrich/email",
    headers={"Authorization": f"Bearer {os.environ['CLEANLIST_API_KEY']}"},
    json={"email": "jane@acme.com"},
)
response.raise_for_status()
print(response.json())
What a call costsper email
  • SearchFree, unlimited
  • Verified work email1 credit
  • Phone number10 credits
  • Email and phone number11 credits
  • Validation0.5 credits
  • AI qualification5 credits
  • A call that finds nothing0

What teams do with it.

  1. Pre-send verification

    Verify every email in your outbound sequence before sending. Remove invalids, flag catch-alls, and protect your sender reputation from bounce damage.

  2. Form submission enrichment

    When a prospect submits a form with their work email, instantly enrich the record with title, company, and seniority, then route to the right rep or sequence.

  3. CRM hygiene sweeps

    Run your CRM email list through verification quarterly. Flag stale addresses, identify job changes, and update contact records before your next campaign.

  4. Purchased list validation

    Before importing a third-party lead list, verify every email to filter out the 15-30% that are typically invalid. Save credits by only enriching validated addresses.

The questions that come up first.

What is the difference between email verification and email enrichment?

Email verification confirms whether an address is deliverable (valid/invalid/risky). Email enrichment goes further: it returns the person behind the email: their name, title, seniority, and company firmographics. The emails endpoint does both in a single API call. Use it when you need both verification status and contact context.

How does catch-all detection work?

Cleanlist sends a probe to a randomly generated address at the domain during SMTP verification. If the server accepts the random address, the domain is catch-all. This means a valid SMTP response for the target address does not guarantee the mailbox exists. Catch-all addresses are flagged with is_catch_all: true and a higher risk_score.

What is the risk_score and how should I use it?

The risk_score is a 0.0 to 1.0 float that quantifies send risk. Scores below 0.1 are safe to send. Scores between 0.1 and 0.3 are moderate risk (typically catch-all domains with some positive signals). Scores above 0.3 should be excluded from cold outreach. Use risk_score to set your own bounce tolerance threshold rather than relying on binary pass/fail.

Does email verification work for personal email addresses (Gmail, Yahoo)?

Yes, but with limitations. Gmail and Yahoo use catch-all configurations for their consumer domains, so SMTP verification cannot confirm individual mailbox existence. These addresses will return status 'risky' with is_catch_all: true. For B2B outreach, focus on corporate email addresses where SMTP verification provides definitive results.

Enrich email addresses in production.

The public API starts on Pro, and a call that returns nothing is never charged.

14 days of Pro, free.