Create a new draft campaign seeded with a minimal default sequence. The starting point for every campaign.
draft campaign for one channel (linkedin or email) and seeds it with a two-node default sequence — either [connection_request, end] or [email, end]. The campaign is not yet launchable — the email body, prospects, and any extra steps still need to be added.
type:
GET /api/accounts?type=email or GET /api/accounts?type=linkedinupdateCampaign — fill in sequence_nodes (for email, set subject and body; add more steps if needed)POST /api/campaigns/{id}/leads — add prospects (direct insert, CSV upload, or import from a saved list)GET /api/campaigns/{id}/validate — pre-launch sanity checklaunchCampaign — start sending"Q2 Enterprise Outreach (2)") if you hit a 409.Channel-specific fields. LinkedIn-only fields (skip_other_campaigns, operating_hours) on an email campaign and email-only fields (daily_limit, stop_on_reply, open_tracking, signature) on a LinkedIn campaign are silently ignored — not rejected. Send only the fields that apply.Default sequence is intentionally empty. Email: subject and body are empty strings. You must populate them via updateCampaign (or use the AI framework chat → generate-messages flow) before launchCampaign will succeed.Sender accounts must match type. A LinkedIn account id on an email campaign (or vice versa) returns 400. Filter GET /api/accounts by type before picking.No prospects yet. Creation seeds the sequence but adds no prospects. launchCampaign on a prospect-less campaign exits immediately with status: "completed".Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Fields are channel-specific. type, name, and sender_account_ids are required; the rest apply only to one channel and are silently ignored on the other.
Channel. Immutable after creation — you cannot convert a LinkedIn campaign to email later.
linkedin, email Display name. Must be unique per user — duplicates return 409.
1One or more connected accounts (from GET /api/accounts?type=<type>) that match type. Must be owned by the caller; mismatched channel returns 400.
1^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$LinkedIn only. If true (default), prospects already in another active LinkedIn campaign are skipped at launch. Ignored for email campaigns.
LinkedIn only. Per-weekday schedule (JSONB). Defaults to Mon–Fri 9–17 in the user's timezone if omitted. Ignored for email campaigns.
Email only. Max prospects per day across all senders (clamped 1–500, defaults to 50). Ignored for LinkedIn campaigns.
1 <= x <= 500Email only. If true (default), a reply auto-terminates the prospect. Ignored for LinkedIn campaigns.
Email only. Insert a tracking pixel (default true). Ignored for LinkedIn campaigns.
Email only. Template with %sender_*% and %first_name% variables. Defaults to "Best,\n%first_name%".
Campaign created as a draft. Returns the campaign with its seeded default sequence nodes.