Pagination and cursors
Signed cursors, what they bind to, and why a cursor stops working after a generation change.
Universe implementation Verified 2026-08-31
Describes what a Bitcoin Universe service actually does today. It is not a statement about the protocol in general.
- Page ID
-
develop/pagination-and-cursors - Normative authority
- Universe implementation documentation
- Networks
- mainnet
- Documentation version
- 2026.08
- Audience
- developer, integrator
- Owner
- bitcoin-universe-docs
- Sources
-
- Universe ARC-20 index and Marketplace v1 authority
at
670030e50071private repository - Universe Atomicals NFT, Realm, and Subrealm index
at
1d9109c68d95private repository
- Universe ARC-20 index and Marketplace v1 authority
at
Esta página aún no está disponible en tu idioma.
Cursors are opaque and signed
Section titled “Cursors are opaque and signed”A cursor is an opaque token. Do not parse it, construct one, or modify one. The ARC-20 feed signs cursors with a dedicated secret, separate from the bearer token, so a tampered cursor is rejected rather than silently misinterpreted.
What a cursor binds to
Section titled “What a cursor binds to”A cursor refers to a position inside an immutable generation. It also preserves the page and holder chunk sizes it was created with.
Two consequences:
- A cursor is only valid for its generation. When the generation changes, restart the listing.
- Changing the page size mid-listing does not work. The cursor already carries the sizes.
Bootstrap cursors
Section titled “Bootstrap cursors”A cursor-free request against the ARC-20 feed may need to build an immutable generation first. In that case the service copies a bounded number of rows and returns a retryable unavailable response until the generation is ready.
Retries resume and reuse the same source fingerprint. Source movement abandons an unfinished generation. That bounds writer time and stops repeated requests from duplicating complete histories.
A client must therefore treat a retryable unavailable response as normal during bootstrap, not as a failure.
Paging patterns
Section titled “Paging patterns”| Surface | Pattern |
|---|---|
| Asset listings | Cursor plus limit |
| Holder listings | Page number plus limit |
| History | Limit, bounded |
| Feed pages | Signed cursor plus limit |
Where a truncated flag is returned, honour it. It means there was more and the response stopped,
not that there was nothing more.
Rules for a client
Section titled “Rules for a client”- Treat the cursor as opaque.
- Restart the listing when the generation identifier changes.
- Never merge pages from two generations into one result set.
- Handle a retryable unavailable response during bootstrap with backoff.
- Respect
truncatedrather than assuming the list ended. - Bound your own total page count so a loop cannot run forever.