---
title: "Call the createDraftCampaign MCP tool"
method: POST
path: "/api/v1/actions/createDraftCampaign"
tags: ["Actions"]
---

# Call the createDraftCampaign MCP tool

`POST /api/v1/actions/createDraftCampaign`

## Request

- Base URL: `https://app.reachium.io`
- URL: `https://app.reachium.io/api/v1/actions/createDraftCampaign`
- Auth: HTTP bearer

Create a NEW DRAFT outreach campaign. If the user has not stated which campaign type they want (for example a bare "I need to reach a lot of people"), pull getPlaybook("campaigns", "choosing-a-campaign-type") FIRST, before picking a preset - the four types (retargeting, connection requests, InMail, lead magnet) route on WHO the audience is, and the wrong pick burns days of sending capacity. Two modes: (1) preset (default connect_message): "connect_message" (visit -> connection request -> first message -> up to 3 followups with custom waits), "inmail_open_profiles" (visit -> cold InMail; pair with manageLeadList action split_by_open_profile so every send is FREE), "connect_or_inmail" (connection request, InMail fallback (default 3 days) if not accepted), or "re_engagement" (message-only retargeting drip to an existing lead list, see the chooser playbook); (2) custom_sequence: a flat step list composing warm-up (like_post/comment_post), ONE contact channel, message, followups, waits, and optional A/B copy in any rule-abiding order - pull getPlaybook("campaigns", "custom-sequences") FIRST. Stays a draft: launch with activateCampaign (launch scope required) or in /campaigns; edit later with updateDraftCampaign. Write copy yourself, grounded in getBrandProfile, AFTER pulling getPlaybook("copywriting") for the house style and getPlaybook("campaigns") for preset/timing choices. Surface returned warnings to the user.

