productId may be a simple-product UUID or a variant UUID. For a product with
variants, update each variant rather than the parent product.
For the complete Spresso bootstrap, outcome, write, and recovery flow, see
Spresso integration.
Authentication and organization scope
Both endpoints require a bearer credential withcatalog:write.
OmniCommerce derives organizationId from the credential. Do not include an
organization ID in either request body.
Update Omni only
Marketplace synchronization is opt-in. OmittingsyncToMarketplaces, or setting
it to false, changes the OmniCommerce catalog without writing to a marketplace.
Synchronize marketplaces
SetsyncToMarketplaces to true to queue durable marketplace work. Without a
targets array, OmniCommerce queues all enabled and published accounts attached
to the product.
To limit the write, pass exact account targets:
{ platform, accountId } pair against the
product’s enabled, published marketplace accounts before changing the catalog.
An unknown, disabled, or unpublished target rejects the entire request.
Async response and job status
A marketplace sync request returns202 Accepted. jobIds contains the durable
jobs, and targets shows the immediate queue status for each account.
Webhook events
The local catalog transaction and outbound marketplace work are separate. A successful local value change emits:product.price.changedfor price, sale-price, or currency changesproduct.inventory.changedfor on-hand quantity changes
Source ownership safeguards
The endpoints keep the same catalog rules as the OmniCommerce workspace:- ERP-managed price or inventory must be changed in the ERP.
- Multi-source inventory must be changed through its source/location workflow.
- A sale price must remain below the list price.
- Active promotion assignments may prevent direct sale-price changes.
GET /api/v1/catalog/items with catalog:read to discover product and
variant UUIDs, pricing guardrail inputs, promotion context, and exact published
marketplace identities before writing.