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

# Pagination

> Parcourir de longues listes avec des curseurs, sans doublon ni trou.

Les listes sont paginées par **curseur** : au lieu d'un numéro de page, chaque réponse vous donne un repère opaque vers la suite. C'est plus fiable qu'une pagination par numéro : si des ventes arrivent pendant que vous lisez, vous ne voyez ni doublon ni ligne manquante.

## Paramètres

**per\_page** `integer` (default: 10)

Nombre de résultats par page, de 1 à 100.

**cursor** `string`

La valeur `next_cursor` de la page précédente. Ne la fabriquez pas et ne la modifiez pas : un curseur invalide renvoie `422`.

## Lire la suite

```json theme={null}
"pagination": {
  "count": 10,
  "per_page": 10,
  "next_cursor": "eyJjIjoiMjAyNi0xMC0yOVQxNjoxNzoxMC4wMDBaIiwiaSI6ImNtMXNhbGUwMDEifQ",
  "next_page_url": "https://api.pulse-sell.com/v1/sales?per_page=10&cursor=eyJj...",
  "has_more_pages": true,
  "has_pages": true
}
```

Tant que `has_more_pages` vaut `true`, rappelez le même endpoint avec `cursor=<next_cursor>`. Les filtres que vous avez utilisés sont repris dans `next_page_url`.

```javascript Node.js theme={null}
async function* allSales(apiKey) {
  let cursor;
  do {
    const url = new URL("https://api.pulse-sell.com/v1/sales");
    url.searchParams.set("per_page", "100");
    if (cursor) url.searchParams.set("cursor", cursor);
    const res = await fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } });
    const body = await res.json();
    yield* body.data;
    cursor = body.pagination.has_more_pages ? body.pagination.next_cursor : null;
  } while (cursor);
}
```

```python Python theme={null}
import requests

def all_sales(api_key):
    cursor = None
    while True:
        params = {"per_page": 100}
        if cursor:
            params["cursor"] = cursor
        r = requests.get("https://api.pulse-sell.com/v1/sales",
                         headers={"Authorization": f"Bearer {api_key}"}, params=params)
        body = r.json()
        yield from body["data"]
        if not body["pagination"]["has_more_pages"]:
            return
        cursor = body["pagination"]["next_cursor"]
```

## Ordre

Les ventes, produits, licences et affiliés sont triés du plus récent au plus ancien. Les clients sont triés par adresse e-mail.

> [!TIP]
>
> Utilisez `per_page=100` pour une synchronisation complète : vous faites dix fois moins d'appels, donc dix fois moins de limite de débit consommée.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.