IKEA Scraper Lite icon

IKEA Scraper Lite

Scrape IKEA products across 50+ markets. Extract names, prices, currencies, ratings, full reviews, colours, dimensions, images, categories, variants,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

IKEA Scraper Lite at a glance

IKEA Scraper Lite is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes item no, name, type, change type (incremental mode) and price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.00 per 1,000 results on the Apify Free plan, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Other
Pricing
$1.00 per 1,000 results (Free plan)
Output
Documented below · JSON, CSV, Excel
Inputs
36 options

Scrape IKEA products across 50+ markets. Extract names, prices, currencies, ratings, full reviews, colours, dimensions, images, categories, variants, badges and store availability. Supports search, category, item-number and URL inputs with filters and sorting.

What IKEA Scraper Lite can do

  • Four ways to find products. Search by keyword, list a category, look up exact item numbers, or paste product, category, search and room/department links.
  • 50+ country storefronts. One Market and language field picks the country, currency and product range; a pasted link in URL mode carries its own market instead.
  • Specials and pricing built in. Every product already carries its markdown info, was-price, savings amount, discount percent and IKEA's own specials label, at no extra request cost.
  • Room and department links just work. A collection page like a living room hub is expanded into the real categories it lists, and each one is scraped, so you don't have to hand-build category links.
  • Detail enrichment on demand. Attach the full description and individual customer reviews (author, date, title, text, rating) per product. It consumes additional platform usage only for the products it reads; there is no enrichment event fee.
  • Availability on demand. Attach national stock and per-store stock, click and collect and cash and carry status per product. Pick the stores you care about (for example IKEA Logan) and get one stock entry per store, even when it holds none.

Choose what to collect

These inputs let you configure IKEA Scraper Lite. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredsearch = keywords + filters. productIds = exact item numbers. url = paste product, category or search links, or bare category ids, and walk them.

Choices: search, productIds, url, category

marketstringThe IKEA market (and its language) to scrape. Sets prices, currency, product range and the site language. In URL mode the market is taken from each link instead.

Choices: us/en, au/en, at/de, bh/ar, bh/en, be/nl, be/fr, ca/en, ca/fr, cl/es, cn/zh, co/es, hr/hr, cz/cs, dk/da, eg/ar, eg/en, ee/et, fi/fi, fi/sv, fr/fr, de/de, hu/hu, in/en, ie/en, il/he, it/it, jp/en, jp/ja, jo/ar, jo/en, kw/ar, kw/en, lv/lv, lt/lt, my/en, mx/es, ma/ar, ma/fr, nl/nl, no/no, om/ar, om/en, ph/en, pl/pl, pt/pt, qa/ar, qa/en, ro/ro, sa/ar, sa/en, rs/sr, sg/en, sk/sk, si/sl, kr/ko, es/es, se/sv, ch/fr, ch/de, ch/it, th/en, th/th, ae/ar, ae/en, gb/en

searchTermsarrayOne or more keywords to search, e.g. sofa, bookcase, desk lamp.
sortBystringOrder of results within each search or category listing, including a search or category link pasted in URL mode. Ignored for productIds and single product links.

Choices: RELEVANCE, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, NEWEST, RATING, MOST_POPULAR, NAME_ASCENDING, WIDTH, HEIGHT, DEPTH, NAME_DESCENDING, CUSTOMER_RATING

productIdsarrayExact IKEA item numbers, e.g. 20522046, each resolves to a full product record.
urlsarrayPaste product, category or search links from ikea.com, or a bare letter-prefixed category id (fu003, tl001, bm003), each link's own market is used, defaulting to Market and language above for a bare id. A search or category link keeps the filters and sort it carries (for example ?filters=f-colors%3A10156&sort=PRICE_LOW_TO_HIGH): they apply to that link and take precedence over the same Facet filters key or Sort by chosen below; a page number (?page=2) is not used, every link is walked from its first page. A room or department link (e.g. ikea.com/us/en/rooms/living-room/) expands into every category that page itself lists; a link with no resolvable category (offers, new, campaigns) is reported in the log and skipped, never guessed as a keyword. Every other field in the Filters section below still applies here, to each search or category link you paste; a single product link always returns that exact item, unfiltered.
categoriesarrayDeprecated compatibility field for saved tasks and API integrations using mode="category". New runs should use URL mode above, which accepts the same category links and bare ids directly.
Show 29 more inputs
More input fields
InputWhat it controls
minPriceintegerOnly keep products at or above this price (market currency).
maxPriceintegerOnly keep products at or below this price (market currency).
minRatingintegerOnly keep products with an average rating at or above this value (1-5).
inStockOnlybooleanKeep only products currently sellable online.
containsKeywordstringKeep only products whose name, type or description contains this text.
specialsCategorystringShow only products in one of IKEA's specials categories: IKEA Family price (loyalty-program markdown) or Last chance (clearance / limited-stock items). Off by default. Added as a facet to the same listing request.

