{"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:03: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}