changedOutput schema / properties / catalogMatch / description
Previous value: -"Offers resolved by barcode rather than by matching titles. When present, prefer these and cite their prices over anything in `products`."New value: +"Offers WEM holds under one catalogue product. Check `identityBasis`: on `barcode` these are resolved by GTIN rather than by matching titles, so prefer them and cite their prices over anything in `products`. On `curated-grouping` the product carries no barcode, the grouping is an inference like any title match, and a cheaper row in `products` may well be the same item — see `cheaperElsewhere`."
addedOutput schema / properties / catalogMatch / properties / cheaperElsewhere
Added value: +{
+ "description": "Present only on a `curated-grouping` block that a live row in `products` undercuts. WEM is telling you its own catalogue block is not the best price it found. Quote this row as the cheaper option with its identity stated as unconfirmed; never present the catalogMatch price as the lowest when this is set.",
+ "properties": {
+ "identity": {
+ "description": "Always `inferred` — matched on title, not barcode. Say so when quoting it.",
+ "enum": [
+ "inferred"
+ ],
+ "type": "string"
+ },
+ "note": {
+ "description": "Plain-language restatement, safe to relay.",
+ "type": "string"
+ },
+ "savingVsCatalogue": {
+ "description": "How much cheaper this row is than the block’s lowest offer.",
+ "type": "number"
+ },
+ "verified": {
+ "description": "Always false.",
+ "type": "boolean"
+ }
+ },
+ "type": [
+ "object",
+ "null"
+ ]
+}
addedOutput schema / properties / catalogMatch / properties / identityBasis
Added value: +{
+ "description": "What this block’s identity rests on. `barcode` — the canonical product carries a GTIN and these offers are the same physical item. `curated-grouping` — it carries none, so the grouping is an inference of the same kind a title match is; do not describe it to the user as barcode-confirmed, and do not let it outrank a cheaper row in `products` on price alone.",
+ "enum": [
+ "barcode",
+ "curated-grouping"
+ ],
+ "type": "string"
+}
addedOutput schema / properties / catalogMatch / properties / lastConfirmedAt
Added value: +{
+ "description": "When WEM last read these offers — the freshness of this block.",
+ "type": [
+ "string",
+ "null"
+ ]
+}
addedOutput schema / properties / catalogMatch / properties / offers / items / properties / lastSeenAt
Added value: +{
+ "description": "When WEM last wrote this offer row.",
+ "type": [
+ "string",
+ "null"
+ ]
+}
addedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceAgeDays
Added value: +{
+ "description": "Whole days since WEM last wrote this price. Null means unknown age — report it as unknown rather than assuming it is current.",
+ "type": [
+ "number",
+ "null"
+ ]
+}
addedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceRefresh
Added value: +{
+ "description": "What re-reads this retailer’s prices: `live-api` a product-lookup API, `feed` a partner datafeed, `none` nothing at all. `none` means the figure is frozen at whatever seeded it and will not move however long it sits — say so rather than quoting it flat.",
+ "enum": [
+ "live-api",
+ "feed",
+ "none"
+ ],
+ "type": "string"
+}