Skip to main content
com.trychannel3.catalog.global adds Channel3-specific fields on top of standard UCP catalog: store filters, seller details, URL lookup, and our id formats. It’s listed in the profile and works with search, lookup, and get_product. New here? Start with the overview or quickstart.

Request extensions

catalog.urls[] (lookup only)

lookup_catalog accepts store product page URLs in catalog.urls[], as well as product ids in catalog.ids[]:
{
  "catalog": {
    "urls": ["https://www.merchant.com/products/widget-blue"]
  }
}
Same behavior as POST /v1/lookup. If we can’t find the URL, you get messages[] with code: "not_found". Put page links in urls[], not ids[]. If a URL ends up in ids, we return use_catalog_urls.

catalog.filters

Extra filters on top of UCP categories and price. Filters combine with AND; multiple values in one field combine with OR.
FieldTypeNotes
website_idsstring[]Merchant ids (e.g. "lGBj") or domains (e.g. "nike.com"). Alias: shop_ids for Shopify-shaped clients
exclude_website_idsstring[]Same shape, inverted
conditionstring[]One or more of "new", "used", "refurbished". "secondhand" is accepted and normalized to "used"
availablebooleanWhen true (default), only in-stock variants. When false, no availability filter is applied
brand_idsstring[]Restrict to specific brands
exclude_brand_idsstring[]Inverse of brand_ids
category_idsstring[]Alias for categories - accepts category slug strings
exclude_category_idsstring[]Inverse
gender"male" | "female" | "unisex"Demographic
age"newborn" | "infant" | "toddler" | "kids" | "adult"Demographic
price.min and price.max are in cents (minor units). Example: 9995 means $99.95 USD.

catalog.context

The base spec defines context as buyer signals. We honor:
FieldNotes
currencyDefaults to USD. Used for price formatting and the price filter
language, country / address_countryLocale hints, used to bias content where available

catalog.placements (opt-in)

Set catalog.placements: ["affiliate"] to have variants carry a placement object with the affiliate commission earned on a converted sale. Requires a Token-tier API key — anonymous and UCP CLI callers never receive commission data. Omit the field (or pass []) and responses are unchanged.
{
  "catalog": {
    "query": "running shoes",
    "placements": ["affiliate"]
  }
}

Response extensions

products[]

Standard UCP product fields, plus Channel3 metadata. Buy and store links live on variants[] only (same as Shopify — products[].url is omitted).
FieldTypeNotes
metadata.top_featuresstring[]Channel3-curated feature highlights
metadata.unique_selling_pointsstring[]Single-line USP, when available
metadata.attributes[{name, value}]Extracted product attributes

options and selected (get_product)

Standard UCP fields for variant selection (color, size, etc.). Returned on get_product only — not on search or lookup.
FieldNotes
options[]Selectable dimensions. Each value has label and an exists flag — whether that value exists on the product, or only on a sibling variant (e.g. a color offered only in some sizes).
selected[]Effective selections after server-side relaxation — diff against your request to detect relaxation
See Get product for catalog.selected and catalog.preferences.

products[]

A UCP products[] entry is a Channel3 product (one product across all stores). Per-store listings are in variants[] — when several stores sell the same product, each store’s offer is its own entry in variants[], so multiple offers for one product are multiple variants, not a nested list:
FieldNotes
idChannel3 product id. On get_product, when catalog.selected resolves to a different variant, this reflects the resolved product.
titleProduct title from the graph, not a single store’s PDP title
price_rangeMin/max across the product’s variants, in UCP minor units
options[]Selectable dimensions (Color, Size, …) when the product has variants — get_product only

variants[] (per-store listings)

Each variant is one store’s listing of the product:
{
  "id": "HvGOfxD:lGBj:01KJ38CXYZ9CJ8K2Y9HDYQ8DXT",
  "title": "Velociti Pace Running Shoes - 8",
  "url": "https://buy.trychannel3.com/HvGOfxD-lGBj-public_ucp?o=01KJ38CXYZ9CJ8K2Y9HDYQ8DXT",
  "price": { "amount": 9995, "currency": "USD" },
  "availability": { "available": true },
  "seller": {
    "id": "lGBj",
    "name": "SHOEBACCA.com",
    "domain": "shoebacca.com",
    "url": "https://www.shoebacca.com"
  },
  "condition": ["new"],
  "placement": {
    "type": "affiliate",
    "commission": { "percentage": { "value": 12.5 } }
  }
}
FieldNotes
variants[].idVariant id — product:store:sku
variants[].urlAttributed buy redirect (buy.trychannel3.com). Token embeds your vendor_id; Anonymous / UCP CLI use public_ucp
variants[].priceListing price in UCP minor units (cents)
variants[].availabilityStandard UCP shape ({ "available": true })
variants[].sellerThe store selling this listing. Use seller.domain with UCP CLI --business
variants[].seller.urlMerchant store homepage (same role as Shopify’s seller.url)
variants[].inputsWhen a variant matched a catalog.ids or catalog.urls entry, includes [{id, match}] with match: "exact" | "featured"
variants[].placementAffiliate commission on this offer. Present only with catalog.placements: ["affiliate"] on a Token-tier key — see Commissions

Commissions / placements

Placements are in preview and mirror Shopify’s catalog placement shape, so agents that already read commissions from a Shopify catalog read Channel3’s identically. Fields may change.
When you opt in with catalog.placements: ["affiliate"] on a Token-tier key, monetizable variants carry a placement:
"placement": {
  "type": "affiliate",
  "commission": { "percentage": { "value": 12.5 } }
}
FieldNotes
placement.type"affiliate"
placement.commission.percentage.valueCommission as a percentage number — 12.5 means 12.5% of the sale, paid on an attributed conversion via variants[].url (which carries your vendor_id)
  • Absent ≠ zero. A variant without placement has no disclosed commission (no affiliate program matched, or you didn’t opt in) — don’t treat a missing placement as 0%.
  • Commission is the vendor’s net share after Channel3’s cut. Actual payout depends on the affiliate program and locale; treat the value as an estimate.

Product ids

We use two id formats:
  • Product id (e.g. HvGOfxD) - one product across all stores
  • Variant id (e.g. HvGOfxD:lGBj:01KJ38CXYZ9CJ8K2Y9HDYQ8DXT) - one store’s listing: product:store:sku
Both work in catalog.ids[] and get_product. https://buy.trychannel3.com/... links also work in ids.

Messages

messages[] entries we emit:
codeWhenAction
not_foundLookup couldn’t resolve the id or URLTreat as a miss
invalid_urlA catalog.urls[] entry isn’t a valid HTTP URLFix the URL
use_catalog_urlsAn HTTP URL appeared in catalog.ids[]Move it to catalog.urls[]

Versioning

Current version: 2026-04-08 (see the profile).