> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sequenzy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Campaign Audience

> Resolve who a campaign will reach, with a live recipient count

Resolve a campaign's stored targeting into named lists and segments plus a recipient count computed at read time.

Use this to verify a scheduled campaign's audience before it sends. Unlike `targetLists` on [Get Campaign](/api-reference/campaigns/get), which contains raw IDs, this endpoint returns resolved names, flags references to deleted records, and reports whether targeting was ever set.

<Note>
  When `audience.isUnset` is `true`, the campaign has no targeting. Scheduling it
  sends to every active subscriber, and `recipientCount` reflects that fallback.
</Note>

## Request

<ParamField path="campaignId" type="string" required>
  Campaign ID.
</ParamField>

```bash theme={null}
curl "https://api.sequenzy.com/api/v1/campaigns/camp_abc123/audience" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

## Response fields

<ResponseField name="audience.type" type="string">
  One of `unset`, `all`, `lists`, `segment`, `filtered`, or `rules`.
</ResponseField>

<ResponseField name="audience.summary" type="string">
  Plain-language description of who the campaign reaches.
</ResponseField>

<ResponseField name="audience.isUnset" type="boolean">
  True when targeting has never been set.
</ResponseField>

<ResponseField name="audience.lists" type="array">
  Resolved lists. Each entry has `id`, `name`, and `missing` - `missing` is true
  when the referenced list no longer exists.
</ResponseField>

<ResponseField name="audience.segments" type="array">
  Resolved segments, in the same shape as `lists`.
</ResponseField>

<ResponseField name="audience.include" type="array">
  Include rules for `rules` targeting, with lists and segments resolved.
</ResponseField>

<ResponseField name="audience.exclude" type="array">
  Exclude rules for `rules` targeting, with lists and segments resolved.
</ResponseField>

<ResponseField name="recipientCount" type="number">
  Subscribers matching the effective targeting right now.
</ResponseField>

## Responses

<ResponseExample>
  ```json 200 theme={null}
  {
    "success": true,
    "campaignId": "camp_abc123",
    "campaignName": "April Launch",
    "status": "scheduled",
    "scheduledAt": "2026-05-02T09:00:00Z",
    "audience": {
      "type": "lists",
      "summary": "Subscribers on lists Newsletter. 1284 recipient(s) match right now.",
      "isUnset": false,
      "lists": [{ "id": "list_123", "name": "Newsletter", "missing": false }],
      "segments": [],
      "filters": [],
      "filterJoinOperator": null,
      "include": [],
      "exclude": [],
      "excludedSubscriberIds": [],
      "includedSubscriberIds": [],
      "excludedCampaignOpenerIds": []
    },
    "recipientCount": 1284,
    "targetLists": { "type": "lists", "listIds": ["list_123"] }
  }
  ```

  ```json 401 theme={null}
  {
    "success": false,
    "error": "Unauthorized"
  }
  ```

  ```json 403 theme={null}
  {
    "success": false,
    "error": "API key is missing required scope: campaigns:read"
  }
  ```

  ```json 404 theme={null}
  {
    "success": false,
    "error": "Campaign not found"
  }
  ```
</ResponseExample>
