On this page

POST/campaigns/lookalike

Purpose

Create a new Lookalike campaign, or add more Lookalike leads to an existing campaign (campaignId), from a LinkedIn profile URL or identifier. Reserves Lookalike allowance (not normal lead credits), enqueues the worker, then poll campaign/leads until ready. Website/domain seeds are not accepted.

Caps and filters depend on the active Lookalike provider for the workspace deploy (current: Ocean). Ocean supports optional titles/countries and up to 10_000 leads. AgentEnrich mode is seed + lead count only (max 25); non-empty titles/countries → validation_error. Extending a campaign started under a different upstream → lookalike_provider_mismatch.

Same-seed extend continues from the last cursor when job title keywords and countries also match; exhausted same-seed+filters returns lookalike_exhausted. Different titles/countries on the same seed starts fresh. A different LinkedIn profile on extend returns alternate_seed_requires_new_campaign — create a new campaign.

Not available on some plans (plan_required).



Request

POST /campaigns/lookalike
X-API-Key: sk_live_...
Content-Type: application/json
Idempotency-Key: optional-uuid
{
  "seed": "https://www.linkedin.com/in/jane-doe/",
  "jobTitleKeywords": ["Chief Revenue Officer", "CRO"],
  "countries": ["us", "gb"],
  "numberOfLeads": 50,
  "leadDuplicateProtectionAcrossCampaigns": true
}

Extend (add more):

{
  "seed": "https://www.linkedin.com/in/jane-doe/",
  "jobTitleKeywords": ["Chief Revenue Officer", "CRO"],
  "countries": ["us", "gb"],
  "numberOfLeads": 50,
  "campaignId": "lookalike_abc123"
}
FieldRequiredNotes
seedyesLinkedIn profile URL or identifier (e.g. linkedin.com/in/…)
jobTitleKeywordsnoOcean: include titles (string or string[], max 15 × 80 chars). Partial match. Omit / empty for broad lookalike. AgentEnrich: must omit or empty (validation_error otherwise).
countriesnoOcean: person countries (ISO 3166-1 alpha-2 string[], max 25). Omit for worldwide. AgentEnrich: must omit or empty.
numberOfLeadsnoOcean default 50 / hard cap 10_000; AgentEnrich default 25 / hard cap 25. Clamped to available Lookalike.
campaignIdnoExisting campaign to extend
leadDuplicateProtectionAcrossCampaignsnoDefault true

Create mints campaignId server-side. Do not send a client-generated id for new campaigns.


Response 200

{
  "campaignId": "lookalike_…",
  "status": "PENDING",
  "extended": false,
  "extensionBatchId": null,
  "requestedLeadTarget": 50,
  "lookalikeReserved": 50,
  "resume": null,
  "message": "Lookalike campaign queued."
}

resume is fresh or continue on extend; null on create. Unused reserved Lookalike is refunded by the worker after insert.

202 may be returned if extend enqueue outcome is ambiguous — check campaign progress before retrying.

Request logs keep creditsCharged at 0 (normal lead-credit flag only). The reserved Lookalike amount is only in lookalikeReserved.


Errors

error.codeHTTPWhen
validation_error400Bad body / seed
lookalike_exhausted400No more results for this profile + titles/locations on this campaign
alternate_seed_requires_new_campaign400Different LinkedIn profile than this campaign’s seed — create a new Lookalike campaign
lookalike_provider_mismatch400Campaign was started under a different Lookalike upstream than the current deploy
upstream_unavailable503Lookalike provider temporarily unavailable, including while Lookalike is under maintenance
insufficient_lookalike_credits403Lookalike balance too low (details.available / required)
plan_required403Ineligible plan, inactive plan without Lookalike top-up, or Lookalike blocked for workspace
not_found404Extend campaignId missing
conflict409Idempotency / extend in progress
rate_limited429Per-key Lookalike RPM
upstream_unavailable503Pipeline/queue failure or idempotency store down

MCP

Tool: create_lookalike_campaign.