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

## 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
    - `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'
    - `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

---

[API](https://skmtc.net/sequenzy/apis/sequenzy-api.md) · [All operations](https://skmtc.net/sequenzy/apis/sequenzy-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/sequenzy/sequenzy-api/versions/af1cf9620482/schema)
