Campaigns

Campaigns That Run Themselves

Describe who you want to reach and what you want to say. Crispy builds the sequence, sends within safe limits, and pauses the moment someone replies so a human can take over. The follow-up that used to eat your week now runs itself.

crispy — bash

Create an acquisition campaign called Q2 Outreach sourced from my fintech-vps list

{
  "campaign_id": "q2-outreach",
  "name": "Q2 Outreach",
  "kind": "acquisition",
  "created": true
}

Show me a launch preview of my gtm-engineers-apr26 campaign with 15 sample messages

{
  "sample_messages": [
    {
      "contact": "Maya Lindqvist",
      "message": "Hi Maya, loved your recent post on GTM tooling. Would be great to connect."
    }
  ],
  "list_summary": { "total": 240, "eligible": 231 },
  "blacklist_hits": 2,
  "duplicate_hits": 7
}

Launch the gtm-engineers-apr26 campaign now that the preview looks good

{
  "campaign_id": "gtm-engineers-apr26",
  "enabled": true,
  "status": "active"
}

12 Tools for Campaigns

Each tool is available as an MCP tool for AI agents or as a REST API endpoint.

Create or Update Campaign

Write

Creates a new campaign or updates an existing one in a single call. Omit campaign_id to create (requires name, kind, and either a list_id or inline contacts) or provide it to update. Choose acquisition for invite-based outreach to new first-degrees or relationship for DM-only outreach to existing connections, with a URL-safe slug auto-derived from the name.

upsert_campaign

Preview Campaign Launch

Read

Renders a read-only launch preview for a campaign before any message goes out. Returns up to 10 personalized first-touch messages (configurable up to 50), a summary of the prospect list, blacklist hits, and duplicate hits. Use it to sanity-check personalization and audience quality before confirming a launch.

preview_campaign_launch

Confirm Campaign Launch

Write

Confirms and enables a campaign after checking launch readiness. Every campaign needs a bound list, and relationship campaigns also need a non-empty message; incomplete campaigns return a structured refusal and remain disabled. The action is idempotent for an already-enabled, ready campaign.

confirm_campaign_launch

Get Campaign Details

Read

Fetches campaign data for one campaign or lists all of them. Omit campaign_id to list every campaign in your workspace, or pass one with include[] to load the health funnel, action stats, account health, and outreach config in parallel. Returns metadata only by default and supports forced recompute of included slices.

get_campaign

Manage A/B Variants

Write

Inspection-only while variant execution is unavailable. action='list' returns stored definitions; action='add' and action='remove' fail with VARIANTS_NOT_APPLIED before any write.

manage_variants

Get Campaign Variant Stats

Read

Fails with VARIANTS_NOT_APPLIED while configured variant copy is not selected by the send paths. This prevents plausible-looking attribution for an experiment that did not run.

get_variant_stats

Apply Sequence Template

Write

Applies a built-in sequence template to a campaign, copying its follow_up steps as-is into the campaign's follow_up_sequence. The template's follow-ups carry no daily limit and write to the follow-up sequence rather than the main sequence. Fails if the template_name or campaign_id is invalid.

apply_sequence_template

List Sequence Templates

Read

Lists the built-in sequence templates available to apply to a campaign. Each entry returns its name, description, and step count so you can pick a proven outreach structure quickly. Returns an empty array if no templates are found.

list_sequence_templates

Manage Campaign Senders

Caution

Manages the pool of sender accounts on a campaign. Use action='list' to see configured senders, 'add' to bring a sender into the round-robin pool (daily limits split evenly across senders), or 'remove' to hard-delete a sender (contacts are reassigned at the next cron, not immediately). Fails if the campaign is not found, the sender is already added, or the sender to remove is not found.

manage_senders

Manage Campaign Outreach

Write

Configures or controls a campaign's outreach engine. With action='setup' you write the ordered steps (warmup actions, the auto-firing invite, then follow-up messages), daily_invites, invite_message, and list_id, while pause and resume toggle sending. Pausing holds pending follow-ups, but each expires 14 days after its scheduled send_at; the pause response reports held_follow_ups and earliest_expiry_at. Omit steps to preserve existing ones, pass [] to clear them, and note that text DM follow-ups use type='message'.

manage_outreach

Set Enrollment Policy

Write

Update the safeguards that decide which contacts are eligible to enter your outreach campaigns. Set account-wide defaults by omitting campaign_id, or apply a per-campaign override using a tristate of 'skip', 'allow', or null (inherit the default). Toggles cover pending invitations, unsubscribes, blocklist membership, recently messaged contacts, same-sender or cross-sender touches, other active acquisition campaigns, and already-connected profiles. Omit any field to leave it unchanged.

set_enrollment_policy

Archive Campaign

Caution

Archives a campaign and permanently cancels every queued pending or retry follow-up. Preview first to see the exact cancellation count. Unarchive restores the campaign record but does not restore cancelled follow-ups or re-enable outreach. Sent-message, activity, and reporting history remains available. Fails with not found if the campaign_id does not exist.

archive_campaign

Use Cases

Here's how teams use Crispy's campaigns tools in their day-to-day workflows.

Launch a full sequence from one prompt

Connection request, follow-up after they accept, then a soft meeting ask, built and scheduled in one go. Preview it before it sends, then confirm.

Example prompt

Build a 3-step campaign for CTOs at fintech startups in London: connect with a note, follow up after they accept, then ask for a quick call

Let it follow up so you don't have to

Every step fires on its own schedule within safe limits. The moment a prospect replies, the sequence pauses and the thread lands in your inbox for a human reply.

Example prompt

Launch the campaign, but pause anyone who replies and label their thread as 'Hot lead'

Inspect stored variant definitions

A/B execution is temporarily unavailable: stored definitions remain inspectable, while mutation and per-arm reporting fail loudly until send paths apply the selected copy.

Example prompt

List the stored variants on the opening message without changing them

Run outreach across multiple senders

Spread a campaign across several connected accounts, each with its own safe limits, so you reach more people without putting any one profile at risk.

Example prompt

Split this campaign across my two connected profiles and keep each one inside its daily limits

Get started in 3 steps

1

Sign up

Create your Crispy account. No credit card required for the first setup.

2

Connect LinkedIn

Link your LinkedIn account from the dashboard. Takes 30 seconds.

3

Start using

Add Crispy to Claude, Cursor, or any MCP client, or call the REST API directly.

$49/seat/mo. Everything included.

No API call limits on active subscriptions. Every tool included. Cancel anytime.

View pricing

Frequently Asked Questions

Will a campaign keep messaging someone after they reply?

No. Reply-pause is built in. The moment a prospect responds, that person drops out of the sequence and their thread surfaces in your inbox so a human picks it up. No awkward 'just following up' after they already answered.

How do you keep my account safe while sending?

Every campaign respects your daily limits and warm-up settings. Crispy paces sends across the day instead of bursting them, so activity looks natural and stays within LinkedIn's thresholds.

Can I preview a campaign before it sends?

Yes. Preview the full launch, who gets enrolled, what each step says, and when it fires, then confirm. Nothing goes out until you approve it.

How does A/B testing work?

A/B execution is temporarily unavailable. Existing definitions remain inspection-only; add/remove and per-arm statistics fail with VARIANTS_NOT_APPLIED until the send paths apply and record the selected copy.

Can I run campaigns for multiple clients or accounts?

Yes. Assign senders per campaign and keep each account's enrollment, limits, and history isolated. Agencies run every client's outreach from one place without credentials chaos.

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.