Sign inTry it

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'.

No reports yetRead-only, no login
Site
IKEA, Germany
Version
v1
Runs, last 7 days
No reports yet
sha256
97fe678eae16…

Run it with your agent

after installing Wield

Ask 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
  1. 1GET/{{params.market}}/meta-data/informera/stores-suggested-detailed.jsonThe market's store list (names, cities) from IKEA's own site metadata.
  2. 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.no cookiesrepeats, max 1

Parameters

from your agent
itemsstring[]requiredIKEA article numbers (8 digits, e.g. '80275887' for KALLAX white 77x147)
marketenumIKEA country and language "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" = "de/de"
storestringOnly stores whose name or city contains this, e.g. 'Berlin', 'Tempelhof', 'München'
zipstringPostcode for the home delivery check

Returns

to your agent
itemsobject[]home_delivery, item_no, stores
marketstring
store_filterstring

Where 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.

Check it yourself
curl -s https://wield.run/api/v1/recipes/ikea.com/check-stock | shasum -a 256
# 97fe678eae16baa1410a4ec8de8ed8945cfad7561602746d03c7ff8d54c72e8e
ikea.com/check-stock.json, v1
{
  "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
}