Product-only Attribute extensions
Useattribute_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.
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. Sendexpected_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.

