Campaigns
Create a campaign
Create a campaign with its steps, lead source lists and senders. A campaign is the outreach half of an agent (campaigns are called agents in the app): create the list first (POST /api/v1/lists), then the source agent that fills it with leads (POST /api/v1/agents), then this campaign to reach out to them.
The campaign reaches out to the contacts of its own lead list (list_id, created with it) and of the lists in list_ids; lists are typically filled by a source agent or by importing contacts. Without steps it gets the default sequence for its channel (invitation, then three messages; plus two emails for multi/email when a mailbox is set). LinkedIn steps are sent from the accounts in linkedin_account_ids, email steps from the mailboxes in email_account_ids; contacts are spread across them (a contact keeps the same account and mailbox for its whole sequence, and contacts of one company share them). The single linkedin_account_id / email_account_id is still accepted (one sender); when both forms are sent the array wins, and an empty array or null removes the senders. Removing a sender hands its contacts that have not started over to the others. 1st-degree connections are excluded by default (exclude_first_degree).
It starts inactive unless active is true, which needs a LinkedIn or email sender; it can be turned on later with PATCH /api/v1/campaigns/{id}/status. Once activated, the campaign runs the outreach automatically, within the senders' daily limits and working hours. Needs the campaigns:write scope.
Steps. steps is the whole sequence in order. email steps go on the email track, every other type on the LinkedIn track; the two tracks run side by side for each contact. Waits are delay steps (delay_days; set track when the next step does not tell), or delay_days on any other step, which adds a wait before it. ai: true (the default) lets the agent write the step for each contact, with your text as the fallback; ai: false sends your text as written (message for messages and InMails, email_body and a first email_subject for emails). voice steps need a recording made in the app: send the id of an existing voice step to keep it.
https://app.replysparrow.com/api/v1/campaignsAuthorizations
Body
application/jsonDefault: []
Available options: English (US)English (UK)SpanishFrenchGermanItalianPortugueseDutchSwedishDanishNorwegianFinnishPolishCzechRomanianGreekTurkishArabicHebrewHindiIndonesianJapaneseKoreanChinese (Simplified)Chinese (Traditional)VietnameseThaiRussianUkrainian
Default: true
Default: false
Default: false
Response
application/jsonCampaign created
Unique identifier for the campaign (the agent id in the app)
Name of the campaign
Whether the campaign is active: outreach is on and enrolled contacts move through the sequence
Exclude first degree connections from the campaign (contacts already connected on LinkedIn)
When enabled, LinkedIn message steps with several paragraphs are sent as 2-4 shorter messages
Other lists whose contacts the campaign reaches
The sequence, LinkedIn track first, each track in order
Creation timestamp
Last update timestamp
Lead finding state of the agent behind the campaign (managed in the Agents section)
Available options: draftactivepaused
Campaign tone, used by AI-written messages
Available options: professionalconversationaldirect
Campaign language, used by AI-written messages; null = the account language
Meeting link AI-written messages may offer
Number of days after which a pending invitation is skipped and only email steps are sent (default 7; 0 = never, though no invitation waits more than 60 days). Set on the sequence's first connect step; null when the sequence has none
The first LinkedIn account of linkedin_account_ids (the primary), kept for existing integrations
The first mailbox of email_account_ids (the primary), kept for existing integrations
LinkedIn accounts sending the LinkedIn steps. Contacts are spread across them; each contact keeps one account for its whole sequence
Mailboxes sending the email steps. Contacts are spread across them; each contact keeps one mailbox for its whole sequence
The campaign's own list: contacts its agent finds and enrolls land here
The sequence behind the campaign
curl --request POST \ --url https://app.replysparrow.com/api/v1/campaigns \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "Q4 founders", "channel": "linkedin", "linkedin_account_id": "acc_123", "list_ids": [ "9f8e7d6c-0000-4000-8000-000000000002" ], "steps": [ { "type": "connect" }, { "type": "message", "delay_days": 1, "message": "Hi {{first_name}}, thanks for connecting!", "ai": false } ]}'{ "id": "5b0c6c1e-8a43-4f7e-9d7d-1f8a2b3c4d5e", "name": "Q4 founders", "active": false, "channel": "linkedin", "status": "draft", "goal": "conversations", "tone": "professional", "language": null, "booking_url": null, "exclude_first_degree": true, "split_messages": false, "skip_invitation_after_days": 7, "linkedin_account_id": "acc_123", "email_account_id": null, "linkedin_account_ids": [ "acc_123" ], "email_account_ids": [], "list_id": "9f8e7d6c-0000-4000-8000-000000000001", "list_ids": [ "9f8e7d6c-0000-4000-8000-000000000002" ], "workflow_id": "wf_123", "steps": [ { "id": "st_1", "track": "linkedin", "order": 1, "type": "connect", "delay_days": null, "message": null, "connect_note": null, "email_subject": null, "email_body": null, "ai": true }, { "id": "st_2", "track": "linkedin", "order": 2, "type": "delay", "delay_days": 1, "message": null, "connect_note": null, "email_subject": null, "email_body": null, "ai": false }, { "id": "st_3", "track": "linkedin", "order": 3, "type": "message", "delay_days": null, "message": "Hi {{first_name}}, thanks for connecting!", "connect_note": null, "email_subject": null, "email_body": null, "ai": false } ], "created_at": "2026-10-24T09:12:44.000Z", "updated_at": "2026-10-24T09:12:44.000Z"}