# IKEA Stock Checker & Product Scraper (`yugenox/ikea-stock-scraper`) Actor

Live IKEA store stock for any product: quantity on hand, stock level, restock dates and aisle/bin at every store, plus price, discounts, rating, images and category. Search by keyword, category or item number. Canada default, 47 countries.

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

## Pricing

from $1.90 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## IKEA Stock Checker & Product Scraper

Check **live IKEA stock at every store**. For each product you get the quantity on hand, the stock level, the next restock date and the **aisle and bin** where it sits in the store. Every row also carries the full product data: price, sale price, rating, images, category and measurements.

Search by keyword, browse a whole category, or check a list of item numbers. **Canada is the default**, and 46 more IKEA countries work the same way.

### What you get

- **Stock at each store**: units on hand, a stock level (high, medium, low or out of stock), and whether the store sells the item at all. It also says whether you can pick it up yourself or order it for click & collect.
- **Restock dates**: the earliest and latest expected date, the quantity coming and how reliable IKEA rates that date. You can see when an out-of-stock item will be back.
- **Where to find it**: the aisle and bin for self-serve items, or a flag that says to ask a co-worker for warehouse items.
- **Online availability**: whether home delivery and click & collect are possible nationwide.
- **Product data**:
  - item number, name, type, colour and design, measurements
  - price, the previous price and discount % during sales, IKEA Family prices, "New" and "Last chance" flags
  - rating and review count, main and lifestyle images, full category path
  - number of variants
- **Store data**: store name, city, province or state, postal code and store type. When you search near a location, each store also gets its distance in km.
- **Combination products** (e.g. a bookcase with glass doors) can include the stock of each part. You can see exactly which part is missing.

### How to use it

| Input | Example | What it does |
|---|---|---|
| **Search keywords** | `billy bookcase`, `office chair` | Searches the same way the IKEA site does, one search per keyword |
| **Categories** | `fu003` or `https://www.ikea.com/ca/en/cat/sofas-fu003/` | Returns every product in the category |
| **Products** | `205.220.46`, `20522046`, a product page URL | Checks exactly these products |
| **Max products** | `100` | Limit per keyword or category |
| **Country / Language** | `ca` / `fr` | Prices, currency, product names and stores for that country |
| **Stores** | `North York`, `Vaughan`, `149` | Only these stores. Leave empty to check all of them |
| **Near a postal code** | `M5V 3L9`, `10001`, `Calgary`, `43.65,-79.38` | Only the N closest stores, with the distance to each |
| **Output format** | per product / per store | Stores nested inside each product, or one flat row per product and store |
| **Stock filter** | in stock / out of stock / restock scheduled / not sold | Keep only matching products |
| **Include colour / size variants** | on | Returns every colour and size as its own product |

#### Example: which desks are in stock near me?

```json
{
  "queries": ["desk"],
  "maxItems": 100,
  "nearLocation": "M5V 3L9",
  "nearestStores": 3,
  "stockFilter": "inStock"
}
```

#### Example: daily out-of-stock monitor for a fixed product list in two stores

```json
{
  "products": ["205.220.46", "s39581494", "https://www.ikea.com/ca/en/p/kallax-shelf-unit-white-20631663/"],
  "stores": ["Richmond", "Coquitlam"],
  "stockOutput": "perStoreRow"
}
```

Schedule this run daily, or hourly, and connect it to a webhook, Google Sheets or Slack to get restock alerts.

### Output example

One row per product (default format). The `stores` list is shortened here:

