# Paginación

> Cómo se dividen los listados en páginas con page y limit, el bloque pagination de la respuesta, cómo recorrerlo todo y cómo se combinan filtros y paginación.

Los listados grandes (miembros, extracto, feed, productos) llegan en páginas. Pides la página con dos parámetros y recibes, junto con los elementos, el bloque `pagination`.

## Los parámetros

| Parámetro | Qué es | Por defecto | Máximo |
|---|---|---|---|
| `page` | La página, empezando por 1 | 1 | — |
| `limit` | Elementos 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"
```

## La respuesta

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

| Campo | Qué es |
|---|---|
| `page` | La página devuelta |
| `limit` | Elementos por página |
| `total` | Cuántos elementos hay, ya con los filtros |
| `totalPages` | Cuántas páginas hay |

## Recorrerlo todo

```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 y paginación

Los filtros (`search`, `role`, `type`, `status`…) se aplican **antes** de paginar: `total` y `totalPages` ya cuentan solo lo que coincide con el filtro.

## Consejos

- Usa el mayor `limit` que tenga sentido (hasta 100) para hacer menos llamadas.
- No des por hecho que todos los listados están paginados: cuando uno no lo está, el bloque `pagination` no viene y `data` lo trae todo.
- Al recorrer una lista que cambia mientras la lees (el feed, por ejemplo), un elemento puede aparecer en dos páginas; elimina duplicados por `id`.

## Relacionados

- [Respuestas y errores](/api/respostas-e-erros)
- [SDK de JavaScript](/api/sdk-js)
