basketwatchireland-com API

basketwatchireland-com API as documented publicly: 24 operations. Contract generated from the documentation by API Evangelist (2026-10-30); not the provider's own document.

Operations 24

GET /api/aldi/specialbuys GET /api/aldi/specialbuys #
GET /api/barcodes GET /api/barcodes #
GET /api/changes daily price movements, with shelf moves, promotions and loyalty prices kept as separate signals #
GET /api/compare GET /api/compare #
GET /api/credits GET /api/credits shows the balance and ledger at no charge #
GET /api/credits/mpp GET /api/credits/mpp #
GET /api/credits/mpp/buy Answers 402 Payment Required with a WWW-Authenticate: Payment challenge naming the stripe method and charge intent. #
POST /api/credits/mpp/buy POST /api/credits/mpp/buy #
GET /api/product/{productId} A single product: current price, unit price, pack, plus its full price history #
GET /api/products catalogue with current shelf price, unit price, pack size, promotion and barcode, and the retailer's own shelf every level down #
GET /api/status coverage and freshness per retailer, free and unauthenticated #
GET /api/tesco/out-of-stock GET /api/tesco/out-of-stock #
GET /api/{store}/category-index Per-category average price over time, with the SKU count behind each point. #
GET /api/{store}/category-summary Per-department roll-up: SKU count, average price and price churn, with the retailer browse URL. #
GET /api/{store}/changes Day‑over‑day movements in price, promotions and loyalty changes #
GET /api/{store}/kpis Headline numbers for the latest snapshot: catalogue size, active SKUs today vs yesterday, promotion share, out-of-stock count, average price, price moves and new lines. #
GET /api/{store}/new-products Newly listed SKUs first seen in the latest snapshot #
GET /api/{store}/price-history Every price observation per SKU across a date range #
GET /api/{store}/products Full catalogue with the current shelf price per SKU #
GET /api/{store}/products/count Fast catalogue size for a store, without returning rows #
GET /api/{store}/promotions Live deals: products on offer, with was-price, offer text and loyalty pricing (Clubcard / Real Rewards). #
GET /api/{store}/removed Delisted SKUs absent from the latest snapshot (two-snapshot confirmed). #
GET /api/{store}/shrinkflation Pack-size reductions: same product, smaller pack, with the old and new size and the change in price per kg, litre or item. #
GET /api/{store}/volatile Most volatile SKUs: products whose price has changed most often over the tracked window. #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/basketwatchireland-com:basketwatchireland-com-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

basketwatchireland-com-openapi-generated.yml Raw ↑
openapi: 3.1.0
info:
  title: basketwatchireland-com API
  version: '2026-10-30'
  description: 'GENERATED FROM DOCUMENTATION by API Evangelist on 2026-10-30: 24 operation(s) read from 4 public documentation page(s) (each operation
    names its page in x-source). This is not the provider''s published contract; basketwatchireland-com has published no machine-readable contract
    that the pipeline could find. Engine: local.'
  x-evidence-tiers:
    code-example: 20
    documentation: 4
    pages-with-code: 2
    pages-read: 4
  x-generated-from: documentation
  x-provenance: generated
  x-authored-by: API Evangelist
  x-generated: '2026-10-30'
  x-generator: generate-contract-from-docs.py
  x-engine: local
  x-sources:
  - https://basketwatchireland.com/api-reference
  - https://basketwatchireland.com/llms.txt
  - https://basketwatchireland.com/support
  - https://api.basketwatchireland.com/api-reference
