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

Enrich contacts via API

Pass an email or LinkedIn URL and get back 40+ verified fields (name, title, seniority, company firmographics, office and mobile phone numbers, and social profiles), all cross-checked across 25+ data providers in a single API call.

An example call: POST to the contact endpoint with a work email, the waterfall tries providers in cost order, and the response returns 17 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 17 fields.

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

Response200 OK · contact
{
  "id": "ev_c9x2kf8",
  "status": "completed",
  "contact": {
    "email": "jane.smith@acme.com",
    "email_status": "valid",
    "first_name": "Jane",
    "last_name": "Smith",
    "title": "VP of Marketing",
    "seniority": "VP",
    "department": "Marketing",
    "linkedin_url": "https://linkedin.com/in/janesmith",
    "phone": "+1-415-555-0142",
    "phone_type": "direct_dial",
    "mobile": "+1-415-555-0198",
    "location": "San Francisco, CA",
    "company_name": "Acme Corp",
    "company_domain": "acme.com",
    "company_industry": "SaaS",
    "company_size": "201-500",
    "company_revenue": "$50M-$100M"
  },
  "meta": {
    "credits_used": 11,
    "providers_queried": 25,
    "providers_matched": 8,
    "confidence": 0.96,
    "enriched_at": "2026-04-15T14:32:01Z"
  }
}
Field reference17 fields
  • emailstringVerified work email address. SMTP-checked against live mail server.
  • email_statusenumVerification result: valid, invalid, risky, catch-all, disposable, role-based, unknown.
  • first_namestringContact's first name, cross-referenced across providers.
  • last_namestringContact's last name.
  • titlestringCurrent job title, normalized to standard form (e.g., 'VP of Sales' not 'VP, Sales & BD').
  • seniorityenumSeniority level: entry, individual_contributor, manager, director, vp, c_level, owner.
  • departmentstringDepartment classification: Sales, Marketing, Engineering, Operations, Finance, HR, etc.
  • linkedin_urlstringLinkedIn profile URL, validated for current employment match.
  • phonestringPhone number in E.164 format.
  • phone_typeenumPhone classification: direct_dial, mobile, hq_switchboard.
  • mobilestringMobile phone number, if available. Requires 11 credits.
  • locationstringCity, state/province, country based on most recent employment data.
  • company_namestringCurrent employer name, matched against corporate registries.
  • company_domainstringPrimary company website domain.
  • company_industrystringIndustry classification using SIC/NAICS mapping.
  • company_sizestringEmployee count range: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001+.
  • company_revenuestringEstimated annual revenue 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 · contact

curl

curl -X POST https://api.cleanlist.ai/v1/enrich/contact \
  -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/contact", {
  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/contact",
    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 contact
  • 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. Outbound prospecting

    Pass a LinkedIn Sales Nav export of emails and get back verified contact records with phone numbers, seniority, and company size, ready for sequencing.

  2. CRM record completion

    Enrich incomplete Salesforce or HubSpot contacts to fill title, phone, and firmographic gaps without manual research.

  3. Lead routing and scoring

    Use seniority, department, and company_size fields to auto-route inbound leads to the right rep and score against your ICP.

  4. Event follow-up enrichment

    Turn a badge-scan CSV of names and emails into fully enriched contact records within hours of the event ending.

The questions that come up first.

What input does the contacts enrichment endpoint accept?

You can pass an email address, a LinkedIn URL, or a name + company combination. Email is the most reliable identifier and returns the highest match rate (98%+). LinkedIn URL match rate is 95%+. Name + company matching is approximately 85% depending on name uniqueness.

How many credits does contact enrichment cost?

Email-only enrichment costs 1 credit per contact. Full enrichment with phone numbers costs 11 credits per contact. Unmatched lookups do not consume credits. Free accounts receive 50 credits per month.

How is the email verified during enrichment?

Every email returned goes through triple verification: syntax validation, DNS/MX record check, and live SMTP handshake. Catch-all domains are flagged as 'risky' so you can decide whether to include them in outreach. The email_status field tells you the exact result.

What happens if a contact has changed jobs since the data was last updated?

Cleanlist queries 25+ providers in sequence and selects the most recently verified data. If a contact changed jobs, the waterfall typically picks up the new employer within 30-60 days. The enriched_at timestamp tells you when the data was last confirmed.

Can I enrich contacts in bulk via the API?

Yes. The API accepts batch requests of up to 1,000 contacts per call. For larger volumes, use the async batch endpoint which processes up to 100,000 contacts; you poll the job for results. CSV upload through the dashboard handles unlimited volumes.

Enrich contacts in production.

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

14 days of Pro, free.