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

# Call the createDraftPost MCP tool

`POST /api/v1/actions/createDraftPost`

## Request

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

Save a LinkedIn post YOU wrote as a Reachium draft (you author the copy; this only saves it). PERSONAL types (no keyword needed): authority_building, problem_awareness, personal_story. LEAD-MAGNET types (REQUIRE a Comment "KEYWORD" CTA in the body AND the matching lead_magnet_keyword param): trend_borrowing, audience_borrowing, step_by_step, case_study_format, company_update. Default to personal unless running a lead-magnet funnel. Never use em dashes in the copy (arrows are fine). LinkedIn caps bodies at 3000 characters. Pull getPlaybook("content") BEFORE drafting: draft-type trade-offs, length target, and CTA rules. The topic also carries the craft skills (post-ideation, post-copywriting, post-hooks, post-images): work idea -> body -> hook LAST -> visual, and pull the skill for the stage you are on. Returns post_id. Surface returned warnings to the user. schedulePost needs the launch scope - without it, the user schedules in the Content UI.

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
  - `topic` string, required: One-line summary of what the post is about.
  - `content` string, required: The full post body, ready to publish.
  - `draft_type` 'authority_building' | 'problem_awareness' | 'personal_story' | 'trend_borrowing' | 'audience_borrowing' | 'step_by_step' | 'case_study_format' | 'company_update', required: Taxonomy type; determines personal_post vs lead_magnet handling.
  - `lead_magnet_keyword` string: Comment-trigger keyword; REQUIRED for lead_magnet types, must match the CTA in the body.
  - `account_id` string, uuid: LinkedIn account UUID to attribute the post to (getLinkedInAccounts).

## 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)
