{
  "service": "grocery-basket",
  "howPricesAreCollected": "Prices are read from each retailer's own public storefront for a specific store, then normalized to a common package unit. Every price carries the store it came from and the timestamp it was read.",
  "perChain": [
    {
      "chain": "aldi",
      "method": "Public product sitemap for the catalog, then the storefront's own item API for the live price of a specific store.",
      "storeSpecific": true
    },
    {
      "chain": "publix",
      "method": "Publix store locator plus their public product search for the resolved store.",
      "storeSpecific": true
    },
    {
      "chain": "target",
      "method": "Target's public store locator and product search API.",
      "storeSpecific": true
    },
    {
      "chain": "ingles",
      "method": "Ingles' public storefront API.",
      "storeSpecific": true
    },
    {
      "chain": "walmart",
      "method": "Public product pages.",
      "storeSpecific": true
    }
  ],
  "matching": "A shopper's item is matched to a real product by unit type (eggs are sold by count, milk by volume), by required and forbidden words, and by cross-aisle rules that stop prepared foods standing in for staples. This is why 'butter' never returns butter chicken and 'eggs' never returns chocolate eggs.",
  "limits": [
    "Coverage is per collected ZIP and per collected product; anything else returns an explicit not-covered error rather than a guess.",
    "Delivery fees, order minimums and loyalty-card prices are not collected yet, so they are null rather than estimated. Shelf prices, sale prices and stock ARE live. Sale prices below are the posted (non-card) promotional price.",
    "lastCheckedAt is when this exact store/product price was last read from the retailer. Grocery prices change weekly and promotions can end mid-week, so treat anything older than ~48h as indicative and re-check before relying on it."
  ]
}