How it works
Every list response includes pagination metadata:Paginating through results
To get all items, keep requesting with thecursor parameter until has_more is false:
Python example
Page size
Control page size with thelimit parameter:
Incremental sync
Useupdated_since to fetch only items that changed after a given timestamp. This is the most efficient way to keep a local copy of your library in sync.
updated_at reflects any change to the item or its associated data — status changes, reading progress, favorites, tag additions/removals, new annotations, and content re-extraction all advance the timestamp. For inbox items that have never been interacted with, updated_at is the time the item appeared in your inbox.
The updated_since parameter filters by updated_at and works with all other filters (status, tag, etc.). Combine it with pagination to sync large deltas:
Python example
Multi-value filters
Several filter parameters accept comma-separated values to match any of the given options:Ordering
By default, items are ordered byupdated_at descending (most recently changed first). This is optimized for incremental sync workflows.
You can also request position ordering to get items in the same order shown in the app:
No status filter is required for position orderings — items without a position sort last.
Position fields and incremental sync
Every item includeslibrary_position and inbox_position fields, regardless of the order parameter used. This means you can use order=updated with updated_since for efficient incremental sync, and still use the position fields to sort items locally into app order:
Annotations, tags, and other list endpoints always use
updated_at ordering.