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

# Pagination

> Page deterministically through changing published data.

List endpoints use opaque keyset cursors. Start with your filters, sort, and `limit`, then follow `links.next` or pass `meta.page.next_cursor` unchanged.

```javascript theme={"dark"}
let url = new URL('/v1/products', baseUrl);
url.searchParams.set('q', 'bourbon');
url.searchParams.set('limit', '50');

while (url) {
  const response = await fetch(url);
  if (!response.ok) throw await response.json();
  const page = await response.json();

  consume(page.data);
  url = page.links.next ? new URL(page.links.next, baseUrl) : null;
}
```

## Guarantees

* Sort order includes a unique stable identifier as a final tie-breaker.
* The cursor is bound to the original normalized query and sort.
* All pages from a cursor chain read one immutable publication revision.
* Cursor contents are implementation details and must not be decoded or modified.

Expired or retired cursors return `410`. Restart the traversal to see the current publication.
