Skip to main content
Glama

WEM Price Compare

Check whether a price claim is true

verify_offer

Provide at least one of: gtin, slug, wem_id, provider and externalId, or title. Checks a price someone has claimed for a product against the prices WEM has itself observed at retailers (recent readings, within a small tolerance; not a live quote), and reports the cheapest observed offer. Identify the product by gtin (strongest), slug, wem_id, provider + externalId, or title (weakest, relevance-checked). retailer names the shop the claim is about; without it the nearest observed price at any shop is checked. Only offers in the claim's currency are compared. Verdicts: confirmed (WEM observed that price there), price_moved (WEM last observed a different price there), not_at_retailer (WEM has no observed price there, though it may hold a feed price), no_claim (no price given; the offers are returned), unknown_product (the product could not be resolved, or WEM holds no observed price for it in that currency). unknown_product means the claim could not be checked, not that it is false. lastConfirmedAt says when WEM last observed a price in the answer, or is null. Each call records an evidence receipt, whose id can be cited later.

Input Schema

NameRequiredDescriptionDefault
gtinNoProduct barcode: EAN-13, UPC-A, EAN-8 or GTIN-14. Strongest identifier.
slugNoWEM canonical slug, as in wem3.ai/pl/{slug}.
priceNoThe price being claimed. Omit to ask only for the observed offers.
titleNoProduct title. The weakest identifier: used only when no id is given, and only if it passes a relevance check.
wem_idNoWEM ID (W + 10 Crockford characters + check). Active catalogue products only.
currencyNoISO 4217 code for the claimed price. Default GBP. Only offers in this currency are compared.
providerNoWith externalId: the retailer source of a listing that identifies the product, e.g. 'amazon'. To name the shop the claim is about, use `retailer`.
retailerNoThe shop the price was claimed at, as a slug or display name. Omit to compare against every shop.
externalIdNoThat listing's own id (an ASIN, or the shop's own item number). Use with provider.

Output Schema

