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