Skip to main content
Glama

WEM Price Compare

Find products by description

semantic_search
Read-only

Searches WEM's partner-feed products by meaning, for a plain-language need such as "comfortable shoes for standing all day" or "gift for a 10 year old who likes science". If the description is a product identifier (a barcode, ASIN, MPN, merchant SKU or wem3.ai/pl URL), that product is looked up instead and the reply takes the keyword-search shape. When no products come back, reason says why: index_empty means nothing matched; no_embedding_key, no_catalogue_client, embedding_failed, query_failed and timed_out mean the semantic index could not be searched this time, which says nothing about whether such products exist.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMax products to return (default 10, max 20).
categoryNoOptional. Keeps only products whose feed category matches this text exactly.
providerNoOptional. Keeps only products from this partner feed, e.g. "awin".
max_priceNoOptional upper price bound, compared with each product's listed price (currencies are not converted).
min_priceNoOptional lower price bound, compared with each product's listed price (currencies are not converted).
descriptionYesPlain-language description of what the shopper needs.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
nextNoPresent when WEM's set of offers is thin. chrome_extension is a page that compares the same product on any retailer page, including shops without an affiliate programme.
queryNo
reasonNoPresent when semantic is false, and never a judgement on the shopper query. `index_empty` — the vector query ran and matched nothing. `no_catalogue_client` / `no_embedding_key` — WEM is misconfigured, not the catalogue empty. `embedding_failed` / `query_failed` — an upstream call failed; retrying later may succeed. `timed_out` — an upstream call did not answer in time; this says nothing about the catalogue.
searchNoPresent when this result names no offer. `url` is WEM's results page for the query and `markdown` is the same link, pre-formatted. WEM searches retailers live on that page, including shops it holds no affiliate programme with, so an empty or withheld result here is not evidence the product is unavailable or unpriced.
filteredNoWithheld candidates tallied by reason (e.g. accessories, another model, a bundle or multipack, a replica, a listing priced far below the product’s other offers). Report this count rather than implying the search was exhaustive, and never quote a withheld listing’s price as the cheapest or as a deal.
productsYes
semanticNoTrue only when the vector path actually ran.
disclosureYesWEM’s affiliate disclosure for this answer, written to be quoted as it is. Its wording changes with the rows: it states whether every outbound link is affiliate-tracked, only some are, or none are. A version from an earlier answer may not fit this one: a row marked `affiliate: false` earns WEM nothing.
catalogMatchNoOffers WEM holds under one catalogue product. Check `identityBasis`: on `barcode` the product carries a GTIN and every offer here is that same item, 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`. Whether the shopper’s words reached this product by barcode or by name is `identity`, a separate question: on `inferred`, say WEM matched it by name.
totalResultsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / channel / description
      Previous value: -"retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. A marketplace cluster is not a set of competing authorised retailers."New value: +"retailer is a named shop (Boots, Currys). marketplace is AliExpress/Temu-style parallel listings. A marketplace cluster is not a set of competing authorised retailers."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / provider / description
      Previous value: -"Retailer slug, e.g. \"ebay\", \"currys\"."New value: +"Retailer slug, e.g. \"amazon\", \"currys\"."
    • changedOutput schema / properties / products / items / properties / channel / description
      Previous value: -"retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. A marketplace cluster is not a set of competing authorised retailers."New value: +"retailer is a named shop (Boots, Currys). marketplace is AliExpress/Temu-style parallel listings. A marketplace cluster is not a set of competing authorised retailers."
    • changedOutput schema / properties / products / items / properties / provider / description
      Previous value: -"Retailer slug, e.g. \"ebay\", \"currys\"."New value: +"Retailer slug, e.g. \"amazon\", \"currys\"."
  2. Changed2 schema fields changed
    • addedOutput schema / properties / catalogMatch / properties / offers / items / properties / shipping / description
      Added value: +"Delivery as the retailer stated it: `free`, or `cost` in the offer currency. Absent or null means not stated: say delivery is shown at the shop, never that it is free. Offers are ordered by item price; add a stated cost before calling one cheaper delivered."
    • addedOutput schema / properties / products / items / properties / shipping / description
      Added value: +"Delivery as the retailer stated it: `free`, or `cost` in the offer currency. Absent or null means not stated: say delivery is shown at the shop, never that it is free. Offers are ordered by item price; add a stated cost before calling one cheaper delivered."
  3. Changed32 schema fields changed
    • changedInput schema / properties / category / description
      Previous value: -"Optional category filter"New value: +"Optional. Keeps only products whose feed category matches this text exactly."
    • changedInput schema / properties / description / description
      Previous value: -"Natural language description of what the user is looking for"New value: +"Plain-language description of what the shopper needs."
    • changedInput schema / properties / limit / description
      Previous value: -"Max results (default 10, max 20)"New value: +"Max products to return (default 10, max 20)."
    • changedInput schema / properties / max_price / description
      Previous value: -"Maximum price (GBP)"New value: +"Optional upper price bound, compared with each product's listed price (currencies are not converted)."
    • changedInput schema / properties / min_price / description
      Previous value: -"Minimum price (GBP)"New value: +"Optional lower price bound, compared with each product's listed price (currencies are not converted)."
    • addedInput schema / properties / provider
      Added value: +{
      +  "description": "Optional. Keeps only products from this partner feed, e.g. \"awin\".",
      +  "type": "string"
      +}
    • changedOutput schema / properties / catalogMatch / properties / identity / description
      Previous value: -"How the shopper’s words reached this product. Decides how you describe the match: on `inferred`, say WEM matched it by name (not by barcode) and do not call the identity confirmed, even when `identityBasis` is `barcode`; on `exact`, the barcode itself resolved it."New value: +"How the shopper’s words reached this product. On `inferred`, WEM matched it by name (not by barcode) and the identity is not confirmed, even when `identityBasis` is `barcode`; on `exact`, the barcode itself resolved it."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / affiliate / description
      Previous value: -"False when this link earns WEM nothing: the shop has no affiliate programme with WEM, or this link does not carry one. Still a real offer: list it with the others, and never call its link affiliate-tracked. Absent (or true) means the link is affiliate-tracked. `disclosure` already states whether all, some or none of the links are tracked; relay that rather than your own wording."New value: +"False when this link earns WEM nothing: the shop has no affiliate programme with WEM, or this link does not carry one. It is still a real offer, and its link is not affiliate-tracked. Absent (or true) means the link is affiliate-tracked. `disclosure` states whether all, some or none of the links are tracked."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / channel / description
      Previous value: -"retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. Do not present a marketplace cluster as competing authorised retailers."New value: +"retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. A marketplace cluster is not a set of competing authorised retailers."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / lastSeenAt / description
      Previous value: -"When WEM last READ this price from the retailer or a datafeed — the same reading `priceAgeDays` counts from, so the two always agree. Null means WEM cannot date the price: say it is undated, never that it is current."New value: +"When WEM last READ this price from the retailer or a datafeed — the same reading `priceAgeDays` counts from, so the two always agree. Null means WEM cannot date the price: it is undated, not current."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / price / description
      Previous value: -"Indicative price. The retailer sets the final price at checkout. Null, with `priceNote`, when WEM may not show this listing’s price: show the note and the link, never a figure of your own."New value: +"Indicative price. The retailer sets the final price at checkout. Null, with `priceNote`, when WEM may not show this listing’s price: the note stands in place of a figure."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceAgeDays / description
      Previous value: -"Calendar days (UK time) since WEM last READ this price: 0 read today, 1 yesterday. Null means WEM cannot say. Report null as undated; never present it as current."New value: +"Calendar days (UK time) since WEM last READ this price: 0 read today, 1 yesterday. Null means WEM cannot say. Null is undated, not current."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceNote / description
      Previous value: -"Present only when `price` is null: the words to show in its place, e.g. \"See price at Amazon\". An Amazon price is shown only when Amazon’s API supplied it just now."New value: +"Present only when `price` is null: the words that stand in its place, e.g. \"See price at Amazon\". An Amazon price is shown only when Amazon’s API supplied it just now."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceQualifier / description
      Previous value: -"Present when `price` is the OPENING price of a range, not the price of this item: a multi-variation listing where the seller advertises its cheapest variant and the shopper picks a size on the page. Quote it as \"from £X\", never as the price or the cheapest. Absent means the price is firm for the row as described."New value: +"Present when `price` is the OPENING price of a range, not the price of this item: a multi-variation listing where the seller advertises its cheapest variant and the shopper picks a size on the page. It reads as \"from £X\"; it is not the item's price or the cheapest. Absent means the price is firm for the row as described."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceRefresh / description
      Previous value: -"What re-reads this retailer’s prices: `live-api` a product-lookup API, `feed` a partner datafeed, `none` nothing on a schedule. `none` means the figure will not move on its own however long it sits — say so rather than quoting it flat, and date it with `priceAgeDays`."New value: +"What re-reads this retailer’s prices: `live-api` a product-lookup API, `feed` a partner datafeed, `none` nothing on a schedule. `none` means the figure will not move on its own however long it sits ; `priceAgeDays` dates it."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceStatus / description
      Previous value: -"`current`: WEM read this price within the last 14 days; only a current price may lead, be called the cheapest or lowest, be compared or enter a saving. `stale`: read longer ago. `undated`: WEM cannot say when. Show those two as \"last seen £X on 8 Sep\" or \"price not dated\", after the current ones, and never compare them. Absent on a row a provider answered just now."New value: +"`current`: WEM read this price within the last 14 days; only a current price may lead, be called the cheapest or lowest, be compared or enter a saving. `stale`: read longer ago. `undated`: WEM cannot say when. Those two read as \"last seen £X on 8 Sep\" or \"price not dated\", come after the current ones, and are not compared. Absent on a row a provider answered just now."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / unitPrice / description
      Previous value: -"Price per 100ml, 100g, litre, kg or item, from the size this row's title states. Present only when the rows differ in size, in one unit across all of them, and only for things bought by the amount (beauty, food, supplements), never an appliance's capacity. When comparing value across sizes, compare these, never the prices: a smaller size is not cheaper because its price is lower. Quote it beside the price (\"£29.95, £99.83 per 100ml\"). Absent does not mean the price is per unit."New value: +"Price per 100ml, 100g, litre, kg or item, from the size this row's title states. Present only when the rows differ in size, in one unit across all of them, and only for things bought by the amount (beauty, food, supplements), never an appliance's capacity. Across sizes, value is compared on these, not on the prices: a smaller size is not cheaper because its price is lower. It reads beside the price (\"£29.95, £99.83 per 100ml\"). Absent does not mean the price is per unit."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / url / description
      Previous value: -"WEM tracked link to the retailer. Send the user here — WEM never takes payment."New value: +"WEM tracked link to the retailer page for this offer. WEM never takes payment."
    • changedOutput schema / properties / catalogMatch / properties / unpriced / description
      Previous value: -"Listings whose price WEM may not show — today, Amazon rows Amazon’s API did not price just now. Give the link with `priceNote` (\"See price at Amazon\"). Never state, estimate or compare a price for one, never call it the cheapest, and never count it in a lowest price or a saving."New value: +"Listings whose price WEM may not show — today, Amazon rows Amazon’s API did not price just now. The row carries `priceNote` (e.g. \"See price at Amazon\") in place of a figure. No price is stated, estimated or compared for one; it is not the cheapest and is not counted in a lowest price or a saving."
    • changedOutput schema / properties / catalogMatch / properties / unpriced / items / properties / priceNote / description
      Previous value: -"What to show where a price would be, e.g. \"See price at Amazon\"."New value: +"What stands where a price would be, e.g. \"See price at Amazon\"."
    • changedOutput schema / properties / catalogMatch / properties / unpriced / items / properties / url / description
      Previous value: -"WEM tracked link. Relay it exactly."New value: +"WEM tracked link. The full URL; a shortened form is a different link."
    • changedOutput schema / properties / disclosure / description
      Previous value: -"Disclosure to relay once per answer, verbatim. Its wording changes with the rows: it states whether every outbound link is affiliate-tracked, only some are, or none are. Never substitute the version you saw last time — a row marked `affiliate: false` earns WEM nothing, and saying otherwise misdescribes it to the shopper."New value: +"WEM’s affiliate disclosure for this answer, written to be quoted as it is. Its wording changes with the rows: it states whether every outbound link is affiliate-tracked, only some are, or none are. A version from an earlier answer may not fit this one: a row marked `affiliate: false` earns WEM nothing."
    • changedOutput schema / properties / next / description
      Previous value: -"Where to send the shopper when WEM's set is thin. chrome_extension means compare the same product on any retailer page — WEM shows that price even without an affiliate programme."New value: +"Present when WEM's set of offers is thin. chrome_extension is a page that compares the same product on any retailer page, including shops without an affiliate programme."
    • changedOutput schema / properties / products / items / properties / affiliate / description
      Previous value: -"False when this link earns WEM nothing: the shop has no affiliate programme with WEM, or this link does not carry one. Still a real offer: list it with the others, and never call its link affiliate-tracked. Absent (or true) means the link is affiliate-tracked. `disclosure` already states whether all, some or none of the links are tracked; relay that rather than your own wording."New value: +"False when this link earns WEM nothing: the shop has no affiliate programme with WEM, or this link does not carry one. It is still a real offer, and its link is not affiliate-tracked. Absent (or true) means the link is affiliate-tracked. `disclosure` states whether all, some or none of the links are tracked."
    • changedOutput schema / properties / products / items / properties / channel / description
      Previous value: -"retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. Do not present a marketplace cluster as competing authorised retailers."New value: +"retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. A marketplace cluster is not a set of competing authorised retailers."
    • changedOutput schema / properties / products / items / properties / price / description
      Previous value: -"Indicative price. The retailer sets the final price at checkout. Null, with `priceNote`, when WEM may not show this listing’s price: show the note and the link, never a figure of your own."New value: +"Indicative price. The retailer sets the final price at checkout. Null, with `priceNote`, when WEM may not show this listing’s price: the note stands in place of a figure."
    • changedOutput schema / properties / products / items / properties / priceNote / description
      Previous value: -"Present only when `price` is null: the words to show in its place, e.g. \"See price at Amazon\". An Amazon price is shown only when Amazon’s API supplied it just now."New value: +"Present only when `price` is null: the words that stand in its place, e.g. \"See price at Amazon\". An Amazon price is shown only when Amazon’s API supplied it just now."
    • changedOutput schema / properties / products / items / properties / priceQualifier / description
      Previous value: -"Present when `price` is the OPENING price of a range, not the price of this item: a multi-variation listing where the seller advertises its cheapest variant and the shopper picks a size on the page. Quote it as \"from £X\", never as the price or the cheapest. Absent means the price is firm for the row as described."New value: +"Present when `price` is the OPENING price of a range, not the price of this item: a multi-variation listing where the seller advertises its cheapest variant and the shopper picks a size on the page. It reads as \"from £X\"; it is not the item's price or the cheapest. Absent means the price is firm for the row as described."
    • changedOutput schema / properties / products / items / properties / priceStatus / description
      Previous value: -"`current`: WEM read this price within the last 14 days; only a current price may lead, be called the cheapest or lowest, be compared or enter a saving. `stale`: read longer ago. `undated`: WEM cannot say when. Show those two as \"last seen £X on 8 Sep\" or \"price not dated\", after the current ones, and never compare them. Absent on a row a provider answered just now."New value: +"`current`: WEM read this price within the last 14 days; only a current price may lead, be called the cheapest or lowest, be compared or enter a saving. `stale`: read longer ago. `undated`: WEM cannot say when. Those two read as \"last seen £X on 8 Sep\" or \"price not dated\", come after the current ones, and are not compared. Absent on a row a provider answered just now."
    • changedOutput schema / properties / products / items / properties / unitPrice / description
      Previous value: -"Price per 100ml, 100g, litre, kg or item, from the size this row's title states. Present only when the rows differ in size, in one unit across all of them, and only for things bought by the amount (beauty, food, supplements), never an appliance's capacity. When comparing value across sizes, compare these, never the prices: a smaller size is not cheaper because its price is lower. Quote it beside the price (\"£29.95, £99.83 per 100ml\"). Absent does not mean the price is per unit."New value: +"Price per 100ml, 100g, litre, kg or item, from the size this row's title states. Present only when the rows differ in size, in one unit across all of them, and only for things bought by the amount (beauty, food, supplements), never an appliance's capacity. Across sizes, value is compared on these, not on the prices: a smaller size is not cheaper because its price is lower. It reads beside the price (\"£29.95, £99.83 per 100ml\"). Absent does not mean the price is per unit."
    • changedOutput schema / properties / products / items / properties / url / description
      Previous value: -"WEM tracked link to the retailer. Send the user here — WEM never takes payment."New value: +"WEM tracked link to the retailer page for this offer. WEM never takes payment."
    • changedOutput schema / properties / search / description
      Previous value: -"Present when this result names no offer. GIVE THE USER THIS LINK — it is the answer when WEM has nothing else to say, and `markdown` is ready to paste. WEM searches retailers live on that page, including shops it holds no affiliate programme with, so an empty or withheld result here is not evidence the product is unavailable or unpriced."New value: +"Present when this result names no offer. `url` is WEM's results page for the query and `markdown` is the same link, pre-formatted. WEM searches retailers live on that page, including shops it holds no affiliate programme with, so an empty or withheld result here is not evidence the product is unavailable or unpriced."
  4. Changed12 schema fields changed
    • addedOutput schema / properties / catalogMatch / properties / lowPrice / description
      Added value: +"Lowest CURRENT price in `offers` (priceStatus `current`). Null when none is current: never fill it from an older or undated row."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / lastSeenAt / description
      Previous value: -"When WEM last VISITED this offer row — not when it read the price. The refresh sweep touches this even when the retailer lookup fails, so it is not evidence the price is current. Use `priceAgeDays` to date a price; never this."New value: +"When WEM last READ this price from the retailer or a datafeed — the same reading `priceAgeDays` counts from, so the two always agree. Null means WEM cannot date the price: say it is undated, never that it is current."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / price / description
      Previous value: -"Indicative price. The retailer sets the final price at checkout."New value: +"Indicative price. The retailer sets the final price at checkout. Null, with `priceNote`, when WEM may not show this listing’s price: show the note and the link, never a figure of your own."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / price / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceAgeDays / description
      Previous value: -"Whole days since WEM last actually READ this price from the retailer or a datafeed. Null means WEM cannot say — common and correct for Amazon, whose licence caps price retention at 24 hours. Report null as undated; never present it as current."New value: +"Calendar days (UK time) since WEM last READ this price: 0 read today, 1 yesterday. Null means WEM cannot say. Report null as undated; never present it as current."
    • addedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceNote
      Added value: +{
      +  "description": "Present only when `price` is null: the words to show in its place, e.g. \"See price at Amazon\". An Amazon price is shown only when Amazon’s API supplied it just now.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceStatus
      Added value: +{
      +  "description": "`current`: WEM read this price within the last 14 days; only a current price may lead, be called the cheapest or lowest, be compared or enter a saving. `stale`: read longer ago. `undated`: WEM cannot say when. Show those two as \"last seen £X on 8 Sep\" or \"price not dated\", after the current ones, and never compare them. Absent on a row a provider answered just now.",
      +  "enum": [
      +    "current",
      +    "stale",
      +    "undated"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / catalogMatch / properties / unpriced
      Added value: +{
      +  "description": "Listings whose price WEM may not show — today, Amazon rows Amazon’s API did not price just now. Give the link with `priceNote` (\"See price at Amazon\"). Never state, estimate or compare a price for one, never call it the cheapest, and never count it in a lowest price or a saving.",
      +  "items": {
      +    "properties": {
      +      "channel": {
      +        "enum": [
      +          "retailer",
      +          "marketplace"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "type": "string"
      +      },
      +      "priceNote": {
      +        "description": "What to show where a price would be, e.g. \"See price at Amazon\".",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "type": "string"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "WEM tracked link. Relay it exactly.",
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / products / items / properties / price / description
      Previous value: -"Indicative price. The retailer sets the final price at checkout."New value: +"Indicative price. The retailer sets the final price at checkout. Null, with `priceNote`, when WEM may not show this listing’s price: show the note and the link, never a figure of your own."
    • changedOutput schema / properties / products / items / properties / price / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • addedOutput schema / properties / products / items / properties / priceNote
      Added value: +{
      +  "description": "Present only when `price` is null: the words to show in its place, e.g. \"See price at Amazon\". An Amazon price is shown only when Amazon’s API supplied it just now.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / products / items / properties / priceStatus
      Added value: +{
      +  "description": "`current`: WEM read this price within the last 14 days; only a current price may lead, be called the cheapest or lowest, be compared or enter a saving. `stale`: read longer ago. `undated`: WEM cannot say when. Show those two as \"last seen £X on 8 Sep\" or \"price not dated\", after the current ones, and never compare them. Absent on a row a provider answered just now.",
      +  "enum": [
      +    "current",
      +    "stale",
      +    "undated"
      +  ],
      +  "type": "string"
      +}
  5. Changed3 schema fields changed
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / affiliate / description
      Previous value: -"False when this is a retailer page WEM observed without a programme. Still a real listing; the click is not commission-bearing. Absent means the usual partner path."New value: +"False when this link earns WEM nothing: the shop has no affiliate programme with WEM, or this link does not carry one. Still a real offer: list it with the others, and never call its link affiliate-tracked. Absent (or true) means the link is affiliate-tracked. `disclosure` already states whether all, some or none of the links are tracked; relay that rather than your own wording."
    • changedOutput schema / properties / filtered / description
      Previous value: -"Withheld candidates tallied by reason (e.g. accessories, wrong model). Report this count rather than implying the search was exhaustive."New value: +"Withheld candidates tallied by reason (e.g. accessories, another model, a bundle or multipack, a replica, a listing priced far below the product’s other offers). Report this count rather than implying the search was exhaustive, and never quote a withheld listing’s price as the cheapest or as a deal."
    • changedOutput schema / properties / products / items / properties / affiliate / description
      Previous value: -"False when this is a retailer page WEM observed without a programme. Still a real listing; the click is not commission-bearing. Absent means the usual partner path."New value: +"False when this link earns WEM nothing: the shop has no affiliate programme with WEM, or this link does not carry one. Still a real offer: list it with the others, and never call its link affiliate-tracked. Absent (or true) means the link is affiliate-tracked. `disclosure` already states whether all, some or none of the links are tracked; relay that rather than your own wording."
  6. Changed2 schema fields changed
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceRefresh / description
      Previous value: -"What re-reads this retailer’s prices: `live-api` a product-lookup API, `feed` a partner datafeed, `crawl` WEM reading the retailer’s own public product page, `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. A `crawl` price was observed on the retailer’s page rather than supplied by them, so date it with `priceAgeDays` and expect `affiliate: false` unless a programme also exists."New value: +"What re-reads this retailer’s prices: `live-api` a product-lookup API, `feed` a partner datafeed, `none` nothing on a schedule. `none` means the figure will not move on its own however long it sits — say so rather than quoting it flat, and date it with `priceAgeDays`."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceRefresh / enum
      Previous value: -[
      -  "live-api",
      -  "feed",
      -  "crawl",
      -  "none"
      -]New value: +[
      +  "live-api",
      +  "feed",
      +  "none"
      +]
  7. Changed2 schema fields changed
    • addedOutput schema / properties / catalogMatch / properties / offers / items / properties / unitPrice
      Added value: +{
      +  "description": "Price per 100ml, 100g, litre, kg or item, from the size this row's title states. Present only when the rows differ in size, in one unit across all of them, and only for things bought by the amount (beauty, food, supplements), never an appliance's capacity. When comparing value across sizes, compare these, never the prices: a smaller size is not cheaper because its price is lower. Quote it beside the price (\"£29.95, £99.83 per 100ml\"). Absent does not mean the price is per unit.",
      +  "properties": {
      +    "amount": {
      +      "type": "number"
      +    },
      +    "currency": {
      +      "description": "ISO 4217 code.",
      +      "type": "string"
      +    },
      +    "per": {
      +      "enum": [
      +        "100ml",
      +        "litre",
      +        "100g",
      +        "kg",
      +        "item"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / products / items / properties / unitPrice
      Added value: +{
      +  "description": "Price per 100ml, 100g, litre, kg or item, from the size this row's title states. Present only when the rows differ in size, in one unit across all of them, and only for things bought by the amount (beauty, food, supplements), never an appliance's capacity. When comparing value across sizes, compare these, never the prices: a smaller size is not cheaper because its price is lower. Quote it beside the price (\"£29.95, £99.83 per 100ml\"). Absent does not mean the price is per unit.",
      +  "properties": {
      +    "amount": {
      +      "type": "number"
      +    },
      +    "currency": {
      +      "description": "ISO 4217 code.",
      +      "type": "string"
      +    },
      +    "per": {
      +      "enum": [
      +        "100ml",
      +        "litre",
      +        "100g",
      +        "kg",
      +        "item"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  8. Changed3 schema fields changed
    • changedOutput schema / properties / catalogMatch / description
      Previous 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`."New value: +"Offers WEM holds under one catalogue product. Check `identityBasis`: on `barcode` the product carries a GTIN and every offer here is that same item, 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`. Whether the shopper’s words reached this product by barcode or by name is `identity`, a separate question: on `inferred`, say WEM matched it by name."
    • addedOutput schema / properties / catalogMatch / properties / identity
      Added value: +{
      +  "description": "How the shopper’s words reached this product. Decides how you describe the match: on `inferred`, say WEM matched it by name (not by barcode) and do not call the identity confirmed, even when `identityBasis` is `barcode`; on `exact`, the barcode itself resolved it.",
      +  "properties": {
      +    "method": {
      +      "enum": [
      +        "gtin",
      +        "slug",
      +        "listing",
      +        "title"
      +      ],
      +      "type": "string"
      +    },
      +    "strength": {
      +      "description": "exact = barcode; catalogued = a WEM key or listing id; inferred = matched on the product name, MPN or SKU and still a guess.",
      +      "enum": [
      +        "exact",
      +        "catalogued",
      +        "inferred"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / catalogMatch / properties / identityBasis / description
      Previous value: -"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."New value: +"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. This is how the offers are grouped, not how the query matched the product — see `identity`."
  9. Changed2 schema fields changed
    • changedOutput schema / description
      Previous value: -"Empty when the vector path cannot rank (`semantic: false`), with `reason` naming which of the five causes applies — they have different fixes, so do not read them all as an empty index. `semantic` is true only when pgvector actually ranked products."New value: +"Empty when the vector path cannot rank (`semantic: false`), with `reason` naming which cause applies — they have different fixes, so do not read them all as an empty index. `semantic` is true only when pgvector actually ranked products."
    • changedOutput schema / properties / reason / description
      Previous value: -"Present when semantic is false, and never a judgement on the shopper query. `index_empty` — the vector query ran and matched nothing. `no_catalogue_client` / `no_embedding_key` — WEM is misconfigured, not the catalogue empty. `embedding_failed` / `query_failed` — an upstream call failed; retrying later may succeed."New value: +"Present when semantic is false, and never a judgement on the shopper query. `index_empty` — the vector query ran and matched nothing. `no_catalogue_client` / `no_embedding_key` — WEM is misconfigured, not the catalogue empty. `embedding_failed` / `query_failed` — an upstream call failed; retrying later may succeed. `timed_out` — an upstream call did not answer in time; this says nothing about the catalogue."
  10. Changed3 schema fields changed
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceRefresh / description
      Previous value: -"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."New value: +"What re-reads this retailer’s prices: `live-api` a product-lookup API, `feed` a partner datafeed, `crawl` WEM reading the retailer’s own public product page, `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. A `crawl` price was observed on the retailer’s page rather than supplied by them, so date it with `priceAgeDays` and expect `affiliate: false` unless a programme also exists."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceRefresh / enum
      Previous value: -[
      -  "live-api",
      -  "feed",
      -  "none"
      -]New value: +[
      +  "live-api",
      +  "feed",
      +  "crawl",
      +  "none"
      +]
    • changedOutput schema / properties / disclosure / description
      Previous value: -"Affiliate disclosure to relay once per answer. Outbound links are tracked at no extra cost to the buyer."New value: +"Disclosure to relay once per answer, verbatim. Its wording changes with the rows: it states whether every outbound link is affiliate-tracked, only some are, or none are. Never substitute the version you saw last time — a row marked `affiliate: false` earns WEM nothing, and saying otherwise misdescribes it to the shopper."
  11. Changed2 schema fields changed
    • addedOutput schema / properties / next
      Added value: +{
      +  "description": "Where to send the shopper when WEM's set is thin. chrome_extension means compare the same product on any retailer page — WEM shows that price even without an affiliate programme.",
      +  "properties": {
      +    "reason": {
      +      "type": "string"
      +    },
      +    "surface": {
      +      "enum": [
      +        "chrome_extension"
      +      ],
      +      "type": "string"
      +    },
      +    "url": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / search
      Added value: +{
      +  "description": "Present when this result names no offer. GIVE THE USER THIS LINK — it is the answer when WEM has nothing else to say, and `markdown` is ready to paste. WEM searches retailers live on that page, including shops it holds no affiliate programme with, so an empty or withheld result here is not evidence the product is unavailable or unpriced.",
      +  "properties": {
      +    "markdown": {
      +      "description": "The same link, pre-formatted.",
      +      "type": "string"
      +    },
      +    "reason": {
      +      "type": "string"
      +    },
      +    "url": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  12. Changed2 schema fields changed
    • addedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceQualifier
      Added value: +{
      +  "description": "Present when `price` is the OPENING price of a range, not the price of this item: a multi-variation listing where the seller advertises its cheapest variant and the shopper picks a size on the page. Quote it as \"from £X\", never as the price or the cheapest. Absent means the price is firm for the row as described.",
      +  "enum": [
      +    "from"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / products / items / properties / priceQualifier
      Added value: +{
      +  "description": "Present when `price` is the OPENING price of a range, not the price of this item: a multi-variation listing where the seller advertises its cheapest variant and the shopper picks a size on the page. Quote it as \"from £X\", never as the price or the cheapest. Absent means the price is firm for the row as described.",
      +  "enum": [
      +    "from"
      +  ],
      +  "type": "string"
      +}
  13. Changed4 schema fields changed
    • addedOutput schema / properties / catalogMatch / properties / offers / items / properties / channel
      Added value: +{
      +  "description": "retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. Do not present a marketplace cluster as competing authorised retailers.",
      +  "enum": [
      +    "retailer",
      +    "marketplace"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / catalogMatch / properties / offers / items / properties / shipping / properties / estimate
      Added value: +{
      +  "description": "Delivery window when the feed stated one.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / products / items / properties / channel
      Added value: +{
      +  "description": "retailer is a named shop (Boots, Currys). marketplace is eBay/AliExpress/Temu-style parallel listings. Do not present a marketplace cluster as competing authorised retailers.",
      +  "enum": [
      +    "retailer",
      +    "marketplace"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / products / items / properties / shipping / properties / estimate
      Added value: +{
      +  "description": "Delivery window when the feed stated one.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  14. Changed2 schema fields changed
    • addedOutput schema / properties / catalogMatch / properties / offers / items / properties / affiliate
      Added value: +{
      +  "description": "False when this is a retailer page WEM observed without a programme. Still a real listing; the click is not commission-bearing. Absent means the usual partner path.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / products / items / properties / affiliate
      Added value: +{
      +  "description": "False when this is a retailer page WEM observed without a programme. Still a real listing; the click is not commission-bearing. Absent means the usual partner path.",
      +  "type": "boolean"
      +}
  15. Changed3 schema fields changed
    • changedOutput schema / properties / catalogMatch / properties / lastConfirmedAt / description
      Previous value: -"When WEM last read these offers — the freshness of this block."New value: +"When WEM last actually read any price in this block. Null means none of them can be dated — say so rather than implying the block is current."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / lastSeenAt / description
      Previous value: -"When WEM last wrote this offer row."New value: +"When WEM last VISITED this offer row — not when it read the price. The refresh sweep touches this even when the retailer lookup fails, so it is not evidence the price is current. Use `priceAgeDays` to date a price; never this."
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / priceAgeDays / description
      Previous value: -"Whole days since WEM last wrote this price. Null means unknown age — report it as unknown rather than assuming it is current."New value: +"Whole days since WEM last actually READ this price from the retailer or a datafeed. Null means WEM cannot say — common and correct for Amazon, whose licence caps price retention at 24 hours. Report null as undated; never present it as current."
  16. Changed7 schema fields changed
    • 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"
      +}
  17. Changed2 schema fields changed
    • changedOutput schema / description
      Previous value: -"Empty when the vector index has no rows (`semantic: false`, `reason: index_empty`). `semantic` is true only when pgvector actually ranked products."New value: +"Empty when the vector path cannot rank (`semantic: false`), with `reason` naming which of the five causes applies — they have different fixes, so do not read them all as an empty index. `semantic` is true only when pgvector actually ranked products."
    • changedOutput schema / properties / reason / description
      Previous value: -"Present when semantic is false. `index_empty` means the embedding column is unpopulated, not that the shopper query is invalid."New value: +"Present when semantic is false, and never a judgement on the shopper query. `index_empty` — the vector query ran and matched nothing. `no_catalogue_client` / `no_embedding_key` — WEM is misconfigured, not the catalogue empty. `embedding_failed` / `query_failed` — an upstream call failed; retrying later may succeed."
  18. Changed2 schema fields changed
    • changedOutput schema / description
      Previous value: -"Falls back to the keyword-search shape whenever embeddings are unavailable, so `semantic` may be absent and `query` / `catalogMatch` may appear instead."New value: +"Empty when the vector index has no rows (`semantic: false`, `reason: index_empty`). `semantic` is true only when pgvector actually ranked products."
    • addedOutput schema / properties / reason
      Added value: +{
      +  "description": "Present when semantic is false. `index_empty` means the embedding column is unpopulated, not that the shopper query is invalid.",
      +  "type": "string"
      +}
  19. Changed1 schema field changed
    • changedOutput schema / properties / catalogMatch / properties / offers / items / properties / verified / description
      Previous value: -"Always true here — identity is resolved, not inferred."New value: +"True when WEM has recently observed this price on the retailer’s own surface. False means the identity is still catalogue-resolved but the price is indicative (partner feed or stale) — do not present it as verified."
  20. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "description": "Falls back to the keyword-search shape whenever embeddings are unavailable, so `semantic` may be absent and `query` / `catalogMatch` may appear instead.",
      +  "properties": {
      +    "catalogMatch": {
      +      "description": "Offers resolved by barcode rather than by matching titles. When present, prefer these and cite their prices over anything in `products`.",
      +      "properties": {
      +        "currency": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "lowPrice": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "offers": {
      +          "items": {
      +            "properties": {
      +              "brand": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "currency": {
      +                "description": "ISO 4217 code.",
      +                "type": "string"
      +              },
      +              "id": {
      +                "type": "string"
      +              },
      +              "image": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "inStock": {
      +                "type": [
      +                  "boolean",
      +                  "null"
      +                ]
      +              },
      +              "price": {
      +                "description": "Indicative price. The retailer sets the final price at checkout.",
      +                "type": "number"
      +              },
      +              "provider": {
      +                "description": "Retailer slug, e.g. \"ebay\", \"currys\".",
      +                "type": "string"
      +              },
      +              "rating": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "reviewCount": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "seller": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "shipping": {
      +                "properties": {
      +                  "cost": {
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "free": {
      +                    "type": "boolean"
      +                  }
      +                },
      +                "type": [
      +                  "object",
      +                  "null"
      +                ]
      +              },
      +              "title": {
      +                "type": "string"
      +              },
      +              "url": {
      +                "description": "WEM tracked link to the retailer. Send the user here — WEM never takes payment.",
      +                "type": "string"
      +              },
      +              "verified": {
      +                "description": "Always true here — identity is resolved, not inferred.",
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "productPage": {
      +          "type": "string"
      +        },
      +        "slug": {
      +          "type": "string"
      +        },
      +        "source": {
      +          "type": "string"
      +        },
      +        "title": {
      +          "type": "string"
      +        }
      +      },
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "disclosure": {
      +      "description": "Affiliate disclosure to relay once per answer. Outbound links are tracked at no extra cost to the buyer.",
      +      "type": "string"
      +    },
      +    "filtered": {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "Withheld candidates tallied by reason (e.g. accessories, wrong model). Report this count rather than implying the search was exhaustive.",
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "products": {
      +      "items": {
      +        "properties": {
      +          "brand": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "currency": {
      +            "description": "ISO 4217 code.",
      +            "type": "string"
      +          },
      +          "id": {
      +            "type": "string"
      +          },
      +          "image": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "inStock": {
      +            "type": [
      +              "boolean",
      +              "null"
      +            ]
      +          },
      +          "price": {
      +            "description": "Indicative price. The retailer sets the final price at checkout.",
      +            "type": "number"
      +          },
      +          "provider": {
      +            "description": "Retailer slug, e.g. \"ebay\", \"currys\".",
      +            "type": "string"
      +          },
      +          "rating": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "reviewCount": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "seller": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "shipping": {
      +            "properties": {
      +              "cost": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "free": {
      +                "type": "boolean"
      +              }
      +            },
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "WEM tracked link to the retailer. Send the user here — WEM never takes payment.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "query": {
      +      "type": "string"
      +    },
      +    "semantic": {
      +      "description": "True only when the vector path actually ran.",
      +      "type": "boolean"
      +    },
      +    "totalResults": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "products",
      +    "totalResults",
      +    "disclosure"
      +  ],
      +  "type": "object"
      +}
  21. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources