# List Viz Subscriptions

```
GET 
/v1/viz/:viz_id/subscriptions
```

This viz's subscriptions, one cursor page at a time.

`nextKey` is emitted ONLY when a further page genuinely exists — the SQL layer fetches `limit + 1` and lets the probe row decide. It used to be the id of the last row on every non-empty page, so a one-row list said `nextKey: 1` and sent every cursor-honouring caller after a page that was not there. A drain-until-empty caller never sees an error for that, only one extra fetch per list, so it is found by reading the envelope rather than by a failure. `hasMore` is derived from `nextKey` by `PageEnvelope`, and `total` is counted, so a caller can assert `len(subscriptions) == total` rather than trusting the drain.

Cursor-paginated. The wire query parameter is `exclusiveStartKey` (what the cURL tab and the parameter table show); the TypeScript SDK takes it as the `exclusiveStartKey` option and the Python SDK as the `exclusive_start_key` keyword — one parameter, spelled per language. Pass the previous page's `nextKey` and stop when it comes back `null` — or let `iterAll()` / `iter_all()` drive the cursor for you (see the SDKs page, "Pagination").

## Request[​](#request "Direct link to request")

## Responses[​](#responses "Direct link to Responses")

* 200
* 404
* 422

Successful Response

Not found

Validation Error
