Every NFT transfer is decoded and indexed, so one collection's history is a filtered read. Each row names the token, its sender and its recipient. One key, one call:
value is the token id as a serialized Clarity value in hex, not a plain number. A collection's ids are usually uint, which decodes to the number you know from the marketplace.
for(const transfer of page.events)awaitsave(transfer);
cursor = page.next_cursor;
}while(cursor);
Pass a start height or a cursor, never both: drop the height once you hold a cursor. A cursor only resumes under the order that issued it. For a one-off export, walk() does the paging for you; it keeps no checkpoint (list, walk, consume).
Hosted reads are metered, with a free monthly allowance (What it costs). A popular collection means many rows, so narrow by height before you page, and request fields to trim each row.
Every filter and the response schema: List NFT transfers. The decoded feeds are described in Index.