Search IKEA products with price, rating and online availability.
Searches IKEA's catalogue like the site's search box, in any IKEA market (de/de, us/en, gb/en, fr/fr, …): name, product type, size, colour/design, current and previous price with currency, star rating and number of reviews, badges (bestseller, new lower price, last chance), online availability, number of variants, image and product page. IKEA always returns its closest matches, even for queries that match nothing, so check the names. Planner and content tiles are dropped.
- Site
- IKEA, Germany
- Version
- v2 of 2
- Runs, last 7 days
- No reports yet
- sha256
- 46e17c9cc5ec…
Run it with your agent
after installing WieldAsk in plain words. Your agent finds this recipe and calls it:
“Search IKEA products with price, rating and online availability.”
Read-only: it changes nothing on the site. No login needed.
{ "tool": "run", "arguments": { "recipe_id": "ikea.com/search-products", "params": { "market": "de/de", "query": "kallax" } } }
Requests
sent from your browser, in order- 1POSTsik.search.blue.cdtapps.com/{{params.market}}/search?c&vIKEA's search service (sik.search.blue.cdtapps.com), the same JSON API the search page calls; read-only POST, public, CORS open. The one-item foreach computes the page offset.
Parameters
from your agentReturns
to your agentWhere it can send
- sik.search.blue.cdtapps.com
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) > `5`
- output.products[0].price > `0`
- output.products[0].currency == 'EUR'
- length(output.products[?starts_with(url, 'https://www.ikea.com/de/de/p/')]) == length(output.products)
- output.total > `5`
Raw recipe
Served as canonical JSON from /api/v1/recipes/ikea.com/search-products, so its sha256 matches the ETag and the index.
curl -s https://wield.run/api/v1/recipes/ikea.com/search-products | shasum -a 256 # 46e17c9cc5ec5aaa79020066554fc815f158d6f440b0def55878e5bd23d90601
{ "description": "Searches IKEA's catalogue like the site's search box, in any IKEA market (de/de, us/en, gb/en, fr/fr, …): name, product type, size, colour/design, current and previous price with currency, star rating and number of reviews, badges (bestseller, new lower price, last chance), online availability, number of variants, image and product page. IKEA always returns its closest matches, even for queries that match nothing, so check the names. Planner and content tiles are dropped.", "effect": "read", "id": "ikea.com/search-products", "keywords": [ "ikea", "möbel", "regal", "kallax", "billy", "malm", "schrank", "einrichtung", "furniture", "home", "shelf", "storage", "product search", "price" ], "output": { "schema": { "properties": { "did_you_mean": { "items": { "type": "string" }, "type": "array" }, "market": { "type": "string" }, "products": { "items": { "properties": { "badge": { "type": [ "string", "null" ] }, "currency": { "type": [ "string", "null" ] }, "design": { "type": [ "string", "null" ] }, "id": { "description": "IKEA article number", "type": "string" }, "image": { "type": [ "string", "null" ] }, "last_chance": { "type": "boolean" }, "name": { "type": "string" }, "new_lower_price": { "type": "boolean" }, "online_sellable": { "type": "boolean" }, "previous_price": { "type": [ "number", "null" ] }, "price": { "type": [ "number", "null" ] }, "rating": { "type": [ "number", "null" ] }, "rating_count": { "type": [ "integer", "null" ] }, "size": { "type": [ "string", "null" ] }, "type": { "type": [ "string", "null" ] }, "url": { "type": [ "string", "null" ] }, "variants": { "type": [ "integer", "null" ] } }, "type": "object" }, "type": "array" }, "query": { "type": "string" }, "query_expanded": { "description": "IKEA broadened the query", "type": "boolean" }, "total": { "type": [ "integer", "null" ] } }, "type": "object" }, "value": "let $max = params.max_price in {query: params.query, market: params.market || 'de/de', total: steps.search[0].total || `null`, did_you_mean: steps.search[0].summary.did_you_mean || `[]`, query_expanded: steps.search[0].summary.expanded == `true`, products: map(&(let $p = @ in {id: $p.itemNo || $p.id, name: $p.name, type: $p.typeName || `null`, size: $p.itemMeasureReferenceText || `null`, design: $p.validDesignText || `null`, price: $p.salesPrice.numeral || `null`, previous_price: $p.salesPrice.previous && to_number(join('.', [$p.salesPrice.previous.wholeNumber, $p.salesPrice.previous.decimals || '0'])) || `null`, currency: $p.salesPrice.currencyCode || `null`, rating: $p.ratingValue || `null`, rating_count: $p.ratingCount || `null`, badge: $p.badge.text || `null`, new_lower_price: contains($p.salesPrice.tags || `[]`, 'NEW_LOWER_PRICE'), last_chance: $p.lastChance == `true`, online_sellable: $p.onlineSellable == `true`, variants: $p.gprDescription.numberOfVariants || `null`, url: $p.pipUrl || `null`, image: $p.mainImageUrl || `null`}), steps.search[0].products || `[]`)[?!$max || price <= $max]}" }, "params": { "additionalProperties": false, "properties": { "limit": { "default": 24, "enum": [ 12, 24, 48 ], "type": "integer" }, "market": { "default": "de/de", "description": "IKEA country and language", "enum": [ "de/de", "at/de", "ch/de", "ch/fr", "nl/nl", "be/nl", "be/fr", "fr/fr", "gb/en", "ie/en", "us/en", "ca/en", "au/en", "se/sv", "dk/da", "no/no", "fi/fi", "it/it", "es/es", "pt/pt", "pl/pl", "cz/cs" ], "type": "string" }, "max_price": { "description": "Keep products at or below this price (in the market's currency)", "minimum": 0, "type": "number" }, "page": { "default": 1, "maximum": 20, "minimum": 1, "type": "integer" }, "query": { "description": "Product name or what you need, e.g. 'kallax', 'billy regal', 'office chair'", "maxLength": 100, "minLength": 2, "type": "string" } }, "required": [ "query" ], "type": "object" }, "provenance": { "method": "har", "notes": "Built with the recipe builder: a captured search call, sanitized into a trace, derived in 3 rounds (the offline replay caught steps.search vs steps.search[0] for the one-item foreach). One call: the search page's POST to sik.search.blue.cdtapps.com/<country>/<language>/search?c=sr&v=<version>, IKEA's own search service (a separate host that IKEA's pages call cross-origin; it answers with CORS *). Products are the PRIMARY_AREA items of type PRODUCT; PLANNER/CONTENT breakouts are not requested. v is a date-like API version from the recording. Verified live 2026-11-07: de/de kallax 24/143 in 322 ms, at/de, us/en with max_price (USD). v2 (2026-11-07 22:38): read_only_post on 1 step only; requests and output unchanged.", "recorded_at": "2026-11-07T18:37:46+01:00", "recorded_by": "C4 with wield-build (capture → trace → derive → replay → live test)" }, "requires_login": false, "schema": "https://wield.run/schema/recipe/v1.json", "site": { "country": "DE", "id": "ikea.com", "language": "de", "name": "IKEA", "origin": "https://www.ikea.com", "origins": [ "https://sik.search.blue.cdtapps.com" ] }, "steps": [ { "description": "IKEA's search service (sik.search.blue.cdtapps.com), the same JSON API the search page calls; read-only POST, public, CORS open. The one-item foreach computes the page offset.", "expect": { "assert": "body.results != `null`", "content_type": "json", "status": [ 200 ] }, "extract": { "json": { "products": "results[?component == 'PRIMARY_AREA'] | [0].items[?type == 'PRODUCT'].product", "summary": "results[?component == 'SEARCH_SUMMARY'] | [0].{query: originalQuery, did_you_mean: didYouMeanPhrases, expanded: queryWasExpanded}", "total": "results[?component == 'PRIMARY_AREA'] | [0].metadata.max" } }, "foreach": { "as": "pg", "in": "[{offset: (params.page - `1`) * params.limit}]", "max": 1 }, "id": "search", "read_only_post": true, "request": { "body": { "type": "json", "value": { "allowAutocorrect": true, "components": [ { "allVariants": false, "columns": 4, "component": "PRIMARY_AREA", "forceFilterCalculation": false, "types": { "breakouts": [], "main": "PRODUCT" }, "window": { "offset": "{{pg.offset}}", "size": "{{params.limit}}" } }, { "component": "SEARCH_SUMMARY" } ], "isB2B": false, "isUserLoggedIn": false, "searchParameters": { "input": "{{params.query}}", "type": "QUERY" } } }, "credentials": "omit", "headers": { "Accept": "application/json", "Content-Type": "application/json" }, "method": "POST", "query": { "c": "sr", "v": "20260727" }, "url": "https://sik.search.blue.cdtapps.com/{{params.market}}/search" } } ], "task": "Search IKEA products with price, rating and online availability", "tos": { "notes": "One search request per run, the same request the IKEA site makes when someone searches. No account, no cart.", "reviewed": false }, "verify": { "checks": [ "length(output.products) > `5`", "output.products[0].price > `0`", "output.products[0].currency == 'EUR'", "length(output.products[?starts_with(url, 'https://www.ikea.com/de/de/p/')]) == length(output.products)", "output.total > `5`" ], "example_params": { "market": "de/de", "query": "kallax" }, "max_ms": 4000 }, "version": 2 }