Paginação (cursor)
Cada resposta traz no máximo 1000 linhas (max_rows), ordenadas por
created_at DESC, id DESC. Quando há mais resultados, o campo next_cursor
vem preenchido; senão, vem null.
Para buscar a próxima página, repita a mesma requisição (mesmos filtros)
acrescentando ?cursor=<next_cursor>:
# Página 1
GET /?query=audits&inicio=2026-05-14
# → resposta inclui "next_cursor": "MjAyNi0w..."
# Página 2 (mesmos filtros + cursor da resposta anterior)
GET /?query=audits&inicio=2026-05-14&cursor=MjAyNi0w...
Como funciona
O cursor é um valor opaco (base64) que carrega a chave keyset (created_at, id)
da última linha vista. A consulta da próxima página busca as linhas "mais antigas"
que esse ponto:
created_at < <ts> OR (created_at = <ts> AND id < <id>)
Por ser keyset estável, a paginação não pula nem duplica linhas entre páginas
(diferente de OFFSET).
Regras
- Mantenha os mesmos filtros ao paginar — o cursor só faz sentido com a mesma query/filtros.
- Pare quando
next_cursorfornull. - Cursor inválido/corrompido →
400{"error":"cursor invalido","campo":"cursor"}.
Exemplo de laço (Ruby)
cursor = nil
loop do
params = {query: "audits", inicio: "2026-05-01", fim: "2026-05-30"}
params[:cursor] = cursor if cursor
uri = URI(base)
uri.query = URI.encode_www_form(params)
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("ATHENA_LAMBDA_API_KEY")
data = JSON.parse(Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }.body)
processa(data["rows"])
cursor = data["next_cursor"]
break if cursor.nil?
end