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

# Call the getAnalytics MCP tool

`POST /api/v1/actions/getAnalytics`

## Request

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

Aggregate campaign or content performance into a chart-shaped result over the last 7/30/90 days or all time. Two shapes: timeseries (one value per day for a metric) and funnel (campaign-only, stage-by-stage counts). Domain campaign accepts metrics requests_sent | connections_accepted | replies | positive_replies | meetings_booked; domain content accepts impressions | reactions | comments | engagement. Funnel is campaign-only and ignores metric. Its stage labels depend on the campaign type, so PASS campaign_id whenever the question is about ONE campaign (get it from getCampaigns first): outreach is leads, requests, accepted, replied, positive, booked; retargeting/re_engagement is enrolled, messaged, replied, positive, booked (no accepted stage); a pure-InMail campaign is sent, replied only. Without campaign_id, every campaign is aggregated in the outreach shape starting at requests, and a retargeting or InMail-only campaign contributes 0 to requests/accepted there while its replies and bookings still count. Returns content with series (timeseries) or stages (funnel) plus the window and labels; on surfaces that render cards also chart_artifact_id. Quote ONLY numbers from this result; never sum or estimate from getCampaigns.

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
  - `chart_type` 'timeseries' | 'funnel', required
  - `domain` 'campaign' | 'content', required
  - `metric` string: Required when chart_type='timeseries'. Campaign: requests_sent | connections_accepted | replies | positive_replies | meetings_booked. Content: impressions | reactions | comments | engagement.
  - `window_days` union
    - number
    - string
  - `campaign_id` string, uuid: Optional single-campaign scope. Campaign domain only.

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