Audience: developers. The public API requires a Pro plan or above (self-serve) or an AppSumo Tier 5+ license. Support agent: confirm the user's plan grants API access before giving API advice.
TL;DR: RESTful Public API at api.cleanlist.ai/api/v1/public for programmatic B2B contact enrichment. Authenticate with a clapi_ Bearer token. Submit up to 250 contacts per bulk request, then poll for status or receive results via webhook.
API Reference (Legacy v1)
This is the legacy v1 API. It lives at /api/v1/public and remains fully supported — existing keys and integrations keep working, and there is no planned sunset. It is frozen, though: new endpoints and capabilities land only on the current API v2 (/api/v2). New integrations should start on v2. See API Versions & Migration for the full picture.
The Cleanlist Public API lets you enrich contacts, check your credit balance, and receive enrichment results programmatically. It is a stable, versioned surface designed to be embedded into CRMs, outbound tooling, ETL jobs, and internal workflows.
API access is included on Cleanlist's standard paid plans and on AppSumo Tier 5 (AppSumo Tiers 1–4 do not include it).
Base URL
https://api.cleanlist.ai/api/v1/publicAll requests must use HTTPS. HTTP requests are rejected.
Core Public API endpoints
| Method | Path | Purpose |
|---|---|---|
GET | /credits/balance | Get your organization's current credit balance |
GET | /auth/validate-key | Check whether an API key is valid |
POST | /enrich/bulk | Submit up to 250 contacts for asynchronous enrichment |
GET | /enrich/status | Poll workflow or task status |
GET | /webhooks/deliveries | List webhook delivery attempts for a workflow |
These are the most-used endpoints. The full /api/v1/public/* surface also covers lead-list management, people/company search, person/company enrichment, smart agents, CRM/sequencer sync, and data export — see the MCP API reference and the OpenAPI spec for the complete list.
Quick Start
1. Get your API key
- Log in to portal.cleanlist.ai (opens in a new tab)
- Go to Settings → API Keys
- Click Generate Key
- Copy the key — it starts with
clapi_and is shown only once
You can have up to 10 active keys per user. See Authentication for full details.
2. Check your credit balance
curl https://api.cleanlist.ai/api/v1/public/credits/balance \
-H "Authorization: Bearer clapi_your_api_key"3. Enrich your first batch
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": "partial",
"contacts": [
{
"first_name": "John",
"last_name": "Doe",
"company_domain": "acme.com"
},
{
"linkedin_url": "https://www.linkedin.com/in/janedoe"
}
]
}'The response contains a workflow_id. Enrichment runs in the background — see Enrichment for how to retrieve results.
API Sections
| Section | Description |
|---|---|
| Authentication | API keys, headers, lifecycle |
| Enrichment | Bulk enrichment and status polling |
| Enrichment Types | The 5 enrichment modes and what each returns |
| Credits | Credit balance, costs, and 402 handling |
| Webhooks | Outbound webhook payload schema and delivery logs |
| Errors | Error codes, validation, and rate limits |
| Lead Lists | How public-API enrichment maps to lead lists (Extension Leads list) |
| OpenAPI | Live OpenAPI / Swagger specification |
Key Concepts
Asynchronous enrichment
POST /enrich/bulk returns immediately with a workflow_id. The actual enrichment runs through Cleanlist's waterfall system across multiple providers. You can:
- Poll
GET /enrich/status?workflow_id=...untilstatusiscompletedorcompleted_with_errors, or - Receive a callback by passing
webhook_urlin the bulk request — Cleanlist will POST the full result set when the workflow finishes.
Credits
Credits are deducted from your organization's balance only when an enrichment succeeds. Common costs:
| Enrichment | Credits |
|---|---|
| Email found | 1 |
| Phone found | 10 |
Email + phone (full) | 11 |
| Failed enrichment | 0 |
See Credits for full pricing and how to handle insufficient-credit errors.
Lead lists
Public API enrichments are automatically grouped into a system-managed lead list named Extension Leads so they remain visible inside the Cleanlist portal. You don't need to create or manage this list yourself — see Lead Lists for details.
Response format
Successful responses return JSON. Error responses are wrapped in a single envelope with a stable UPPERCASE code:
{
"error": {
"code": "BAD_REQUEST",
"message": "Error message describing what went wrong"
}
}Common status codes:
| Code | Meaning |
|---|---|
200 | Success |
400 | Bad request (e.g., empty contacts, more than 250 contacts, or both/neither workflow_id+task_id) |
401 | Missing or invalid API key |
402 | Insufficient credits |
404 | Workflow / task not found |
422 | Pydantic validation error (e.g., per-contact field-combo validation failed) |
429 | Rate limit exceeded |
500 | Internal server error |
See Errors for the complete reference.
Learn more
- Waterfall enrichment — how Cleanlist combines multiple providers
- Pricing — credit-based pricing details
- Cleanlist product overview (opens in a new tab)