Pular para o conteúdo principal

Listagem e Paginação

Todos os endpoints GET que retornam coleções (/v1/portal_users, /v1/dashboard_users, /v1/team_roles, etc.) usam paginação por número de página.

Parâmetros​

Enviados via query string:

ParâmetroTipoDefaultDescrição
pageinteiro ≥ 11Página solicitada (começa em 1).
per_pageinteiro 1–10020Quantidade de itens por página. Máximo 100.
sort_bystringvaria por recursoCampo usado para ordenar. Aceita os mesmos nomes da resposta.
sort_orderasc ou descdescDireção da ordenação.

Valores fora dos limites são clampados (ex.: per_page=999 vira 100; page=0 vira 1).

Resposta​

Toda listagem segue este envelope:

{
"data": [
{ "id": "8b2f4c1e-6a3d-4f0b-9c7e-2d5a1b3c4d5e", "email": "joao@example.com", "status": "active", "tenant_id": "cliente-1042" }
],
"meta": {
"total": 142,
"page": 1,
"per_page": 20,
"total_pages": 8
}
}
CampoDescrição
dataArray com os itens da página atual.
meta.totalTotal de itens que atendem aos filtros (não só os retornados).
meta.pagePágina atual.
meta.per_pageItens por página efetivamente aplicado.
meta.total_pagesNúmero total de páginas (ceil(total / per_page)).

A última página pode conter menos que per_page itens. Quando page > total_pages, data vem vazio (não é erro).

Exemplos​

Primeira página, padrão​

curl -H "Authorization: Bearer $KOBANA_TOKEN" \
'https://api.dashboards.sandbox.kobana.com.br/v1/portal_users'

Página 3 com 50 itens​

curl -H "Authorization: Bearer $KOBANA_TOKEN" \
'https://api.dashboards.sandbox.kobana.com.br/v1/portal_users?page=3&per_page=50'

Ordenado por created_at ascendente​

curl -H "Authorization: Bearer $KOBANA_TOKEN" \
'https://api.dashboards.sandbox.kobana.com.br/v1/portal_users?sort_by=created_at&sort_order=asc'

Filtros + paginação​

Filtros específicos do recurso convivem com page/per_page:

curl -H "Authorization: Bearer $KOBANA_TOKEN" \
'https://api.dashboards.sandbox.kobana.com.br/v1/portal_users?status=active&email=joao&page=2&per_page=25'

Iterando todas as páginas​

Padrão recomendado em pseudo-código:

async function fetchAll(url, token) {
const out = [];
let page = 1;
while (true) {
const res = await fetch(`${url}?page=${page}&per_page=100`, {
headers: { Authorization: `Bearer ${token}` },
});
const { data, meta } = await res.json();
out.push(...data);
if (page >= meta.total_pages) break;
page += 1;
}
return out;
}

Boas práticas​

  • Para sincronização incremental, prefira filtrar por updated_at_gte (ou similar disponível no endpoint) ao invés de varrer todas as páginas.
  • per_page=100 minimiza o número de requisições e consome menos do limite de requisições.
  • Faça cache de meta.total quando estiver renderizando paginadores; não recalcule a cada navegação.
  • Evite assumir ordem estável sem sort_by explícito — a ordem padrão pode mudar entre recursos.