paths:
  /api/aldi/specialbuys:
    get:
      operationId: get_api_aldi_specialbuys
      tags:
      - Api
      summary: GET /api/aldi/specialbuys
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: limit
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiAldiSpecialbuysResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -H \"X-API-Key: YOUR_KEY\"  \"https://basketwatchireland.com/api/aldi/specialbuys?limit=1\" \n Response \n {\n \"active_by_category\"\
          : [\n { \"category_path\": \"SpecialBuys > Clothing\", \"count\": 54, \"avg_price\": 6.63 }\n ],\n \"recently_ended\": [\n { \"id\"\
          : \"000000000708833001\", \"name\": \"Bottle with Carabiner\", \"brand\": \"CROFTON\", \"category_path\": \"SpecialBuys > Kitchen\"\
          , \"last_seen\": \"2026-06-26\", \"last_pric"
  /api/barcodes:
    get:
      operationId: get_api_barcodes
      tags:
      - Api
      summary: GET /api/barcodes
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: codes
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiBarcodesResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -H \"X-API-Key: YOUR_KEY\"  \"https://basketwatchireland.com/api/barcodes?codes=5000127014084,5000157024671,5099999999990\"\
          \ \n Response \n {\n \"requested\": 3,\n \"valid\": 3,\n \"matched\": 2,\n \"products\": [\n { \"store\": \"tesco\", \"id\": \"tesco:252261477\"\
          , \"matched_barcodes\": [\"5000157024671\"], \"name\": \"Heinz Beans in Tomato Sauce 415g\" },\n { \"store\": \"tesco\", \"id\": \"\
          tesco:253158380\", \"matched_barcodes\": [\"5"
  /api/changes:
    get:
      operationId: get_api_changes
      tags:
      - Api
      summary: daily price movements, with shelf moves, promotions and loyalty prices kept as separate signals
      x-source: https://basketwatchireland.com/llms.txt
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/compare:
    get:
      operationId: get_api_compare
      tags:
      - Api
      summary: GET /api/compare
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: q
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiCompareResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -H \"X-API-Key: YOUR_KEY\"  \"https://basketwatchireland.com/api/compare?q=heinz%20ketchup\" \n Response \n {\n \"as_of\"\
          : \"2026-06-29\",\n \"matches\": [\n {\n \"match_id\": 561961,\n \"brand\": \"Heinz\",\n \"pack\": \"910g\",\n \"category\": \"Food\
          \ Cupboard\",\n \"display_name\": \"Heinz Tomato Ketchup 910g\",\n \"coverage\": 4,\n \"stores\": {\n \"aldi\": {\n \"id\": \"000000000000336799\"\
          ,\n \"name\": \"Tomato Ketchup 910g\",\n \"price\": 3.99,\n"
  /api/credits:
    get:
      operationId: get_api_credits
      tags:
      - Api
      summary: GET /api/credits shows the balance and ledger at no charge
      x-source: https://basketwatchireland.com/api-reference
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiCreditsResponse'
      x-evidence:
        kind: documentation
  /api/credits/mpp:
    get:
      operationId: get_api_credits_mpp
      tags:
      - Api
      summary: GET /api/credits/mpp
      x-source: https://basketwatchireland.com/api-reference
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl \"https://basketwatchireland.com/api/credits/mpp\" \n Free and unauthenticated: an agent that cannot read the price without\
          \ paying cannot decide\n whether to buy. Returns the packs, the per-record rate and the purchase URL. \n 2 · ask to buy, with no credential "
  /api/credits/mpp/buy:
    get:
      operationId: get_api_credits_mpp_buy
      tags:
      - Api
      summary: 'Answers 402 Payment Required with a WWW-Authenticate: Payment challenge naming the stripe method and charge intent.'
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: pack
        in: query
        required: true
        schema:
          type: string
        description: Pack amount in euro cents.
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiCreditsMppBuyResponse'
      x-evidence:
        kind: documentation
    post:
      operationId: post_api_credits_mpp_buy
      tags:
      - Api
      summary: POST /api/credits/mpp/buy
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: pack
        in: query
        required: false
        schema:
          type: string
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -X POST \"https://basketwatchireland.com/api/credits/mpp/buy?pack=4999\"  -H \"Authorization: Payment <base64url(credential)>\"\
          \ \n The credential echoes the challenge back intact alongside your token, as\n {\"challenge\": {...}, \"payload\": {\"spt\": \"spt_...\"\
          }} . A successful purchase\n returns a funded api_key , the credits added and the balance. Send that key as\n X-API-Key on every request\
          \ from then o"
  /api/product/{productId}:
    get:
      operationId: get_api_product_productId
      tags:
      - Api
      summary: 'A single product: current price, unit price, pack, plus its full price history'
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: productId
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiProductProductidResponse'
      x-evidence:
        kind: documentation
  /api/products:
    get:
      operationId: get_api_products
      tags:
      - Api
      summary: catalogue with current shelf price, unit price, pack size, promotion and barcode, and the retailer's own shelf every level down
      x-source: https://basketwatchireland.com/llms.txt
      parameters:
      - name: category
        in: query
        required: false
        schema:
          type: string
        description: matches part of the department name or a whole level of the shelf
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/status:
    get:
      operationId: get_api_status
      tags:
      - Api
      summary: coverage and freshness per retailer, free and unauthenticated
      x-source: https://basketwatchireland.com/llms.txt
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/tesco/out-of-stock:
    get:
      operationId: get_api_tesco_out_of_stock
      tags:
      - Api
      summary: GET /api/tesco/out-of-stock
      x-source: https://basketwatchireland.com/api-reference
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiTescoOutOfStockResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -H \"X-API-Key: YOUR_KEY\"  \"https://basketwatchireland.com/api/tesco/out-of-stock\" \n Response \n {\n \"date\": \"2026-06-29\"\
          ,\n \"count\": 882,\n \"items\": [\n { \"id\": \"tesco:317208754\", \"name\": \"Sheep Hill Sauvignon Blanc 75cl\", \"brand\": \"A GABB\
          \ FAMILY WINE\", \"category_path\": \"Drinks > Wine\", \"url\": \"https://www.tesco.ie/shop/en-IE/products/317208754\", \"pack_size\"\
          : \"75cl\", \"price\": 18.00, \"clubcard_pric"
  /api/{store}/category-index:
    get:
      operationId: get_api_store_category_index
      tags:
      - Api
      summary: Per-category average price over time, with the SKU count behind each point.
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStoreCategoryIndexResponse'
      x-evidence:
        kind: documentation
  /api/{store}/category-summary:
    get:
      operationId: get_api_store_category_summary
      tags:
      - Api
      summary: 'Per-department roll-up: SKU count, average price and price churn, with the retailer browse URL.'
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStoreCategorySummaryResponse'
      x-evidence:
        kind: documentation
  /api/{store}/changes:
    get:
      operationId: get_api_store_changes
      tags:
      - Api
      summary: Day‑over‑day movements in price, promotions and loyalty changes
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      - name: 'on'
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStoreChangesResponse'
      x-evidence:
        kind: documentation
  /api/{store}/kpis:
    get:
      operationId: get_api_store_kpis
      tags:
      - Api
      summary: 'Headline numbers for the latest snapshot: catalogue size, active SKUs today vs yesterday, promotion share, out-of-stock count,
        average price, price moves and new lines.'
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStoreKpisResponse'
      x-evidence:
        kind: documentation
  /api/{store}/new-products:
    get:
      operationId: get_api_store_new_products
      tags:
      - Api
      summary: Newly listed SKUs first seen in the latest snapshot
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      - name: days
        in: query
        required: false
        schema:
          type: integer
      - name: from
        in: query
        required: false
        schema:
          type: string
      - name: to
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStoreNewProductsResponse'
      x-evidence:
        kind: documentation
  /api/{store}/price-history:
    get:
      operationId: get_api_store_price_history
      tags:
      - Api
      summary: Every price observation per SKU across a date range
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      - name: from
        in: query
        required: false
        schema:
          type: string
      - name: to
        in: query
        required: false
        schema:
          type: string
      - name: q
        in: query
        required: false
        schema:
          type: string
      - name: category
        in: query
        required: false
        schema:
          type: string
      - name: ids
        in: query
        required: false
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
      - name: offset
        in: query
        required: false
        schema:
          type: integer
      - name: fields
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStorePriceHistoryResponse'
      x-evidence:
        kind: documentation
  /api/{store}/products:
    get:
      operationId: get_api_store_products
      tags:
      - Api
      summary: Full catalogue with the current shelf price per SKU
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      - name: q
        in: query
        required: false
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
      - name: offset
        in: query
        required: false
        schema:
          type: integer
      - name: fields
        in: query
        required: false
        schema:
          type: string
      - name: from
        in: query
        required: false
        schema:
          type: string
      - name: to
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStoreProductsResponse'
      x-evidence:
        kind: documentation
  /api/{store}/products/count:
    get:
      operationId: get_api_store_products_count
      tags:
      - Api
      summary: Fast catalogue size for a store, without returning rows
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStoreProductsCountResponse'
      x-evidence:
        kind: documentation
  /api/{store}/promotions:
    get:
      operationId: get_api_store_promotions
      tags:
      - Api
      summary: 'Live deals: products on offer, with was-price, offer text and loyalty pricing (Clubcard / Real Rewards).'
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStorePromotionsResponse'
      x-evidence:
        kind: documentation
  /api/{store}/removed:
    get:
      operationId: get_api_store_removed
      tags:
      - Api
      summary: Delisted SKUs absent from the latest snapshot (two-snapshot confirmed).
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStoreRemovedResponse'
      x-evidence:
        kind: documentation
  /api/{store}/shrinkflation:
    get:
      operationId: get_api_store_shrinkflation
      tags:
      - Api
      summary: 'Pack-size reductions: same product, smaller pack, with the old and new size and the change in price per kg, litre or item.'
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStoreShrinkflationResponse'
      x-evidence:
        kind: documentation
  /api/{store}/volatile:
    get:
      operationId: get_api_store_volatile
      tags:
      - Api
      summary: 'Most volatile SKUs: products whose price has changed most often over the tracked window.'
      x-source: https://basketwatchireland.com/api-reference
      parameters:
      - name: store
        in: path
        required: true
        schema:
          type: string
      - name: days
        in: query
        required: false
        schema:
          type: string
        description: Window size in days.
      - name: from
        in: query
        required: false
        schema:
          type: string
        description: Start date.
      - name: to
        in: query
        required: false
        schema:
          type: string
        description: End date.
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiStoreVolatileResponse'
      x-evidence:
        kind: documentation
