# Paginazione

> Come gli elenchi si dividono in pagine con page e limit, il blocco pagination della risposta, come scorrere tutto e come si combinano filtri e paginazione.

Gli elenchi lunghi (membri, estratto conto, feed, prodotti) arrivano in pagine. Chiedi la pagina con due parametri e ricevi, insieme agli elementi, il blocco `pagination`.

## I parametri

| Parametro | Che cos'è | Predefinito | Massimo |
|---|---|---|---|
| `page` | La pagina, a partire da 1 | 1 | — |
| `limit` | Elementi per pagina | 20 | 100 |

```bash
curl -s "https://api.memberfy.net/api/profiles/list?page=2&limit=50" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-CommunityId: $COMMUNITY_ID"
```

## La risposta

```json
{
  "success": true,
  "message": "…",
  "data": [ { "…": "…" } ],
  "pagination": { "page": 2, "limit": 50, "total": 137, "totalPages": 3 }
}
```

| Campo | Che cos'è |
|---|---|
| `page` | La pagina restituita |
| `limit` | Elementi per pagina |
| `total` | Quanti elementi esistono, già filtrati |
| `totalPages` | Quante pagine ci sono |

## Scorrere tutto

```js
let page = 1;
const all = [];
while (true) {
  const { data, pagination } = await api.profiles.getList({ page, limit: 100 });
  all.push(...data);
  if (page >= pagination.totalPages) break;
  page += 1;
}
```

## Filtri e paginazione

I filtri (`search`, `role`, `type`, `status`…) vengono applicati **prima** della paginazione: `total` e `totalPages` contano già solo ciò che corrisponde al filtro.

## Consigli

- Usa il `limit` più alto che abbia senso (fino a 100) per fare meno chiamate.
- Non dare per scontato che tutti gli elenchi siano paginati: quando uno non lo è, il blocco `pagination` non arriva e `data` contiene tutto.
- Se scorri un elenco che cambia mentre lo leggi (il feed, per esempio), un elemento può comparire in due pagine; elimina i duplicati in base all'`id`.

## Correlati

- [Risposte ed errori](/api/respostas-e-erros)
- [SDK JavaScript](/api/sdk-js)
