Skip to main content

Catalog Data Model

This document defines the customer-facing data model used across REST API, webhooks, MCP, and UCP endpoints.

Product​

FieldTypeRequiredNotes
idstringResponse onlyInternal product UUID.
catalogIdstringResponse only10 digit product ID used by cart and agent tools.
storeIdstringYes on createStore UUID in write requests. Responses expose it as scope.storeId.
scopeobjectResponse onlyPer-product { merchantId, storeId } ownership. It is repeated on every product so multi-merchant and multi-store result sets are unambiguous.
skustringNoStore SKU. Used for idempotent upsert. Max 120 chars.
externalIdstringNoSource system product ID. Used for idempotent upsert. Max 255 chars.
namestringYesProduct name. Max 255 chars.
descriptionstringNoProduct description.
pricenumberYesMust be 0 or greater.
currencystringNo3-letter currency. Defaults to USD.
statusstringNodraft, active, or archived. Defaults to active.
inStockbooleanNoDefaults to true.
inventoryQuantitynumberNoInteger, 0 or greater. Defaults to 0.
imageUrlstringNoLegacy/public primary image URL. Synchronized with the first imageUrls entry.
imageUrlsstring[]NoOrdered public image gallery, maximum 20 valid URLs. The first entry is the primary image.
productUrlstringNoPublic product page URL.
metadataobjectNoInternal integration metadata.
otherDetailsobjectNoFlexible business attributes.
variantsarrayNoVariant objects. Defaults to [].

Images are optional. Send imageUrls when a product has a gallery. For backward compatibility, clients may continue sending only imageUrl; when imageUrls is present, its first URL becomes imageUrl. Product snapshots stored in cart items include both fields.

Variant​

Variant fields mirror product commercial fields but are stored under the parent product.

FieldTypeRequired
skustringNo
externalIdstringNo
namestringYes
descriptionstringNo
pricenumberYes
currencystringNo
statusstringNo
inStockbooleanNo
inventoryQuantitynumberNo
imageUrlstringNo
productUrlstringNo
otherDetailsobjectNo

Example:

{
"sku": "HOODIE-BLK-M",
"externalId": "shopify_variant_123",
"name": "Black Hoodie / Medium",
"price": 49.9,
"currency": "USD",
"status": "active",
"inStock": true,
"inventoryQuantity": 8,
"imageUrl": "https://cdn.example.com/hoodie-black-m.png",
"productUrl": "https://store.example.com/products/hoodie?variant=black-m",
"otherDetails": {
"color": "black",
"size": "M"
}
}

Use otherDetails for structured attributes that do not need dedicated top-level fields.

{
"brand": "Example Brand",
"category": "Apparel",
"tags": ["hoodie", "black", "bestseller"],
"material": "cotton",
"gender": "unisex",
"color": "black",
"sizeSystem": "US",
"fulfillment": {
"warehouse": "east",
"shipsInDays": 2
}
}

Cart​

FieldTypeNotes
idstringInternal cart UUID.
scopeobject{ merchantId, storeId } ownership of this cart.
checkout.idstringCheckout identifier returned after cart creation.
statusstringopen, checkout_created, or completed state when applicable.
itemsarrayCart line items.
totalQuantitynumberSum of item quantities.
totalAmountstringTotal amount as decimal string.
currencystringCart currency.
metadataobjectInternal metadata.
otherDetailsobjectChannel or agent context.

Cart item input:

FieldTypeRequiredNotes
catalogIdstringYes10 digit product ID.
quantitynumberYesInteger, minimum 1.
metadataobjectNoInternal metadata.
otherDetailsobjectNoChannel context.

Order​

FieldTypeNotes
idstringInternal order UUID.
orderIdstringGenerated public order ID.
scopeobject{ merchantId, storeId } ownership of this order.
cart.idstringSource cart UUID.
checkout.idstringCheckout ID used to complete the order.
payment.idstringPayment ID supplied by the caller or generated internally when omitted.
customerobjectCustomer data.
shippingAddressobjectShipping address.
billingAddressobjectOptional billing address.
paymentobjectOptional on create. A supplied id is preserved; otherwise an internal payment reference is generated. Optional status, when supplied, must be paid.
statusstringcompleted or cancelled.
itemsarrayImmutable order item snapshots.
totalQuantitynumberTotal item quantity.
totalAmountstringOrder total.
currencystringOrder currency.
metadataobjectInternal metadata.
otherDetailsobjectIntegration-specific order data.

Example customer:

{
"name": "Example User",
"email": "user@example.com",
"phone": "+15551112233"
}

Example address:

{
"line1": "Example Street 1",
"line2": "Apt 4",
"city": "Example City",
"region": "NY",
"country": "US",
"postalCode": "10001"
}

Identity Rules​

  • id is the Thyris product UUID. Use it for direct product updates/deletes after a product has been created.
  • catalogId is for cart creation and agent tools.
  • sku and externalId are used for idempotent product upsert within the same store.
  • If sku and externalId match different products in the same store, the API returns 409.
  • Delete webhook events use sku and/or externalId, not catalogId.