> ## Documentation Index
> Fetch the complete documentation index at: https://docs.linkedcamp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Leads and activities

> Prospects, their history, and the individual scheduled actions that make up that history.

<Info>Requires the **Campaigns** permission. Tools in this group are hidden from `tools/list` and refused on call when your plan does not grant it.</Info>

| Tool | Kind |
| - | - |
| [`activity_list`](#activity_list) | Read-only |
| [`activity_skip`](#activity_skip) | Write, Destructive |
| [`lead_add`](#lead_add) | Write |
| [`lead_blacklist`](#lead_blacklist) | Write, Destructive |
| [`lead_delete`](#lead_delete) | Write, Destructive |
| [`lead_export`](#lead_export) | Write |
| [`lead_flow_state`](#lead_flow_state) | Read-only |
| [`lead_get`](#lead_get) | Read-only |
| [`lead_list`](#lead_list) | Read-only |
| [`lead_move`](#lead_move) | Write |
| [`lead_note_add`](#lead_note_add) | Write |
| [`lead_note_update`](#lead_note_update) | Write, Destructive |
| [`lead_notes_list`](#lead_notes_list) | Read-only |
| [`lead_update`](#lead_update) | Write |

## activity\_list

<Badge color="blue">Read-only</Badge>

Completed actions — one row per lead per step. Only COMPLETED activities are returned; the upstream field cannot return PENDING or FAILED rows. To see a failure and its `failedReason`, read one lead with `lead_get`. Note that `status` here filters the LEAD's pipeline status, not the activity's.

### Parameters

<ParamField path="campaignId" type="string">
  Campaign id, from `campaign_list` or `campaign_create`.
</ParamField>

<ParamField path="status" type="enum (22 values)">
  Filters the LEAD pipeline status, not the activity status. Activities are always COMPLETED.
</ParamField>

<ParamField path="keyword" type="string">
  Free-text search.
</ParamField>

<ParamField path="range" type="object">
  Date window as \{ from, to } — epoch milliseconds or ISO 8601. Omit for the backend default.

  <Expandable title="properties">
    <ParamField path="from" type="string | number">
      Start of the window.
    </ParamField>

    <ParamField path="to" type="string | number">
      End of the window.
    </ParamField>

    <ParamField path="startDate" type="string | number">
      Alias for `from`.
    </ParamField>

    <ParamField path="endDate" type="string | number">
      Alias for `to`.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="page" type="integer (min 1)" default="1">
  1-indexed page number.
</ParamField>

## activity\_skip

<Badge color="orange">Write</Badge> <Badge color="red">Destructive</Badge>

<Warning>Marked destructive in the protocol — your MCP client asks for confirmation before running it.</Warning>

Mark one pending action SKIPPED, to unblock a lead stuck on a step that will never succeed. That status is the only thing it writes — it does not itself schedule the next step, so do not promise the lead has advanced; re-read with `lead_flow_state` to see what the flow does next. It acts on an activity id, not a lead id. To stop a lead entirely use `lead_update` with `paused` or `isExcluded`.

### Parameters

<ParamField path="activityId" type="string" required>
  Activity id, from `activity_list`.
</ParamField>

## lead\_add

<Badge color="orange">Write</Badge>

Add one prospect to a campaign by LinkedIn profile URL and/or email. A lead needs at least one of those two — a row with neither is rejected. For more than a handful, use `campaign_upload_leads`.

### Parameters

<ParamField path="campaignId" type="string" required>
  Campaign id, from `campaign_list` or `campaign_create`.
</ParamField>

<ParamField path="profileLink" type="string">
  linkedin.com/in/… profile URL.
</ParamField>

<ParamField path="email" type="string (email)">
  Required if there is no profile URL.
</ParamField>

<ParamField path="firstName" type="string">
  Given name.
</ParamField>

<ParamField path="lastName" type="string">
  Family name.
</ParamField>

<ParamField path="fullName" type="string">
  Full display name. Use instead of first/last when you only have one string.
</ParamField>

<ParamField path="designation" type="string">
  Job title.
</ParamField>

<ParamField path="location" type="string">
  City, region or country.
</ParamField>

<ParamField path="phone" type="string">
  Phone number.
</ParamField>

<ParamField path="website" type="string">
  Website URL.
</ParamField>

<ParamField path="salesNavLink" type="string">
  Sales Navigator profile URL.
</ParamField>

<ParamField path="recruiterLink" type="string">
  LinkedIn Recruiter profile URL.
</ParamField>

<ParamField path="personalization" type="string">
  Free-text hook available in copy as \{\{personalization}}.
</ParamField>

<ParamField path="customFields" type="object (free-form)">
  Extra merge fields, e.g. \{ "recentPost": "…" }, usable as \{\{recentPost}}.
</ParamField>

## lead\_blacklist

<Badge color="orange">Write</Badge> <Badge color="red">Destructive</Badge>

<Warning>Marked destructive in the protocol — your MCP client asks for confirmation before running it.</Warning>

Add a lead to the blacklist: their sequence stops and they will be excluded from every future campaign on this account. The right response to an opt-out request. Account-wide and lasting, and no tool removes a blacklist entry — confirm the person and get an explicit yes before calling. To stop sending to someone without excluding them permanently, use `lead_update` with `isExcluded: true` instead.

### Parameters

<ParamField path="leadId" type="string" required>
  Lead id, from `lead_list`.
</ParamField>

## lead\_delete

<Badge color="orange">Write</Badge> <Badge color="red">Destructive</Badge>

<Warning>Marked destructive in the protocol — your MCP client asks for confirmation before running it.</Warning>

Permanently remove leads from a campaign along with their pending actions. Irreversible — confirm with the user, and prefer `lead_update` with `isExcluded: true` when they only want sending to stop.

### Parameters

<ParamField path="campaignId" type="string" required>
  Campaign id, from `campaign_list` or `campaign_create`.
</ParamField>

<ParamField path="leadIds" type="string[]">
  Specific leads to delete.
</ParamField>

<ParamField path="selectAll" type="object (free-form)">
  Delete every lead matching a filter instead of an id list, e.g. \{ "status": "FAILED" }.
</ParamField>

## lead\_export

<Badge color="orange">Write</Badge>

Generate a CSV of leads filtered by campaign, status and tags. Returns a filename served from the CDN. Use it when the user wants a file. To read leads in the conversation use `lead_list`; for campaign performance numbers rather than people, `campaign_export_stats`.

### Parameters

<ParamField path="campaignId" type="string">
  Campaign id, from `campaign_list` or `campaign_create`.
</ParamField>

<ParamField path="leadStatus" type="array of enum (22 values)">
  Filter by lead pipeline status.
</ParamField>

<ParamField path="tags" type="string[]">
  Tag ids to filter by, from `tag_list`.
</ParamField>

## lead\_flow\_state

<Badge color="blue">Read-only</Badge>

Where a lead sits in its campaign sequence right now, when the next action fires, and whether it has been orphaned by a sequence edit. One lead, current position only. For every lead waiting on a given step use `sequence_leads_at_step`; for what a sequence rewrite did to the whole campaign use `flow_audit`.

### Parameters

<ParamField path="leadId" type="string" required>
  Lead id, from `lead_list`.
</ParamField>

## lead\_get

<Badge color="blue">Read-only</Badge>

Full profile for one lead, plus its complete activity history and current position in the campaign flow — the single call to make when asked "what happened with this person". This is also the only place a FAILED action and its `failedReason` can be read: `activity_list` returns COMPLETED rows only. Do not page through `lead_list` to assemble one lead's history.

### Parameters

<ParamField path="leadId" type="string" required>
  Lead id, from `lead_list`.
</ParamField>

<ParamField path="includeActivities" type="boolean" default="true">
  Include the per-step activity history.
</ParamField>

<ParamField path="includeMessages" type="boolean" default="false">
  Include the full message thread. Can be long.
</ParamField>

## lead\_list

<Badge color="blue">Read-only</Badge>

Prospects in a campaign (or across your whole account), with their current pipeline status. The list view: many leads, a few fields each. For one person's full story use `lead_get`, for where they are in the sequence `lead_flow_state`, and for a spreadsheet `lead_export`. Filter by `status` to answer questions like "who replied this week" (REPLIED) or "who accepted but never answered" (CONNECTED).

### Parameters

<ParamField path="campaignId" type="string">
  Omit to search every campaign.
</ParamField>

<ParamField path="keyword" type="string">
  Search name, email or company.
</ParamField>

<ParamField path="status" type="enum (22 values)">
  Filter by pipeline status.
</ParamField>

<ParamField path="tags" type="string[]">
  Tag ids — leads must carry at least one.
</ParamField>

<ParamField path="range" type="object">
  Date window as \{ from, to } — epoch milliseconds or ISO 8601. Omit for the backend default.

  <Expandable title="properties">
    <ParamField path="from" type="string | number">
      Start of the window.
    </ParamField>

    <ParamField path="to" type="string | number">
      End of the window.
    </ParamField>

    <ParamField path="startDate" type="string | number">
      Alias for `from`.
    </ParamField>

    <ParamField path="endDate" type="string | number">
      Alias for `to`.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="page" type="integer (min 1)" default="1">
  1-indexed page number.
</ParamField>

<ParamField path="pageSize" type="integer (1–100)" default="25">
  Rows per page.
</ParamField>

## lead\_move

<Badge color="orange">Write</Badge>

Transfer leads into a different campaign. Understand what the backend actually does before offering this, because it is not a relocation: it INSERTS a new lead row in the destination at status FOUND, clearing `acceptedAt` and `repliedAt`, schedules a fresh activity on the destination's first step, and soft-deletes the original with `deleteReason: "MOVED"`. So the prospect restarts from the beginning and the per-step history does not come along — inbox conversations do, they are repointed at the new row. A lead already in the destination by profile URL or email is skipped. The destination must have a LinkedIn account attached or it throws "Destination campaign has no LinkedAccount." — set one with `campaign_update` first. Beware `selectAll`: it moves every lead from the first listed lead's campaign and ignores the rest of the list.

### Parameters

<ParamField path="campaignId" type="string" required>
  Destination campaign id.
</ParamField>

<ParamField path="leadIds" type="string[]" required>
  Lead ids, from `lead_list`.
</ParamField>

<ParamField path="selectAll" type="boolean">
  Move every lead matching the current filter rather than the id list.
</ParamField>

## lead\_note\_add

<Badge color="orange">Write</Badge>

Write an internal note on a lead. Never sent to the prospect — this is not a way to message anyone, and sending an inbox message has no tool at all. Use `lead_note_update` to change one afterwards; it replaces the whole body.

### Parameters

<ParamField path="leadId" type="string" required>
  Lead id, from `lead_list`.
</ParamField>

<ParamField path="content" type="string" required>
  Body text.
</ParamField>

## lead\_note\_update

<Badge color="orange">Write</Badge> <Badge color="red">Destructive</Badge>

<Warning>Marked destructive in the protocol — your MCP client asks for confirmation before running it.</Warning>

Rewrite an existing internal note. Replaces the whole body — pass the full text, not a fragment, and read it with `lead_notes_list` first if you do not already have it. Editing a note changes nothing the prospect sees.

### Parameters

<ParamField path="noteId" type="string" required>
  Note id, from `lead_notes_list`.
</ParamField>

<ParamField path="content" type="string" required>
  Body text.
</ParamField>

## lead\_notes\_list

<Badge color="blue">Read-only</Badge>

Internal notes your team has written about a lead. Not visible to the prospect. Notes are free text for humans and have no effect on sending. For the messages actually exchanged with the prospect read `conversation_get`.

### Parameters

<ParamField path="leadId" type="string" required>
  Lead id, from `lead_list`.
</ParamField>

## lead\_update

<Badge color="orange">Write</Badge>

Edit a lead: correct contact details, pause its sequence, exclude it from sending, or attach merge-field data. `paused: true` freezes just this lead; `isExcluded: true` takes it out of the campaign without deleting the record. Scope is one lead. It cannot pause a whole campaign — pausing a campaign has no tool and is web-app only — and it cannot move a lead elsewhere (`lead_move`) or change its tags for reply classification, which happens on the conversation via `conversation_update`.

### Parameters

<ParamField path="leadId" type="string" required>
  Lead id, from `lead_list`.
</ParamField>

<ParamField path="email" type="string (email)">
  Email address.
</ParamField>

<ParamField path="firstName" type="string">
  Given name.
</ParamField>

<ParamField path="lastName" type="string">
  Family name.
</ParamField>

<ParamField path="designation" type="string">
  Job title.
</ParamField>

<ParamField path="phone" type="string">
  Phone number.
</ParamField>

<ParamField path="website" type="string">
  Website URL.
</ParamField>

<ParamField path="personalization" type="string">
  Free-text hook for this person, available in copy as \{\{personalization}}.
</ParamField>

<ParamField path="paused" type="boolean">
  Freeze this lead's sequence without removing it.
</ParamField>

<ParamField path="isExcluded" type="boolean">
  Remove from sending while keeping the record.
</ParamField>

<ParamField path="isInterested" type="boolean">
  Mark the reply as positive intent.
</ParamField>

<ParamField path="seen" type="boolean">
  Mark as read.
</ParamField>

<ParamField path="customFields" type="object (free-form)">
  Extra merge-field data, e.g. \{ "recentPost": "…" }, usable in copy as \{\{recentPost}}.
</ParamField>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.