Choices: none, family_price, last_chance

filtersobjectNative IKEA facet filters for search and category listings. Keys: colors, materials, type, price, category; values are comma-separated facet ids as shown on the site's filter panel (colors e.g. 10139, price e.g. PRICE_0_10000). Unknown keys are ignored. Not applied in item-number mode or to single product links.
fetchDetailsbooleanAttach the full marketing description and individual customer reviews (title, text, author, date, rating) to each product.
maxReviewsintegerCap on individual reviews captured per product (0 disables review text; ratings are still attached). Reviews consume additional platform usage; there is no enrichment event fee. The true limit is however many reviews IKEA includes on the product page itself; values above 100000 are treated as 100000.
includeAvailabilitybooleanAttach national and per-store stock (quantity, click & collect, cash & carry) to each product. Leave Store IDs empty for the stores that currently hold stock (up to 25).
storeIdsarrayNeeds Include store availability switched on. Return stock for only these stores, always one entry per store you list, even when the quantity is 0 or the item is not offered there. Use the numeric store id (919 is IKEA Logan) or a store name such as Logan (names are known for Australia). An unknown name stops the run before anything is collected.
deliveryPostcodestringOnly for market Australia / English; needs Include store availability switched on. Adds a postcode-specific yes/no to each product: does IKEA offer home delivery to this 4-digit Australian postcode (for example 4209). It is reported next to, and separately from, the store quantities. It is not a delivery date or a delivery price, and stock at a store does not prove delivery. Leave empty to skip. A postcode in another format, another market, or Include store availability off stops the run before anything is collected.
maxItemsintegerTotal products to return across all inputs, the overall run cap.
readProductsAtOnceintegerHow many product pages are read in parallel to finish faster. Results, order and charges are identical at any value. Set 1 to read strictly one at a time. Reading automatically drops back to one at a time whenever the site pushes back.
maxPagesintegerOptional safety cap on result pages walked per search or category. Leave empty or 0 for no page limit, the run stops at Max products instead.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large crawl of products without returning or charging for products already collected there. Use this after an interrupted run, or when continuing a product catalogue pull in another run. For recurring monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately per market, mode (search/category/productIds/url), and filter setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the market, mode, search/category/productIds/urls and filter settings, different setups then never mix state with each other.
baselineDatasetIdstringOptional. Pick the dataset of an earlier full run of this Actor to use as your starting point, so your first incremental run returns only products that changed since then instead of the whole catalogue again. Pick the dataset unedited: it must be this Actor's own product output. Only used on the first run for a state key; ignored once that state key already tracks products. Cannot be combined with Resume from a previous run. If the dataset is old, everything that changed since is returned as UPDATED or NEW.
earlierHistoryStoreIdstringOptional. Pick the saved-history store of the IKEA Scraper (named ikea-com-incremental-state) so your first Lite run for a State key, or for the same search settings, continues from the history that scraper already tracked, instead of returning the whole catalogue as NEW. The store is only read, never changed. Only used on the first run for a state key; ignored once that state key already tracks products, or when Start from an existing dataset or Resume is set.
emitUnchangedbooleanOff by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search/category/URLs, not when Max products capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.
changeScopestringAll fields (default): any change to the product record returns an UPDATED row, exactly as before this option existed. Price and availability only: only price changes (price, was price, savings, discount and special flags, and each colour/size variant's own price) and availability changes (online sellable, the product page's stock status, national click and collect and home delivery, and in-stock, click and collect or cash and carry changes at the stores chosen in Store ids) return an UPDATED row; names, descriptions, images, badges, ratings and other details never do. Selling price and availability only: like Price and availability only, but a price change counts only when the selling price (price, for the product or a variant) or its currency moves; was prices, savings and special flags never return a row on their own. In both narrow options, unit counts, the stock level label and the in-store location alone never return a row. Changing this option on a search with no State key continues from that search's saved baseline instead of starting over.

