---
title: "Per-lead progress for a campaign"
method: GET
path: "/api/v1/campaigns/{id}/leads"
tags: ["Campaigns"]
---

# Per-lead progress for a campaign

`GET /api/v1/campaigns/{id}/leads`

## Request

- Base URL: `https://app.reachium.io`
- URL: `https://app.reachium.io/api/v1/campaigns/{id}/leads`
- Auth: HTTP bearer

Offset-cursor pagination over campaign_lead_progress, newest updated_at first (a lead_id tiebreaker keeps pages stable across bulk sweeps).

## Path parameters

- `id` string, required

## Query parameters

- `status` 'accepted' | 'replied' | 'booked' | 'pending_invite' | 'in_progress' | 'failed' | 'completed'
- `limit` integer
- `cursor` string

## Response `200`

A page of leads.

- object
  - `data` object, required
    - `campaign` object, required: id, name, status, type of the campaign.
    - `total` integer, required
    - `items` object[], required
    - `next_cursor` string, nullable, required
  - `error` unknown, required

## Other responses

- `400`: An unknown status filter value, or a malformed cursor (code invalid_args or invalid_cursor).
- `401`: Missing or invalid API key. Send `Authorization: Bearer rmcp_...` (code unauthorized).
- `403`: The key's granted scopes do not satisfy this endpoint's minimum required scope (code insufficient_scope).
- `404`: No such campaign in this workspace (code not_found).
- `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`: Lookup failed (code query_failed).

---

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