# IKEA Product Catalog Scraper (`automation-lab/ikea-product-catalog-scraper`) Actor

Search IKEA catalogs by keyword and locale, then export structured product, price, availability, image, category, and variant data.

- **URL**: https://apify.com/automation-lab/ikea-product-catalog-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Product Catalog Scraper

Search IKEA by keyword and export clean product and variant records for a selected country and language.

The Actor uses IKEA's anonymous catalog search data surface, so it does not require an IKEA account, browser, or proxy configuration.

Use it to monitor prices, compare assortments, enrich retail catalogs, or create scheduled product feeds.

### What does IKEA Product Catalog Scraper do?

IKEA Product Catalog Scraper turns a normal product query such as `chair`, `desk`, or `KALLAX` into structured dataset rows.

Each row represents one unique IKEA item number.

Base search products and color or design variants can both be included.

The Actor extracts:

- product and item identifiers;
- range name, product type, design, and measurements;
- localized current price and currency;
- average rating and rating count;
- badges and last-chance status;
- online-sellable status;
- colors and category breadcrumbs;
- main, contextual, and other product images;
- the canonical localized IKEA product URL;
- query, locale, source URL, and scrape timestamp.

Results are deduplicated by IKEA item number and saved to the default Apify dataset.

### Who is it for?

**Retail market researchers** can compare IKEA assortment and pricing across recurring keyword searches.

**Furniture brands** can observe competing designs, ratings, merchandising badges, and last-chance products.

**Catalog enrichment teams** can map IKEA item numbers to titles, images, product types, and canonical URLs.

**Price monitoring teams** can schedule the same query and compare timestamped dataset exports.

**Data analysts** can send records to spreadsheets, databases, BI tools, or warehouses through Apify integrations.

**Developers and AI agents** can call the Actor through the API or Apify MCP server without implementing IKEA response parsing.

