Developers/Guides

Pagination and filters

List endpoints share one shape:

HTTP
GET /v1/templates?limit=50&sort=-updatedAt&filter[name][contains]=welcome&include=total
JSON
{
  "data": [
    {
      "id": "tpl_01JA2C4E6G8J0K2M4P6R8T0V2X",
      "name": "Welcome postcard",
      "folderId": null,
      "productId": "prd_01J9ZZZZZZZZZZZZZZZZZZZZP6",
      "productSpecificationId": "psp_01J9ZZZZZZZZZZZZZZZZZZZZA6",
      "draft": {
        "revision": 7,
        "updatedAt": "2026-10-14T15:20:11.000Z",
        "updatedById": "usr_01J9ZZZZZZZZZZZZZZZZZZZZU1"
      },
      "latestVersion": {
        "id": "tv_01JA2C4E6G8J0K2M4P6R8T0V3Y",
        "number": 3,
        "publishedAt": "2026-10-14T15:22:40.000Z",
        "publishedByType": "USER",
        "publishedById": "usr_01J9ZZZZZZZZZZZZZZZZZZZZU1",
        "staticLayerStatus": "READY"
      },
      "archivedAt": null,
      "createdAt": "2026-09-30T08:00:00.000Z",
      "updatedAt": "2026-10-14T15:22:40.000Z"
    }
  ],
  "nextCursor": "eyJzIjpbIjIwMjYtMTAtMTRUMTU6MjI6NDAuMDAwWiJdfQ",
  "hasMore": true,
  "totalCount": 132
}

Each row of data is the operation's list view (here a template); the example shows one of the fifty.

  • limit: 1 to 200, default 50.
  • cursor: the nextCursor of the previous page; keep the same sort and filters or the cursor is refused.
  • sort: comma separated field names, - prefix for descending; the reference lists the sortable fields per endpoint. Ties break on the id, so paging never skips or repeats a row.
  • filter[field]=value equals; filter[field][op]=value with eq, ne, in (comma separated), gte, gt, lte, lt, null (true or false) and contains (case-insensitive text). Dates accept RFC 3339 or YYYY-MM-DD.
  • include=total adds totalCount for the filter.

An unknown field, operator or value answers 422 validation_failed with one entry per parameter in errors, named as you wrote it (filter[status][in]).

The SDKs accept the nested form and serialise it:

TypeScript
await client.templates.list({ query: { filter: { status: { in: ['ACTIVE', 'ARCHIVED'] } } } });
Python
client.templates.list(query={"filter": {"status": {"in": ["ACTIVE", "ARCHIVED"]}}})