New: meet Clu, and send email, LinkedIn and call steps with Sequences. Watch the videos →
API Reference (v2)
Quickstart
🔌

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: Create a key, confirm it with /whoami, enrich a person, poll /enrichment/status/{workflow_id}, then scale to bulk with an estimate quote. Copy-paste examples below.

🐍

Prefer a typed client? Skip the raw HTTP and use an official SDK (Python, TypeScript or Java) with the same steps in a few lines.

API Quickstart

The Cleanlist API quickstart needs one clapi_ key from Settings → API keys, one POST /api/v2/enrichment/person and a poll of /api/v2/enrichment/status/{workflow_id}. A lookup that finds nothing costs 0 credits.

Goal: get from "no API key" to "enrichment results in hand" in under 10 minutes. API v2 is served at https://api.cleanlist.ai/api/v2.

API keys come with Pro and Enterprise (and the legacy Pro and Scale plans) and with AppSumo Tiers 5 to 7. On other plans, and on every plan during a trial, the API keys page shows an upgrade card instead of the create form. Using Claude? The Cleanlist MCP works on Starter, the Pro trial and every AppSumo tier, with no key needed.

Prerequisites

  • A Cleanlist account at app.cleanlist.ai (opens in a new tab)
  • A plan that includes API access (see above)
  • A lead list to write results into (create one in the app, or with POST /api/v2/lead-lists)

Step 1: Create an API key

  1. Open app.cleanlist.ai (opens in a new tab).
  2. Go to Settings → API keys.
  3. Under Create API key, enter a Name (for example quickstart) and, if you want, an Expiry.
  4. Click Create API key.
  5. Copy the key shown under New API key. It starts with clapi_ and is shown once.
export CLEANLIST_API_KEY="clapi_your_actual_key"

If your plan doesn't include API access, creating a key through POST /api/v1/api-keys returns 403 with this body:

{
  "error": {
    "code": "PERMISSION_DENIED",
    "message": "This feature requires the Pro plan or higher.",
    "details": {
      "error": "feature_gated",
      "feature": "api_access",
      "current_tier": "starter",
      "required_tier": "pro"
    }
  }
}

During a trial, API calls with a key return 403 with the message "Public API access is not included during the trial. Use the signed-in app or choose a paid plan."

Step 2: Confirm the key works

GET /whoami is free and tells you who you are, your tier, your scopes and which features your plan includes:

curl https://api.cleanlist.ai/api/v2/whoami \
  -H "Authorization: Bearer $CLEANLIST_API_KEY"

Step 3: Check your credit balance

curl https://api.cleanlist.ai/api/v2/credits/balance \
  -H "Authorization: Bearer $CLEANLIST_API_KEY"

Step 4: Enrich a person

POST /enrichment/person runs asynchronously and returns a workflow_id. It requires a lead_list_id (the list the enriched person is written to). Identify the person with one of: email, linkedin_url, person_id, or first_name + last_name + (company_name or domain). Set enrichment_type to partial (email, 1 credit), phone_only (10 credits) or full (email and phone, 11 credits).

The auto-created "MCP Results" list applies only to the /enrichment/by-task cohort flow. Single-person enrichment needs an explicit lead_list_id.

curl -X POST https://api.cleanlist.ai/api/v2/enrichment/person \
  -H "Authorization: Bearer $CLEANLIST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "lead_list_id": "YOUR_LIST_ID",
    "first_name": "John",
    "last_name": "Doe",
    "domain": "acme.com",
    "enrichment_type": "partial"
  }'

The response includes workflow_id, status: "pending", credits_reserved (an upfront cap; the unused part is refunded when the run settles), lead_list_id and a poll_url.

Step 5: Poll for the result

Poll GET /enrichment/status/{workflow_id} until the status is terminal. The response carries progress counters, the final result, and the actual credits_charged and credits_refunded.

curl https://api.cleanlist.ai/api/v2/enrichment/status/WORKFLOW_ID \
  -H "Authorization: Bearer $CLEANLIST_API_KEY"
# repeat until "status" is terminal: completed | completed_with_errors | failed | canceled | terminated
🧑‍💻

With an SDK call enrichment.enrichment_status(workflow_id) in a loop (enrichmentStatus in TS and Java). See the runnable SDK examples.

You're billed for results, not attempts. The credits_reserved cap is taken up front; whatever isn't used (for example, no email found) is refunded when the workflow settles.

Step 6: Scale to bulk

To enrich a whole list at once, create and fill a list, then get a quote and run a bulk enrichment.

  1. Estimate the cost: POST /credits/estimate with { "tool": "enrich_list", "list_id": "<id>", "scope": "partial" } returns a signed quote_id (valid 5 minutes, single use).
  2. Run: POST /enrichment/bulk with { "list_id": "<id>", "scope": "partial", "quote_id": "<quote_id>" }. The bulk endpoint requires a quote_id. (The field is list_id here, not lead_list_id.)
  3. Poll the returned workflow_id exactly as in Step 5.

See Credits & Quotes for the quote model and Lead Lists for creating and filling lists (including CSV import). To find people first, see the People Finder API.

What you've built

  1. A working clapi_ API key
  2. A live identity and credit-balance check
  3. An async person enrichment
  4. A polling loop that reads results and final billing
  5. A path to bulk enrichment with quotes

Related