Paginação

Como paginar os endpoints de listagem — pageNumber, pageSize e a armadilha de trocar o tamanho no meio.

Os endpoints de listagem são paginados por dois atributos enviados no corpo da
requisição
— não na query string:

{
  "pageNumber": 1,
  "pageSize": 50
}
CampoSignificado
pageNumberQual página buscar. Começa em 1, não em 0
pageSizeQuantos itens por página. Máximo 100

A resposta

{
  "pageNumber": 1,
  "pageSize": 50,
  "totalPages": 5,
  "totalItems": 250,
  "hasMorePages": true,
  "items": [ { "…": "…" } ]
}

Os registros vêm em items. Para saber se acabou, use hasMorePages — é
mais direto e menos sujeito a erro do que comparar pageNumber com
totalPages.

A armadilha: não mude o pageSize no meio

pageNumber é um deslocamento calculado a partir do pageSize. Trocá-lo entre
uma chamada e a próxima faz a mesma pageNumber apontar para um recorte
diferente da coleção — e o resultado é registro pulado ou repetido, sem
nenhum erro que denuncie.

Escolha um pageSize antes de começar e mantenha até o fim da iteração.

# errado: o tamanho muda entre as páginas
{"pageNumber": 1, "pageSize": 100}
{"pageNumber": 2, "pageSize": 50}   # não é a "segunda metade" do que veio antes

# certo: tamanho constante
{"pageNumber": 1, "pageSize": 100}
{"pageNumber": 2, "pageSize": 100}

Percorrendo tudo

page=1
while : ; do
  resp=$(curl -s -X POST https://api.hub.allbound.ia.br/core/v1/contact/filter \
    -H "Authorization: Bearer pn_SEU_TOKEN_AQUI" \
    -H "Content-Type: application/json" \
    -d "{\"pageNumber\": $page, \"pageSize\": 100}")

  echo "$resp" | jq -r '.items[]'
  [ "$(echo "$resp" | jq -r '.hasMorePages')" = "true" ] || break
  page=$((page + 1))
done

pageSize: 100 é o máximo e o que menos consome cota: percorrer 1.000 registros
custa 10 requisições em vez de 100. Ver Rate limiting.