> ## 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.

# Catalog API

> Create, synchronize, and extend Catalog products through the public API.

The Catalog API stores company products against a base Product Schema. Public responses return active Shared Attribute values, product source and status, timestamps, and product-only Attribute extensions.

## Product-only Attribute extensions

Use `attribute_extension_ids` when a product needs active Shared Attributes that do not belong to its base schema. The API accepts up to 2,000 unique Shared Attribute UUIDs.

```json theme={null}
{
  "schema_id": "11111111-1111-4111-8111-111111111111",
  "attributes": {
    "sku": "SKU-1042",
    "season": "winter"
  },
  "attribute_extension_ids": [
    "22222222-2222-4222-8222-222222222222"
  ]
}
```

Create attaches the supplied extensions. Patch preserves existing extensions when `attribute_extension_ids` is omitted or empty. Use `remove_attribute_extension_ids` to detach product-only Attributes and remove their values or relation links atomically. You cannot detach base-schema Attributes this way.

Responses expose each extension as `{ "attribute_id", "key" }` in `attribute_extensions`.

## Concurrency and validation

Catalog writes validate values against active Shared Attribute definitions. Missing, foreign, or archived extension UUIDs fail without revealing another company's Attribute inventory. Send `expected_updated_at` on patch to reject stale writes with `409`.

## Listing and synchronization

`GET /catalog` uses keyset pagination and supports status, source, search, and schema filters. Pass `next_cursor` back unchanged.

Use `GET /catalog/changes` for incremental synchronization. It returns products oldest-first after `since`. Keep the first page's `sync_timestamp` and use it as `since` for the next cycle.

## Webhooks

Managed Catalog webhooks cover product and Attribute create, update, and delete events. You can inspect delivery history, send test events, and explicitly redeliver failed attempts. See [Webhooks](/docs/api-reference/webhooks).
