Skip to main content
All list endpoints return paginated results using cursor-based pagination. This approach is stable even when items are added or removed between requests.

How it works

Every list response includes pagination metadata:

Paginating through results

To get all items, keep requesting with the cursor parameter until has_more is false:
Python example

Page size

Control page size with the limit parameter:

Incremental sync

Use updated_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.
An item’s 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
Store the timestamp before you start syncing. If the sync fails partway through, you can retry from the same checkpoint without missing changes.

Multi-value filters

Several filter parameters accept comma-separated values to match any of the given options:
Multi-value filters use OR logic — an item matches if it has any of the specified values.

Ordering

By default, items are ordered by updated_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 includes library_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.