# Paging

- **Compare ids, not lengths.** Fetch two pages; if the second's ids equal the first's, the cursor does not advance. The report's `paging.paged_steps_without_new_files` counts pages that brought nothing new - dedup drops repeats silently.
- **A page smaller than asked, with the cursor set for the size asked**: the middle never arrives and the run looks complete at half. Ask with a margin, compare given with asked, ask no more than is given.
- **A feed that hits a ceiling and repeats its last page**: `until.empty` never fires. Ask for a page beyond the edge and set `paging.limit` by measurement.
- **`hasNextPage: false` with items left**: there is no paging; ask for the maximum in one request and name the ceiling.
- **`total_pages` that lies**: measure the edge with a request beyond it, at two page sizes.
- **`paging.next.cursor` names a value, not a template**: `"cursor": "{at+1}"` looks up a key called `at+1`. Compute it with an `extract` of kind `value` first.
- Page families: `link` (an address taken from the page) and `grow` (scroll and press, browser pages only).
