# IKEA Scraper - Products, Prices, Stock & Specs (`scrapesage/ikea-scraper`) Actor

Scrape IKEA products by keyword, category or URL across any market: live prices, discounts, exact measurements, materials, designer, full specs, ratings, all images and real-time stock. Monitor price drops & restocks. No login. Export to JSON/CSV/Excel.

- **URL**: https://apify.com/scrapesage/ikea-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## IKEA Scraper — Products, Prices, Stock, Specs & Reviews

Extract **complete product data from [IKEA](https://www.ikea.com)** in any market — by **keyword, category, article number or URL**. Get **live prices and currency**, exact **measurements**, **materials**, **designer**, full **specifications**, every **image**, **ratings & reviews**, and **real-time in-store + online stock**. Built for **price monitoring, competitor research, dropshipping, interior-design tooling and market analysis**.

No login, no cookies, no browser — fast, reliable extraction straight from IKEA's own public data APIs. Works across **every IKEA market** (US, UK, Canada, Germany, France, Spain, Italy, Netherlands, Sweden, Australia, Japan and more), each with its own prices, currency and stock.

### Why this IKEA scraper?

Most IKEA scrapers grab a name and a price and stop there. This actor reads IKEA's search, product and availability APIs directly and ships the **richest dataset in the category** — the full product, not just the card.

| Data | Basic scrapers | This actor |
|---|---|---|
| Name, article number, price, currency | ✅ | ✅ |
| Discount / "new lower price" flag | partial | ✅ |
| **Exact measurements** (width, depth, height, weight) | ❌ | ✅ |
| **Materials & care**, **designer** | ❌ | ✅ |
| Product information sections, full description | ❌ | ✅ |
| **Ratings + review count** | partial | ✅ |
| **Customer reviews** (text, rating, author, date) | ❌ | ✅ (optional) |
| All product images | partial | ✅ |
| **Real-time stock** — online + per-store quantities + restock | ❌ | ✅ (optional) |
| Category path / breadcrumb | ❌ | ✅ |
| Any market (country + language) | partial | ✅ |
| **Monitor mode** — only new / price-drop / restock rows | ❌ | ✅ |

### Use cases

- **Price monitoring & repricing** — track IKEA prices and discounts over time and react to "new lower price" drops. Run on a schedule with monitor mode to capture only what changed.
- **Stock & availability alerts** — watch in-store quantities and online availability for specific articles and get notified the moment something is **back in stock**.
- **Dropshipping & resale research** — pull catalog, prices, measurements and images to build listings and spot products worth flipping.
- **Competitor & market analysis** — benchmark assortment, pricing and ratings across categories and across countries.
- **Interior-design & PIM tooling** — feed apps and spreadsheets with clean, structured product data: dimensions, materials, colours, images and descriptions.
- **Review & sentiment analysis** — collect ratings and customer reviews to understand what shoppers love (or don't) about a product.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **IKEA Scraper**, enter one or more **keywords** (e.g. `standing desk`), a **category** (e.g. `https://www.ikea.com/us/en/cat/desks-20649/`), **product URLs** or **article numbers**, and pick your **country** and **language**.
3. Click **Start** and watch products stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "searchQueries": ["standing desk", "billy bookcase"],
    "country": "us",
    "language": "en",
    "sortBy": "topRated",
    "includeProductDetails": true,
    "includeStock": true,
    "includeReviews": true,
    "maxResults": 100
}
```

- **searchQueries** — keywords to search the IKEA catalog. One feed per keyword (IKEA's search returns up to ~119 products per query — narrow the keyword or use a category for deeper catalogs).
- **categoryIds** — browse a whole category by URL (`…/cat/desks-20649/`) or numeric ID (`20649`).
- **productUrls** / **itemNos** — exact products by page URL or 8-digit article number (`10549428` or `105.494.28`).
- **startUrls** — any mix of IKEA search, category and product URLs, auto-routed (the country/language in the URL path is respected).
- **country / language** *(default `us` / `en`)* — the IKEA market that sets prices, currency and stock.
- **sortBy** *(default `relevance`)* — `relevance`, `priceLowToHigh`, `priceHighToLow`, `newest`, `topRated`.
- **priceMin / priceMax** — keep only products in a price range.
- **includeProductDetails** *(default true)* — open each product page for full specs, measurements, materials, designer, description and images.
- **includeStock** *(default false)* — add live online + per-store availability and restock signals.
- **includeReviews** *(default false)* — also output featured customer reviews as separate rows.
- **maxResults** *(default 100)* — overall product cap.
- **monitorMode / monitorKey** — only output new or changed products between runs (see Monitoring).
- **proxyConfiguration** — proxy settings (Apify datacenter proxy by default; that's all IKEA needs).

### Output

By default you get **one clean, dense table of products** — every column applies to every row. Add `includeReviews` to also get `review` rows (each tagged with a `type` field; use the **Products** / **Reviews** dataset views to switch).

A product record (`type: "product"`):

```json
{
    "type": "product",
    "market": "us-en",
    "country": "us",
    "itemNo": "10549428",
    "itemNoFormatted": "105.494.28",
    "name": "MITTPLAN",
    "productType": "Desk",
    "url": "https://www.ikea.com/us/en/p/mittplan-desk-white-10549428/",
    "price": 149.99,
    "currency": "USD",
    "priceFormatted": "$149.99",
    "onSale": null,
    "priceTag": null,
    "measurement": "31 1/2x23 5/8 \"",
    "measurements": { "width": "31 1/2 \"", "depth": "23 5/8 \"", "height": "29 1/2 \"" },
    "category": "Desks for home",
    "categoryPath": ["Desks & desk chairs", "Desks & computer desks", "Desks for home"],
    "rating": 4.8,
    "ratingCount": 67,
    "color": "white",
    "designer": "Anna-Maria Nilsson",
    "material": "Particleboard, Fibreboard",
    "description": "You can sit or stand at this desk…",
    "availability": "InStock",
    "itemCondition": "New",
    "images": ["https://www.ikea.com/us/en/images/products/…"],
    "productInformation": [{ "section": "Measurements", "content": "Width: 31 1/2 \" …" }],
    "stock": {
        "online": { "clickAndCollect": true, "inRange": true, "deliveryProbability": "HIGH_IN_STOCK" },
        "storesChecked": 108, "storesInStock": 50, "stores": [{ "storeCode": "028", "quantity": 9 }]
    },
    "scrapedAt": "2026-06-19T18:00:00.000Z"
}
```

A review record (`type: "review"`) carries `productName`, `itemNoFormatted`, `rating`, `title`, `body`, `author`, `date` and `productUrl`.

#### What to expect (field coverage)

| Field | Coverage |
|---|---|
| name, article number, price, currency, URL, category, images | ✅ ~100% |
| measurement, rating + count | ✅ ~95% (products with ratings) |
| exact measurements, material, description (with `includeProductDetails`) | ✅ ~95% |
| designer | present when IKEA credits an individual designer (many ranges are "IKEA of Sweden") |
| stock (with `includeStock`) | ✅ online + per-store for the chosen country |
| reviews (with `includeReviews`) | featured reviews published on the product page |

A blank field means IKEA didn't publish that value for that product — not that scraping failed. Nothing is dropped, so you always get the richest dataset available.

### Monitor price drops & restocks

Turn on **`monitorMode`** and the actor remembers products between runs, outputting only ones that are **new** or whose **price or stock changed** — each tagged with a `changeType` (`new`, `price_drop`, `price_rise`, `back_in_stock`, `out_of_stock`). Pair it with [Apify Schedules](https://docs.apify.com/platform/schedules) to watch a wishlist, a category or a competitor's bestsellers automatically. Monitor state is kept in a named key-value store, so it works independently of (and alongside) the platform scheduler.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly to track prices and restocks.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, reprice job) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/ikea-scraper').call({
    searchQueries: ['standing desk'],
    country: 'us',
    language: 'en',
    includeProductDetails: true,
    includeStock: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} products`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new products or price drops straight into your tools.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a watched product drops in price or comes back in stock.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find every standing desk on IKEA under $200 with its dimensions and stock" and let it run the scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **e-commerce price & product intelligence stack**:

- **[Amazon Scraper](https://apify.com/scrapesage/amazon-scraper)** — products, prices, reviews & sellers across 20 marketplaces.
- **[Zalando Scraper](https://apify.com/scrapesage/zalando-scraper)** — Europe's #1 fashion retailer: prices, sizes & stock.
- **[Newegg Scraper](https://apify.com/scrapesage/newegg-scraper)** — electronics & PC hardware: prices, specs & reviews.
- **[eBay Scraper](https://apify.com/scrapesage/ebay-scraper)** — listings, sold prices & seller leads.
- **[AliExpress Scraper](https://apify.com/scrapesage/aliexpress-scraper)** — products, prices, orders & supplier leads.
- **[Alibaba Scraper](https://apify.com/scrapesage/alibaba-scraper)** — wholesale products & supplier leads.
- **[Shopify Store Scraper](https://apify.com/scrapesage/shopify-store-scraper)** — any storefront's products, variants, prices & stock.
- **[Google Trends Scraper](https://apify.com/scrapesage/google-trends-scraper)** — demand signals for the products you track.

### Tips

- **Use a category for breadth.** A single keyword returns up to ~119 products; a category page (e.g. `…/cat/desks-20649/`) targets a precise assortment. Paste several keywords or categories to cover more.
- **Turn on `includeStock`** when availability matters — it adds online buying options plus in-store quantities and restock signals for your country.
- **Keep `includeProductDetails` on** for measurements, materials, designer and the full description — it's the difference between a card and a complete product.
- **Recurring monitoring**: combine `monitorMode` with [Schedules](https://docs.apify.com/platform/schedules) to track prices and restocks hands-free, and a [webhook](https://docs.apify.com/platform/integrations/webhooks) to push alerts where your team works.
- **Multiple markets**: run once per `country`/`language` (prices and stock are market-specific), or paste market-specific URLs in `startUrls`.

### FAQ

**Which IKEA countries are supported?** Any market on ikea.com. Set `country` and `language` to the path segments IKEA uses (`us`/`en`, `gb`/`en`, `de`/`de`, `fr`/`fr`, `es`/`es`, `it`/`it`, `nl`/`nl`, `se`/`sv`, `au`/`en`, `jp`/`ja`, …). Prices, currency and stock all follow the chosen market.

**Does it need an IKEA API key or login?** No. It reads IKEA's public search, product and availability data — no key, login or browser required.

**How do I scrape a whole category?** Paste the category page URL (e.g. `https://www.ikea.com/us/en/cat/desks-20649/`) into `categoryIds` or `startUrls`, or just its numeric ID.

**Can I get real-time stock?** Yes — enable `includeStock` for online availability plus per-store quantities and restock signals in your chosen country.

**Can I monitor prices and restocks?** Yes — enable `monitorMode` and create a [Schedule](https://docs.apify.com/platform/schedules). Each run outputs only new or changed products, tagged with a `changeType`.

**Can I export to Google Sheets, CSV or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**A field is empty — why?** Some products don't list a designer, some have no reviews yet, and some fields only appear on the product page (turn on `includeProductDetails`). Fields are blank only when IKEA didn't publish that value — never because the scraper skipped it.

**Is scraping IKEA legal?** This actor collects publicly available product data only. You're responsible for using the data in compliance with applicable laws and IKEA's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search the IKEA catalog, e.g. `desk`, `malm`, `sofa bed`. One product feed per keyword (the IKEA search API returns up to ~119 products per query — narrow the keyword or use a category for deeper catalogs).

## `categoryIds` (type: `array`):

Browse a whole IKEA category. Paste a category page URL (e.g. `https://www.ikea.com/us/en/cat/desks-20649/`) or just its numeric ID (`20649`).

## `productUrls` (type: `array`):

Direct IKEA product (PIP) page URLs, e.g. `https://www.ikea.com/us/en/p/mittplan-desk-white-10549428/`. Each is fetched with full detail.

## `itemNos` (type: `array`):

IKEA article numbers (8 digits), with or without dots — e.g. `10549428` or `105.494.28`. Resolved to full product detail for the chosen market.

## `startUrls` (type: `array`):

Any mix of IKEA search, category and product URLs — each is auto-detected and routed. The country/language in the URL path overrides the market settings below.

## `country` (type: `string`):

IKEA market country code (the first path segment on ikea.com). Sets prices, currency and stock for that market. Examples: `us`, `gb`, `ca`, `de`, `fr`, `es`, `it`, `nl`, `se`, `au`, `pl`, `jp`.

## `language` (type: `string`):

Language code for the chosen market (the second path segment). Examples: `en` (us/gb/ca/au), `de`, `fr`, `es`, `it`, `nl`, `sv` (Sweden), `ja` (Japan).

## `sortBy` (type: `string`):

Order for keyword/category feeds.

## `priceMin` (type: `integer`):

Only keep products at or above this price (in the market's currency). Leave empty for no minimum.

## `priceMax` (type: `integer`):

Only keep products at or below this price (in the market's currency). Leave empty for no maximum.

## `includeProductDetails` (type: `boolean`):

Open each product's page to add full specifications: exact measurements, materials & care, designer, product information sections, all images, description and live availability. Adds one request per product. Turn off for fast, price-only listing scans.

## `includeStock` (type: `boolean`):

Fetch live availability for each product in the chosen country: online buying options plus in-store quantities and restock signals across IKEA stores. Adds one request per product.

## `includeReviews` (type: `boolean`):

Also output featured customer reviews published on each product page (rating, title, text, author, date) as separate `review` rows. Requires product details.

## `maxReviewsPerProduct` (type: `integer`):

Cap featured reviews collected per product.

## `maxResults` (type: `integer`):

Maximum number of products to scrape across all inputs.

## `deduplicateProducts` (type: `boolean`):

Emit each article number at most once per run (across all keywords, categories and URLs).

## `monitorMode` (type: `boolean`):

Remember products between runs and only output ones that are new or whose price or stock changed since last run. Each emitted row is tagged with a `changeType` (`new`, `price_drop`, `price_rise`, `back_in_stock`, `out_of_stock`). Pair with Apify Schedules to track prices and restocks automatically.

## `monitorKey` (type: `string`):

Names the saved state for monitor mode. Use a distinct key per watch list so separate schedules don't share state.

## `maxConcurrency` (type: `integer`):

Maximum number of requests in parallel.

## `proxyConfiguration` (type: `object`):

Proxy settings. IKEA's data APIs are not aggressively anti-bot, so the Apify datacenter proxy (the default) works well and is cheapest.

## Actor input object example

```json
{
  "searchQueries": [
    "standing desk"
  ],
  "country": "us",
  "language": "en",
  "sortBy": "relevance",
  "includeProductDetails": true,
  "includeStock": false,
  "includeReviews": false,
  "maxReviewsPerProduct": 10,
  "maxResults": 100,
  "deduplicateProducts": true,
  "monitorMode": false,
  "monitorKey": "default",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped records in the default dataset. Each row is tagged with a `type` (product or review); use the Products / Reviews dataset views to filter the columns.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "standing desk"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/ikea-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchQueries": ["standing desk"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/ikea-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "standing desk"
  ]
}' |
apify call scrapesage/ikea-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/ikea-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/uMGrh1yVAXsPEcQrk/builds/nue3yjZxBXP987Ek6/openapi.json