NameRequiredDescriptionDefault
offersYesPrices WEM holds for this product, including indicative ones and shops it has no affiliate programme with yet. When `cheapest` is null, still show these rows and their links: they are a comparison, not a verification. Do not call them confirmed, and do not name a verified cheapest.
sourceYes
productNo
receiptYesCitation handle for this answer. Field names follow ACP suggested_price (observed_at, source, amount). signed is true only when WEM issued an HMAC with a dedicated key; otherwise false (fail closed).
summaryYesWritten so quoting it verbatim is accurate. Prefer quoting it to paraphrasing the verdict code.
verdictYes
betterByNoSaving from taking `cheapest` over the claimed price. Never negative.
cheapestNo
identityNoHow the product was identified — a separate question from whether the price checks out. Never present a `strength` of "inferred" as a verified identity.
sameModelNoPresent only when the maker's own page says another model code is this product and a person at WEM has checked it. These are NOT offers for the product asked about: they are not part of `offers`, and none is this product's lowest price or the best deal. On verify_offer they are not part of the check: `verdict`, `cheapest`, `betterBy`, `summary` and the receipt are about the product asked about, and a cheaper sister code never makes the claimed price wrong. `summary` is written to be quoted as it is. `maker.host` is the source of the claim. `url` is WEM's comparison for that model, not a shop. When `relation` is `differs`, the `differences` are what the maker says differs, and its price is not a saving. Absent is not evidence that no equivalent exists.
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.
resolvedByNoWhich identifier resolved the product.
claimMatchedNo
comparisonSetNoHow wide the comparison behind `cheapest` was. `exhaustive` is always false: WEM does not see every retailer, so `cheapest` is the lowest offer WEM holds, never the lowest that exists. Relay it as such.
lastConfirmedAtNoWhen WEM last read a price among the offers compared — the freshness of this answer. Null means none of them carries a dated reading: say the prices are undated.
toleranceAppliedNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • removedInput schema / anyOf
      Removed value: -[
      -  {
      -    "required": [
      -      "gtin"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "slug"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "wem_id"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "provider",
      -      "externalId"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "title"
      -    ]
      -  }
      -]
  2. Changed2 schema fields changed
    • changedInput schema / properties / externalId / description
      Previous value: -"That listing's own id (ASIN, eBay item number). Use with provider."New value: +"That listing's own id (an ASIN, or the shop's own item number). Use with provider."
    • changedInput schema / properties / provider / description
      Previous value: -"With externalId: the retailer source of a listing that identifies the product, e.g. 'amazon' or 'ebay'. To name the shop the claim is about, use `retailer`."New value: +"With externalId: the retailer source of a listing that identifies the product, e.g. 'amazon'. To name the shop the claim is about, use `retailer`."
  3. Changed14 schema fields changed
    • changedInput schema / properties / currency / description
      Previous value: -"ISO 4217 code for the claimed price. Default GBP."New value: +"ISO 4217 code for the claimed price. Default GBP. Only offers in this currency are compared."
    • changedInput schema / properties / externalId / description
      Previous value: -"The retailer's own product id (ASIN, eBay item number). Use with provider."New value: +"That listing's own id (ASIN, eBay item number). Use with provider."
    • changedInput schema / properties / price / description
      Previous value: -"The price being claimed. Omit to ask only what the verified offers are."New value: +"The price being claimed. Omit to ask only for the observed offers."
    • changedInput schema / properties / provider / description
      Previous value: -"Retailer slug for the listing being checked, e.g. 'currys'."New value: +"With externalId: the retailer source of a listing that identifies the product, e.g. 'amazon' or 'ebay'. To name the shop the claim is about, use `retailer`."
    • changedInput schema / properties / retailer / description
      Previous value: -"Retailer the price was claimed at — slug or display name."New value: +"The shop the price was claimed at, as a slug or display name. Omit to compare against every shop."
    • changedInput schema / properties / title / description
      Previous value: -"Product title. Weakest identifier — used only when no id is available."New value: +"Product title. The weakest identifier: used only when no id is given, and only if it passes a relevance check."
    • changedOutput schema / properties / cheapest / 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 / claimMatched / 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 / 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 / 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 / sameModel / description
      Previous value: -"Present only when the maker's own page says another model code is this product and a person at WEM has checked it. These are NOT offers for the product asked about: never merge them into `offers`, never call one this product's lowest price or the best deal. On verify_offer they are not part of the check: `verdict`, `cheapest`, `betterBy`, `summary` and the receipt are about the product asked about, and a cheaper sister code never makes the claimed price wrong. Mention it as a separate line: quote `summary`, name the maker's page (`maker.host`) as the source, and link `url`, WEM's comparison for that model, not a shop. When `relation` is `differs`, name the `differences` and never call its price a saving. Absent is not evidence that no equivalent exists."New value: +"Present only when the maker's own page says another model code is this product and a person at WEM has checked it. These are NOT offers for the product asked about: they are not part of `offers`, and none is this product's lowest price or the best deal. On verify_offer they are not part of the check: `verdict`, `cheapest`, `betterBy`, `summary` and the receipt are about the product asked about, and a cheaper sister code never makes the claimed price wrong. `summary` is written to be quoted as it is. `maker.host` is the source of the claim. `url` is WEM's comparison for that model, not a shop. When `relation` is `differs`, the `differences` are what the maker says differs, and its price is not a saving. Absent is not evidence that no equivalent exists."
    • changedOutput schema / properties / sameModel / items / properties / cheapest / description
      Previous value: -"The other model's cheapest named shop. Null when no named shop has an in-stock price for it. Give its age; never present it as current without one."New value: +"The other model's cheapest named shop. Null when no named shop has an in-stock price for it. `priceAgeDays` gives its age; without one it is not current."
    • changedOutput schema / properties / sameModel / items / properties / maker / description
      Previous value: -"The maker's own page that says so: the proof. Cite it; WEM is not the source of the claim."New value: +"The maker's own page that says so: the proof. WEM is not the source of the claim."
    • changedOutput schema / properties / sameModel / items / properties / url / description
      Previous value: -"WEM's comparison for that model. Link this, not a shop."New value: +"WEM's comparison for that model, not a shop."
  4. Changed3 schema fields changed
    • addedOutput schema / properties / cheapest / properties / affiliate
      Added value: +{
      +  "description": "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.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / claimMatched / properties / affiliate
      Added value: +{
      +  "description": "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.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / offers / items / properties / affiliate
      Added value: +{
      +  "description": "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.",
      +  "type": "boolean"
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / offers / description
      Added value: +"Prices WEM holds for this product, including indicative ones and shops it has no affiliate programme with yet. When `cheapest` is null, still show these rows and their links: they are a comparison, not a verification. Do not call them confirmed, and do not name a verified cheapest."
  6. Changed1 schema field changed
    • addedOutput schema / properties / sameModel
      Added value: +{
      +  "description": "Present only when the maker's own page says another model code is this product and a person at WEM has checked it. These are NOT offers for the product asked about: never merge them into `offers`, never call one this product's lowest price or the best deal. On verify_offer they are not part of the check: `verdict`, `cheapest`, `betterBy`, `summary` and the receipt are about the product asked about, and a cheaper sister code never makes the claimed price wrong. Mention it as a separate line: quote `summary`, name the maker's page (`maker.host`) as the source, and link `url`, WEM's comparison for that model, not a shop. When `relation` is `differs`, name the `differences` and never call its price a saving. Absent is not evidence that no equivalent exists.",
      +  "items": {
      +    "properties": {
      +      "cheapest": {
      +        "description": "The other model's cheapest named shop. Null when no named shop has an in-stock price for it. Give its age; never present it as current without one.",
      +        "properties": {
      +          "currency": {
      +            "type": "string"
      +          },
      +          "price": {
      +            "type": "number"
      +          },
      +          "priceAgeDays": {
      +            "description": "Days since WEM read that price. Null means undated.",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "shop": {
      +            "type": "string"
      +          }
      +        },
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "checkedOn": {
      +        "description": "When a person at WEM read the maker’s page (YYYY-MM-DD).",
      +        "type": "string"
      +      },
      +      "differences": {
      +        "description": "What the maker says differs. Empty when identical.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "maker": {
      +        "description": "The maker's own page that says so: the proof. Cite it; WEM is not the source of the claim.",
      +        "properties": {
      +          "host": {
      +            "type": "string"
      +          },
      +          "says": {
      +            "description": "The page's words, as checked.",
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "model": {
      +        "description": "The other model code, as the maker writes it.",
      +        "type": "string"
      +      },
      +      "relation": {
      +        "description": "`identical`: the maker says it is the same product. `differs`: the same product except `differences`; not like for like.",
      +        "enum": [
      +          "identical",
      +          "differs"
      +        ],
      +        "type": "string"
      +      },
      +      "summary": {
      +        "description": "WEM’s words for it, written to be quoted as they are.",
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "WEM's comparison for that model. Link this, not a shop.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "model",
      +      "relation",
      +      "differences",
      +      "maker",
      +      "checkedOn",
      +      "summary"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  7. Changed2 schema fields changed
    • changedOutput schema / properties / lastConfirmedAt / description
      Previous value: -"When WEM last read these offers — the freshness of this answer."New value: +"When WEM last read a price among the offers compared — the freshness of this answer. Null means none of them carries a dated reading: say the prices are undated."
    • changedOutput schema / properties / receipt / properties / observed_at / description
      Previous value: -"When WEM last read the offers, or \"unobserved\". ACP #197."New value: +"When WEM read the price in amount, or \"unobserved\" when nothing dates it — then do not present amount as current. ACP #197."
  8. Changed1 schema field changed
    • 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."
  9. Changed2 schema fields changed
    • addedInput schema / anyOf
      Added value: +[
      +  {
      +    "required": [
      +      "gtin"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "slug"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "wem_id"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "provider",
      +      "externalId"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "title"
      +    ]
      +  }
      +]
    • removedInput schema / required
      Removed value: -[]
  10. Changed1 schema field changed
    • addedInput schema / properties / wem_id
      Added value: +{
      +  "description": "WEM ID (W + 10 Crockford characters + check). Active catalogue products only.",
      +  "type": "string"
      +}
  11. Changed12 schema fields changed
    • changedOutput schema / properties / receipt / description
      Previous value: -"Unsigned citation handle for this answer. Serialises what was already returned. signed is always false."New value: +"Citation handle for this answer. Field names follow ACP suggested_price (observed_at, source, amount). signed is true only when WEM issued an HMAC with a dedicated key; otherwise false (fail closed)."
    • addedOutput schema / properties / receipt / properties / amount
      Added value: +{
      +  "description": "Major-unit decimal, same units as verify_offer prices.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / receipt / properties / amount_minor
      Added value: +{
      +  "description": "Integer minor units of amount, ACP form.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / receipt / properties / currency
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / receipt / properties / identity_method
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / receipt / properties / issuedAt / description
      Added value: +"Alias of observed_at, kept for the unsigned edition."
    • addedOutput schema / properties / receipt / properties / observed_at
      Added value: +{
      +  "description": "When WEM last read the offers, or \"unobserved\". ACP #197.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / receipt / properties / signature
      Added value: +{
      +  "description": "hmac-sha256=<hex> when signed; otherwise null.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / receipt / properties / signed / description
      Previous value: -"Always false until a later edition."New value: +"True when WEM signed this receipt with a dedicated HMAC key. False when no key is configured (fail closed). Never derived from CRON_SECRET."
    • addedOutput schema / properties / receipt / properties / source
      Added value: +{
      +  "description": "Citable URI of the standard this receipt is issued under.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / receipt / properties / verdict
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / receipt / properties / verifier
      Added value: +{
      +  "description": "Always \"wem\".",
      +  "type": "string"
      +}
  12. Changed5 schema fields changed
    • addedOutput schema / properties / cheapest / properties / totalCost
      Added value: +{
      +  "description": "Item plus any stated extras. When unknown is non-empty, delivered is a floor — never relay it as what the shopper will pay.",
      +  "properties": {
      +    "confidence": {
      +      "enum": [
      +        "stated",
      +        "unknown"
      +      ],
      +      "type": "string"
      +    },
      +    "currency": {
      +      "type": "string"
      +    },
      +    "delivered": {
      +      "type": "number"
      +    },
      +    "fees": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "item": {
      +      "type": "number"
      +    },
      +    "shipping": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "tax": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "unknown": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / claimMatched / properties / totalCost
      Added value: +{
      +  "description": "Item plus any stated extras. When unknown is non-empty, delivered is a floor — never relay it as what the shopper will pay.",
      +  "properties": {
      +    "confidence": {
      +      "enum": [
      +        "stated",
      +        "unknown"
      +      ],
      +      "type": "string"
      +    },
      +    "currency": {
      +      "type": "string"
      +    },
      +    "delivered": {
      +      "type": "number"
      +    },
      +    "fees": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "item": {
      +      "type": "number"
      +    },
      +    "shipping": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "tax": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "unknown": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / offers / items / properties / totalCost
      Added value: +{
      +  "description": "Item plus any stated extras. When unknown is non-empty, delivered is a floor — never relay it as what the shopper will pay.",
      +  "properties": {
      +    "confidence": {
      +      "enum": [
      +        "stated",
      +        "unknown"
      +      ],
      +      "type": "string"
      +    },
      +    "currency": {
      +      "type": "string"
      +    },
      +    "delivered": {
      +      "type": "number"
      +    },
      +    "fees": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "item": {
      +      "type": "number"
      +    },
      +    "shipping": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "tax": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "unknown": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / receipt
      Added value: +{
      +  "description": "Unsigned citation handle for this answer. Serialises what was already returned. signed is always false.",
      +  "properties": {
      +    "id": {
      +      "type": "string"
      +    },
      +    "issuedAt": {
      +      "type": "string"
      +    },
      +    "signed": {
      +      "description": "Always false until a later edition.",
      +      "type": "boolean"
      +    },
      +    "standardVersion": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "verdict",
      -  "offers",
      -  "summary",
      -  "source",
      -  "disclosure"
      -]New value: +[
      +  "verdict",
      +  "offers",
      +  "summary",
      +  "source",
      +  "disclosure",
      +  "receipt"
      +]
  13. Changed1 schema field changed
    • addedOutput schema / properties / comparisonSet
      Added value: +{
      +  "description": "How wide the comparison behind `cheapest` was. `exhaustive` is always false: WEM does not see every retailer, so `cheapest` is the lowest offer WEM holds, never the lowest that exists. Relay it as such.",
      +  "properties": {
      +    "exhaustive": {
      +      "description": "Always false. Never present this answer as the lowest price available anywhere.",
      +      "type": "boolean"
      +    },
      +    "observedAt": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "offersCompared": {
      +      "type": "number"
      +    },
      +    "retailersCompared": {
      +      "type": "number"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  14. Changed1 schema field changed
    • changedOutput schema / properties / resolvedBy / description
      Previous value: -"Which identifier resolved the product — gtin is strongest, title weakest."New value: +"Which identifier resolved the product."
  15. Changed7 schema fields changed
    • addedOutput schema / properties / cheapest / properties / inStock / description
      Added value: +"null means the retailer did not report availability. Say \"stock not confirmed\" — never present null as in stock."
    • changedOutput schema / properties / cheapest / properties / inStock / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • addedOutput schema / properties / claimMatched / properties / inStock / description
      Added value: +"null means the retailer did not report availability. Say \"stock not confirmed\" — never present null as in stock."
    • changedOutput schema / properties / claimMatched / properties / inStock / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • addedOutput schema / properties / identity
      Added value: +{
      +  "description": "How the product was identified — a separate question from whether the price checks out. Never present a `strength` of \"inferred\" as a verified identity.",
      +  "properties": {
      +    "method": {
      +      "enum": [
      +        "gtin",
      +        "slug",
      +        "listing",
      +        "title"
      +      ],
      +      "type": "string"
      +    },
      +    "strength": {
      +      "description": "exact = barcode; catalogued = a WEM key or the retailer’s own listing id; inferred = matched on the product name and still a guess.",
      +      "enum": [
      +        "exact",
      +        "catalogued",
      +        "inferred"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / offers / items / properties / inStock / description
      Added value: +"null means the retailer did not report availability. Say \"stock not confirmed\" — never present null as in stock."
    • changedOutput schema / properties / offers / items / properties / inStock / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
  16. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "description": "`unknown_product` means the claim could NOT be checked. It never means the claim is false and must not be reported as one.",
      +  "properties": {
      +    "betterBy": {
      +      "description": "Saving from taking `cheapest` over the claimed price. Never negative.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "cheapest": {
      +      "properties": {
      +        "currency": {
      +          "type": "string"
      +        },
      +        "inStock": {
      +          "type": "boolean"
      +        },
      +        "price": {
      +          "type": "number"
      +        },
      +        "provider": {
      +          "type": "string"
      +        },
      +        "retailer": {
      +          "description": "Shopper-facing retailer name.",
      +          "type": "string"
      +        },
      +        "url": {
      +          "type": "string"
      +        }
      +      },
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "claimMatched": {
      +      "properties": {
      +        "currency": {
      +          "type": "string"
      +        },
      +        "inStock": {
      +          "type": "boolean"
      +        },
      +        "price": {
      +          "type": "number"
      +        },
      +        "provider": {
      +          "type": "string"
      +        },
      +        "retailer": {
      +          "description": "Shopper-facing retailer name.",
      +          "type": "string"
      +        },
      +        "url": {
      +          "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"
      +    },
      +    "lastConfirmedAt": {
      +      "description": "When WEM last read these offers — the freshness of this answer.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "offers": {
      +      "items": {
      +        "properties": {
      +          "currency": {
      +            "type": "string"
      +          },
      +          "inStock": {
      +            "type": "boolean"
      +          },
      +          "price": {
      +            "type": "number"
      +          },
      +          "provider": {
      +            "type": "string"
      +          },
      +          "retailer": {
      +            "description": "Shopper-facing retailer name.",
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "type": "array"
      +    },
      +    "product": {
      +      "properties": {
      +        "slug": {
      +          "type": "string"
      +        },
      +        "title": {
      +          "type": "string"
      +        }
      +      },
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "resolvedBy": {
      +      "description": "Which identifier resolved the product — gtin is strongest, title weakest.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "summary": {
      +      "description": "Written so quoting it verbatim is accurate. Prefer quoting it to paraphrasing the verdict code.",
      +      "type": "string"
      +    },
      +    "toleranceApplied": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "verdict": {
      +      "enum": [
      +        "confirmed",
      +        "price_moved",
      +        "not_at_retailer",
      +        "no_claim",
      +        "unknown_product"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "verdict",
      +    "offers",
      +    "summary",
      +    "source",
      +    "disclosure"
      +  ],
      +  "type": "object"
      +}
  17. Added

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Rich disclosure beyond annotations: not a live quote, recent readings with a small tolerance, only same-currency offers compared, each call records an evidence receipt, and `lastConfirmedAt` is null when nothing was observed. It also explicitly warns that unknown_product means unchecked rather than false — an important misread guard. Minor gap: doesn't say whether receipts are idempotent or cost anything, but for a near-read-only tool with readOnlyHint=false this is strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the required-identifier rule and packs verdict definitions tightly; nearly every sentence carries a distinct constraint. It is a long single block, so slightly heavy, but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with an output schema, the description covers the full decision surface: identifier resolution, currency scoping, verdict taxonomy, null semantics for lastConfirmedAt, and the evidence-receipt side effect. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds value by ranking identifiers by strength, clarifying that `retailer` (not `provider`) names the claimed shop, and noting currency restricts which offers are compared. That is meaningfully above schema-alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: checks a claimed price against WEM's own observed retailer prices, and reports the cheapest observed offer. The claim-verification framing — with named verdicts — clearly separates it from siblings like compare_offers or find_lowest_price, which shop rather than adjudicate a claim.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit identifier priority (gtin strongest, title weakest and only when no id is given), explains when to set `retailer` ('names the shop the claim is about') versus omit it, and says to omit `price` to just retrieve offers. The provider/externalId vs retailer distinction is called out directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources