create_campaign
Build a LinkedIn outreach campaign from a natural language description. Finds matching people and saves a draft; nothing sends until you launch it.
Instructions
Create a LinkedIn outreach campaign from a natural language description.
Finds people on LinkedIn who match the description and saves a draft;
nothing is sent until campaign(action='launch'). Use it for sales
prospecting, recruiting and candidate sourcing, research and
user-interview recruitment, job-search networking, investor and partner
outreach, vendor scouting and event invitations.
Reaching people you can already name — an article author, a warm intro, a
speaker, one founder a customer mentioned — is the `people` argument: pass
their profile URLs and the campaign is seeded from exactly them, with no
LinkedIn search. Everything else is unchanged: draft until launch, rate
limits, sending window, opt-outs.
Describe who you need to reach and HeyLead finds them on LinkedIn:
customers (lead generation, B2B prospecting, cold outreach), candidates
(recruiting and sourcing), hiring managers and referrals (job search),
investors and partners, vendors, and user-interview or research participants.
On first campaign, project_brief is asked explicitly, in the goal's words
(see project_brief below) — a homepage alone is not enough.
Args:
target_description: Who to target (e.g., "CTOs at fintech startups",
"freelance UX designers in London", "yoga studio owners in California")
campaign_name: Optional name for the campaign.
icp_id: Optional ID of a saved ICP from generate_icp. If provided,
uses the saved ICP's enriched LinkedIn codes for precise targeting
instead of generating a new one.
company_context: Optional. Your website URL or 1-2 sentences about your
product/company. Copied into project_brief when project_brief is omitted.
project_brief: Optional. Full project paste the model sees, in the goal's
words. sell: what you offer and who it is for. job_search: the role,
the kind of company, what you bring. hire: the role, who fits it, what
it offers. partner: what you want from a partner, what you bring.
buy: what you need, by when and how much, what a vendor must confirm.
research: what you research, who you want to hear from, what you ask.
Required before launch, resume, or auto-send.
mode: Always autopilot (copilot mode was removed). Whether opening DMs
and follow-ups wait for a person is the WORKSPACE's approval mode,
not this: a hosted workspace that never chose holds them
(inspect(action="waiting") lists them); scheduler(action=
"approval_mode") switches it.
company_url: Optional LinkedIn company URL for account-based targeting.
Searches for employees at that specific company matching the ICP.
Example: "https://www.linkedin.com/company/google"
voice_mode: "text_only". Messages are text.
connections_only: "on" to create a DM-only campaign targeting existing
LinkedIn connections. Skips invitations and warm-up — sends DMs
directly to people you're already connected with. Use when user says
"existing connections", "DM my network", "message my connections".
exclude_connections: ON BY DEFAULT for a new campaign: nobody who was
already a 1st-degree connection before this campaign started is
reached — refused at enrolment and skipped at send time rather than
DMed. People who accept this campaign's own invitation still get
the opener. Pass "off" to include existing connections (or turn it
off later in the campaign settings). Defaults off only for a
connections_only campaign. Use "off" when the user says
"include my existing connections"; the old "on" is still accepted
for "don't message my existing connections", "cold only",
"skip people I already know". Cannot be combined with
connections_only, which is its exact inverse.
people: LinkedIn profile URLs or public identifiers, comma or newline
separated (e.g. "linkedin.com/in/jane-doe, linkedin.com/in/john-doe").
The campaign is seeded from exactly these people: no LinkedIn
search runs, the goal <-> ICP audit is skipped (the audience is
stated, not inferred), a low ICP score does not drop anybody, and
discovery stays off so nothing tops the queue up with strangers.
Use it whenever the user names who to reach. Cannot be combined
with connections_only.
campaign_type: Prompt family: "outbound" (default) or "job_search".
job_search writes a job-search campaign: the invitation note and
the first DM may name the recipient's company and the role, use
one credible proof point at most and never list a CV. InMail is
not routed by this switch. Pair with connections_only="on" to
write to people the sender is already connected to.
force: True to create the campaign even when the goal <-> ICP audit
returns `mismatch` (the ICP holds no plausible buyer for the goal).
Leave False; a `partial` verdict never blocks, it only warns.
goal: What the campaign is for: "sell" (default), "job_search",
"hire", "partner", "buy" or "research". It sets campaign_type and
campaign_intent, picks whose profile the ICP describes, and picks
the fit question the goal <-> ICP audit asks. hire, partner and
research run on your project_brief until their message sets exist.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | ||
| mode | No | autopilot | |
| force | No | ||
| icp_id | No | ||
| people | No | ||
| voice_mode | No | text_only | |
| company_url | No | ||
| campaign_name | No | ||
| campaign_type | No | ||
| project_brief | No | ||
| company_context | No | ||
| connections_only | No | ||
| target_description | Yes | ||
| exclude_connections | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |