Paginação
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,GET /conversas,GET /conversas/{id}/mensagens,GET /contatos,GET /negocios,GET /negocios/{id}/notas,GET /agendas,GET /compromissos,GET /bloqueios,GET /equipe/membros,GET /equipe/presenca,GET /equipe/convites,GET /equipe/equipes,GET /regras-comentario. - Estas listas vêm inteiras, sem cursor:
GET /modelos,GET /webhooks,GET /webhooks/{id}/entregas,GET /funis,GET /instagram/contas,GET /automacoes. - Entregas de webhook usam
?antes=<id da última entrega vista>em vez de cursor.
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;
}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