Skip to main content
Most NDI list routes are keyset cursor pages. A few folder-style listings are offset pages. Do not mix the two.

Cursor pages

list methods return { items, next_cursor }. Pass ?cursor= (or the SDK cursor= argument) to fetch the next page. next_cursor is null on the last page. The Python and TypeScript SDKs expose iter_all / iterAll for:
  • workspaces
  • files
  • jobs
  • domains
Access labels use iter_access_labels / iterAccessLabels.
Do not invent page numbers. The cursor is opaque.

Offset pages

This listing uses offset / limit:
  • GET /v1/workspaces/{id}/files/{file_id}/outputs/{output_id}/members

Catalog tables

A catalog table from automatic search’s agent or a QA turn carries up to 200 rows; its next_cursor pages the rest through POST /v1/workspaces/{id}/filtered-search with { "type": "page", "cursor": "..." }. The Python SDK wraps that as client.search.filtered_page; the TypeScript SDK does not wrap it yet — call the HTTP route. A new filtered search ({ "type": "query", ... }, client.search.filtered) is deprecated; paging is not. Tables page through catalog entries. Each entry’s supporting sections stay together, and native register entries remain separate. Query wording does not change the result unit. total_matches counts entries and total_files counts distinct source files across all confirmed matches before top-N and paging. Pages of legacy results retain their stored grouping. Pages are live re-executions, so concurrent source changes may still move results between pages; catalog_drifted reports this. Content-verified selections do not issue catalog-only page cursors.