---
title: "Recipients, one by one"
method: GET
path: "/api/v1/campaigns/{id}/recipients"
tags: ["Campaigns"]
---

# Recipients, one by one

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

## Request

- Base URL: `https://mailcheer.com`
- URL: `https://mailcheer.com/api/v1/campaigns/{id}/recipients`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-Api-Key`

Permission required: `campaigns:read`. Who the campaign went to and what each person did with it: delivered, opened, clicked, bounced, complained, unsubscribed. Cursor pagination, like `/subscribers`. `opened_at` and `clicked_at` include bots (security gateways, privacy relays); `human_opened` and `human_clicked` say whether a PERSON opened or clicked. `email` is `null` when the contact was deleted after the send: the row stays, because it still counts in the campaign's figures. `unsubscribed` is an attribution: the person unsubscribed after this email and before receiving another one (the unsubscribe link identifies the person, not the campaign). Cancelled messages are not recipients and are left out.

## Path parameters

- `id` string, required

## Query parameters

- `limit` integer
- `cursor` string
- `status` 'opened' | 'clicked' | 'not_opened' | 'bounced' | 'complained' | 'unsubscribed'

## Response `200`

The requested page.

- object: The envelope of every list. To walk through it: as long as `has_more` is `true`, call the same address again with `?cursor=<next_cursor>`. The order is stable; a page returns at most `limit` items (50 by default, 100 at most).
  - `object` 'list'
  - `data` object[]
    - `object` 'recipient'
    - `id` string
    - `email` string, nullable
    - `first_name` string, nullable
    - `last_name` string, nullable
    - `status` 'queued' | 'sending' | 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced' | 'complained' | 'failed'
    - `sent_at` string, date-time, nullable
    - `delivered_at` string, date-time, nullable
    - `opened_at` string, date-time, nullable
    - `clicked_at` string, date-time, nullable
    - `human_opened` boolean
    - `human_clicked` boolean
    - `unsubscribed` boolean: Unsubscribed through THIS email's link. Emails sent before 2026-09-24, whose link only identified the person: attributed to the last email received before the unsubscribe.
  - `has_more` boolean: One more page after this one.
  - `next_cursor` string, nullable: To pass back as `?cursor=` for the next page. `null` on the last page.

## Other responses

- `401`: Key missing, unknown or revoked.
- `403`: The key does not have the requested permission, or the workspace cannot send: `sending_blocked` (suspended, blocked or banned — nothing goes out, through any channel), `commitment_required` (the anti-spam commitment is not accepted), `reputation_blocked` (too many bounces or complaints).
- `404`: The object does not exist in this workspace.
- `422`: Malformed field, unverified domain, or recipient on the suppression list.

---

[API](https://skmtc.dev/mailcheer/apis/mailcheer-api.md) · [All operations](https://skmtc.dev/mailcheer/apis/mailcheer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mailcheer/apis/mailcheer-api/revisions/ba64b7ef2170?raw)
