Paginação, filtros e ordenação
Como percorrer listas grandes, filtrar resultados e ordenar as respostas da API pública.
Todo endpoint de listagem da API pública usa o mesmo contrato de paginação, os mesmos parâmetros de página e o mesmo formato de resposta. Os filtros mudam de recurso para recurso, mas seguem convenções previsíveis.
Duas variáveis de entrada:
| Parâmetro | Padrão | Limite | O que faz |
|---|---|---|---|
page | 1 | mínimo 1 | Número da página, começando em 1 |
pageSize | 20 | máximo 200 | Quantidade de registros por página |
curl "$SUNCHAT_BASE/v1/produto?page=2&pageSize=50" \
-H "X-Ambiente: $SUNCHAT_CONTA" \
-H "X-Authorization: X-Chave-Api $SUNCHAT_CHAVE"
Valor fora do intervalo devolve 422 com o campo apontado. A API não corrige o
número em silêncio, então pedir pageSize=500 é erro, e não 200.
A resposta é sempre um objeto com os registros em Items e os contadores ao lado.
Nunca um array solto na raiz.
{
"Items": [
{ "Id": "8f14e45f-ea6d-4a1c-9c1f-3b7d2a5e9c04", "Nome": "Camiseta branca" }
],
"Page": 2,
"PageSize": 50,
"TotalItems": 327,
"TotalPages": 7,
"HasNext": true,
"HasPrevious": true
}
| Campo | O que é |
|---|---|
Items | Os registros da página |
Page | A página devolvida |
PageSize | O tamanho de página aplicado |
TotalItems | Total de registros que atendem aos filtros, em todas as páginas |
TotalPages | Total de páginas com o pageSize atual |
HasNext | true se existe página seguinte |
HasPrevious | true se existe página anterior |
Use HasNext como condição de parada, e não uma comparação sua entre Page e
TotalPages:
page=1
while :; do
resposta=$(curl -s "$SUNCHAT_BASE/v1/produto?page=$page&pageSize=200" \
-H "X-Ambiente: $SUNCHAT_CONTA" \
-H "X-Authorization: X-Chave-Api $SUNCHAT_CHAVE")
echo "$resposta" | jq -c '.Items[]'
[ "$(echo "$resposta" | jq -r '.HasNext')" = "true" ] || break
page=$((page + 1))
done
A paginação é por deslocamento, com page, e não por cursor. Se registros forem
criados ou excluídos durante a varredura, um item pode aparecer duas vezes ou
nenhuma, porque ele muda de página no meio do caminho. Em cargas grandes,
prefira filtrar por um intervalo de datas fechado, algo como criacaoInicio e
criacaoFim, que não se move enquanto você lê.
Filtros vão na query string e são todos opcionais. Combiná-los aplica E
lógico: ?ativo=true&search=camiseta devolve produtos ativos que também casam com
"camiseta".
As convenções que se repetem em toda a API:
| Padrão | Significado | Exemplo |
|---|---|---|
search | Busca textual nos campos principais do recurso | ?search=maria |
id... | Filtra por um relacionamento | ?idContato=8f14e45f-... |
ids... | Aceita vários valores, repetindo o parâmetro | ?idsTags=a1b2...&idsTags=c3d4... |
ativo, ativa | Só ativos ou só inativos | ?ativo=false |
...Inicio e ...Fim | Intervalo de datas, extremos incluídos | ?criacaoInicio=2026-08-01&criacaoFim=2026-08-31 |
Parâmetro desconhecido é ignorado, sem erro. Confira o nome exato na página do endpoint, porque um filtro escrito errado não reclama: ele só não filtra, e a resposta parece boa demais.
O parâmetro sort recebe o nome do campo. Prefixe com - para inverter, e separe
por vírgula para ordenar por mais de um campo:
?sort=nome → nome crescente
?sort=-preco → preço decrescente
?sort=-preco,nome → preço decrescente e, dentro de cada preço, nome crescente
O nome do campo não diferencia maiúsculas de minúsculas.
Cada recurso aceita a sua própria lista. Campo fora dela é ignorado, e a listagem volta para a ordenação padrão.
| Recurso | Campos aceitos em sort |
|---|---|
| Anotações de negócio | dataDaCriacao |
| Atendimentos | dataDaCriacao, dataDaAtualizacao, timestamp |
| Cálculos de impostos | ncm, cest, ufDestino |
| Campos personalizados | nome, ordem |
| Canais | nome, dataDaCriacao |
| Departamentos | nome |
| Etiquetas | nome |
| Grupos de produto | nome, ordem |
| Listas de contato | nome |
| Operações | nome, ativa |
| Origens do negócio | nome |
| Pessoas | nome, codigo, cnpjCpf, dataDeCadastro |
| Pipelines | nome, id |
| Produtos | nome, preco, codigoPrincipal |
| Scripts | nome, valido |
| Tabelas de preço | nome, ativa, descontoMaximo, valorMinimoDeVenda |
| Tickets | codigo, assunto, abertoEm, fechadoEm, resolvidoEm, ultimaIteracao, dataDeVencimento, iteracoes |
| Tipos de atividade | nome |
| Usuários | nome, email, ativo |
| Variáveis globais | nome |
| Vendas | data, numero, valorTotal, nomePessoa |
Os recursos que ficaram fora da tabela (contatos, reuniões, ações agendadas,
negócios, atividades e motivos de venda) aceitam o parâmetro sort na
requisição mas têm ordenação fixa. Enviá-lo não muda nada. Ordene do seu lado,
ou acompanhe o Changelog da API.