MUJI Scraper at a glance
MUJI Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes product, change type (incremental mode), country, currency and price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce
- Pricing
- $2.20 per 1,000 results (Free plan), from $1.50 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 28 options
Scrape MUJI products from the United States, Canada and Australia storefronts. Search by keyword or paste product, category and search links. Returns price, was-price and discount, per-variant stock, sizes, colours, media, materials and customer reviews, plus Incremental mode for change monitoring.
What MUJI Scraper can do
- Three country storefronts, one actor. Search by keyword or paste links for the United States, Canada or Australia; each keeps its own country, currency, prices and stock, and links from different countries can be mixed in one run.
- A full pricing picture. Current price, was-price, discount amount and discount percentage, plus per-variant stock and backorder status.
- Deep detail on demand. Full description, breadcrumb, extra media, materials, measurements, care notes and country of origin, toggled per run so you only pay for what you use.
- Customer voice. Individual reviews with rating, title, text, author, date, verified-buyer flag, helpful votes and photos, plus the per-star breakdown, where the storefront publishes them.
- The storefront's own filters. Category, colour, size, price range and availability, matched to each storefront's own values so spelling and capitalisation are handled for you.
- Five ways to order results. Relevance, price, name, newest or best selling.
Choose what to collect
These inputs let you configure MUJI Scraper - Products, Prices, Stock & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose 'search' for keywords plus filters, or 'url' to scrape pasted MUJI links. Each mode reads only its own field below. |
queriesarray | Only used when mode = search, ignored in URL mode. One or more keywords, for example 'aroma diffuser' or 'oxford shirt'. |
urlsarray | Only used when mode = url, ignored in search mode. Product links under /products/, category links under /collections/ and search links under /search?q= are all accepted. A category or search link that already carries page=N starts at that page rather than at page 1. A product link ending in .json works too. sort_by= and the price / availability filters on a link are honoured for that link. Leaving this empty in URL mode runs the 11 example links. |
countrystring | Which MUJI storefront to read. Each one has its own catalogue, its own prices in its own currency and its own stock. In URL mode this is only the fallback: a pasted link's own address decides its country. MUJI Japan and MUJI Europe run on separate platforms and are not covered here. |
categorystring | Optional. Keep only products in this catalogue category, exactly as MUJI names it, for example 'Aroma Diffusers', 'Ballpoint Pens' or 'Shirts'. Category names differ between country storefronts. |
colorstring | Optional. Keep only products offered in this colour, for example 'Navy' or 'Off White'. The storefront's own colour list is read at run time, so spelling and capitalisation are matched for you. |
sizestring | Optional. Keep only products offered in this size, for example 'M', 'L' or 'A4'. The storefront's own size list is read at run time, so spelling and capitalisation are matched for you. |
Show 21 more inputs
| Input | What it controls |
|---|---|
minPriceinteger | Optional. Only keep products whose current price is at or above this amount, in the storefront's own currency. |
maxPriceinteger | Optional. Only keep products whose current price is at or below this amount, in the storefront's own currency. |
inStockOnlyboolean | Optional. Keep only products that can be bought right now. Sold-out products are returned by default so you can track them. |
sortBystring | How to order results. Relevance and price are ordered by MUJI itself. A category or search link can also order by name, newest and best selling; a keyword search cannot, so for a keyword search name and newest are applied over the products the run collects, and best selling falls back to relevance. |
fetchDetailsboolean | Collect each product's full description, category breadcrumb, extra images and videos, materials, measurements, care notes and country of origin. Turn off for a lighter run that returns only the listing-level fields. A pasted product link always returns full detail, because there is no listing card behind it. |
fetchReviewsboolean | Also collect individual customer reviews for each product: rating, title, text, author, date, verified-buyer flag, helpful votes and review photos, plus the per-star breakdown. The average rating and review count are always returned without this. Not every MUJI country publishes individual reviews; where none are published, reviews come back as an empty list and reviewsAvailable is false. |
maxReviewsPerProductinteger | Cap on how many individual reviews are collected for each product when 'Fetch customer reviews' is on. Newest first. |
maxItemsinteger | Maximum number of products to return across the whole run. This is the run's cap. Use 0 for unlimited. |
maxPagesinteger | Maximum number of result pages to take per keyword or link. 0 = unlimited; the run then stops only at Max products, or when there are no more results. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large catalogue pull without returning or charging for products already collected there. Use this after an interrupted run. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns every matching product as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED products. A product is UPDATED when any of its stored fields moves (price, was-price, promo, stock including per-variant stock, copy, images, options); review text, ratings and review counters, scrapedAt and updatedAt never count, and 'Change scope' narrows this to price and stock only. Turn on 'Emit unchanged' or 'Emit expired' only when you also want those rows returned (and billed). State is kept separately for each storefront, search and filter setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to derive a key automatically from the storefront, search and filter settings, so two different searches never mix state. |
emitUnchangedboolean | Off 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 want a full snapshot every run. |
emitExpiredboolean | Off 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, never when Max products capped it or Resume was used. This returns, and bills, extra rows, so leave it off unless you need expiry tracking. |
changeScopestring | All fields (default): any change to a stored field except reviews, ratings and timestamps makes a product UPDATED. Price and stock only: only price, was-price, discount, on-sale flag, in-stock flag and each variant's price and availability decide UPDATED; copy, images and labels never do. Switching scope never restarts the baseline, with or without a state key: stored products are compared again under the new scope, so nothing comes back as NEW or is billed again because of it. |
compactUpdatesboolean | Off by default. UPDATED and EXPIRED rows are slimmed down to identifiers, current price and stock, priceChanges (old and new value) and variantChanges. NEW rows stay full. A compact row carries no product details, so it does not incur the detail-enrichment charge. |
expireAfterMissedScansinteger | Used with Emit expired. A product is marked EXPIRED only after it was missing from this many consecutive complete scans (default 1). EXPIRED means the product dropped out of the scanned search, which a listing change and a delisting both cause; use the stock fields for availability. |
ignoreFieldsForChangesarray | Field names that must never make a product UPDATED or appear in changedFields, for example description. Dotted paths reach inside variants: variants.image drops the image from every variant while variant price and stock still count. Ignored fields are still returned in every row. Reviews, ratings and timestamps are always ignored. Adding or removing a field here never restarts the baseline: no product comes back as NEW or is billed again because of it. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a page per product; other connectors get a best-effort write or digest. Each connector receives a condensed summary per product, not the full record; the complete record always stays in the dataset. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL or id of the Notion page under which product pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on products 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.
titleProductchangeTypeChange type (incremental mode) (text)countryCountrycurrencyCurrencypricePriceoriginalPriceWasdiscountPercentDiscount %onSaleOn sale (boolean)inStockIn stock (boolean)categoryCategoryratingRatingreviewCountReviewsShow 24 more fields
sizesSizes (array)colorsColours (array)skuSKUproductIdProduct IDfeaturedImageImage (image)urlURL (link)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)descriptionDescriptionmaterialsMaterialscountryOfOriginCountry of originmeasurementsMeasurementsdimensionsDimensionscareInstructionsCarevariantsVariants (array)imagesImages (array)reviewsreviewsauthorAuthorbodyReview textdateReview datehelpfulVotesHelpful votespriceChangesPrice changes (text)variantChangesVariant changesExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"productId": "0000000000001",
"handle": "sample-product-handle",
"title": "Sample Product Name",
"url": "https://www.muji.us/products/sample-product-handle",
"country": "us",
"countryName": "United States",
"currency": "USD",
"brand": "MUJI",
"category": "Aroma Diffusers",
"productCategory": "Diffusers",
"tags": [
"Aroma Diffuser",
"Best Seller Home"
],
"price": 42.5,
"originalPrice": 55,
"discountAmount": 12.5,
"discountPercent": 22.7,
"onSale": true,
"inStock": true,
"variantCount": 2,
"inStockVariantCount": 1,
"sizes": [
"S",
"L"
],
"colors": [
"Black",
"White"
],
"variants": [
{
"variantId": "0000000000002",
"sku": "0000000000000",
"title": "S / Black",
"price": 42.5,
"originalPrice": 55,
"available": true,
"backorder": false
}
],
"featuredImage": "https://example.com/images/00000000.jpg",
"images": [
"https://example.com/images/00000000.jpg"
],
"rating": 4.3,
"reviewCount": 128,
"reviewsAvailable": true,
"reviews": [
{
"reviewId": "000000001",
"rating": 5,
"title": "Sample review title",
"body": "Sample review text appears here.",
"author": "Reviewer Name",
"date": "2026-01-01T00:00:00.000Z",
"verifiedBuyer": true
}
],
"description": "Full product description appears here when Fetch product details is on.",
"materials": "Cotton",
"countryOfOrigin": "Japan",
"attributes": {
"custom.purposes": [
"Long Sleeve"
]
},
"source": "search",
"sourceRef": "aroma diffuser",
"scrapedAt": "2026-01-01T00:00:00Z"
}Ways to use this data
- Price and discount tracking: monitor was-price, discount percentage and stock across a catalogue on a recurring schedule.
- Assortment comparison: compare category, pricing and stock across the US, Canada and Australia storefronts.
- Product research and cataloguing: pull full descriptions, materials, measurements and media for a product line.
- Review analysis: collect individual customer reviews and ratings to track sentiment on top sellers.
- Competitive and catalogue monitoring: watch a category or search result for new arrivals and price changes.
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 MUJI Scraper return?
The documented output for MUJI Scraper includes product, change type (incremental mode), country, currency, price, was, discount % and on sale. Availability of each field depends on the source page and the selected mode.
How much does MUJI Scraper cost?
It costs $2.20 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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. stateKey lets you name a monitoring campaign so its state stays stable across runs.
Why does a category or search link sometimes return fewer products than expected?
The run stops at Max products, or at Max pages if that is set lower. Raise either one, or set it to 0, to collect more of a large category.
Why did my run fail instead of returning an empty dataset?
If the storefront refuses every request, the run stops with a clear message so "no matching products" is never confused with "nothing could be read". Run it again in a few minutes. If only some links or pages could not be read, you still get what was found.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
