Large lists and paging
Every list the API returns (Projects, Scenarios, Runs, Policies, Violations, a
project’s attached Policies, Calibration labels, Feedback) is capped — at most
500 rows per request, with a smaller default for a few endpoints (100 for
Runs/Policies/Violations, 200 for Scenarios) that matches what the dashboard
already fetches. A tenant below the cap sees no difference at all. Once a
tenant crosses it, a caller building its own integration against the API (the
dashboard and CLI stay under the caps today) asks for the next page with
offset; a response that came back full carries an X-Next-Offset header
naming where the next page starts, and a response that came back short of the
cap is the last page. Rows come back in a stable order that never skips or
repeats one across pages — newest-first for every list except a project’s
attached Policies, which stays in the order they were attached (oldest
attachment first), matching the Policies tab it feeds.
The Team page’s Members, Invitations and API keys lists page the same way, 500
rows at a time. Next appears whenever a page comes back full, because
that is when the API sends X-Next-Offset; it cannot tell a full last page
from one with more behind it, so a list of exactly 500 shows Next and an empty
second page that reads “No more members.” (or invitations, or API keys). The
Previous / Next buttons show at a section’s foot whenever you are past
the first page or Next exists; a list shorter than 500 shows none. Each list
keeps its own place in the URL (members_offset, invitations_offset,
api_keys_offset), so paging one list leaves the others where they are and a
page is a link you can share. The Team forms also check the API’s own length
limits when you save (issuer URL 2048 characters, client ID 512, group claim
200, invitation email 320, API key name 200, at most 100 admission groups of
at most 300 characters each): an over-long value is kept as you typed or pasted
it, not cut short, and the form says which field is too long instead of sending
a request the API would refuse.