Check IKEA store stock for products, with aisle and bin.
For up to 10 IKEA article numbers, shows stock in each IKEA store of a country: stock level (high, medium, low, out of stock), quantity, Click & Collect, restock information, where to find it (aisle and bin) and whether home delivery is available. Article numbers differ by country: take them from ikea.com/search-products in the same market. Filter stores by name or city, e.g. 'Berlin' or 'Tempelhof'.
- Site
- IKEA, Germany
- Version
- v1
- Runs, last 7 days
- No reports yet
- sha256
- 97fe678eae16…
Run it with your agent
after installing WieldAsk in plain words. Your agent finds this recipe and calls it:
“Check IKEA store stock for products, with aisle and bin.”
Read-only: it changes nothing on the site. No login needed.
{ "tool": "run", "arguments": { "recipe_id": "ikea.com/check-stock", "params": { "items": [ "80275887" ], "market": "de/de", "store": "Berlin" } } }
Requests
sent from your browser, in order- 1GET/{{params.market}}/meta-data/informera/stores-suggested-detailed.jsonThe market's store list (names, cities) from IKEA's own site metadata.
- 2GETapi.salesitem.ingka.com/availabilities/ru/{{c.country}}?expand&itemNos&zipIKEA's stock service (api.salesitem.ingka.com, Ingka Group's API that ikea.com product pages call). The client key is public: the page's inline config (ciaApiClientKey) carries it for every visitor; it is read from the page at run time. The one-item foreach computes the country code and the item list.
Parameters
from your agentReturns
to your agentWhere it can send
- www.ikea.com
- api.salesitem.ingka.com
Anything else is blocked by the extension.
Reads from your session
- cia_key from dom
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.items) == `1`
- length(output.items[0].stores) >= `2`
- length(output.items[0].stores[?contains(store, 'Berlin')]) == length(output.items[0].stores)
- output.items[0].stores[0].stock != `null`
- length(output.items[0].stores[?quantity != `null`]) > `0`
Raw recipe
Served as canonical JSON from /api/v1/recipes/ikea.com/check-stock, so its sha256 matches the ETag and the index.
curl -s https://wield.run/api/v1/recipes/ikea.com/check-stock | shasum -a 256 # 97fe678eae16baa1410a4ec8de8ed8945cfad7561602746d03c7ff8d54c72e8e
{ "auth": { "derive": [ { "from": "dom", "name": "cia_key", "regex": "\"ciaApiClientKey\":\"([0-9a-f-]{36})\"", "selector": "script:not([src])" } ] }, "description": "For up to 10 IKEA article numbers, shows stock in each IKEA store of a country: stock level (high, medium, low, out of stock), quantity, Click & Collect, restock information, where to find it (aisle and bin) and whether home delivery is available. Article numbers differ by country: take them from ikea.com/search-products in the same market. Filter stores by name or city, e.g. 'Berlin' or 'Tempelhof'.", "effect": "read", "id": "ikea.com/check-stock", "keywords": [ "ikea", "verfügbarkeit", "vorrätig", "lagerbestand", "einrichtungshaus", "abholen", "regal", "gang", "stock", "in stock", "availability", "store", "pickup", "aisle" ], "output": { "schema": { "properties": { "items": { "items": { "properties": { "home_delivery": { "type": "boolean" }, "item_no": { "type": "string" }, "stores": { "items": { "properties": { "aisle": { "description": "Self-serve aisle / bin", "type": [ "string", "null" ] }, "city": { "type": [ "string", "null" ] }, "click_collect": { "type": "boolean" }, "in_stock": { "type": "boolean" }, "quantity": { "type": [ "integer", "null" ] }, "restock": { "description": "IKEA's next restock entry, when it gives one", "type": [ "object", "null" ] }, "stock": { "description": "HIGH_IN_STOCK, MEDIUM_IN_STOCK, LOW_IN_STOCK or OUT_OF_STOCK", "type": [ "string", "null" ] }, "store": { "type": [ "string", "null" ] }, "store_id": { "type": "string" }, "updated": { "type": [ "string", "null" ] } }, "type": "object" }, "type": "array" } }, "type": "object" }, "type": "array" }, "market": { "type": "string" }, "store_filter": { "type": [ "string", "null" ] } }, "type": "object" }, "value": "let $stores = steps.stores.stores || `[]`, $av = steps.stock[0].availabilities || `[]`, $loc = steps.stock[0].sales_locations || `[]`, $q = lower(params.store || '') in {market: params.market || 'de/de', store_filter: params.store || `null`, items: map(&(let $no = @ in {item_no: $no, home_delivery: ($av[?itemKey.itemNo == $no && classUnitKey.classUnitType == 'RU'] | [0]).availableForHomeDelivery == `true`, stores: sort_by(map(&(let $a = @, $sid = @.classUnitKey.classUnitCode in let $s = ($stores[?id == $sid] | [0]), $cc = $a.buyingOption.cashCarry in {store_id: $sid, store: $s.name || `null`, city: $s.city || `null`, stock: $cc.availability.probability.thisDay.messageType || `null`, quantity: $cc.availability.quantity || ($cc.availability && `0`) || `null`, in_stock: ($cc.availability.quantity || `0`) > `0`, click_collect: $a.availableForClickCollect == `true`, restock: ($cc.availability.restocks || `[]`)[0] || `null`, aisle: (let $l = ($loc[?itemKey.itemNo == $no && classUnitKey.classUnitCode == $sid] | [0]).salesLocations[0].aisleAndBin in ($l && join(' / ', [$l.aisle || '', $l.bin || '']))) || `null`, updated: $cc.availability.updateDateTime || `null`}), $av[?itemKey.itemNo == $no && classUnitKey.classUnitType == 'STO'])[?$q == '' || contains(lower(store || ''), $q) || contains(lower(city || ''), $q)], &(store || ''))}), params.items)}" }, "params": { "additionalProperties": false, "properties": { "items": { "description": "IKEA article numbers (8 digits, e.g. '80275887' for KALLAX white 77x147)", "items": { "pattern": "^\\d{8}$", "type": "string" }, "maxItems": 10, "minItems": 1, "type": "array" }, "market": { "default": "de/de", "description": "IKEA country and language", "enum": [ "de/de", "at/de", "ch/de", "nl/nl", "be/nl", "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" }, "store": { "description": "Only stores whose name or city contains this, e.g. 'Berlin', 'Tempelhof', 'München'", "maxLength": 60, "type": "string" }, "zip": { "description": "Postcode for the home delivery check", "maxLength": 12, "type": "string" } }, "required": [ "items" ], "type": "object" }, "provenance": { "method": "browser-inspect", "notes": "Spiked on a KALLAX product page: 'check availability' calls api.salesitem.ingka.com/availabilities/ru/<country>?itemNos=…&zip=…&expand=… (IKEA's stock service run by Ingka Group, a separate host the product pages call; CORS *), with X-Client-ID set to the public ciaApiClientKey from the page's inline config and Accept application/json;version=2. Store names come from www.ikea.com/<market>/meta-data/informera/stores-suggested-detailed.json (store id = classUnitCode). classUnitType RU is the country (home delivery), STO a store. start_path /de/de/ because www.ikea.com/ is a country chooser without the config.", "recorded_at": "2026-11-07T18:43:00+01:00", "recorded_by": "C4" }, "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://www.ikea.com", "https://api.salesitem.ingka.com" ], "start_path": "/de/de/" }, "steps": [ { "description": "The market's store list (names, cities) from IKEA's own site metadata.", "expect": { "content_type": "json", "status": [ 200 ] }, "extract": { "json": { "stores": "[?hideStore != `true`].{id: id, name: name, city: address.city}" } }, "id": "stores", "request": { "headers": { "Accept": "application/json" }, "method": "GET", "url": "/{{params.market}}/meta-data/informera/stores-suggested-detailed.json" } }, { "description": "IKEA's stock service (api.salesitem.ingka.com, Ingka Group's API that ikea.com product pages call). The client key is public: the page's inline config (ciaApiClientKey) carries it for every visitor; it is read from the page at run time. The one-item foreach computes the country code and the item list.", "expect": { "assert": "body.availabilities != `null`", "content_type": "json", "status": [ 200 ] }, "extract": { "json": { "availabilities": "availabilities", "sales_locations": "salesLocations || `[]`" } }, "foreach": { "as": "c", "in": "[{country: split(params.market, '/')[0], items: join(',', params.items)}]", "max": 1 }, "id": "stock", "request": { "credentials": "omit", "headers": { "Accept": "application/json;version=2", "X-Client-ID": "{{vars.cia_key}}" }, "method": "GET", "query": { "expand": "StoresList,Restocks,SalesLocations", "itemNos": "{{c.items}}", "zip": "{{params.zip}}" }, "url": "https://api.salesitem.ingka.com/availabilities/ru/{{c.country}}" } } ], "task": "Check IKEA store stock for products, with aisle and bin", "tos": { "notes": "Two requests per run, the same ones a product page makes when someone checks availability. No account, no cart.", "reviewed": false }, "verify": { "checks": [ "length(output.items) == `1`", "length(output.items[0].stores) >= `2`", "length(output.items[0].stores[?contains(store, 'Berlin')]) == length(output.items[0].stores)", "output.items[0].stores[0].stock != `null`", "length(output.items[0].stores[?quantity != `null`]) > `0`" ], "example_params": { "items": [ "80275887" ], "market": "de/de", "store": "Berlin" }, "max_ms": 5000 }, "version": 1 }