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

# List Campaign Replies

> See who replied to a campaign, newest first.

Returns one row per reply to a campaign, newest first, with the subscriber who replied, the send they replied to, the attachment count, the reply time and the inbox conversation holding the reply.

The [campaign metrics endpoint](https://docs.sequenzy.com/api-reference/analytics/campaign-metrics.md) reports how many replies a campaign received in `stats.replies`. This endpoint lists those same replies, so `pagination.total` matches that count when you call the metrics endpoint without `period`, `start`, `end` or `mailboxProvider`, which narrow it. Test sends are left out of both.

Reply text is not returned. To read a reply, pass its `conversationId` to [Get Conversation](https://docs.sequenzy.com/api-reference/conversations/get.md), which needs its own conversations scope. `conversationId` is `null` when the reply has no inbox conversation.

Also available at `GET /api/v1/campaigns/{campaignId}/replies`. Both routes need the `analytics:read` scope.

For account keys used by marketers, campaigns that send a transactional template are hidden and return `404`.

## Path Parameters

**campaignId** `string` *required*

The ID of the campaign.

## Query Parameters

**page** `number` (default: 1)

Page number for pagination.

**limit** `number` (default: 100)

Replies per page (max 500). Larger values are capped at 500.

## Common Queries

### List everyone who replied to a campaign

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

### Read one of the replies

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

## Response Fields

**replies** `array`

Replies, newest first.

**properties**

**replyId** `string`

ID of the reply.

**subscriberId** `string`

The subscriber who replied.

**email** `string | null`

The subscriber's email. `null` when the subscriber has since been deleted.

**externalId** `string | null`

The subscriber's external ID.

**firstName** `string | null`

The subscriber's first name.

**lastName** `string | null`

The subscriber's last name.

**emailSendId** `string`

The campaign send the subscriber replied to.

**conversationId** `string | null`

The inbox conversation holding the reply. `null` when the reply has no
inbox conversation.

**hasAttachments** `boolean`

Whether the reply had attachments.

**attachmentCount** `number`

How many attachments the reply had.

**receivedAt** `string`

When the reply arrived (ISO 8601).

**pagination** `object`

`page`, `limit`, `total` (replies across every page) and `totalPages`. Keep
requesting the next page while `page` is less than `totalPages`.

## Responses

```json 200 theme={null}
{
  "success": true,
  "campaignId": "camp_abc123",
  "replies": [
    {
      "replyId": "reply_123",
      "subscriberId": "sub_123",
      "email": "user@example.com",
      "externalId": null,
      "firstName": "Ana",
      "lastName": null,
      "emailSendId": "send_123",
      "conversationId": "conv_123",
      "hasAttachments": false,
      "attachmentCount": 0,
      "receivedAt": "2026-11-08T10:00:00.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 100,
    "total": 1,
    "totalPages": 1
  }
}
```

```json 400 theme={null}
{ "success": false, "error": "'limit' must be a positive integer" }
```

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

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

```json 500 theme={null}
{ "success": false, "error": "Internal server error" }
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.