```json
{
  "itemNo": "49552863",
  "itemType": "SPR",
  "name": "RELATERA",
  "typeName": "Desk sit/stand",
  "title": "RELATERA Desk sit/stand",
  "designText": "white",
  "measurement": "90x60 cm (35 3/8x23 5/8 \")",
  "price": 209,
  "currency": "CAD",
  "previousPrice": null,
  "rating": 4.7,
  "ratingCount": 85,
  "url": "https://www.ikea.com/ca/en/p/relatera-desk-sit-stand-white-s49552863/",
  "imageUrl": "https://www.ikea.com/ca/en/images/products/relatera-desk-sit-stand-white__1293250_pe935138_s5.jpg",
  "category": "RELATERA kid's desks",
  "categoryPath": "Desks & desk chairs > Desks & computer desks > Table & desk systems > RELATERA system > RELATERA kid's desks",
  "market": "ca",
  "onlineAvailability": { "availableForHomeDelivery": true, "availableForClickCollect": true, "homeDeliveryStockLevel": "HIGH_IN_STOCK" },
  "storesChecked": 3,
  "storesInStock": 2,
  "totalStoreQuantity": 9,
  "inStockAt": ["IKEA Toronto - Etobicoke", "IKEA Toronto - North York"],
  "nextRestockDate": "2026-09-24",
  "stores": [
    {
      "storeId": "256",
      "storeName": "IKEA Toronto - Etobicoke",
      "storeType": "STORE",
      "city": "Etobicoke",
      "region": "ON",
      "postalCode": "M8Z 1T3",
      "distanceKm": 12.3,
      "inStock": true,
      "stockLevel": "LOW_IN_STOCK",
      "quantity": 2,
      "availableForCashCarry": true,
      "availableForClickCollect": true,
      "soldInStore": true,
      "nextRestockDate": "2026-09-24",
      "nextRestockReliability": "HIGH",
      "aisle": null,
      "bin": null,
      "updatedAt": "2026-09-23T21:47:39.000Z"
    }
  ],
  "source": { "type": "query", "input": "desk" },
  "scrapedAt": "2026-09-24T02:52:10.114Z"
}
```

A row in the flat per-store format:

```json
{
  "itemNo": "40477340",
  "title": "BILLY Bookcase",
  "designText": "black oak effect",
  "price": 100,
  "currency": "CAD",
  "storeId": "003",
  "storeName": "IKEA Vancouver - Richmond",
  "city": "Richmond",
  "region": "BC",
  "inStock": false,
  "stockLevel": "OUT_OF_STOCK",
  "quantity": 0,
  "nextRestockDate": "2026-09-24",
  "nextRestockQuantity": 36,
  "nextRestockReliability": "HIGH",
  "aisle": "07",
  "bin": "06",
  "locationType": "AISLE_AND_BIN",
  "division": "SELF_SERVE"
}
```

#### Stock levels

| `stockLevel` | Meaning |
|---|---|
| `HIGH_IN_STOCK` / `MEDIUM_IN_STOCK` / `LOW_IN_STOCK` | On the shelf (`inStock: true`) |
| `OUT_OF_STOCK` | The store sells it but has none right now. Check `nextRestockDate` |
| `NOT_SOLD_AT_STORE` | Not in this store's range. It may still be available for click & collect or delivery |
| `NOT_AVAILABLE` / `UNKNOWN` | The store reported no stock figure |

### Use cases

- **Shoppers and resellers**: find which store has an item before you drive there, and get notified when a sold-out item is restocked.
- **Stock-alert and deal apps**: build IKEA restock alerts or "in stock near you" features from scheduled runs.
- **Retail and market analysts**: track assortment, stock-outs, prices and discounts across stores and countries over time.
- **Interior designers and movers**: check a whole shopping list against one store, with aisle and bin, in a single run.

### FAQ

**How fresh is the stock data?**
It is IKEA's live store stock at the moment of the run. Each store row includes `updatedAt`, the time IKEA last updated that figure.

**Which countries are supported?**
Canada (default) and 46 more: United States, United Kingdom, Ireland, Germany, France, Spain, Italy, Netherlands, Belgium, Switzerland, Austria, the Nordics, Poland, Czech Republic, Portugal, Australia, New Zealand, Japan, South Korea, China, Singapore, Malaysia, Thailand, India, the Gulf countries, Mexico, Chile, Colombia and others. Choose one in **Country**.

**How many products can I get?**
As many as the keyword or category contains. Some keywords, like "white", match close to 4,000 products. Set **Max products** to control it. Big runs are fast, because up to 50 products are checked at every store in one go.

**Why are some stores missing?**
Plan-and-order points and pick-up points hold no shelf stock, so they are left out by default. Turn on **Include plan & order points**, or name the location in **Stores**, to include them.

**Can I check one store only?**
Yes. Put its name, city or ID in **Stores**, for example `North York`. If a name doesn't match, the run log lists every store in that country with its ID.

**Does it show online prices or store prices?**
It shows the regular IKEA price for the country, and any active sale or IKEA Family price with its validity dates.

**How do I get alerts?**
Schedule the actor and add an integration (email, Slack, Google Sheets, webhook). Use **Stock filter** = "Restock scheduled" or "In stock" to keep only the rows you care about.

**What if a keyword, store or language doesn't exist?**
The run still finishes and tells you what happened. Unknown item numbers and categories are listed in the log and skipped. Keywords longer than IKEA's 150-character limit are shortened. A language the country's site doesn't offer falls back to the main language. If a postal code can't be found, every store is checked.

