Admin cursor pagination
How dashboard and admin API lists return the next window without OFFSET or COUNT(*).
Admin list endpoints return:
{
"data": [],
"pageSize": 25,
"nextCursor": "opaque-versioned-value",
"hasNextPage": true
}Request the first window with pageSize (default 25, maximum 100). Follow-up windows send the previous nextCursor as cursor. page omitted or page=1 is accepted as the first window for existing callers. page greater than 1 returns HTTP 400 invalid_cursor and does not run OFFSET.
Malformed, wrong-version, or filter-mismatched cursors also return 400 invalid_cursor without leaking decoded internals.
totalCount and totalPagesOFFSET for dashboard navigationCSV audit export remains a bounded download (Take up to 5000 rows in a date range). It is not a paginated UI.
Public SCIM /Users and /Groups keep RFC 7644 startIndex/count. Do not send admin cursors there.
Each list keeps an in-memory cursor history for Previous/Next. Changing search, source, status, or other filters resets that history. Nested tables (SCIM mappings, sync events, client credentials, resource children) use Load more. User, organization, and FGA selectors search remotely and load more instead of requesting pageSize=500.
Client list summary counts are computed on the first window only. The dashboard caches that first-page summary while you walk Next.
FGA resource trees load a cursor window of roots. Children load from resources/{id}/children when a node is expanded. Access Tester and grant pickers search GET resources (any depth) instead of prefetching the tree. FGA stats run nine table counts in parallel on the stats endpoint only; list pages do not wait on those counts.
Replace:
GET /sqlos/admin/auth/api/users?page=2&pageSize=25with:
GET /sqlos/admin/auth/api/users?pageSize=25
GET /sqlos/admin/auth/api/users?pageSize=25&cursor={nextCursor}Keep the same search and other filters on every window. A cursor from a different filter set is rejected.
This cursor contract applies to SqlOS admin endpoints only. Application-level authorized lists compose BuildFilterAsync with plain EF pagination — see Paginating authorized lists.