components:
  schemas:
    GetApiAldiSpecialbuysResponse:
      type: object
      properties:
        active_by_category:
          type: array
          items:
            type: object
            properties:
              category_path:
                type: string
              count:
                type: integer
              avg_price:
                type: number
        recently_ended:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              brand:
                type: string
              category_path:
                type: string
              last_seen:
                type: string
                format: date
              last_price:
                type: number
        newly_listed:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              brand:
                type: string
              category_path:
                type: string
              first_seen:
                type: string
                format: date
              launch_price:
                type: number
    GetApiBarcodesResponse:
      type: object
      properties:
        requested:
          type: integer
        valid:
          type: integer
        matched:
          type: integer
        products:
          type: array
          items:
            type: object
            properties:
              store:
                type: string
              id:
                type: string
              matched_barcodes:
                type: array
                items:
                  type: string
              name:
                type: string
        not_found:
          type: array
          items:
            type: string
        invalid:
          type: array
          items: {}
    GetApiCompareResponse:
      type: object
      properties:
        match_id:
          type: integer
        brand:
          type: string
        pack:
          type: string
        category:
          type: string
        display_name:
          type: string
        coverage:
          type: integer
        stores:
          type: object
          properties:
            aldi:
              type: object
              properties:
                id:
                  type: string
                name:
                  type: string
                price:
                  type: number
                unit_price:
                  type: number
                unit_basis:
                  type: string
                was_price:
                  type:
                  - string
                  - 'null'
                clubcard_price:
                  type:
                  - string
                  - 'null'
                scrape_date:
                  type: string
                  format: date
            tesco:
              type: object
              properties:
                id:
                  type: string
                name:
                  type: string
                price:
                  type: number
                unit_price:
                  type: number
                unit_basis:
                  type: string
                was_price:
                  type:
                  - string
                  - 'null'
                clubcard_price:
                  type: number
                scrape_date:
                  type: string
                  format: date
            supervalu:
              type: object
              properties:
                id:
                  type: string
                name:
                  type: string
                price:
                  type: number
                unit_price:
                  type: number
                unit_basis:
                  type: string
                was_price:
                  type:
                  - string
                  - 'null'
                clubcard_price:
                  type:
                  - string
                  - 'null'
                scrape_date:
                  type: string
                  format: date
            dunnes:
              type: object
              properties:
                id:
                  type: string
                name:
                  type: string
                price:
                  type: number
                unit_price:
                  type: number
                unit_basis:
                  type: string
                was_price:
                  type:
                  - string
                  - 'null'
                clubcard_price:
                  type:
                  - string
                  - 'null'
                scrape_date:
                  type: string
                  format: date
    GetApiCreditsResponse:
      type: object
      properties:
        X-Credits-Charged:
          type: integer
        X-Credits-Remaining:
          type: integer
    GetApiCreditsMppBuyResponse:
      type: object
      properties:
        challenge:
          type: object
        payload:
          type: object
          description: Contains spt token.
    GetApiProductProductidResponse:
      type: object
      properties:
        product:
          type: object
          description: product details
        history:
          type: array
          description: price history entries
    GetApiTescoOutOfStockResponse:
      type: object
      properties:
        date:
          type: string
          format: date
        count:
          type: integer
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              brand:
                type: string
              category_path:
                type: string
              url:
                type: string
              pack_size:
                type: string
              price:
                type: number
              clubcard_price:
                type: number
    GetApiStoreCategoryIndexResponse:
      type: object
      properties:
        category:
          type: object
          description: Keys are category names, values are arrays of {date, avg_price, n}.
    GetApiStoreCategorySummaryResponse:
      type: object
      properties:
        category:
          type: string
        sku_count:
          type: integer
        avg_price:
          type: number
        changed:
          type: integer
        changed_pct:
          type: number
        price_delta_pct:
          type: number
        url:
          type: string
    GetApiStoreChangesResponse:
      type: object
      properties:
        date:
          type: string
        prev_date:
          type: string
        shelf_increases:
          type: array
        shelf_decreases:
          type: array
        promotions:
          type: array
        clubcard_changes:
          type: array
    GetApiStoreKpisResponse:
      type: object
      properties:
        total_products:
          type: integer
        active_today:
          type: integer
        active_yesterday:
          type: integer
        active_delta:
          type: integer
        on_promo_today:
          type: integer
        promo_pct_today:
          type: number
        out_of_stock_today:
          type: integer
        avg_price_today:
          type: number
        avg_price_yesterday:
          type: number
        prices_up_today:
          type: integer
        prices_down_today:
          type: integer
        new_today:
          type: integer
    GetApiStoreNewProductsResponse:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        brand:
          type: string
        category_path:
          type: string
        first_seen:
          type: string
        launch_price:
          type: number
    GetApiStorePriceHistoryResponse:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        brand:
          type: string
        category_path:
          type: string
        pack_size:
          type: string
        scrape_date:
          type: string
        price:
          type: number
        unit_price:
          type: number
        unit_basis:
          type: string
        clubcard_price:
          type: number
        offer_text:
          type: string
        was_price:
          type: number
        offer_valid:
          type: string
        available:
          type: integer
    GetApiStoreProductsResponse:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        brand:
          type: string
        category_path:
          type: string
        url:
          type: string
        pack_size:
          type: string
        first_seen:
          type: string
        last_seen:
          type: string
        scrape_date:
          type: string
        price:
          type: number
        unit_price:
          type: number
        unit_basis:
          type: string
        clubcard_price:
          type: number
        offer_text:
          type: string
        shelf_path:
          type: string
        available:
          type: integer
        removed:
          type: integer
    GetApiStoreProductsCountResponse:
      type: object
      properties:
        total:
          type: integer
    GetApiStorePromotionsResponse:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        brand:
          type: string
        category_path:
          type: string
        url:
          type: string
        pack_size:
          type: string
        last_seen:
          type: string
        scrape_date:
          type: string
        price:
          type: number
        unit_price:
          type: number
        unit_basis:
          type: string
        offer_text:
          type: string
        was_price:
          type: number
        offer_valid:
          type: string
        clubcard_price:
          type: number
    GetApiStoreRemovedResponse:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        brand:
          type: string
        category_path:
          type: string
        first_seen:
          type: string
          description: date
        last_seen:
          type: string
          description: date
        last_price:
          type: number
    GetApiStoreShrinkflationResponse:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        brand:
          type: string
        category_path:
          type: string
        pack_size:
          type: string
        start_date:
          type: string
        end_date:
          type: string
        start_price:
          type: number
        end_price:
          type: number
        start_pack_qty:
          type: number
        start_pack_unit:
          type: string
        end_pack_qty:
          type: number
        end_pack_unit:
          type: string
        pack_shrink_pct:
          type: number
        start_unit_price:
          type: number
        end_unit_price:
          type: number
        unit_basis:
          type: string
        unit_price_pct:
          type: number
        headline_pct:
          type: number
    GetApiStoreVolatileResponse:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        brand:
          type: string
        category_path:
          type: string
        distinct_prices:
          type: integer
        observations:
          type: integer
        min_price:
          type: number
        max_price:
          type: number
        avg_price:
          type: number
        range_pct:
          type: number
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
security:
- apiKey: []
tags:
- name: Api