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

# Paginación

> Un esquema de cursor en todas las colecciones.

Cada colección devuelve el mismo envelope:

```json theme={null}
{
  "data": [ ... ],
  "meta": { "limit": 25, "has_more": true },
  "links": { "next": "https://api.chatsailer.com/v1/contacts?limit=25&cursor=eyJvZmZ..." }
}
```

Lee páginas siguiendo `links.next` hasta que sea `null`:

```python theme={null}
url = "https://api.chatsailer.com/v1/contacts?limit=100"
headers = {"Authorization": f"Bearer {token}"}

while url:
    page = httpx.get(url, headers=headers).json()
    for contact in page["data"]:
        handle(contact)
    url = page["links"]["next"]
```

## Trata el cursor como opaco

No parsees, construyas ni guardes un cursor. Su contenido es un detalle de
implementación y va a cambiar cuando los endpoints pasen a paginación por
keyset — pero `links.next` seguirá funcionando, que es el punto de darte una
URL en vez de un offset.

Pasar un cursor que construiste tú, o uno de otro endpoint, devuelve
`400 invalid_cursor`.

## No hay un total

La respuesta te dice si existe otra página (`meta.has_more`), no cuántos
registros hay en total. Contar el conjunto filtrado significaría un segundo
scan completo en cada página, que se pone más lento justo cuando el workspace
crece.

Si necesitas un conteo, pagina y cuenta lo que recibes.

## Ordenamiento

Pasa `sort` para ordenar una colección, por ejemplo `sort=-created_at` para
los más nuevos primero. Mantén `sort` idéntico en cada página de un mismo
recorrido — cambiarlo a mitad invalida el cursor.

## Cómo elegir un limit

`limit` por defecto es 25 y acepta hasta 100. Páginas más grandes significan
menos round trips; páginas más chicas, respuestas individuales más rápidas.
Para un sync masivo, 100 suele ser lo correcto.
