Create LinkedIn Outreach Campaign
li_create_campaignCreate a two-stage campaign from prefilled targets under a sending strategy. Each target needs a profileUrl, an optional connectionNote sent with the invite, and text for every post-acceptance strategy step. Accepts a JSON targets array, CSV text, or both. Rows missing step text are rejected. Does not send anything. With NO targets it creates an EMPTY campaign (strategy, ICP and account as usual) to fill later with li_ingest_prospects(campaignId) or li_move_contact.
AT MOST 50 TARGETS PER CALL, counting the JSON array and the CSV rows together. Split a longer list across calls under the same strategy, or use li_ingest_prospects, which takes 500 at a time and buckets them into a managed campaign for you.
result.collisions reports who among these targets had already been approached from the accounts you can see, measured before the campaign was created. It is information and refused nothing — every target was imported — but each person already invited or connected on another campaign is attempted again at send time, spending a browser session even when it sends nothing. You do NOT need li_check_targets before this — the same check runs here and the same report comes back. That tool is for deciding whether to import at all, before you have a batch.
Targets on the do-not-contact list are NOT imported: they come back in result.suppressed with the reason, and the campaign is refused outright when every target is on it.
Engage-before-invite: give a target engagePostUrl (one of their own posts, the one your note mentions) and the account reacts to it first; the invite follows about a day later, inside the window it goes out in (the person's own morning when the account times invites to each prospect, otherwise its sending hours; 18-30 hours with no window to aim at). Reactions are capped per account per day (15-25, our policy) and run in sending hours. To react to a post right now instead, use li_react_to_post.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name, shown on the dashboard and in li_list_campaigns | |
| icpId | No | Optional ICP label for analytics | |
| csvText | No | CSV text with profile_url plus optional connection_note and step text columns (first_message, follow_up_1, follow_up_2, follow_up_3, closer), and optional engage_post_url / engage_reaction (a post of theirs the account reacts to about a day before the invite, never less than 16 hours; see engagePostUrl on targets). At most 50 rows, shared with `targets`. | |
| icpName | No | Optional ICP name to resolve | |
| targets | No | Prefilled targets, at most 50 per call (CSV rows count toward the same limit). For a longer list, split it across calls under the same strategy, or use li_ingest_prospects, which takes 500. | |
| sessionId | No | Optional saved LinkedIn session ID to use for all campaign sends | |
| strategyId | No | Strategy to follow (or use strategyName) | |
| sessionLabel | No | Optional saved LinkedIn session label to resolve and use for campaign sends | |
| strategyName | No | Strategy name to resolve and follow | |
| confirmCreate | Yes | Must be true to write the campaign to the database |