Sign inTry it

Search Lidl's online shop for products.

Searches Lidl's German online shop like its search page: product title, brand, price in euros, the struck-through price and discount when reduced, customer rating and number of reviews, availability (online, coming soon, in stores on given dates), image and link. The first 48 results in Lidl's order. Lidl's search is semantic: a query with no real match still returns loosely related products.

No reports yetRead-only, no login
Site
Lidl, Germany
Version
v2 of 2
Runs, last 7 days
No reports yet
sha256
69d16df85a39…

Run it with your agent

after installing Wield

Ask in plain words. Your agent finds this recipe and calls it:

“Search Lidl's online shop for products.”

Read-only: it changes nothing on the site. No login needed.

{
  "tool": "run",
  "arguments": {
    "recipe_id": "lidl.de/search-products",
    "params": {
      "query": "kaffeemaschine"
    }
  }
}

Requests

sent from your browser, in order
  1. 1GET/q/search?qLidl's search page (/q/search?q=…). Its 48 product tiles are rendered as placeholders; each tile's data is a JSON attribute (data-grid-data) that the recipe parses per tile (html_items field parse: json).

Parameters

from your agent
querystringrequiredWhat to look for, e.g. 'kaffeemaschine', 'akkuschrauber', 'parkside'

Returns

to your agent
productsobject[]availability, brand, discount_percent, image, price_eur, rating, reviews, title, url, was_eur
querystring

Where it can send

  • www.lidl.de

Anything else is blocked by the extension.

Reads from your session

Nothing. Your browser attaches the site's cookies by itself.

Used only in requests to the addresses on the left. Never sent to wield.run or your agent.

Checks

a run passes when
  • length(output.products) > `30`
  • length(output.products[?price_eur > `0`]) == length(output.products)
  • length(output.products[?starts_with(url, 'https://www.lidl.de/p/')]) == length(output.products)
  • length(output.products[?rating != `null` && rating <= `5`]) > `20`
  • length(output.products[?was_eur != `null` && was_eur > price_eur]) > `5`

Raw recipe

