Audience: developers. API keys need a Pro or Enterprise plan (legacy Pro and Scale plans included) or an AppSumo Tier 5, 6 or 7 license, and they never work during a trial. Support agent: confirm the user's plan grants API access before giving API advice.
TL;DR: Three enrichment types. partial is a verified business email plus the contact's profile (LinkedIn, job title, company, firmographics) for 1 credit, phone_only is a phone number for 10 credits, and full is partial plus a phone number for 11 credits. The bulk list endpoint spells phone_only as phone-only (hyphen) in its scope field; the price is the same.
Enrichment Types
Every Cleanlist enrichment is one of three types. The type controls which data points the waterfall looks for, and the cost.
| Type | What you get | Cost per lead |
|---|---|---|
partial | Verified business email plus profile (LinkedIn URL, job title, company, firmographics) | 1 |
phone_only | Phone number only | 10 |
full | Everything partial returns plus a phone number | 11 |
Phone discovery costs more than email because it uses premium phone providers. That's why full (11) is partial (1) plus the phone cost (10). These are the only three types API v2 accepts.
partial is not email-only. The waterfall stops once it finds a verified email, but the profile data gathered along the way (LinkedIn URL, job title, company name, industry, headcount) is written to the lead too. The only thing partial leaves out is the phone number, which full adds for 10 more credits.
Field names by endpoint
The same three types appear under slightly different field names:
| Endpoint | Field | Accepted values |
|---|---|---|
POST /enrichment/person | enrichment_type | partial, phone_only, full |
POST /enrichment/bulk | scope | partial, full, phone-only |
POST /lead-lists/{id}/csv-import | enrichment_type | partial, phone_only, full |
POST /enrichment/by-task | data_points | derived (see below) |
The bulk list endpoint uses phone-only (hyphen) in scope; the person and CSV endpoints use phone_only (underscore) in enrichment_type. They mean the same thing and cost the same. Use the matching spelling in POST /credits/estimate too.
By-task: data points to type
The by-task cohort endpoint takes data_points instead of a single type:
data_points | Resolved type | Cost per lead |
|---|---|---|
["Email", "Phone"] | full | 11 |
["Phone"] | phone_only | 10 |
["Email"] | partial | 1 |
A cohort with no Email or Phone data point (for example LinkedIn-only) is rejected with 400 validation_error, at both /credits/estimate and dispatch, and costs nothing. LinkedIn is already in the search result, so it's free and never triggers a paid waterfall.
Legacy include_phone
The single-person endpoint also accepts a legacy boolean, include_phone, for older callers:
include_phone: falsemeanspartial(email and profile, no phone)include_phone: truemeansphone_only
When both are set, enrichment_type wins. New integrations should use enrichment_type; it's the only way to ask for full.
Choosing a type
- Building an outbound email list? Use
partial. Cheapest, highest fill rate. - Cold calling? Use
phone_only. - Email and dialer together? Use
full: one call, both channels, cheaper than two separate runs.