Choices: all, priceAndStock, sellingPriceAndStock

compactUpdatesbooleanOff by default. When on, UPDATED rows (and EXPIRED rows) are short: product id, url, name, current price, online sellable flag and the availability block, plus priceChanges, variantChanges (per colour/size variant) and storeChanges (per chosen store, and the national click and collect and home delivery flags) showing the old and new value of each moved field. NEW rows always carry the complete product record. Review text is not included in compact rows. A compact row is billed exactly like the full row it replaces.
expireAfterMissedScansintegerOnly used with Emit expired products. A product is marked EXPIRED only after it has been missing from this many full scans in a row (default 1). Raise it (e.g. 3) so a product that briefly drops out of a search or category listing is not reported as gone. A product that comes back resets the count. A scan that was capped, resumed or could not read a page never counts as a miss. Stock status itself is reported through the availability fields, not through EXPIRED.
ignoreFieldsForChangesarrayOptional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (full description, reviews and store availability already never trigger a false UPDATED when their own fetch simply didn't land this run). Use this if another field in your setup turns out to be noisy, for example priceValidFrom/priceValidTo or isBreathTaking, which IKEA can rotate without the product itself changing.
mcpConnectorsarrayOptionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify then Settings then API & Integrations, then select it here. Notion gets a page-per-item export; other connectors get a best-effort write. Leave empty to skip. Supported: Notion, Linear, Airtable, Apify.
notionParentPageUrlstringURL or id of the Notion page under which item pages are created. Required only for the Notion export.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idItem no (text)
nameName (text)
typeNameType (text)
changeTypeChange type (incremental mode) (text)
pricePrice (number)
wasPriceWas price (number)
discountPercentDiscount % (number)
currencyCur (text)
onSaleOn Sale (boolean)
isOnSpecialSpecials (boolean)
averageRatingRating (number)
reviewCountReviews (number)
Show 19 more fields
colorColour (text)
onlineSellableSellable (boolean)
marketMarket (text)
urlURL (link)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
reviewsCollectedReviews collected (number)
reviewsreviews
authorReviewer (text)
dateReview date (date)
titleReview title (text)
bodyReview text (text)
ratingReview rating (number)
previousPricePrevious price (compact updates) (number)
priceChangesPrice and stock changes (compact updates) (object)
variantChangesVariant changes (compact updates) (array)
storeChangesStore changes (compact updates) (array)
otherChangesOther changes (compact updates) (object)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "kind": "product",
  "id": "00099999",
  "itemNo": "00099999",
  "itemType": "ART",
  "name": "SAMPLE",
  "typeName": "Shelving unit",
  "description": "A simple sample shelving unit with adjustable shelves.",
  "url": "https://www.ikea.com/us/en/p/sample-shelving-unit-white-00099999/",
  "price": 148,
  "currency": "USD",
  "priceFormatted": "$148.00",
  "onSale": true,
  "isOnSpecial": true,
  "wasPrice": 179,
  "wasPriceFormatted": "$179.00",
  "savingsAmount": 31,
  "discountPercent": 17.3,
  "specialsLabel": "IKEA Family price",
  "ratingValue": 4.4,
  "ratingCount": 812,
  "averageRating": 4.4,
  "reviewCount": 812,
  "color": "slate gray",
  "colors": [
    {
      "name": "slate gray",
      "id": "90512",
      "hex": "5b6470"
    }
  ],
  "measurementText": "27 1/2x9 3/4x70 1/4 \"",
  "width": 27.5,
  "depth": 9.75,
  "height": 70.25,
  "measurementUnit": "in",
  "material": "Particleboard, foil, plastic edging",
  "categoryPath": [
    "Storage & organization",
    "Shelving units"
  ],
  "ancestorCategories": [
    {
      "name": "Storage & organization",
      "key": "st001",
      "url": "https://www.ikea.com/us/en/cat/storage-organization-st001/"
    },
    {
      "name": "Shelving units",
      "key": "st002",
      "url": "https://www.ikea.com/us/en/cat/shelving-units-st002/"
    }
  ],
  "badge": "Best seller",
  "isBestseller": true,
  "onlineSellable": true,
  "mainImage": "https://www.ikea.com/us/en/images/products/sample__0000001.jpg",
  "mainImageAlt": "SAMPLE Shelving unit, slate gray",
  "contextualImageUrl": "https://www.ikea.com/us/en/images/products/sample__0000002.jpg",
  "contextualImageAlt": "Living room with the SAMPLE shelving unit",
  "tag": "FAMILY_PRICE",
  "tagText": "IKEA Family price",
  "images": [
    "https://www.ikea.com/us/en/images/products/sample__0000001.jpg"
  ],
  "numberOfVariants": 3,
  "variants": [
    {
      "id": "00099998",
      "name": "SAMPLE",
      "color": "black",
      "price": 158,
      "currency": "USD"
    }
  ],
  "market": "us",
  "language": "en",
  "reviewsCollected": 1,
  "reviews": [
    {
      "author": "Jordan R.",
      "date": "2026-07-14",
      "title": "Sturdy and easy to build",
      "body": "Took about an hour to assemble and looks great in the living room.",
      "rating": 5
    }
  ],
  "availability": {
    "national": {
      "country": "US",
      "homeDelivery": true,
      "clickCollect": true,
      "stockStatus": "HIGH_IN_STOCK"
    },
    "storesWithStock": 37,
    "stores": [
      {
        "code": "512",
        "cashCarry": true,
        "quantity": 48,
        "stockStatus": "HIGH_IN_STOCK"
      }
    ]
  }
}