Use [IKEA Product Reviews Scraper](https://apify.com/automation-lab/ikea-product-reviews-scraper) when you need individual review text rather than catalog search records.

### Why use this Actor?

- **No browser overhead:** it uses a lightweight JSON request rather than rendering product pages.
- **Locale-aware:** choose a two-letter IKEA market and language pair.
- **Variant-ready:** optionally emit distinct color and design variants as separate rows.
- **Stable deduplication:** every saved record has a unique IKEA item number.
- **Exact limits:** the Actor stops when it reaches `maxItems`.
- **Typed output:** prices, ratings, booleans, arrays, URLs, and timestamps keep useful data types.
- **Clear failures:** unsupported market/language pairs fail instead of returning a misleading empty success.
- **Integration-friendly:** output goes to the run's default dataset for standard Apify exports and automations.

### Getting started

1. Open the Actor in Apify Console.
2. Enter a product keyword in **Search query**.
3. Keep `us` and `en`, or select another supported IKEA market/language pair.
4. Choose the maximum number of product and variant records.
5. Leave **Include product variants** enabled for the broadest assortment view.
6. Click **Start**.
7. Open the **IKEA products** dataset view.
8. Export the rows as JSON, CSV, Excel, XML, or another supported format.
9. Add a schedule or integration if you need recurring monitoring.

A useful first run is:

```json
{
  "query": "chair",
  "country": "us",
  "language": "en",
  "maxItems": 100,
  "includeVariants": true
}
```

### Input parameters

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `query` | string | required | Product keyword, range name, or search phrase. Length: 1–200 characters. |
| `country` | string | `us` | Two-letter IKEA market code used in localized IKEA URLs, such as `us`, `de`, `gb`, or `se`. |
| `language` | string | `en` | Two-letter language code supported by that market, such as `en`, `de`, or `sv`. |
| `maxItems` | integer | `100` | Maximum unique base product and variant records to save. Range: 1–1,000. |
| `includeVariants` | boolean | `true` | Save variants as separate rows in addition to base search products. |

Country and language codes form a real IKEA locale path.

Not every language is available in every market.

If IKEA does not recognize the pair, the run fails with an actionable error.

The Actor has no proxy input and does not silently switch to a paid proxy.

### Output fields

| Field | Meaning |
| --- | --- |
| `productId` | Product identifier supplied by IKEA. |
| `itemNumber` | Stable item number used to deduplicate rows. |
| `parentProductId` | Base product ID for variant rows; otherwise `null`. |
| `isVariant` | Whether the row is a variant. |
| `name` | IKEA product range name. |
| `productType` | Localized product type. |
| `design` | Localized color or design text. |
| `measure` | Catalog measurement reference when present. |
| `price` | Current numeric catalog price. |
| `currency` | ISO currency code. |
| `rating` | Average rating when available. |
| `ratingCount` | Number of ratings when available. |
| `badge` | Localized badge text, such as a bestseller label. |
| `badgeType` | Source badge classification. |
| `onlineSellable` | Whether IKEA marks the item as sellable online. |
| `lastChance` | Whether IKEA marks the item as last chance. |
| `colors` | Color names attached to the product. |
| `categoryPath` | Localized category breadcrumb. |
| `mainImageUrl` | Main image URL. |
| `mainImageAlt` | Main image alternative text. |
| `images` | Product images with type, URL, and alternative text. |
| `productUrl` | Canonical localized IKEA product URL. |
| `query` | Search phrase that produced the row. |
| `country` | Market code used for the request. |
| `language` | Language code used for the request. |
| `sourceUrl` | Public IKEA search endpoint used by the run. |
| `scrapedAt` | ISO 8601 extraction timestamp. |

Source fields can be absent for some products, so optional values may be `null` or empty arrays.

### Output example

The following abbreviated record reflects the current US chair output shape:

```json
{
  "productId": "10605424",
  "itemNumber": "10605424",
  "parentProductId": null,
  "isVariant": false,
  "name": "SANDSBERG",
  "productType": "Chair",
  "design": "white",
  "measure": null,
  "price": 15,
  "currency": "USD",
  "rating": 4.5,
  "ratingCount": 263,
  "badge": null,
  "badgeType": null,
  "onlineSellable": true,
  "lastChance": false,
  "colors": ["white"],
  "categoryPath": ["Tables & chairs", "Dining furniture", "Dining chairs"],
  "mainImageUrl": "https://www.ikea.com/us/en/images/products/sandsberg-chair-white__1390727_pe965548_s5.jpg",
  "productUrl": "https://www.ikea.com/us/en/p/sandsberg-chair-white-10605424/",
  "query": "chair",
  "country": "us",
  "language": "en",
  "sourceUrl": "https://sik.search.blue.cdtapps.com/us/en/search-result-page?q=chair&size=100&c=sr",
  "scrapedAt": "2026-07-28T00:00:00.000Z"
}
```

A variant has `isVariant: true` and its base product ID in `parentProductId`.

Variants are normal dataset rows and use the same item charge; there is no separate variant event.

### How much does it cost to scrape IKEA products?

The Actor uses pay-per-event pricing.

Each run has a **$0.001 start fee** and each saved dataset row triggers one `item` event.

The current six item tiers are:

| Tier | Price per saved product or variant |
| --- | ---: |
| FREE | $0.000041071 |
| BRONZE | $0.000035714 |
| SILVER | $0.000027857 |
| GOLD | $0.000021429 |
| PLATINUM | $0.000014286 |
| DIAMOND | $0.000010000 |

Apify applies the tier associated with the user's platform plan.

At the highest listed item price, approximate totals are:

- 10 rows: **$0.00141** including the start fee;
- 100 rows: **$0.00511** including the start fee;
- 500 rows: **$0.02154** including the start fee;
- 1,000 rows: **$0.04207** including the start fee.

Only normalized, deduplicated rows count as item events.

Rejected records, duplicate item numbers, and empty results do not trigger item events.

Apify platform usage may still apply according to your account agreement.

No proxy transfer is used by this Actor.

### Monitoring and data workflows

#### Price and assortment monitoring

Schedule the same keyword daily or weekly.

Export each run and compare `itemNumber`, `price`, `currency`, `onlineSellable`, and `lastChance` over time.

#### Cross-market research

Run the same query with different valid country/language pairs.

Keep currencies and localized product names in mind when comparing the datasets.

#### Catalog enrichment

Join rows to internal records by `itemNumber` or `productUrl`.

Use `name`, `productType`, `design`, image fields, and category paths to enrich a product database.

#### Review enrichment

Pass a product URL or item number from this Actor into [IKEA Product Reviews Scraper](https://apify.com/automation-lab/ikea-product-reviews-scraper) for review-level analysis.

#### Spreadsheet and warehouse export

Connect the default dataset to Google Sheets, Make, Zapier, webhooks, or a database ingestion job.

### API usage with cURL

Start a run and wait for its dataset items:

```bash
curl "https://api.apify.com/v2/acts/automation-lab~ikea-product-catalog-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "query": "desk",
    "country": "us",
    "language": "en",
    "maxItems": 50,
    "includeVariants": true
  }'
```

Keep your Apify token in an environment variable or secret manager.

Do not commit tokens to source control.

### API usage with JavaScript

Install the client:

```bash
npm install apify-client
```

Run the Actor:

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/ikea-product-catalog-scraper').call({
  query: 'lamp',
  country: 'us',
  language: 'en',
  maxItems: 100,
  includeVariants: true,
});

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

