Introducing HeyReach Campaign API
Introducing HeyReach Campaign API
LinkedIn outreach, everywhere you work. Build and launch campaigns from Claude, OpenClaw, Slack — all through one powerful API. Give your AI agents full control over campaigns, leads, inbox, and analytics. No tabs. No logins. Just results.

For almost three years, HeyReach has been the LinkedIn automation tool agencies and GTM teams trust. That trust was earned by building together: multi-sender rotation, unified inbox, agency-friendly pricing, powerful integrations, HeyReach MCP, and many other features.
Trust is a responsibility we take seriously. Which is why today's release matters: HeyReach Campaign API is the most-requested feature recently, and it fundamentally changes how LinkedIn automation works.
What changes: LinkedIn outreach is no longer locked in a browser. Campaign API gives you full programmatic access to LinkedIn automation. Every feature — campaigns, inbox management, lead routing, analytics — is now accessible via our API. Give your AI agents complete control: campaigns, leads, inbox, analytics.
Just natural language commanding your entire LinkedIn outreach infrastructure. Use cases:
- Build a campaign for CMOs at $10M+ ARR SaaS companies
- Import all closed-lost accounts from HubSpot and launch a 3-step sequence starting with “If Connected” filter and then segment existing and new connections into two separate flows
- Launch a connect-only LinkedIn outreach campaign for all new users this month
How-to videos for Campaign API
⚠️ HeyReach Campaign API is live in beta for all users. We're shipping fast and iterating based on your feedback, so expect additional updates in the coming days.
Important: Campaign API is powerful. Improper usage could affect other areas of the tool. Please read the documentation below carefully before building. Questions? Email support@heyreach.io or reach out in your dedicated Slack channel.
Full documentation
Below is the complete technical reference for building and launching HeyReach campaigns from anywhere. All endpoints require API key authentication (available in Settings → API).
1. POST /api/public/campaign/Create
Purpose: Creates a fully configured campaign in DRAFT status in a single call. You must call StartCampaign separately to activate it.
Request body — CreateCampaignApiInputDto
Response — 200 OK
{ "campaignId": 12345 }
Errors
2. POST /api/public/campaign/UpdateSettings
Purpose: Updates the general settings of a campaign — its name, lead list, and exclusion options. Cannot be called on ACTIVE or COMPLETED campaigns.
Side effect: If the campaign was in SCHEDULED status, it reverts to DRAFT.
Request body — UpdateCampaignSettingsApiDto
Response — 200 OK
Empty body.
Errors
3. POST /api/public/campaign/UpdateSequence
Purpose: Creates or fully replaces the sequence (automation workflow) of a campaign. For PAUSED campaigns, a safe update is performed — existing lead states are preserved and leads are remapped to compatible positions in the new sequence. For SCHEDULED campaigns, the campaign reverts to DRAFT.
Request body — UpdateCampaignSequenceApiDto
The PublicSequenceNodeDto object
Node types (PublicSequenceNodeType)
Payload objects
PublicConnectionRequestPayload (for CONNECTION_REQUEST):
PublicMessagePayload
(for MESSAGE):
PublicInMailPayload (for INMAIL):
PublicInMailMessage:
PublicPostLikePayload (for LIKE_POST):
PublicSendLeadToInstantlyPayload (for SEND_LEAD_TO_INSTANTLY):
PublicSendLeadToSmartLeadPayload (for SEND_LEAD_TO_SMARTLEAD):
Sequence validation rules
- Every path through the tree must terminate with an
ENDnode. CONNECTION_REQUEST,CHECK_IS_CONNECTIONandCHECK_IS_OPEN_PROFILEnodes must have bothconditionalNodeandunconditionalNodeset.- All other non-END nodes must have
unconditionalNodeset and must not haveconditionalNodeset. actionDelaymust be 0–100.- Node payloads must be valid per the constraints listed above.
- The sequence tree must not contain paths that are structurally impossible to complete.
Response — 200 OK
Empty body.
Errors
4. POST /api/public/campaign/UpdateAccounts
Purpose: Replaces the entire list of LinkedIn sender accounts assigned to a campaign. For PAUSED campaigns, removing an account will stop any leads currently being processed by that account. For SCHEDULED campaigns, the campaign reverts to DRAFT.
Request body — UpdateCampaignAccountsApiDto
⚠️ This is a full replacement, not a merge. Any account not in the new list will be removed. On a PAUSED campaign, leads assigned to a removed account will be stopped and cannot be resumed.
Response — 200 OK
Empty body.
Errors
5. POST /api/public/campaign/UpdateSchedule
Purpose: Replaces the schedule of a campaign. Defines when the campaign runs each day, which days it is active, the timezone, and optional start/end dates. For SCHEDULED campaigns, the campaign reverts to DRAFT.
Restriction: Once a campaign has been started at least once, the startDate cannot be changed.
Request body — UpdateCampaignScheduleApiDto
The CampaignScheduleApiDto object
Response — 200 OK
Empty body.
Errors
6. GET /api/public/campaign/GetCampaignSequence
Purpose: Retrieves the current sequence (workflow) of a campaign as a PublicSequenceNodeDto. The returned object is directly compatible with the Create and UpdateSequence endpoints — you can use it as the sequence field in either request body without modification.
Query parameters
Response — 200 OK
Returns a PublicSequenceNodeDto (the root of the sequence tree, without the implicit START wrapper). Returns an empty 200 response if the campaign has no sequence.
