records:read). A published-only key, the default for a new key, sees only published records, so your live site needs no filter for it; see Drafts and publishing. With an API key, a collection’s slug works wherever its ID does.
List records
GET /v1/collections/{collection_id}/records returns a page of records, newest first. Pass limit (1 to 100, 20 by default) and, for the next page, the next_cursor from meta; it is null on the last page. The SDKs’ list methods also loop over every page for you:
GET /v1/records/{record_id}. To find a record by its slug, filter the list on the slug field’s key, such as filter[slug]=hello-world: it returns at most one record, since slugs are unique.
Filter
Filter on field values withfilter[<key>]=value (equal), or with an operator, filter[<key>][<operator>]=value, for text, long_text, integer, decimal, boolean, date, enum, asset and relation fields. Filters combine with AND:
Values are read as the field’s type, so
"5" is not the integer 5. Dates take today, and dates with a time also now: filter[starts_on][gte]=today lists upcoming events. A plain date’s today is the day in UTC. A day given for a date with a time covers that day in the field’s time zone (UTC without one), so filter[starts][eq]=2026-10-09 is everything on 9 October there. A date with a time matches the same moment written with any offset.
Lists also filter on created_at, updated_at and published_at: filter[published_at][exists]=false lists unpublished records, for a key that sees them.
With curl, pass -g so the brackets reach the API as they are:
Sort
Sort bycreated_at (the default, newest first), updated_at, published_at (unpublished records sort earliest), or a text, number, date, boolean or enum field with one value: sort=price, or sort=-published_on for descending. Records with no value for the field come last either way, and text sorts by character code.
Embed related records and assets
Records store only the IDs of related records and assets. To get them in the same response, passexpand with up to five relation, asset or rich text field keys (for rich text, the assets its images show). Embedding needs permission to read what is embedded: records:read for relations, and assets:read for asset and rich text fields (403 otherwise).
expanded object keyed by field key. A related record or asset that no longer exists is null for a single-value field and left out of the list for a multiple one. With a published-only key, related unpublished records are left out too. To get rich text as HTML or Markdown, with its images, pass rich_text (Read HTML or Markdown).
Count
GET /v1/collections/{collection_id}/records/count answers how many records match, with the same filters as the list, without fetching them:
Keep a copy in sync
To copy content into your own store, list what changed since your last run withfilter[updated_at][gt]= and the time you last synced, sorted by updated_at. Deleted records aren’t in lists: add filter[deleted]=true to the same query to list those deleted since then, with a key that isn’t published-only. A deleted record can be restored for 30 days and is then purged, so run the sync at least that often; a restored record comes back in the first query.
For changes as they happen instead of on a schedule, subscribe to webhooks: a site that rebuilds on record.* and field.migrated stays current without polling.