Search fashion products with optional size and price filters.
Searches the Zalando catalogue (www.zalando.de) like the site's own search, via its GraphQL API: name, brand, current and original price, sale flag, sizes in stock, badges and product link. Filters by size and price range; sorts by popularity or price. If Zalando rotates its query hashes this fails with expect_failed; use zalando.de/search-products-html then.
- Site
- Zalando, Germany
- Version
- v1
- Runs, last 7 days
- No reports yet
- sha256
- 7a7a28165226…
Requests
sent from your browser, in order- 1POST/api/graphql/Persisted catalog query: product ids, total count. On www the collection id is ...:katalog (German); ...:catalogue silently returns NO_HITS there.
- 2POST/api/graphql/Batched product-card query (one entry per product id, as the site does).
Parameters
from your agentlimitinteger = 24
max_priceintegerEUR
min_priceintegerEUR
querystringrequiredSearch text, e.g. 'sneakers', 'regenjacke herren'
sizesstring[]Size keys, e.g. ['42'] for shoes, ['M'] for clothes = []
sortenum "POPULARITY" | "PRICE_ASC" = "POPULARITY"
Returns
to your agentcurrencyany
no_hitsboolean
pagesinteger
productsobject[]brand, flags, name, on_sale, original_price_eur, price_eur, sizes, sku, url
querystring
totalintegerAll matching products on Zalando
Where it can send
- www.zalando.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) > `0`
- output.total > `100`
- output.no_hits == `false`
- length(output.products[?price_eur > `80`]) == `0`
- starts_with(output.products[0].url, 'https://www.zalando.de/')
Raw recipe
Served as canonical JSON from /api/v1/recipes/zalando.de/search-products, so its sha256 matches the ETag and the index.
Check it yourself
curl -s https://wield.run/api/v1/recipes/zalando.de/search-products | shasum -a 256 # 7a7a281652263a8e59465a171670d3230b8543efcef8b321f958782ce30fa69a
zalando.de/search-products.json, v1
{ "description": "Searches the Zalando catalogue (www.zalando.de) like the site's own search, via its GraphQL API: name, brand, current and original price, sale flag, sizes in stock, badges and product link. Filters by size and price range; sorts by popularity or price. If Zalando rotates its query hashes this fails with expect_failed; use zalando.de/search-products-html then.", "effect": "read", "id": "zalando.de/search-products", "keywords": [ "zalando", "mode", "kleidung", "schuhe", "sneaker", "jacke", "online shopping", "fashion", "clothes", "shoes", "shopping", "buy clothes", "größe", "preis" ], "output": { "schema": { "properties": { "currency": { "const": "EUR" }, "no_hits": { "type": "boolean" }, "pages": { "type": [ "integer", "null" ] }, "products": { "items": { "properties": { "brand": { "type": "string" }, "flags": { "description": "e.g. Deal, Bestseller, Nachhaltigkeit", "items": { "type": "string" }, "type": "array" }, "name": { "type": "string" }, "on_sale": { "type": "boolean" }, "original_price_eur": { "type": [ "number", "null" ] }, "price_eur": { "description": "Current price (sale price if on sale)", "type": "number" }, "sizes": { "description": "Sizes in stock", "items": { "type": "string" }, "type": "array" }, "sku": { "type": "string" }, "url": { "format": "uri", "type": "string" } }, "type": "object" }, "type": "array" }, "query": { "type": "string" }, "total": { "description": "All matching products on Zalando", "type": "integer" } }, "required": [ "query", "total", "products" ], "type": "object" }, "value": "{query: params.query, total: steps.catalog.kind == 'NO_HITS' && `0` || steps.catalog.total, pages: steps.catalog.pages, no_hits: steps.catalog.kind == 'NO_HITS', currency: 'EUR', products: steps.cards.products || `[]`}" }, "params": { "additionalProperties": false, "properties": { "limit": { "default": 24, "maximum": 50, "minimum": 1, "type": "integer" }, "max_price": { "description": "EUR", "minimum": 1, "type": "integer" }, "min_price": { "description": "EUR", "minimum": 0, "type": "integer" }, "query": { "description": "Search text, e.g. 'sneakers', 'regenjacke herren'", "maxLength": 100, "minLength": 1, "type": "string" }, "sizes": { "default": [], "description": "Size keys, e.g. ['42'] for shoes, ['M'] for clothes", "items": { "type": "string" }, "type": "array" }, "sort": { "default": "POPULARITY", "enum": [ "POPULARITY", "PRICE_ASC" ], "type": "string" } }, "required": [ "query" ], "type": "object" }, "provenance": { "method": "browser-inspect", "notes": "spikes/zalando.md plus a C4 re-check on www.zalando.de: the spike's collection id ern:collection:cat:categ:catalogue only works on en.zalando.de; on www (German) it silently returns catalogResultKind NO_HITS with totalCount 2 (this was the spike's 'curl soft-fail'). With ...:katalog it returns CATALOG and real hits. Persisted-query hashes only (raw queries rejected); they rotate with frontend deploys. Only Content-Type is required; no cookies or XSRF for reads. Empty sizes must be options: [] ([null] is a GraphQL error); missing min/max are dropped. The extension needs the tab to stay on www: a browser with Zalando's English language cookie is redirected to en.zalando.de (tab_error).", "recorded_at": "2026-11-07T12:20:00+01:00", "recorded_by": "C4" }, "requires_login": false, "schema": "https://wield.run/schema/recipe/v1.json", "site": { "country": "DE", "id": "zalando.de", "language": "de", "login_url": "https://www.zalando.de/login", "name": "Zalando", "origin": "https://www.zalando.de", "origins": [ "https://www.zalando.de" ] }, "steps": [ { "description": "Persisted catalog query: product ids, total count. On www the collection id is ...:katalog (German); ...:catalogue silently returns NO_HITS there.", "expect": { "assert": "body[0].errors == null && body[0].data.collection.entities != null", "content_type": "json", "status": [ 200 ] }, "extract": { "json": { "cards_body": "[0].data.collection.entities.catalogResultKind != 'NO_HITS' && [0].data.collection.entities.edges[?starts_with(node.id, 'ern:product::')].{id: '56101dd21771604ceeed97d5bc1e950e56ffaf38d7ac267894777a4a457dcafd', variables: {id: node.id, skipHoverData: `false`, isSustainabilityProductScoreEnabled: `false`, version: `1`, moduleInput: {module: 'PRODUCT_CARD_WITH_HOVER'}, displayContext: {module: 'PRODUCT_CARD_WITH_HOVER'}, isRatingEnabled: `false`, shouldLoadGallery: `false`, isCatalogView: `true`}} || `[]`", "kind": "[0].data.collection.entities.catalogResultKind", "pages": "[0].data.collection.entities.pageInfo.numberOfPages", "total": "[0].data.collection.entities.totalCount" } }, "id": "catalog", "request": { "body": { "type": "json", "value": [ { "id": "7e1b853f12ef1ae6a253dbad0b35310f75581d2e3aabda4a95a30278643ae0c4", "variables": { "fetchDesktopSpan": false, "fetchExperience": false, "fetchScsSeoContents": false, "filters": { "discreteFilters": [ { "key": "sizes", "options": "{{params.sizes}}" } ], "fullTextQuery": "{{params.query}}", "rangeFilters": [ { "key": "prices", "maximum": "{{params.max_price}}", "minimum": "{{params.min_price}}" } ], "toggleFilters": [] }, "first": "{{params.limit}}", "forcedEntities": [ null ], "height": 800, "id": "ern:collection:cat:categ:katalog", "isLoggedIn": false, "isPaginationRequest": false, "orderBy": "{{params.sort}}", "subSli": "client", "uri": "/katalog/?q={{params.query | urlencode}}", "width": 1280 } } ] }, "headers": { "Accept": "application/json", "Content-Type": "application/json" }, "method": "POST", "url": "/api/graphql/" } }, { "delay_ms": 200, "description": "Batched product-card query (one entry per product id, as the site does).", "expect": { "assert": "length(body[?data.product != null]) > `0`", "content_type": "json", "status": [ 200 ] }, "extract": { "json": { "products": "[?data.product != null].data.product.{sku: sku, name: name, brand: brand.name, price_eur: (displayPrice.promotional.amount || displayPrice.original.amount) / `100`, original_price_eur: displayPrice.original.amount && displayPrice.original.amount / `100` || `null`, on_sale: displayPrice.promotional != `null`, sizes: simples[].size || `[]`, flags: productFlags[].formatted || `[]`, url: uri}" } }, "id": "cards", "request": { "body": { "type": "json", "value": "{{steps.catalog.cards_body}}" }, "headers": { "Accept": "application/json", "Content-Type": "application/json" }, "method": "POST", "url": "/api/graphql/" }, "when": "length(steps.catalog.cards_body) > `0`" } ], "task": "Search fashion products with optional size and price filters", "tos": { "notes": "Zalando's terms forbid automated extraction of content. One user-initiated search at a time from the user's browser (2 requests); Akamai scores automated traffic (an automated test browser was tagged traffic_type=aggressive-crawler), so keep it human-paced. Buying stays on zalando.de.", "reviewed": false }, "verify": { "checks": [ "length(output.products) > `0`", "output.total > `100`", "output.no_hits == `false`", "length(output.products[?price_eur > `80`]) == `0`", "starts_with(output.products[0].url, 'https://www.zalando.de/')" ], "example_params": { "max_price": 80, "query": "sneakers", "sizes": [ "42" ] }, "max_ms": 5000 }, "version": 1 }