**What happens if the run hits its timeout or my spending limit?**
It stops about a minute before the timeout, saves everything collected so far, and ends with a "Partial" message. It also stops cleanly when your spending limit is reached.

**How am I charged?**
You pay per result. In the default **per product** format, one result is one product, together with its stock at every store you chose. In the flat **per store** format, every product and store pair is its own result, so 1 product checked at 15 stores counts as 15 results. Use **Stores** or **Near a postal code** to check only the stores you need.

**Is it legal to scrape IKEA?**
This Actor only collects publicly available data: product listings, prices, store stock and store locations that anyone can see on IKEA's website without an account. Collecting publicly available data is generally legal, but you're responsible for how you use it. You must follow privacy laws such as GDPR, PIPEDA and CCPA, as well as IKEA's terms. If you're unsure, check with a lawyer. More on this: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?**
No. Everything comes from pages IKEA shows to any visitor without logging in. It never uses a login, never touches private or restricted accounts, and never reaches password-protected areas.

# Actor input Schema

## `queries` (type: `array`):

What you would type into the IKEA search box, e.g. "billy bookcase", "office chair", "kallax". Each keyword is searched separately. IKEA search or category URLs work here too.

## `categories` (type: `array`):

Category IDs or category page URLs, e.g. "fu003" or https://www.ikea.com/ca/en/cat/sofas-fu003/. Returns every product in the category (up to "Max products").

## `products` (type: `array`):

Check specific products: item numbers ("205.220.46", "20522046", "s39581494") or product page URLs. Ideal for monitoring a fixed list.

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

Stop after this many products for each keyword or category. Some keywords return thousands of products.

## `market` (type: `string`):

Which IKEA country to use for prices, currency and stores.

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

Two-letter language for product names and categories, e.g. "en" or "fr" for Canada. Leave empty for the country's main language.

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

Look up live stock at each store: quantity on hand, stock level, restock dates, aisle and bin. Turn off to get product data only.

## `stores` (type: `array`):

Store names, cities or store IDs, e.g. "North York", "Vaughan", "Montreal", "149". Leave empty to check every store in the country. Unknown names are listed in the log with every available store.

## `nearLocation` (type: `string`):

Only check the stores closest to this postal / ZIP code, city or "latitude,longitude", e.g. "M5V 3L9", "10001", "Vancouver" or "43.65,-79.38". Each store row then includes its distance in km.

## `nearestStores` (type: `integer`):

How many of the closest stores to check when "Near a postal code or place" is set.

## `stockOutput` (type: `string`):

One row per product with a list of stores inside it, or one flat row per product and store (easier for spreadsheets).

## `stockFilter` (type: `string`):

Keep only products that are in stock, out of stock (sold at the store but none on hand), restocking (a delivery is scheduled) or not sold at the selected stores. With one row per product, a product is kept if any selected store matches.

## `includePickupPoints` (type: `boolean`):

Also report plan-and-order / pick-up points. They hold no shelf stock, so they are left out unless named in "Stores".

## `includeChildItems` (type: `boolean`):

For combination products (e.g. a bookcase with doors), add the stock of each part per store — shows which part is missing.

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

IKEA search groups colour and size variants under one product. Turn on to get every variant as its own product with its own stock.

## `sort` (type: `string`):

Order of search and category results.

## `dedupe` (type: `boolean`):

Save each product only once per run, even if several keywords or categories return it.

## `concurrency` (type: `integer`):

How many requests run at once. The default is fast and gentle.

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

Datacenter proxies work well. Residential proxies are used automatically as a backup if needed.

## Actor input object example

```json
{
  "queries": [
    "billy bookcase"
  ],
  "maxItems": 20,
  "market": "ca",
  "includeStock": true,
  "nearestStores": 3,
  "stockOutput": "perProduct",
  "stockFilter": "all",
  "includePickupPoints": false,
  "includeChildItems": false,
  "includeVariants": false,
  "sort": "RELEVANCE",
  "dedupe": true,
  "concurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped products (or product-store rows).

## `run` (type: `string`):

Status and statistics for this run.

# 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 = {
    "queries": [
        "billy bookcase"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/ikea-stock-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 = {
    "queries": ["billy bookcase"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "billy bookcase"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/ikea-stock-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yugenox/ikea-stock-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/17j2hdivkaGH7Y8zl/builds/yFxNHMzKcpgomEXXf/openapi.json
