TL;DR
Clay's HTTP API enrichment lets you call the Cleanlist API directly from your table rows. You send a contact (name + company or LinkedIn URL), Cleanlist queries 15+ data providers via waterfall enrichment, and returns verified emails, direct phone numbers, and company data back into Clay columns. Setup takes about 10 minutes. You need a Cleanlist API key (free, 30 credits included) and a Clay Explorer plan or above.
Clay is powerful for building enrichment workflows. But if you have used it for a while, you know the problem: you chain together 5-6 enrichment providers, build fallback logic for each one, and still end up with gaps in your data. One provider has the email but not the phone. Another has the phone but it is a switchboard, not a direct dial.
Cleanlist solves this with a single API call. Instead of building your own waterfall in Clay across Hunter, RocketReach, Findymail, and others, the Cleanlist API handles the orchestration internally. It queries 15+ providers per contact, picks the best verified result from each, and returns one clean record.
This guide walks you through connecting the two.
What You Need Before Starting
- A Cleanlist account with an API key (sign up at app.cleanlist.ai, 30 free credits, no credit card)
- A Clay account on Explorer plan or above (HTTP API requires a paid Clay plan)
- A Clay table with contact data (first name, last name, and company domain or LinkedIn URL)
How the Cleanlist API Works
The Cleanlist enrichment API is asynchronous. You submit contacts, receive a workflow_id immediately, then poll a status endpoint for the completed results. Most single-contact enrichments finish in 2-5 seconds.
Here is the key information:
| Detail | Value |
|---|---|
| Endpoint | POST https://api.cleanlist.ai/api/v1/public/enrich/bulk |
| Auth | Authorization: Bearer clapi_your_key |
| Max per request | 250 contacts |
| Rate limit | 60 requests per minute |
| Credits | 1 credit per contact enriched |
| Response time | 2-5 seconds typical |
Input requirements (each contact needs one of these):
linkedin_urlon its ownfirst_name+last_name+company_nameorcompany_domain
Step 1: Get Your Cleanlist API Key
- Sign up at app.cleanlist.ai
- Go to Settings > API Keys
- Click Generate API Key
- Copy the key (starts with
clapi_)
You get 30 free credits. No credit card required. Each enrichment uses 1 credit.
Step 2: Add an HTTP API Enrichment in Clay
- Open your Clay table
- Click the "+" button to add a new enrichment column
- Search for "HTTP API" and select it
- Switch to the Configure tab (skip the Generate tab for this setup)
Step 3: Configure the Enrichment Request
Fill in the Clay configuration panel with these values:
Method: POST
Endpoint URL:
https://api.cleanlist.ai/api/v1/public/enrich/bulk
Headers (add as key-value pairs):
| Key | Value |
|---|---|
Authorization | Bearer clapi_your_api_key |
Content-Type | application/json |
JSON Body (using Clay's /Column Name syntax to reference your table columns):
{
"enrichment_type": "full",
"contacts": [
{
"first_name": "/First Name",
"last_name": "/Last Name",
"company_domain": "/Domain"
}
]
}Important
In Clay's JSON body, dynamic column references must be wrapped in double quotes. Write "/First Name" not /First Name. Missing quotes cause "Failed to parse body" errors.
If you have LinkedIn URLs instead of names:
{
"enrichment_type": "full",
"contacts": [
{
"linkedin_url": "/LinkedIn URL"
}
]
}Enrichment Type Options
| Type | What it returns | Best for |
|---|---|---|
full | Emails + phone numbers | Most use cases |
partial | Emails only | Email outreach campaigns |
phone_only | Phone numbers only | Cold calling lists |
Step 4: Set Rate Limiting
Cleanlist allows 60 requests per minute. In Clay's rate limiting fields:
- Request limit:
50 - Duration (ms):
60000
This keeps you safely under the cap.
Step 5: Enable "Required to Run"
Toggle Required to Run on your name and domain columns. This prevents Clay from firing the API on rows where those fields are empty, which saves credits.
Step 6: Handle the Async Response
Since Cleanlist's API is asynchronous, the first response returns a workflow ID, not the enriched data:
{
"workflow_id": "wf_abc123",
"status": "processing",
"task_ids": ["task_xyz"],
"total_contacts": 1
}You need a second HTTP API column to poll for completed results:
- Set Field Paths to Return on the first column to:
task_ids.0 - Add that value as a new column (call it "Task ID")
- Add another HTTP API enrichment column with these settings:
- Method:
GET - URL:
https://api.cleanlist.ai/api/v1/public/enrich/status?task_id=/Task ID - Headers: Same
Authorization: Bearer clapi_your_api_key
- Method:
Timing tip
Add a Clay "Delay" enrichment between the two HTTP API columns (5-10 seconds). This gives Cleanlist time to finish processing before you poll for results.
Step 7: Map Enriched Data to Columns
Once the status endpoint returns completed data, click on the response cell and use Clay's "Add to Table" button. Select the fields you want as new columns.
Person fields:
| Field path | What it contains |
|---|---|
name | Full name |
title | Job title |
seniority | Seniority level (VP, Director, Manager) |
linkedin | LinkedIn profile URL |
phone | Direct phone number |
Company fields:
| Field path | What it contains |
|---|---|
company.name | Company name |
company.domain | Company website |
company.industry | Industry classification |
company.employees | Employee count range |
company.revenue | Revenue range |
company.tech_stack | Technologies used |
Verification fields:
| Field path | What it contains |
|---|---|
verification.status | "valid" or "invalid" |
verification.deliverable | true/false |
verification.confidence | 0-100 confidence score |
verification.catch_all | Whether domain catches all emails |
Alternative: Paste cURL for Faster Setup
If you want to skip manual configuration, copy this cURL and paste it into Clay's "Paste cURL" option:
curl -X POST https://api.cleanlist.ai/api/v1/public/enrich/bulk \
-H "Authorization: Bearer clapi_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"enrichment_type": "full",
"contacts": [
{
"first_name": "Jane",
"last_name": "Smith",
"company_domain": "acme.com"
}
]
}'Clay's Sculptor will parse this and auto-fill the configuration. Then swap the static values ("Jane", "Smith", "acme.com") for column references (/First Name, /Last Name, /Domain).
Why Use Cleanlist Instead of Building a Waterfall in Clay
Clay lets you chain multiple enrichment providers together manually. That works, but it has real costs:
| Approach | Pros | Cons |
|---|---|---|
| DIY waterfall in Clay | Full control over provider order and logic | 5-6 enrichment steps, each billed separately by Clay. Complex fallback logic. You maintain the workflow. |
| Cleanlist API in Clay | One step, one credit, 15+ providers queried automatically | Less granular control over individual provider selection |
With a DIY waterfall, you pay for each provider step in Clay credits, even when earlier providers already found the data. With Cleanlist, you pay 1 credit per contact regardless of how many providers it queries internally.
For most teams, the single API call is simpler and cheaper. If you need to compare approaches in detail, see our data enrichment solutions comparison or the full Clay pricing breakdown.
Troubleshooting
| Issue | Fix |
|---|---|
401 Unauthorized | Check your API key starts with clapi_ and the header is Bearer clapi_xxx (space after Bearer) |
402 Insufficient credits | Top up credits in the Cleanlist dashboard at app.cleanlist.ai |
429 Rate limited | Reduce Clay's rate limit to 50 requests per 60,000ms |
400 Bad request | Wrap string variables in quotes in the JSON body |
| Empty results on poll | Add a longer delay between the submit and poll steps |
| "Failed to parse body" | Check for missing commas or unquoted column references in your JSON |
Frequently Asked Questions
Can I use Cleanlist in Clay without the HTTP API?
Not directly. Cleanlist is not in Clay's native integrations marketplace, so the HTTP API enrichment is the way to connect them. The setup is straightforward and works the same way you would connect any custom API in Clay.
How much does this cost?
On the Cleanlist side, 1 enrichment = 1 credit. The free plan gives you 30 credits/month. Paid plans start at $29/month for 500 credits. On the Clay side, the HTTP API enrichment uses Clay credits based on your plan tier. See our full pricing page for details.
What is the difference between using Cleanlist's API vs using Clay's built-in enrichment providers?
Clay's built-in providers (Apollo, Clearbit, Hunter, etc.) each query one database. Cleanlist queries 15+ providers in a waterfall and returns the best verified result. In practice, this means higher match rates (95%+ vs 50-70% from a single source) and every email is verified before it reaches your table. See our enrichment API comparison for benchmarks.
Does Cleanlist verify emails automatically?
Yes. Every email returned through the API is triple-verified: syntax check, MX/DNS validation, and SMTP handshake. You do not need a separate email verification step in your Clay workflow. The verification.confidence field in the response tells you exactly how confident the result is.
Can I enrich in bulk or does it have to be one row at a time?
The API accepts up to 250 contacts per request. In Clay, the HTTP API enrichment runs once per row by default. For bulk enrichment outside of Clay, you can send batches directly to the API endpoint. For large lists, consider using the Cleanlist dashboard directly instead of routing through Clay.
Ready to try it? Get your free API key and connect it to Clay in under 10 minutes. If you want to see the full API documentation, visit docs.cleanlist.ai.