# Pagination

> Walk through a long list by cursor, with no total and no skipped page.

Lists are walked through by **cursor**, never by page number: a crawl may hold hundreds of thousands of occurrences, and an offset would re-read everything it skips.

## First page

`limit` sets the page size (25 by default, 100 at most):

```bash
curl "https://api.nessflow.com/v1/crawls/$CRAWL_ID/issues?limit=1" \
  -H "Authorization: Bearer $NESSFLOW_TOKEN"
```

The response carries `meta.has_more` and `meta.next_cursor`.

## Next pages

Pass `next_cursor` as is, with the SAME filters:

```bash
curl "https://api.nessflow.com/v1/crawls/$CRAWL_ID/issues?limit=1&cursor=$NEXT_CURSOR" \
  -H "Authorization: Bearer $NESSFLOW_TOKEN"
```

Stop when `has_more` is `false`. The order is stable: a page read twice returns the same rows.

## What the cursor refuses

The cursor is encrypted and bound to its request: reusing it on another list, or with other filters, answers `400 pagination.invalid_cursor` rather than returning a page that would mix two lists.

```bash expect=400
curl "https://api.nessflow.com/v1/crawls/$CRAWL_ID/pages?cursor=$NEXT_CURSOR" \
  -H "Authorization: Bearer $NESSFLOW_TOKEN"
```

There is no total: counting would cost a full read on every page. The issue summary gives the totals that matter.