Served as canonical JSON from /api/v1/recipes/lidl.de/search-products, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/lidl.de/search-products | shasum -a 256
# 69d16df85a39b23912dea4d6180e977a9f67d5952e0cfd00acf6282f03fbe371
lidl.de/search-products.json, v2
{
  "description": "Searches Lidl's German online shop like its search page: product title, brand, price in euros, the struck-through price and discount when reduced, customer rating and number of reviews, availability (online, coming soon, in stores on given dates), image and link. The first 48 results in Lidl's order. Lidl's search is semantic: a query with no real match still returns loosely related products.",
  "effect": "read",
  "id": "lidl.de/search-products",
  "keywords": [
    "lidl",
    "lidl online shop",
    "angebote",
    "kaffeemaschine",
    "küche",
    "werkzeug",
    "parkside",
    "silvercrest",
    "haushalt",
    "preis",
    "deals",
    "products",
    "germany"
  ],
  "output": {
    "schema": {
      "properties": {
        "products": {
          "items": {
            "properties": {
              "availability": {
                "description": "As Lidl shows it, e.g. 'lieferbar', 'demnächst bestellbar', 'auch in der Filiale von 16.11. - 21.11.'",
                "type": [
                  "string",
                  "null"
                ]
              },
              "brand": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "discount_percent": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "image": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "price_eur": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "rating": {
                "description": "0–5",
                "type": [
                  "number",
                  "null"
                ]
              },
              "reviews": {
                "type": "integer"
              },
              "title": {
                "type": "string"
              },
              "url": {
                "type": "string"
              },
              "was_eur": {
                "description": "Struck-through price (often the recommended retail price) when reduced",
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "type": "object"
          },
          "type": "array"
        },
        "query": {
          "type": "string"
        }
      },
      "required": [
        "query",
        "products"
      ],
      "type": "object"
    },
    "value": "{query: params.query, products: map(&{title: title, brand: brand || `null`, price_eur: price || `null`, was_eur: was || `null`, discount_percent: discount || `null`, rating: rating || `null`, reviews: reviews || `0`, availability: availability || `null`, image: image || `null`, url: join('', ['https://www.lidl.de', path])}, steps.search.products[?title != `null` && path != `null`] || `[]`)}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "query": {
        "description": "What to look for, e.g. 'kaffeemaschine', 'akkuschrauber', 'parkside'",
        "maxLength": 100,
        "minLength": 2,
        "type": "string"
      }
    },
    "required": [
      "query"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "browser-inspect",
    "notes": "Lidl's search page /q/search?q=… is a Nuxt page whose 48 product tiles are skeletons filled by script; each tile element carries its product as JSON in data-grid-data (fullTitle, brand.name, price.price, price.discount.{deletedPrice, percentageDiscount}, price.currencyCode, ratings.{average, count}, stockAvailability.badgeInfo.badges[].text, canonicalUrl, image). The recipe reads those attributes with html_items parse: json + path, so it needs an extension whose interpreter lists the html_json feature (0.1.12 or later); older extensions get extension_outdated from wield-mcp. The page's product search API (/q/api/search) answers servers 401, so it is not used. Paging uses offset=, which robots.txt disallows, so the recipe reads the first page only. No sponsored tiles were in the list. The search is semantic: 'qzxwvkjhgfdpl' still finds 1579 products (numFound in the page state, not readable as JSON), so there is no empty result to detect. v2 (2026-11-07 22:53): keywords only (online shop removed: they steered unrelated searches here, C1 ranking note).",
    "recorded_at": "2026-11-07T22:44:00+01:00",
    "recorded_by": "C4"
  },
  "requires_login": false,
  "schema": "https://wield.run/schema/recipe/v1.json",
  "site": {
    "country": "DE",
    "id": "lidl.de",
    "language": "de",
    "name": "Lidl",
    "origin": "https://www.lidl.de",
    "origins": [
      "https://www.lidl.de"
    ]
  },
  "steps": [
    {
      "description": "Lidl's search page (/q/search?q=…). Its 48 product tiles are rendered as placeholders; each tile's data is a JSON attribute (data-grid-data) that the recipe parses per tile (html_items field parse: json).",
      "expect": {
        "content_type": "html",
        "status": [
          200
        ]
      },
      "extract": {
        "html_items": {
          "products": {
            "fields": {
              "availability": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "stockAvailability.badgeInfo.badges[0].text",
                "selector": ":scope"
              },
              "brand": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "brand.name",
                "selector": ":scope"
              },
              "currency": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "price.currencyCode",
                "selector": ":scope"
              },
              "discount": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "price.discount.percentageDiscount",
                "selector": ":scope"
              },
              "image": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "image",
                "selector": ":scope"
              },
              "path": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "canonicalUrl",
                "selector": ":scope"
              },
              "price": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "price.price",
                "selector": ":scope"
              },
              "rating": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "ratings.average",
                "selector": ":scope"
              },
              "reviews": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "ratings.count",
                "selector": ":scope"
              },
              "title": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "fullTitle",
                "selector": ":scope"
              },
              "was": {
                "attr": "data-grid-data",
                "parse": "json",
                "path": "price.discount.deletedPrice",
                "selector": ":scope"
              }
            },
            "max": 48,
            "selector": "[data-grid-data]"
          }
        }
      },
      "id": "search",
      "request": {
        "headers": {
          "Accept": "text/html"
        },
        "method": "GET",
        "query": {
          "q": "{{params.query}}"
        },
        "url": "/q/search"
      }
    }
  ],
  "task": "Search Lidl's online shop for products",
  "tos": {
    "notes": "robots.txt disallows *search?q=* (and *?offset=*) for bots: this recipe calls the search page itself, once per user request, from the user's own browser. No robots rules for Claude agents and no AI content signals. One request per call; nothing is added to the cart.",
    "reviewed": false
  },
  "verify": {
    "checks": [
      "length(output.products) > `30`",
      "length(output.products[?price_eur > `0`]) == length(output.products)",
      "length(output.products[?starts_with(url, 'https://www.lidl.de/p/')]) == length(output.products)",
      "length(output.products[?rating != `null` && rating <= `5`]) > `20`",
      "length(output.products[?was_eur != `null` && was_eur > price_eur]) > `5`"
    ],
    "example_params": {
      "query": "kaffeemaschine"
    },
    "max_ms": 5000
  },
  "version": 2
}