Skip to main content
GET
/
catalog
/
changes
const lasso = new LassoClient({ apiKey: 'lasso_...' });

// Initial sync
let result = await lasso.catalog.changes({ since: '2026-05-01T00:00:00Z' });
let allProducts = result.products;

// Paginate through all changes
while (result.has_more) {
  result = await lasso.catalog.changes({
    since: '2026-05-01T00:00:00Z',
    cursor: result.next_cursor,
  });
  allProducts.push(...result.products);
}

// Store sync_timestamp for next cycle
const nextSince = result.sync_timestamp;
{
  "products": [
    {
      "id": "a1b2c3d4-...",
      "schema_id": "e5f6a7b8-...",
      "source": "manual",
      "status": "active",
      "attributes": {
        "title": "Premium Widget",
        "sku": "WDG-001",
        "description": "A beautifully crafted premium widget...",
        "price": 29.99
      },
      "created_at": "2026-05-01T12:00:00Z",
      "updated_at": "2026-05-27T09:15:00Z"
    }
  ],
  "next_cursor": "eyJ1cGRhdGVkX2F0IjoiMjAyNi0wNS0yN1QwOToxNTowMFoiLCJpZCI6ImExYjJjM2Q0LSJ9",
  "has_more": true,
  "sync_timestamp": "2026-05-27T12:00:00Z"
}

Documentation Index

Fetch the complete documentation index at: https://productlasso.com/docs/llms.txt

Use this file to discover all available pages before exploring further.

Returns products ordered by updated_at ascending, filtered to only include products updated after the specified timestamp. Designed for incremental sync patterns — call periodically with the sync_timestamp from the previous response to get only new changes.
since
string
required
ISO 8601 timestamp. Only products updated after this time are returned.
page_size
integer
default:"100"
Number of products per page (1-200).
cursor
string
Cursor for pagination. Use next_cursor from the previous response.
schema_id
string
Optional filter to a specific catalog schema.
status
string
Optional filter by product status (draft, active, archived).
products
array
Array of products updated after the since timestamp, ordered oldest-first.
next_cursor
string
Cursor for the next page. null when no more results.
has_more
boolean
Whether there are more pages to fetch.
sync_timestamp
string
Server timestamp at query start. Store this and pass it as since on your next sync cycle to ensure no changes are missed.
Always store the sync_timestamp from the first page of a sync cycle and use it for the next cycle. Do not use timestamps from subsequent pages, as new changes may occur between pages.
const lasso = new LassoClient({ apiKey: 'lasso_...' });

// Initial sync
let result = await lasso.catalog.changes({ since: '2026-05-01T00:00:00Z' });
let allProducts = result.products;

// Paginate through all changes
while (result.has_more) {
  result = await lasso.catalog.changes({
    since: '2026-05-01T00:00:00Z',
    cursor: result.next_cursor,
  });
  allProducts.push(...result.products);
}

// Store sync_timestamp for next cycle
const nextSince = result.sync_timestamp;
{
  "products": [
    {
      "id": "a1b2c3d4-...",
      "schema_id": "e5f6a7b8-...",
      "source": "manual",
      "status": "active",
      "attributes": {
        "title": "Premium Widget",
        "sku": "WDG-001",
        "description": "A beautifully crafted premium widget...",
        "price": 29.99
      },
      "created_at": "2026-05-01T12:00:00Z",
      "updated_at": "2026-05-27T09:15:00Z"
    }
  ],
  "next_cursor": "eyJ1cGRhdGVkX2F0IjoiMjAyNi0wNS0yN1QwOToxNTowMFoiLCJpZCI6ImExYjJjM2Q0LSJ9",
  "has_more": true,
  "sync_timestamp": "2026-05-27T12:00:00Z"
}