Ways to use this data

  • Price and markdown tracking: monitor a category or a list of item numbers for price drops, IKEA Family price markdowns and last-chance clearance.
  • Catalogue and range building: pull a full category or room sweep into your own product database or marketplace feed.
  • Review and ratings research: collect individual review text and ratings for sentiment analysis or competitor benchmarking.
  • Stock and fulfilment checks: confirm national and per-store availability, click and collect and home delivery status before promoting a product.
  • Cross-market comparison: compare price, currency and range differences for the same item numbers across several country storefronts.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does IKEA Scraper Lite return?

The documented output for IKEA Scraper Lite includes item no, name, type, change type (incremental mode), price, was price, discount % and cur. Availability of each field depends on the source page and the selected mode.

How much does IKEA Scraper Lite cost?

It costs $1.00 per 1,000 results on the Apify Free plan, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Reading the results

Every run writes a RUN_SUMMARY record to its key-value store: productsScanned, productsReturned (including EXPIRED rows; expiredRowsReturned gives their number), rowsByChangeType, stockReads (attempted, answered, unknownToStockService, unread), deliveryReads (attempted, answered, unreadable; only with deliveryPostcode), productPages (attempted, landed, unread), scanComplete (the same test that allows EXPIRED rows), stateCommitted and stateProblem (incremental mode), stoppedEarlyReason (maxItems, maxTotalCharge, timeLimit or empty) and stoppedAtChargeLimit. When fewer than 99% of the stock or product-page reads could be read, the run's status message says how many.

Can I get only new or changed products on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated products, and unchanged ones are not billed unless you also turn on Emit unchanged. Use What counts as a change to watch only prices and stock, and Compact update rows to get the old and new values instead of the full record (see "Daily price and store stock monitor" above).

Why did my run fail instead of returning an empty dataset?

For search, category and listing/room links, if every page this run tried to read was refused or never answered, the run stops with a clear error instead of finishing with 0 products, so "nothing found" is never confused with "nothing could be read". A genuinely empty listing, or a category id IKEA does not recognise, still finishes normally with 0 products and a status message explaining which case it was. For productIds mode and pasted single product links, a fully blocked run is not currently distinguished from a genuinely empty result: it finishes normally with 0 products and a generic "no products found" message, so treat a surprising empty result from a lookup as worth retrying before assuming the item numbers themselves are wrong.

Why is Resume returning nothing new against a category I've already collected a lot from?

Resume skips ids you already have and pages past them, but IKEA caps any listing at 400 products. Once you hold that many, narrow the search or change Sort by.

Ready to collect with IKEA Scraper Lite?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.