Sign inTry it

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.

No reports yetRead-only, no login
Site
IKEA, Germany
Version
v2 of 2
Runs, last 7 days
No reports yet
sha256
46e17c9cc5ec…

Run it with your agent

after installing Wield

Ask 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
  1. 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.json bodyno cookiesrepeats, max 1

Parameters

from your agent
limitenum 12 | 24 | 48 = 24
marketenumIKEA country and language "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" = "de/de"
max_pricenumberKeep products at or below this price (in the market's currency)
pageinteger = 1
querystringrequiredProduct name or what you need, e.g. 'kallax', 'billy regal', 'office chair'

Returns

to your agent
did_you_meanstring[]
marketstring
productsobject[]badge, currency, design, id, image, last_chance, name, new_lower_price, online_sellable, previous_price, price, rating, rating_count, size, type, url, variants
querystring
query_expandedbooleanIKEA broadened the query
totalinteger

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

Check it yourself
curl -s https://wield.run/api/v1/recipes/ikea.com/search-products | shasum -a 256
# 46e17c9cc5ec5aaa79020066554fc815f158d6f440b0def55878e5bd23d90601
ikea.com/search-products.json, v2
{
  "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
}