Called through the Actions bridge: the response is that tool's own result, wrapped as `{ data: <tool result> }` under HTTP 200. Billing, daily-cap, and confirm-step outcomes are embedded INSIDE `data`, never remapped to an HTTP status (see the templated `/api/v1/actions/{toolName}` operation above for the full protocol, and `x-mcp-actions` for this tool's machine-readable scope/cap/confirm_behavior fields). Authentication, request-shape, and optional idempotency-protocol failures still use their documented non-200 statuses.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `name` string, required: Campaign name; the " (Rio)" attribution suffix is added automatically, do not include it. Lead with WHAT it is - the offer, audience or goal - then any context, e.g. "10 DM Templates - Gabriel Palacios - SYSTEM". Never include "draft": status is tracked separately and the name outlives the draft.
  - `lead_list_id` string, uuid: Existing lead list UUID (confirm via getLeadLists first). Required for every preset EXCEPT re_engagement, whose audience comes from retargeting.source_list_id instead; omit it there.
  - `connection_note` string: Connection note; leave empty unless the visitor explicitly wants one.
  - `first_message` string: First message after the connection is accepted; use {{first_name}}. Omit only if the user will write this copy themselves.
  - `followup_message` string: Follow-up sent 2 days later if no reply; use {{first_name}}.
  - `copy_artifact_id` string, uuid, nullable: Artifact id from generateCampaignCopy; when present its possibly user-edited copy wins over first_message. Omit otherwise.
  - `description` string: Optional one-line description shown on the campaign card.
  - `sender_account_ids` string[]: LinkedIn account UUIDs (from getCampaignSenderAccounts). Optional.
  - `preset` 'connect_message' | 'inmail_open_profiles' | 'connect_or_inmail' | 're_engagement': Sequence preset (default connect_message); see the tool description. re_engagement builds a RETARGETING campaign instead (message-only drip to leads you are already connected to); it requires the retargeting param block and either message or custom_sequence, and ignores lead_list_id, connection_note, first_message, followup_message, inmail_subject, inmail_message, inmail_config, timing, and sender_account_ids.
  - `inmail_subject` string: InMail subject line. Required for the InMail presets.
  - `inmail_message` string: InMail body. Required for the InMail presets. Use {{first_name}}.
  - `inmail_config` object: Free vs paid InMail policy; omit for the free-only default. Same shape as updateDraftCampaign's inmail_config.
    - `allow_paid` boolean, required: true = also InMail non-open-profile leads (paid credits). false = free open-profile-only (default).
    - `daily_paid_cap` integer, required: Max PAID InMails per day. Ignored when allow_paid is false.
    - `use_license_stacking` boolean: Combine multiple InMail-capable licenses on the sending account(s) to raise the effective daily paid cap.
    - `accounts` object: Per-account overrides keyed by linkedin_account_id, winning over the flat allow_paid/daily_paid_cap/use_license_stacking above.
  - `followups` object[]: Up to 3 no-reply follow-ups, sent in order. Use INSTEAD of followup_message.
    - `message` string, required: Follow-up text; use {{first_name}}.
    - `wait_days` integer, required: Days after the previous message (1-14).
  - `timing` object: Optional wait-time overrides; omit for defaults.
    - `invite_wait_hours` integer: Hours between profile visit and the connection request or InMail (default 1).
    - `first_message_wait_hours` integer: Hours between acceptance and the first message (default 1).
    - `inmail_fallback_days` integer: connect_or_inmail only: days before the InMail fallback (default 3, minimum 3).
  - `custom_sequence` union[]: Custom step list (see getPlaybook("campaigns", "custom-sequences") FIRST). Composes visit/like/comment warm-up, ONE contact channel (connection_request or inmail), message, followups, delays, optional inmail_fallback, and A/B copy via *_b fields. Mutually exclusive with preset and the preset copy/timing params, EXCEPT for preset:"re_engagement", where it is a valid alternative to message/followups (a connection_request, inmail, or inmail_fallback step is refused there: retargeting never contacts someone new).
    - union
      - object
        - `step` 'visit_profile', required
      - object
        - `step` 'delay', required
        - `value` integer, required
        - `unit` 'minutes' | 'hours' | 'days', required
      - object
        - `step` 'like_post', required
      - object
        - `step` 'comment_post', required
        - `text` string, required
      - object
        - `step` 'connection_request', required
        - `note` string
        - `note_b` string: A/B variant of the connection note; assigned per lead at their first message-bearing step of the sequence.
      - object
        - `step` 'message', required
        - `text` string, required
        - `text_b` string: A/B variant of the message; assigned per lead at their first message-bearing step of the sequence.
      - object
        - `step` 'followup', required
        - `text` string, required
        - `text_b` string: A/B variant of the message; assigned per lead at their first message-bearing step of the sequence.
        - `wait_days` integer, required
      - object
        - `step` 'inmail', required
        - `subject` string, required
        - `body` string, required
        - `subject_b` string: A/B variant of the InMail subject; assigned per lead at their first message-bearing step of the sequence.
        - `body_b` string: A/B variant of the InMail body; assigned per lead at their first message-bearing step of the sequence.
      - object
        - `step` 'inmail_fallback', required
        - `after_days` integer, required
        - `subject` string, required
        - `body` string, required
  - `message` string: RETARGETING ONLY (preset:"re_engagement"): the single drip message sent to the whole audience; use {{first_name}}. Required unless custom_sequence is used instead. Ignored by every other preset.
  - `retargeting` object: RETARGETING ONLY (preset:"re_engagement"): sender + audience configuration. Required whenever preset is re_engagement.
    - `sender_account_id` string, uuid, required: The single connected LinkedIn account this retargeting campaign sends from (from getCampaignSenderAccounts).
    - `source_list_id` string, uuid, required: Existing lead list UUID to build the retargeting audience from (see getLeadLists). Only existing lead lists are supported here.
    - `daily_cap` integer: Max messages sent per day from this campaign (default 5; retargeting starts gentle by design).
    - `filters` object: Optional audience narrowing filters, applied on top of source_list_id.
      - `never_contacted` boolean: Only include leads never previously contacted. Mutually exclusive with outcomes.
      - `outcomes` string[]: Only include leads whose past outreach ended in one of these outcome values.
      - `title_contains` string: Only include leads whose title/headline contains this text.
      - `company_contains` string: Only include leads whose company name contains this text.
      - `intent_list_ids` string[]: Further narrow to leads also present in these lead lists.

## Response `200`

The result of calling this tool.

- object
  - `data` unknown, required
  - `error` unknown, required

## Other responses

- `400`: The request body was not a JSON object (code invalid_request), or Idempotency-Key is malformed (code invalid_idempotency_key).
- `401`: Missing or invalid API key. Send `Authorization: Bearer rmcp_...` (code unauthorized).
- `403`: This tool is out of the key’s granted scope (code insufficient_scope).
- `409`: This Idempotency-Key has an unresolved in-flight or ambiguous result (code request_in_flight). Reconcile before using a new key.
- `422`: This Idempotency-Key was already used with a different request body (code idempotency_key_reuse).
- `429`: Rate limited: shared `mcp:ip:{ip}` (600/60s) or `mcp:key:{keyId}` (120/60s) bucket, the SAME buckets the MCP endpoint uses (code rate_limited).
- `500`: Unhandled server error (code internal_error).

---

[API](https://skmtc.dev/reachium/apis/reachium-api.md) · [All operations](https://skmtc.dev/reachium/apis/reachium-api/llms.txt) · [OpenAPI document](https://skmtc.dev/reachium/apis/reachium-api/revisions/30c16b30b499?raw)