### API usage with Python

Install the client:

```bash
pip install apify-client
```

Run the Actor:

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/ikea-product-catalog-scraper').call(run_input={
    'query': 'KALLAX',
    'country': 'de',
    'language': 'de',
    'maxItems': 50,
    'includeVariants': True,
})

items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use IKEA catalog data with MCP

Connect Claude Code to this Actor through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/ikea-product-catalog-scraper"
```

#### Claude Desktop, Cursor, and VS Code

For Claude Desktop, Cursor, VS Code, and other MCP-capable desktop or editor clients, use this HTTP server configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/ikea-product-catalog-scraper"
    }
  }
}
```

Example prompts:

- "Search IKEA US for standing desks and return the first 100 products with prices."
- "Find KALLAX products in IKEA Germany and group the records by design."
- "Create a CSV-ready feed of IKEA US lamps with item number, price, rating, and URL."

The MCP client still needs authorization to use your Apify account.

### Tips for reliable runs

- Start with the exact prefilled `chair` query to verify your setup.
- Use a market and language combination that exists on IKEA's localized website.
- Enable variants for assortment analysis; disable them when you need only base search products.
- Use item numbers rather than product names as durable join keys.
- Keep `country` and `currency` in downstream tables when comparing markets.
- Schedule separate runs per query and locale for simpler change tracking.
- Inspect run logs when a locale fails before retrying.
- Do not add a proxy URL; direct public JSON access is the supported v1 route.

### Limits and failure behavior

The Actor accepts at most 1,000 saved rows per run.

IKEA search can use fuzzy matches and related results, so a very unusual query may still return suggestions rather than an empty list.

Search relevance and the available assortment are controlled by IKEA and can change.

Localized fields, ratings, images, badges, and availability flags are not present on every item.

The Actor does not visit every product detail page and does not promise store-level inventory.

It retries transient network failures, HTTP 429 responses, and temporary server errors up to three attempts with backoff.

It does not repeatedly retry deterministic invalid-market errors.

If IKEA changes the response shape, the Actor fails clearly instead of saving malformed records.

The v1 route is HTTP-only and has no automatic proxy fallback.

### Responsible and legal use

This Actor extracts publicly accessible IKEA catalog information.

Public availability does not remove your responsibility to follow applicable laws, IKEA terms, contractual restrictions, and data-use requirements.

Use reasonable schedules and item limits.

