---
title: "List subscribers"
method: GET
path: "/subscribers"
tags: ["Subscribers"]
---

# List subscribers

`GET /subscribers`

Lists subscribers with stable pagination and optional filtering by status, free-text query, tags, list, segment, attribute, or email. Non-attribute results are ordered by createdAt descending with subscriber ID as a deterministic tie-breaker. Attribute-filtered results use ClickHouse-first cursor pagination ordered by subscriber ID ascending and do not include a total count.

**Pulling a full audience:** every response includes `pagination.nextCursor` and `pagination.hasMore`. Follow `nextCursor` rather than incrementing `page`. Cursor pagination keeps results stable while subscribers are being created or deleted mid-pull (page numbers can skip or repeat rows as the underlying set shifts) and skips the total-count query, so `pagination.total` and `pagination.totalPages` are `null` on cursor requests. Combined with `limit=1000`, a 10,000-subscriber export takes ten requests instead of a hundred.

## Query parameters

- `page` integer
- `limit` integer
- `cursor` string
- `includeTotal` 'false'
- `status` 'active' | 'unsubscribed' | 'bounced' | 'all'
- `query` string
- `email` string
- `tags` string
- `attribute` string
- `attributeOperator` 'is' | 'contains' | 'gt' | 'gte' | 'lt' | 'lte' | 'is_not_empty'
- `list` string
- `listId` string
- `listName` string
- `segmentId` string
- `unsubscribedAfter` string
- `unsubscribedBefore` string

## Response `200`

Successful response

- object
  - `success` boolean
  - `subscribers` Subscriber[]
    - `id` string
    - `email` string, email, nullable — Null for phone-only (SMS) contacts, which are identified by their phone number instead.
    - `externalId` string, nullable — Customer-owned app/customer/user ID for this subscriber
    - `firstName` string, nullable
    - `lastName` string, nullable
    - `timezone` string, nullable — IANA timezone identifier used for recipient-local campaign delivery. Null when unknown.
    - `phone` string, nullable — Phone number in E.164 format
    - `smsStatus` 'not_subscribed' | 'pending' | 'subscribed' | 'unsubscribed' — SMS marketing consent status, independent of the email status
    - `status` 'active' | 'unsubscribed' | 'bounced'
    - `unsubscribedAt` string, date-time, nullable — When the contact opted out, derived from the list memberships the opt-out deactivated. Use this rather than `updatedAt` to date an opt-out - any later tag or attribute write moves `updatedAt`. Null unless the contact is currently unsubscribed, so leaving a single list does not set it, and null for contacts imported as already unsubscribed, where no date exists.
    - `emailProvider` string, nullable
    - `tags` string[]
    - `customAttributes` object
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
  - `pagination` SubscriberListPagination — Pagination for the subscriber list endpoint. `total` and `totalPages` are null on cursor requests because the count query is skipped.
    - `page` integer
    - `limit` integer
    - `total` integer, nullable
    - `totalPages` integer, nullable
    - `nextCursor` string, nullable — Pass back as `cursor` to fetch the next page. Null when there are no further results.
    - `hasMore` boolean
    - `orderBy` string — Sort key the cursor walks.

## Other responses

- `400` — Invalid status filter, malformed cursor, or cursor combined with page
- `401` — Unauthorized
- `404` — Segment or list not found
- `500` — Internal server error
- `503` — The database was temporarily unavailable. The request may be retried after the delay in Retry-After.

## Changes

> 121 revisions in range; 9 could not be searched.

- **2026-08-19** `ba3a29c6eb33` — 5 info
  - added the optional property `retryable` to the response with the `400` status
  - added the optional property `retryable` to the response with the `401` status
  - added the optional property `retryable` to the response with the `404` status
  - added the optional property `retryable` to the response with the `500` status
  - …1 more
- **2026-08-18** `8fbabe82a04d` — 2 info
  - added the non-success response with the status `503`
  - added the optional property `subscribers/items/timezone` to the response with the `200` status
- **2026-08-16** `6fd2903b91ce` — 4 info
  - added the optional property `code` to the response with the `400` status
  - added the optional property `code` to the response with the `401` status
  - added the optional property `code` to the response with the `404` status
  - added the optional property `code` to the response with the `500` status
- **2026-08-10** `16ad4f8e3d97` — 3 info
  - added the new optional `query` request parameter `unsubscribedAfter`
  - added the new optional `query` request parameter `unsubscribedBefore`
  - added the optional property `subscribers/items/unsubscribedAt` to the response with the `200` status
- …earlier changes not shown

[Full history](https://skmtc.dev/sequenzy/apis/sequenzy-api/changes/subscribers/get.md)

---

[API](https://skmtc.dev/sequenzy/apis/sequenzy-api.md) · [All operations](https://skmtc.dev/sequenzy/apis/sequenzy-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/sequenzy/sequenzy-api/revisions/73f826277d9a/schema)
