Write

Add Or Update Lead

Add or update a lead keyed by LinkedIn URL, accepting either a slug like 'john-doe' or a full profile URL. It creates the contact when not found and updates status, notes, tags, and custom attributes when it already exists. Returns an error if the account storage_mode is not 'managed'.

upsert_leadPOST/api/v1/leads/upsert
crispy — bash

Example prompt: Add john-doe as a lead at Acme with status contacted and tag warm-lead

{
  "crispy_id": "c_8f21",
  "created": false,
  "status": "contacted",
  "tags": ["warm-lead"]
}
Permission scope
core
Access
Write
Category
Lead Management

What you can build

Capture a new prospect with status, tags, and custom attributes in one write
Update an existing lead's status to qualified after a positive reply
Sync enrichment data and CRM ids onto a contact via external_ids
Idempotently maintain a lead record as it moves through your pipeline

Parameters

Inputs accepted by upsert_lead.

NameTypeDescription
lookupobjectStructured contact identifier. Resolver picks the highest-priority field per RESOLVER-09 (crispy_id > linkedin_provider_id > external_id > linkedin_url > email).
linkedin_urlstringLinkedIn profile URL or slug (e.g. 'john-doe' or 'linkedin.com/in/john-doe'). [Deprecated: use lookup.linkedin_url]
statusstringLead status to set (e.g. new, contacted, replied, qualified).
first_namestringFirst name.
last_namestringLast name.
emailstringEmail address.
companystringCompany name.
titlestringJob title.
tagsstring[]Tags for categorization.
custom_attrsobjectCustom personalization variables (max 100 string keys, 1KB total). Used in templates as {key}. Merged with existing.
external_idsobjectStable third-party identifiers (CRM IDs, enrichment IDs). Keys ending in _id are auto-populated from CSV imports.

The complete LinkedIn API. Ready when you are.

Connect your first LinkedIn profile in under 5 minutes. Every tool, every seat, no feature gates. Safe limits, warm-up, and full permission control built in.