# Muji Scraper (`tomko5peter/muji-scraper`) Actor

🛍️ MUJI Scraper - Extract every product, price & category from any MUJI store worldwide. Smart pattern targeting (men/*, women/clothing/*), two-stage data extraction, and built for scale. Perfect for competitive analysis, market research, and price intelligence.

- **URL**: https://apify.com/tomko5peter/muji-scraper.md
- **Developed by:** [Peter Tomko](https://apify.com/tomko5peter) (community)
- **Categories:** E-commerce, Automation, Integrations
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.99/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period. You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#rental-actors

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

## 🛍️ MUJI Product Data Scraper - EU

**Download complete MUJI product catalogs from any MUJI country store!**

Powerful web scraper that extracts comprehensive product data, pricing, and inventory information from MUJI's e-commerce sites worldwide. Get thousands of products with detailed specifications, images, and real-time availability - perfect for market research, price monitoring, and product analysis.

### 🚀 Key Features

- **🎯 Smart Category Targeting**: Download specific product categories or entire catalogs using flexible pattern matching
- **📊 Rich Product Data**: Extract detailed specifications, pricing, stock levels, images, and customer reviews
- **🌍 Multi-Country Support**: Works with any MUJI country site - includes ready-to-use configurations for UK, Germany, and France. Automatically isolates data by country when switching between sites.
- **📈 Data Historization**: Track price changes and product updates over time
- **⚡ Efficient Scraping**: Built with Python and Apify for fast, reliable data extraction

### Input Configuration

| Field | Description | Example |
|-------|-------------|---------|
| `URL` | MUJI website URL to scrape | `https://uk.muji.eu/` |
| `ALLOW_HISTORIZATION` | Enable data versioning | `true` or `false` |
| `DOWNLOAD_ONLY_CATEGORY_NAMES` | Extract categories only (testing) | `false` |
| `CATEGORY_NAMES_FOR_SCRAPING` | Filter categories to scrape | `men/*, women/clothing/*` |

### Category Filtering

Use patterns to target specific categories:

- `*` - All categories (default)
- `men/*` - All men's products
- `women/clothing/*` - Women's clothing only
- `men/clothing/*, women/accessories/*` - Multiple categories

Patterns are case-insensitive and support wildcards (`*`). Leave empty to scrape all categories.

### Country-Specific Configurations

#### Example Configurations

The scraper works with any MUJI country site. Below are tested configurations for popular European stores:

#### United Kingdom - uk.muji.eu

```json
{
  "URL": "https://uk.muji.eu/",
  "ALLOW_HISTORIZATION": true,
  "DOWNLOAD_ONLY_CATEGORY_NAMES": false,
  "CATEGORY_NAMES_FOR_SCRAPING": "men/*"
}
```

**Note**: Do not use `www.` prefix for UK MUJI site - use `https://uk.muji.eu/` directly.

#### France - france.muji.eu

```json
{
  "URL": "https://france.muji.eu/",
  "ALLOW_HISTORIZATION": true,
  "DOWNLOAD_ONLY_CATEGORY_NAMES": false,
  "CATEGORY_NAMES_FOR_SCRAPING": "men/*"
}
```

#### Germany - germany.muji.eu

```json
{
  "URL": "https://germany.muji.eu/",
  "ALLOW_HISTORIZATION": true,
  "DOWNLOAD_ONLY_CATEGORY_NAMES": false,
  "CATEGORY_NAMES_FOR_SCRAPING": "men/*"
}
```

#### Other Countries

The scraper supports any MUJI country website. Simply replace the URL with your target country's MUJI site:

- Italy: `https://italy.muji.eu/`
- Spain: `https://spain.muji.eu/`
- Netherlands: `https://netherlands.muji.eu/`
- Japan: `https://www.muji.com/jp/`
- US: `https://www.muji.us/`
- And many more...

Use the same configuration structure as the examples above, just change the `URL` field to your desired country's MUJI website.

### Output Data Structure

#### Datasets Created

| Dataset | Description | Key Fields |
|---------|-------------|------------|
| `category-urls-all` | Discovered category URLs from navigation | `master_url`, `url`, `index`, `timestamp` |
| `products-category-page` | Basic product data from category listings | `product_id`, `name`, `price_amount`, `availability`, `categories` |
| `extended-products-data-all` | Detailed product data from individual pages | `options`, `html_description`, `specifications`, `images` |

#### Category URLs Structure

```json
{
  "master_url": "https://france.muji.eu/",
  "url": "https://france.muji.eu/men/clothing/coats-and-jackets",
  "index": 1,
  "timestamp": "2026-02-27T15:46:22.540835"
}
```

#### Products Category Page Structure

```json
{
  "product_id": 8885,
  "name": "Veste à capuche en polyester déperlante pour homme",
  "sku": "P-AD0X5-F-000000",
  "url": "https://france.muji.eu/products/mens-water-repellent-hooded-jacket-20408",
  "summary": "Cette veste pratique et fonctionnelle...",
  "availability": "",
  "stock_level": 3,
  "price_currency": "EUR",
  "price_amount": 54.95,
  "price_formatted": "54,95€",
  "is_on_sale": false,
  "main_image_url": "https://cdn11.bigcommerce.com/...",
  "categories": ["Homme", "Vêtements", "Vestes et manteaux"],
  "weight_value": 0.34,
  "rating": 0,
  "num_reviews": 0,
  "has_options": true,
  "scraped_at": "2026-02-27T15:46:23.673169",
  "master_url": "https://france.muji.eu/",
  "category_url": "https://france.muji.eu/men/clothing/coats-and-jackets",
  "custom_field_material": "100% polyester (résine polyuréthane utilisée au verso)",
  "custom_field_country_of_origin": "Viêt Nam"
}
```

#### Extended Products Data Structure

```json
{
  "original_product_id": 8885,
  "original_name": "Veste à capuche en polyester déperlante pour homme",
  "original_sku": "P-AD0X5-F-000000",
  "product_url": "https://france.muji.eu/products/mens-water-repellent-hooded-jacket-20408",
  "category_url": "https://france.muji.eu/men/clothing/coats-and-jackets",
  "html_description": "Cette veste pratique et fonctionnelle...",
  "specifications": "Detailed product specifications and features...",
  "muji_price_data": {
    "with_tax": {
      "formatted": "54,95€",
      "value": 54.95,
      "currency": "EUR"
    }
  },
  "options": [
    {
      "display_name": "Couleur",
      "required": true,
      "values": [
        {
          "label": "Gris",
          "image": {"data": "https://cdn11.bigcommerce.com/..."}
        },
        {
          "label": "Noir", 
          "image": {"data": "https://cdn11.bigcommerce.com/..."}
        }
      ]
    },
    {
      "display_name": "Taille",
      "values": [{"label": "XS"}, {"label": "S"}, {"label": "M"}]
    }
  ]
}
```

### Getting Started

#### Local Development

```bash
## Install dependencies
pip install -r requirements.txt

## Run locally
./local-run.sh
```

#### Deploy to Apify

```bash
## Login and deploy
apify login
apify push
```

### Troubleshooting

#### Common Issues

- **DNS Error**: Check URL format - remove `www.` prefix for UK site
- **No matches**: Check category patterns match actual site structure
- **Too many results**: Use more specific patterns like `men/clothing/*` instead of `men/*`
- **Mixed country data**: The scraper automatically filters products by country - when switching from France to Germany, only German products will be processed for extended data

### Datasets Created

| Dataset | Description |
|---------|-------------|
| `category-urls-all` | Navigation category URLs discovered from site structure |
| `products-category-page` | Product listings scraped from category pages |
| `extended-products-data-all` | Detailed product information from individual product pages |

# Actor input Schema

## `URL` (type: `string`):

The URL of website you want to get the data from.

## `ALLOW_HISTORIZATION` (type: `boolean`):

The historization of datasets. By true - created datasets will collect all information.

## `DOWNLOAD_ONLY_CATEGORY_NAMES` (type: `boolean`):

If true, only category names will be downloaded. Otherwise, all data will be downloaded.

## `CATEGORY_NAMES_FOR_SCRAPING` (type: `string`):

Specify which categories to scrape using flexible patterns. Leave empty to scrape ALL categories. Examples:
• '*' = All categories
• 'men/*' = All men's categories
• 'women/clothing/*' = All women's clothing
• 'men/accessories/bags' = Specific category only
• 'women/*, men/footwear' = Multiple patterns (comma-separated)

Patterns are case-insensitive and automatically cleaned. Use '/\*' for subcategories.

## Actor input object example

```json
{
  "URL": "https://uk.muji.eu/",
  "ALLOW_HISTORIZATION": true,
  "DOWNLOAD_ONLY_CATEGORY_NAMES": false,
  "CATEGORY_NAMES_FOR_SCRAPING": "men/clothing/coats-and-jackets"
}
```

# Actor output Schema

## `categoryUrls` (type: `string`):

Extracted category URLs from MUJI website - append to dataset

## `overview` (type: `string`):

No description

# 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 = {
    "URL": "https://uk.muji.eu/",
    "CATEGORY_NAMES_FOR_SCRAPING": "men/clothing/coats-and-jackets"
};

// Run the Actor and wait for it to finish
const run = await client.actor("tomko5peter/muji-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 = {
    "URL": "https://uk.muji.eu/",
    "CATEGORY_NAMES_FOR_SCRAPING": "men/clothing/coats-and-jackets",
}

# Run the Actor and wait for it to finish
run = client.actor("tomko5peter/muji-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 '{
  "URL": "https://uk.muji.eu/",
  "CATEGORY_NAMES_FOR_SCRAPING": "men/clothing/coats-and-jackets"
}' |
apify call tomko5peter/muji-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tomko5peter/muji-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/IeYiIeo9lYs0PG9UD/builds/Go8vUoGGVwFIL5KKO/openapi.json
