# Pagination

> Parcourir une liste longue par curseur, sans total et sans page qui saute.

Les listes se parcourent par **curseur**, jamais par numéro de page : un crawl peut porter des centaines de milliers d’occurrences, et un décalage relirait tout ce qu’il saute.

## Première page

`limit` fixe la taille de la page (25 par défaut, 100 au plus) :

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

La réponse porte `meta.has_more` et `meta.next_cursor`.

## Pages suivantes

Passez `next_cursor` tel quel, avec les MÊMES filtres :

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

Arrêtez-vous quand `has_more` vaut `false`. L’ordre est stable : une page lue deux fois rend les mêmes lignes.

## Ce que le curseur refuse

Le curseur est chiffré et lié à sa requête : le réutiliser sur une autre liste, ou avec d’autres filtres, répond `400 pagination.invalid_cursor` plutôt que de rendre une page qui mélangerait deux listes.

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

Il n’y a pas de total : le compter coûterait une lecture complète à chaque page. Le résumé des anomalies donne les totaux qui comptent.
