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

# Call the getCampaigns MCP tool

`POST /api/v1/actions/getCampaigns`

## Request

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

List the workspace's campaigns, paginated: up to 100 per page (default 20) with total, has_more, and next_cursor (pass it back as cursor), plus status and type filters. Lead-magnet rows carry a lead_magnet block (keyword, document id + title, hook post, armed, sender_resolution) so a funnel audit is one call; getCampaignSequence reads one campaign's full copy. Outreach campaigns carry ALL-TIME stats since launch (active leads, requests, acceptance/reply rate, bookings); lead-magnet campaigns carry lm_stats instead (captured, DMs, replies, bookings); retargeting/re_engagement campaigns carry re_stats instead (enrolled, messaged, replied, positive, booked - no requests/accepted); pure-InMail campaigns (a send_inmail step with no connection_request) carry inmail_stats instead (sent, replies, open-profile rate, skip reasons - always all-time). For date-windowed numbers (for example "last week"), use getWorkspaceStats or getCampaignFunnel with days_back instead of these lifetime totals. Use getCampaignStats for one named campaign, getCampaignFunnel for stage-by-stage conversion. For workspace-wide totals, use getWorkspaceStats (optionally with days_back) instead of aggregating this page, or point to https://app.reachium.io/campaigns.

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
  - `status` 'active' | 'paused' | 'draft' | 'completed' | 'all': Optional filter. Defaults to "all".
  - `limit` integer: How many campaigns to return per page (1-100). Default 20.
  - `cursor` string: Opaque cursor from a previous result's next_cursor; omit for the first page.
  - `type` 'outreach' | 'lead_magnet' | 're_engagement' | 'inmail' | 'all': Optional campaign-type filter. Defaults to "all".

## 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/11682826692b?raw)
