New: API Reference docs are live — integrate Cleanlist enrichment into your apps. View API docs →
Legacy API (v1)
Introduction
🔌

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/public

All requests must use HTTPS. HTTP requests are rejected.

Core Public API endpoints

MethodPathPurpose
GET/credits/balanceGet your organization's current credit balance
GET/auth/validate-keyCheck whether an API key is valid
POST/enrich/bulkSubmit up to 250 contacts for asynchronous enrichment
GET/enrich/statusPoll workflow or task status
GET/webhooks/deliveriesList 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

  1. Log in to portal.cleanlist.ai (opens in a new tab)
  2. Go to Settings → API Keys
  3. Click Generate Key
  4. 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

SectionDescription
AuthenticationAPI keys, headers, lifecycle
EnrichmentBulk enrichment and status polling
Enrichment TypesThe 5 enrichment modes and what each returns
CreditsCredit balance, costs, and 402 handling
WebhooksOutbound webhook payload schema and delivery logs
ErrorsError codes, validation, and rate limits
Lead ListsHow public-API enrichment maps to lead lists (Extension Leads list)
OpenAPILive 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=... until status is completed or completed_with_errors, or
  • Receive a callback by passing webhook_url in 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:

EnrichmentCredits
Email found1
Phone found10
Email + phone (full)11
Failed enrichment0

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:

CodeMeaning
200Success
400Bad request (e.g., empty contacts, more than 250 contacts, or both/neither workflow_id+task_id)
401Missing or invalid API key
402Insufficient credits
404Workflow / task not found
422Pydantic validation error (e.g., per-contact field-combo validation failed)
429Rate limit exceeded
500Internal server error

See Errors for the complete reference.

Learn more