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

# Call the getCampaignFunnel MCP tool

`POST /api/v1/actions/getCampaignFunnel`

## Request

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

Get one campaign’s conversion funnel (pass campaign_id from getCampaigns): the stage-by-stage counts with the conversion rate between each stage. FOUR shapes depending on campaign type/sequence: outreach (leads → requests → accepted → replied → positive → booked); lead-magnet (captured → DMs → replied → booked); retargeting/re_engagement (enrolled → messaged → replied → positive → booked - no requests/accepted stage, since a retargeting sequence never has a connection step; messaged also counts a lead who messaged in first, before their drip fired); pure-InMail outreach, detected by a send_inmail step with no connection_request (sent → replied only - no requests/accepted/booked stage). Use to answer "how is this campaign converting / where is it leaking". Counts default to all-time; pass days_back (1-365) to window them (the InMail shape is always all-time regardless of days_back, with a note when a window was requested). Pass granularity:"daily" for a day-by-day series instead of one totals block (max 90 points; a window longer than 90 days truncates to the most recent 90 with truncated:true; a note explains when a column is not meaningful for the type) - use it for "how did last week compare to the week before". booking_rate = meetings booked / positive replies for outreach and retargeting campaigns, and meetings booked / replies for lead-magnet campaigns (LM funnels do not track positive-reply classification); the InMail shape has no booking_rate or meetings_booked field at all.

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
  - `campaign_id` string, uuid, required: The campaign to analyze (from getCampaigns).
  - `days_back` integer: Window the funnel to the last N days. Omit for all-time.
  - `granularity` 'total' | 'daily': "total" (default) returns one totals block; "daily" returns a day-by-day series instead.

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