# Paginação

> Como as listagens se dividem em páginas com page e limit, o bloco pagination da resposta, como percorrer tudo e como filtros e paginação se combinam.

Listagens grandes (membros, extrato, feed, produtos) vêm em páginas. Você pede a página com dois parâmetros e recebe, junto com os itens, o bloco `pagination`.

## Os parâmetros

| Parâmetro | O que é | Padrão | Máximo |
|---|---|---|---|
| `page` | A página, começando em 1 | 1 | — |
| `limit` | Itens por página | 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"
```

## A resposta

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

| Campo | O que é |
|---|---|
| `page` | A página devolvida |
| `limit` | Itens por página |
| `total` | Quantos itens existem, já com os filtros |
| `totalPages` | Quantas páginas há |

## Percorrer tudo

```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;
}
```

## Filtros e paginação

Os filtros (`search`, `role`, `type`, `status`…) são aplicados **antes** de paginar: `total` e `totalPages` já contam só o que bate com o filtro.

## Dicas

- Use o maior `limit` que fizer sentido (até 100) para fazer menos chamadas.
- Não presuma que todas as listagens são paginadas: quando uma não é, o bloco `pagination` não vem, e `data` traz tudo.
- Ao percorrer uma lista que muda enquanto você lê (o feed, por exemplo), um item pode aparecer em duas páginas; deduplique pelo `id`.

## Relacionados

- [Respostas e erros](/api/respostas-e-erros)
- [SDK JavaScript](/api/sdk-js)