Do not attempt to overload the source or use the output for deceptive activity.

Product descriptions, images, trademarks, and other materials may be protected by intellectual-property rights.

Ensure that your storage, republication, analysis, and commercial use have an appropriate legal basis.

This Actor is not affiliated with or endorsed by IKEA.

### Troubleshooting

#### The run says the market or language is invalid

Confirm that the same country/language path exists on IKEA's website.

For example, the United States uses `us/en` and Germany uses `de/de`.

Both values must contain exactly two letters.

#### I received fewer rows than `maxItems`

`maxItems` is a ceiling, not a promise.

The query may have fewer unique products after item-number deduplication.

Disabling variants can also reduce the row count.

#### My unusual query returned apparently unrelated products

IKEA search can return fuzzy matches and related catalog suggestions.

Try a product type, named IKEA range, or a more specific phrase.

#### A price, rating, badge, or image is null

IKEA did not include that field for the item in the current search response.

The Actor preserves the row and uses nullable output fields rather than inventing values.

#### Should I enable an Apify proxy?

No.

The Actor currently uses direct anonymous access and exposes no proxy option.

If the source route changes, inspect the run log and report the failure rather than repeatedly rerunning it.

### Frequently asked questions

#### Does it scrape individual customer reviews?

No.

Use [IKEA Product Reviews Scraper](https://apify.com/automation-lab/ikea-product-reviews-scraper) for review text and reviewer-level records.

#### Does it include variants?

Yes.

With `includeVariants: true`, variants are normalized as separate rows and linked to their base product through `parentProductId`.

#### Can it search multiple countries in one run?

No.

Run one locale per Actor run so prices, currency, language, and monitoring history stay unambiguous.

#### Does it require an IKEA login?

No.

The supported catalog search route is anonymous.

#### Does it download image files?

No.

It returns image URLs and alternative text, which avoids unnecessary transfer and storage costs.

#### Can I schedule it?

Yes.

Use Apify schedules to repeat stable query and locale inputs, then connect the resulting dataset to your monitoring workflow.

### Related Automation Lab Actors

- [IKEA Product Reviews Scraper](https://apify.com/automation-lab/ikea-product-reviews-scraper) — extract review-level records for IKEA products.
- [Home Depot Product Scraper](https://apify.com/automation-lab/home-depot-product-scraper) — collect structured product records from another home-improvement retailer.
- [Google Shopping Scraper](https://apify.com/automation-lab/google-shopping-scraper) — compare shopping results across retailers.

Choose related Actors only when their source and output fit your intended workflow.

### Support

If a run fails on a valid IKEA locale, include the exact input, run URL, and relevant log message in your report.

Do not include your Apify token or other secrets.

Source behavior can change, and a reproducible run helps distinguish input errors from upstream changes.

# Actor input Schema

## `query` (type: `string`):

Product keyword to search in the selected IKEA market, such as chair, desk, or lamp.

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

Two-letter IKEA market code used in ikea.com URLs, for example us, gb, de, or se.

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

Two-letter language code supported by the selected IKEA market, for example en, de, or sv.

## `maxItems` (type: `integer`):

Maximum number of unique product or variant records to save.

## `includeVariants` (type: `boolean`):

Save color or design variants as separate deduplicated records in addition to base search results.

## Actor input object example

```json
{
  "query": "chair",
  "country": "us",
  "language": "en",
  "maxItems": 20,
  "includeVariants": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

Default dataset containing all extracted catalog records.

# 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 = {
    "query": "chair",
    "country": "us",
    "language": "en",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/ikea-product-catalog-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 = {
    "query": "chair",
    "country": "us",
    "language": "en",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/ikea-product-catalog-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 '{
  "query": "chair",
  "country": "us",
  "language": "en",
  "maxItems": 20
}' |
apify call automation-lab/ikea-product-catalog-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/9AaHEpv7YLgTmMeWV/builds/brU8FoYRmoeaxH7i8/openapi.json
