---
title: "List who a campaign would reach"
description: "Who the campaign would reach if sent now, one row per segment member, by the send's own rule: sendable, missing_data (a required variable has no value), suppressed or excluded, with the reason. `GET /api/v1/email/campaigns/{id}/recipients`"
url: https://www.unitpost.com/docs/email/get-email-campaigns-id-recipients
section: "Email API reference"
updated: 2026-10-13
---
# List who a campaign would reach

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

Who the campaign would reach if sent now, one row per segment member, by the send's own rule: `sendable`, `missing_data` (a required variable has no value), `suppressed` or `excluded`, with the reason. The numbers of [Validate a campaign](https://www.unitpost.com/docs/email/get-email-campaigns-id-validate), member by member. Rows run in contact-id order: pass `next_cursor` as `after` for the next page. A page can hold fewer rows than `limit` while `has_more` is true (a rare status in a big segment is walked in bounded steps). Rows name contacts, so this also requires `contacts:read`. Requires the `campaigns:read` capability.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | — |
| `status` | query | string | no | Only members with this outcome (default `all`). One of: `all`, `sendable`, `missing_data`, `suppressed`, `excluded`. |
| `limit` | query | integer | no | Rows per page (1–100, default 50). |
| `after` | query | string | no | The previous page's `next_cursor`. |

## Response fields (200)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | — |
| `contact_id` | string | yes | — |
| `email` | string \| null | yes | — |
| `name` | string \| null | yes | — |
| `status` | enum | yes | What a send now would do for this member, by the send's own rule. One of: `sendable`, `missing_data`, `suppressed`, `excluded`. |
| `reason` | string \| null | yes | Why, in plain words; null when sendable. |
| `reason_code` | enum \| null | yes | — |

## Responses

| Status | Description |
| --- | --- |
| 200 | A page of the audience. |
| 401 | Missing or invalid API key. |
| 403 | Insufficient scope (`campaigns:read` and `contacts:read`). |
| 404 | Campaign not found (or it's an SMS campaign). |
| 409 | The campaign's template, segment or contact data couldn't be read. |
| 422 | A bad `status`, `limit` or `after` (another resource's id), a repeated key, or an unknown one. |
| 503 | `operation_timed_out`: the segment read took too long; retry. |

## Example request

```bash
curl -X GET 'https://www.unitpost.com/api/v1/email/campaigns/cmp_123/recipients' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'User-Agent: my-app/1.0'
```

## Example response (200)

```json
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "campaign_recipient",
      "contact_id": "contact_123",
      "email": "customer@example.com",
      "name": "Example",
      "status": "sendable",
      "reason": "string",
      "reason_code": "unsubscribed"
    }
  ],
  "next_cursor": "string"
}
```

## Links

- HTML reference (with Node.js, Python, Ruby, PHP, Laravel, Go, Java, Rust, .NET and CLI examples): https://www.unitpost.com/docs/email/get-email-campaigns-id-recipients
- OpenAPI 3.1 (full schemas): https://www.unitpost.com/api/v1/openapi.json
