# Paginação

> Como paginar listas na API do FORSI Chat com cursor: o campo proximo, o limite de 1 a 100 e exemplos prontos em JavaScript e Python.

Listas respondem `{"dados": [...], "proximo": "..."}`. Para a próxima página, repita a mesma chamada com `?cursor=` e o valor de `proximo`. Quando `proximo` vier `null`, acabou. Use `?limite=` de 1 a 100 (padrão 50).

- O cursor é opaco: não monte nem altere; só devolva o que recebeu. Cursor estranho dá `422 cursor_invalido`.
- Mantenha os mesmos filtros entre as páginas.
- Rotas com cursor: [`GET /mensagens`](https://docs.forsi.com.br/api/mensagens/listar-mensagens-org), [`GET /conversas`](https://docs.forsi.com.br/api/conversas/listar-conversas), [`GET /conversas/{id}/mensagens`](https://docs.forsi.com.br/api/conversas/listar-mensagens), [`GET /contatos`](https://docs.forsi.com.br/api/contatos/listar-contatos), [`GET /negocios`](https://docs.forsi.com.br/api/funil/listar-negocios), [`GET /negocios/{id}/notas`](https://docs.forsi.com.br/api/funil/listar-notas-negocio), [`GET /agendas`](https://docs.forsi.com.br/api/agenda/listar-agendas), [`GET /compromissos`](https://docs.forsi.com.br/api/agenda/listar-compromissos), [`GET /bloqueios`](https://docs.forsi.com.br/api/agenda/listar-bloqueios), [`GET /equipe/membros`](https://docs.forsi.com.br/api/equipe/listar-membros), [`GET /equipe/presenca`](https://docs.forsi.com.br/api/equipe/listar-presenca), [`GET /equipe/convites`](https://docs.forsi.com.br/api/equipe/listar-convites), [`GET /equipe/equipes`](https://docs.forsi.com.br/api/equipe/listar-equipes), [`GET /regras-comentario`](https://docs.forsi.com.br/api/automacoes/listar-regras-comentario).
- Estas listas vêm inteiras, sem cursor: [`GET /modelos`](https://docs.forsi.com.br/api/modelos/listar-modelos), [`GET /webhooks`](https://docs.forsi.com.br/api/webhooks/listar-webhooks), [`GET /webhooks/{id}/entregas`](https://docs.forsi.com.br/api/webhooks/listar-entregas), [`GET /funis`](https://docs.forsi.com.br/api/funil/listar-funis), [`GET /instagram/contas`](https://docs.forsi.com.br/api/automacoes/listar-contas-instagram), [`GET /automacoes`](https://docs.forsi.com.br/api/automacoes/listar-automacoes-de-comentario).
- Entregas de webhook usam `?antes=<id da última entrega vista>` em vez de cursor.

```js title="JavaScript"
async function todasAsConversas() {
  const itens = [];
  let cursor = null;
  do {
    const url = new URL('https://chat.forsi.com.br/api/v1/conversas');
    url.searchParams.set('limite', '100');
    if (cursor) url.searchParams.set('cursor', cursor);
    const resposta = await fetch(url, { headers: { Authorization: 'Bearer ' + process.env.FORSI_CHAVE } });
    const json = await resposta.json();
    if (!resposta.ok) throw new Error(json.erro.codigo + ': ' + json.erro.mensagem);
    itens.push(...json.dados);
    cursor = json.proximo; // null quando acabou
  } while (cursor);
  return itens;
}
```

```python title="Python"
import os
import requests

def todas_as_conversas():
    itens, cursor = [], None
    while True:
        params = {"limite": 100, **({"cursor": cursor} if cursor else {})}
        resposta = requests.get(
            "https://chat.forsi.com.br/api/v1/conversas",
            headers={"Authorization": "Bearer " + os.environ["FORSI_CHAVE"]},
            params=params,
            timeout=30,
        )
        corpo = resposta.json()
        resposta.raise_for_status()
        itens += corpo["dados"]
        cursor = corpo.get("proximo")
        if not cursor:
            return itens
```

---

Página: https://docs.forsi.com.br/paginacao · Índice: https://docs.forsi.com.br/llms.txt · Tudo num arquivo: https://docs.forsi.com.br/llms-full.txt
