# Shopify Products Scraper & Price Change Monitor (`signalscope-data/shopify-store-monitor`) Actor

Scrape any Shopify store: products, prices, stock, ratings & customer review texts (Judge.me, Okendo, Yotpo, Junip, REVIEWS.io, Loox, Stamped) — or store tech stack. Monitor price drops & restocks. $1/1,000 rows.

- **URL**: https://apify.com/signalscope-data/shopify-store-monitor.md
- **Developed by:** [Bin](https://apify.com/signalscope-data) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 product rows

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

## Shopify Products Scraper & Price Change Monitor

Scrape **every product, variant, price and stock status from any Shopify store** — or switch to **Monitor mode** and get only what changed since the last run: **price drops, price increases, new products, removed products, restocks and sell-outs**.

New: **stock levels & estimated sales** — turn on `includeInventory` to get the **units in stock per variant and barcodes (GTIN/UPC/EAN)**, and in Monitor mode an `inventory_change` feed with **estimated units sold and revenue** between runs.

New: **product ratings & review counts** — turn on `includeRatings` to add `rating`, `reviewCount` and the star distribution per product (Okendo, Yotpo, Judge.me, Junip, REVIEWS.io, Loox, Stamped and schema.org ratings), filter to proven best sellers with `minReviewCount`, and in Monitor mode get a `new_reviews` feed — **review velocity**, a strong demand signal.

New: **product review texts** — `outputLevel: "reviews"` returns the **customer reviews themselves**: stars, title, full text, author display name, date, verified buyer, helpful votes, the **store's reply**, and on Yotpo stores the **fit / size / comfort answers** — from the store's public **Judge.me, Okendo, Yotpo, Junip, REVIEWS.io, Loox or Stamped** widget, newest first. Filter by stars (`reviewMaxRating: 2` = complaints only) and date (`reviewsSince`). In Monitor mode, `new_reviews` events now carry the new review texts too.

New: **one row per store** — `outputLevel: "store"` turns a list of store URLs into a **competitor / lead table**: catalog size, price range and median, % on sale and average discount, sold-out share, **new products in the last 30/90 days** and launches per month, top vendors and product types, **Shopify theme and detected apps** (Klaviyo, Attentive, Recharge, Yotpo, Okendo, Gorgias, Meta/TikTok pixels, Klarna, Afterpay, Global-e… 60+ checked), plus total reviews / stock value when ratings or inventory are on.

Works with millions of Shopify stores (Allbirds, Gymshark, Kylie Cosmetics, Fashion Nova, …). No browser, no login, no proxies — fast and cheap.

### Why use it

- 🛍️ **Full catalog** — title, vendor, type, tags, all variants (size/color), SKU, price, compare-at price, availability, images, dates.
- 🔔 **Change monitor** — schedule it daily/hourly and receive a clean feed of `price_drop`, `price_increase`, `new_product`, `new_variant`, `removed_product`, `back_in_stock`, `out_of_stock` events. You only pay for changes, not the whole catalog.
- 🗂️ **Collections** — paste a collection URL (e.g. `/collections/sale`) to scrape only that collection.
- 🎯 **Track specific products** — paste individual product URLs (`/products/...`) to watch just those items for price drops and restocks.
- 🔍 **Filters** — keywords / exclude keywords (title, vendor, type, tags), min/max price, on-sale only, in-stock only.
- 🏷️ **Discount %** — every product has `discountPercent` (largest compare-at vs. current price gap) for deal hunting.
- 🔕 **Noise control** — report only the change types you care about (e.g. just `price_drop` + `back_in_stock`) and ignore price moves under X%. You pay only for reported changes.
- 📦 **Product or variant rows** — one row per product (variants nested) or flattened per variant for spreadsheets.
- 📊 **Inventory & sales velocity** — `inventoryQuantity` per variant and `totalInventory` per product (on the many stores that publish stock counts), plus `estimatedUnitsSold` / `estimatedRevenue` per variant in Monitor mode.
- ⭐ **Ratings & reviews** — `rating`, `reviewCount`, `ratingSource` and `ratingDistribution` (1–5 stars) per product; `minRating` / `minReviewCount` filters; `new_reviews` events with `reviewsAdded` in Monitor mode.
- 💬 **Review texts** — `outputLevel: "reviews"`: one row per customer review (Judge.me, Okendo, Yotpo, Junip, REVIEWS.io, Loox, Stamped) with rating, text, date, verified buyer, store reply and Yotpo fit answers; star and date filters; reviews shared across product variants are output once.
- 🔢 **Barcodes** — GTIN / UPC / EAN per variant for matching products across stores and marketplaces.
- 💱 Store currency detected automatically.

### Use cases

- **Competitor price tracking** for DTC brands and e-commerce teams.
- **Dropshipping & product research** — find new launches and best sellers of top stores.
- **Deal / sale alerts** — post price drops to Slack, Telegram, Discord or a deals site.
- **Stock alerts** — know when a sold-out product is back.
- **Market research** — catalog size, pricing and assortment of any brand.
- **Competitor & lead lists** — paste 100 store URLs with `outputLevel: "store"`: one row each with catalog size, price point, launch cadence and tech stack (who uses Klaviyo, Recharge, Yotpo…), ready for a spreadsheet or CRM.
- **Sales estimation** — track a competitor's stock daily to see which products actually sell (and how fast).
- **Best-seller research** — rank a competitor's catalog by review count, or watch which products collect new reviews fastest.
- **Voice of customer** — pull every 1–2★ review of a competitor's best sellers to find product defects, sizing problems and unmet needs before you design your own product or ad copy.
- **Product matching** — join catalogs from different stores or Amazon listings by barcode.

### Input example

Monitor two competitors for meaningful price drops and restocks:

```json
{
  "stores": ["https://www.allbirds.com", "https://gymshark.com/collections/sale"],
  "mode": "changes",
  "stateKey": "competitors-daily",
  "changeTypes": ["price_drop", "back_in_stock"],
  "minChangePercent": 10
}
```

Scrape only discounted running shoes under $120 that are in stock:

```json
{
  "stores": ["https://www.allbirds.com"],
  "keywords": ["runner"],
  "excludeKeywords": ["kids", "gift card"],
  "maxPrice": 120,
  "onlyOnSale": true,
  "onlyAvailable": true
}
```

Estimate a competitor's daily sales from stock changes (first run saves the baseline):

```json
{
  "stores": ["https://www.taylorstitch.com"],
  "mode": "changes",
  "stateKey": "taylor-sales",
  "includeInventory": true,
  "changeTypes": ["inventory_change", "new_product"]
}
```

Example `inventory_change` event:

```json
{
  "changeType": "inventory_change",
  "title": "The Yosemite Shirt in Buckeye Plaid",
  "variantTitle": "M - 40",
  "barcode": "197102118471",
  "price": 138,
  "oldInventory": 40,
  "inventory": 34,
  "inventoryDelta": -6,
  "estimatedUnitsSold": 6,
  "estimatedRevenue": 828
}
```

Find a competitor's proven best sellers (4.5★+ with 100+ reviews):

```json
{
  "stores": ["https://www.beardbrand.com", "https://www.brooklinen.com"],
  "includeRatings": true,
  "minRating": "4.5",
  "minReviewCount": 100
}
```

Track review velocity daily (first run saves the baseline):

```json
{
  "stores": ["https://www.beardbrand.com"],
  "mode": "changes",
  "stateKey": "beardbrand-reviews",
  "includeRatings": true,
  "changeTypes": ["new_reviews", "new_product"]
}
```

Example `new_reviews` event:

```json
{
  "changeType": "new_reviews",
  "title": "Norse Winter Sea Salt Spray",
  "oldReviewCount": 867,
  "reviewCount": 872,
  "reviewsAdded": 5,
  "oldRating": 4.53,
  "rating": 4.54,
  "ratingSource": "judgeme"
}
```

Watch a few specific products:

```json
{
  "stores": [
    "https://www.allbirds.com/products/mens-wool-runners",
    "https://www.allbirds.com/products/mens-canvas-runner-nz"
  ],
  "mode": "changes",
  "stateKey": "my-wishlist"
}
```

#### Store-level example (competitor table / tech stack)

```json
{
  "stores": ["https://www.brooklinen.com", "https://www.rothys.com", "https://colourpop.com"],
  "outputLevel": "store",
  "includeRatings": true
}
```

Real result (October 2026): **ColourPop** — 1,049 products, median price $10, 62 new products in the last 90 days, 2.73M reviews (Okendo, average 4.73★), apps detected: Klaviyo, Attentive, Yotpo, Okendo, Gorgias, Nosto, Klevu, Klarna, Elevar, Triple Whale. **Rothy's** — 713 products, median $135, 84 new in 90 days, 397,723 reviews (4.55★), Yotpo + Yotpo Loyalty + Global-e. **Brooklinen** — 491 products, 81 new in 90 days, 16.5% on sale (average −47%), Attentive, Yotpo, Meta Pixel.

#### Customer reviews example (voice of customer)

All 1–2★ reviews written since September on a competitor's sea salt sprays:

```json
{
  "stores": ["https://www.beardbrand.com"],
  "outputLevel": "reviews",
  "keywords": ["sea salt"],
  "maxReviewsPerProduct": 0,
  "reviewMaxRating": 2,
  "reviewsSince": "2026-09-01"
}
```

Example review row (real, Yotpo store, October 2026):

```json
{
  "type": "review",
  "store": "https://rothys.com",
  "productTitle": "The Ivy Sneaker - ReVelvet™ Cobalt",
  "productUrl": "https://rothys.com/products/womens-ivy-sneaker-revelvet-cobalt",
  "rating": 5,
  "title": "Love the leopard matches my",
  "body": "Love the leopard matches my bag",
  "author": "Carol D.",
  "verifiedBuyer": true,
  "createdAt": "2026-10-06T18:55:24.000Z",
  "helpfulCount": 0,
  "customFields": { "Comfort": 5, "Usual Size": "9.5", "Size Purchased": "9.5", "Fit": 2, "Width": 2 },
  "storeReply": null,
  "reviewSource": "yotpo"
}
```

Judge.me rows also include `reviewerCountry`, `variant` and `mediaCount`; Okendo rows include `recommended`. Stamped rows include `reviewerCountry`, `variant`, `mediaCount`, `customFields` (the store's extra questions) and `featured`. Junip rows include `recommended`, `variant`, `mediaCount`, `incentivized` and `featured` (Junip's public API has no reviewer names, so `author` is empty). REVIEWS.io rows include `reviewerCountry`, `variant` (matched by SKU), `mediaCount`, `customFields` (e.g. "How was the product fit?" on a 1–5 scale) and the store's reply. Loox rows include `mediaCount` (photo/video reviews) and `translated`; Loox's public widget cuts texts over ~500 characters with "..." — those rows have `bodyTruncated: true` (about 1 in 10 reviews). When a store pools reviews across a product line, `reviewedProductTitle` shows the product the review was actually written for. In Monitor mode with `includeRatings`, each `new_reviews` event carries `newReviews` (up to 10 newest texts) and `newLowRatingReviews`.

### Output examples

Change event:

```json
{
  "changeType": "price_drop",
  "store": "https://www.allbirds.com",
  "title": "Men's Canvas Runner NZ - Deep Navy Stripes",
  "variantTitle": "10",
  "sku": "A12345",
  "oldPrice": 110,
  "price": 100,
  "changePercent": -9.1,
  "currency": "USD",
  "url": "https://www.allbirds.com/products/mens-canvas-runner-nz",
  "detectedAt": "2026-10-04T12:00:00.000Z"
}
```

Catalog product:

```json
{
  "store": "https://www.allbirds.com",
  "productId": 7123456789,
  "title": "Women's Tree Runners",
  "vendor": "Allbirds",
  "productType": "Shoes",
  "tags": ["women", "runners"],
  "currency": "USD",
  "minPrice": 98,
  "maxPrice": 98,
  "onSale": false,
  "discountPercent": 0,
  "available": true,
  "variantsCount": 12,
  "variants": [{ "variantId": 1, "title": "5", "sku": "...", "price": 98, "compareAtPrice": null, "available": true }]
}
```

Store row (`outputLevel: "store"`, shortened):

```json
{
  "type": "store",
  "storeName": "ColourPop",
  "store": "https://colourpop.com",
  "country": "US",
  "currency": "USD",
  "productsAnalyzed": 1049,
  "catalogComplete": true,
  "soldOutSharePct": 4.1,
  "priceMin": 3, "priceMedian": 10, "priceMax": 159,
  "onSaleSharePct": 1.5, "averageDiscountPct": 30.14,
  "newProductsLast30Days": 14, "newProductsLast90Days": 62,
  "launchesByMonth": [{ "month": "2026-09", "products": 52 }, { "month": "2026-10", "products": 1 }],
  "topProductTypes": [{ "name": "Shadow Palette", "count": 53 }, { "name": "Super Shock Shadow", "count": 45 }],
  "theme": { "name": "Colourpop/Main", "schemaName": "Colourpop", "schemaVersion": "3.10.0" },
  "techStack": ["Klaviyo", "Attentive", "Yotpo", "Okendo", "Gorgias", "Nosto", "Klevu", "Klarna", "Google Tag Manager", "Elevar", "Triple Whale", "Microsoft Clarity"],
  "techStackByCategory": { "email & SMS": ["Klaviyo", "Attentive"], "reviews & UGC": ["Yotpo", "Okendo"], "support chat": ["Gorgias"] },
  "totalReviews": 2733643, "averageRating": 4.73,
  "mostReviewedProducts": [{ "title": "Tulum", "price": 6.3, "rating": 4.45, "reviewCount": 21795 }]
}
```

### Pricing

Pay only for results:

- **$1 per 1,000 products/rows** (catalog mode)
- **$1 per 1,000 reviews** (`outputLevel: "reviews"` — products are not charged)
- **$0.01 per store row** (`outputLevel: "store"` — the whole catalog summarised in one row)
- **$2 per 1,000 change events** (monitor mode — the first baseline run is free of change charges)

### How monitoring works

1. Set **Mode** to "Monitor: only changes since last run" and give the monitor a name.
2. The first run saves a baseline snapshot.
3. Create a Schedule (e.g. daily) — each run outputs only the differences.
4. Add an integration (Slack, email, Google Sheets, webhook, Zapier, Make) to get alerts automatically.

### FAQ

**Which stores work?** Any Shopify store that hasn't disabled its public product feed (the vast majority).

**How do I get alerts only for big price drops?** Use `mode: "changes"`, `changeTypes: ["price_drop"]` and `minChangePercent: 15`. Connect a Slack, email or webhook integration to the schedule.

**Can I track a single product?** Yes — paste the product URL. Multiple product URLs from the same store are fetched together and tracked as one monitor.

**How do keyword filters match?** Case-insensitive, whole words and their endings: `runner` matches "Runners" but not "shoprunner". Tags are included, so store tags like `sale` or `new-arrival` work too.

**Why do I get 0 products?** The store may hide its product feed, or the collection handle is wrong — open `https://<store>/collections` to see valid collection URLs. The run's `SUMMARY` record lists every store that failed.

**Can I export to CSV / Excel / Google Sheets?** Yes — choose "Flatten per variant" for spreadsheet-friendly rows, then export from the dataset or connect Google Sheets.

**Can I see how many units are in stock?** Yes, on stores that publish it (many do — e.g. Taylor Stitch, ColourPop). Turn on `includeInventory`; `inventoryQuantity` is `null` when a store hides stock levels. Barcodes are returned whenever the store sets them.

**How are sales estimated?** In Monitor mode with `includeInventory`, every drop in a variant's stock between two runs is reported as `estimatedUnitsSold` (× price = `estimatedRevenue`). Restocks show as a positive `inventoryDelta` with 0 units sold. Run it daily or hourly for a sales-velocity time series. It's an estimate: returns, manual stock edits and bundles can affect it.

**Which review apps are supported for ratings?** Okendo, Yotpo, Junip and Loox (with the 1–5 star distribution; Junip adds `recommendedPct`), Stamped and REVIEWS.io (read from their public widget APIs), Judge.me (the rating badge on the product page) and any store that publishes schema.org `aggregateRating` on product pages (many themes do). Stores using other apps (e.g. Fera, Ali Reviews) or no reviews return `rating: null`. The log says which app was detected and how many products had ratings.

**Can I get the review texts, not just ratings?** Yes — `outputLevel: "reviews"`. Stores using Judge.me, Okendo, Yotpo, Junip, REVIEWS.io, Loox or Stamped (the seven most common Shopify review apps) are supported; reviews come newest first, up to `maxReviewsPerProduct` per product (0 = all). The log says which app was found; stores on other apps (Fera, Ali Reviews, Rivyo…) are reported in `SUMMARY` with "no supported review app".

**Does it work with Junip and REVIEWS.io stores?** Yes. Junip is detected from the store key its theme block publishes on product pages; REVIEWS.io reviews are matched by the product's variant SKUs (REVIEWS.io groups them per product) and the store's REVIEWS.io name is checked against the product before use. Junip's public API doesn't expose reviewer names, so Junip rows have no `author`.

**How do I collect only negative reviews?** Set `reviewMaxRating: 2` (and optionally `reviewsSince`). Pages are read newest first and stop at the date limit, so date-limited runs are fast.

**Loox stores are slower — why?** Loox rate-limits its public review widget per IP, so the Actor reads Loox one page per second. If Loox still blocks the run, it logs a clear warning, skips the remaining Loox requests (SUMMARY shows the store with an error) and other stores carry on; run again later or with fewer products.

**Why do several products show the same rating?** Some stores group reviews across variants of one product line (e.g. all colors of a T-shirt pack share one review pool in Okendo or Judge.me). That is the number the store itself shows to shoppers.

**Does `includeRatings` cost more?** No extra charge per row — it only adds one request per product, so big catalogs take a bit longer. Use `maxProductsPerStore`, a collection URL or keywords to keep runs short.

**Is it legal?** It reads only public product information that the store publishes for browsing and shopping. Review rows contain only what the store shows publicly on its product pages (reviewer display name, usually first name + initial, and country on Judge.me) — no emails, phone numbers or other contact data.

**Can I see which apps a Shopify store uses?** Yes — `outputLevel: "store"` checks the homepage for 60+ apps and pixels (email/SMS, subscriptions, reviews, support chat, loyalty, search, BNPL, returns, cross-border, ads & analytics, page builders) and reads the Shopify theme name. Apps that load only through a tag manager or only on other pages can be missed.

**How do I know how often a competitor launches products?** Use `outputLevel: "store"`: `newProductsLast30Days`, `newProductsLast90Days`, `lastProductLaunchAt` and `launchesByMonth` (last 12 months) are based on each product's creation date, so re-published old products don't count as new.

### More tools from the same developer

- [Company Jobs Scraper](https://apify.com/signalscope-data/ats-jobs-scraper) — every open job from Workday, Greenhouse, Lever, Ashby & more, with new-job alerts.
- [App Store & Google Play Reviews Scraper](https://apify.com/signalscope-data/app-reviews-scraper) — reviews, ratings and new-review monitoring for iOS and Android apps.
- [App Store & Google Play Top Charts & App Rank Tracker](https://apify.com/signalscope-data/app-charts-tracker) — top free/paid/grossing charts in any country, with daily rank changes, breakout apps and dropouts.
- [Telegram Channel Scraper & Keyword Monitor](https://apify.com/signalscope-data/telegram-channel-monitor) — public channel posts with keyword alerts.
- [Workday Jobs Scraper](https://apify.com/signalscope-data/workday-jobs-scraper) — any myworkdayjobs.com careers site.
- [Government Tenders Monitor](https://apify.com/signalscope-data/public-tenders-monitor) — EU TED & UK public contracts.

# Actor input Schema

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

Store URLs (e.g. https://www.allbirds.com), collection URLs (…/collections/sale — scrape only that collection) or individual product URLs (…/products/<handle> — track just those products). Mix freely.

## `mode` (type: `string`):

'changes' compares with the previous run and outputs only new products, removed products, price changes, restocks and sell-outs. The first run saves a baseline.

## `stateKey` (type: `string`):

Used in monitor mode. Use a different name for each separate monitor/schedule.

## `outputLevel` (type: `string`):

Only for full catalog mode. "store" = one row per store for competitor research and lead lists: product/variant counts, price range and median, share on sale and average discount, sold-out share, new products in the last 30/90 days and launches per month, top vendors / product types / tags, newest products, Shopify theme and detected apps (Klaviyo, Recharge, Yotpo, Gorgias, Meta/TikTok pixels, BNPL... 60+ checked on the homepage). Add includeRatings for total reviews + most-reviewed products, includeInventory for total stock and inventory value. Charged as one store event per store. "reviews" = the product reviews themselves (rating, title, text, author display name, date, verified buyer, helpful votes, store reply, Yotpo fit/size answers) read from the store's public Judge.me, Okendo or Yotpo widget, newest first; charged per review. Combine with keywords / maxProductsPerStore to pick products and the review filters below.

## `includeDescription` (type: `boolean`):

Add the product description as plain text.

## `includeInventory` (type: `boolean`):

Fetch each product's variant data to add barcode (GTIN/UPC/EAN), stock quantity per variant (inventoryQuantity, when the store makes it public — many do), totalInventory and inventoryPolicy. In changes mode this also reports 'inventory_change' events with estimatedUnitsSold and estimatedRevenue — a sales-velocity signal for competitor stores. Adds one request per product, so big stores take longer.

## `includeRatings` (type: `boolean`):

Add rating (average stars), reviewCount, ratingSource and (Okendo/Yotpo/Junip/Loox) ratingDistribution per product, read from the store's public review app: Okendo, Yotpo, Junip, REVIEWS.io, Stamped and Loox via their public widget APIs, Judge.me and others via the product page (Judge.me badge or schema.org rating). In changes mode this also reports 'new_reviews' events (reviewsAdded since last run, plus the newest review texts in newReviews for every app that supports review texts) — review velocity is a demand signal. Adds one request per product.

## `maxProductsPerStore` (type: `integer`):

0 = all.

## `keywords` (type: `array`):

Only include products whose title, vendor, product type or tags contain at least one of these words (case-insensitive), e.g. 'runner', 'merino'. Empty = all products.

## `excludeKeywords` (type: `array`):

Skip products whose title, vendor, product type or tags contain any of these words, e.g. 'gift card', 'sample'.

## `minPrice` (type: `integer`):

Only products with at least one variant priced at or above this (store currency). Leave empty for no limit.

## `maxPrice` (type: `integer`):

Only products with at least one variant priced at or below this (store currency). Leave empty for no limit.

## `onlyOnSale` (type: `boolean`):

Catalog mode: output only products with a compare-at (crossed-out) price higher than the current price. See discountPercent in the output.

## `onlyAvailable` (type: `boolean`):

Catalog mode: skip products where every variant is sold out.

## `minRating` (type: `string`):

Catalog mode, needs 'Include product ratings': only products rated at least this many stars, e.g. 4.5. Leave empty for no limit.

## `minReviewCount` (type: `integer`):

Catalog mode, needs 'Include product ratings': only products with at least this many reviews, e.g. 100 = proven best sellers. Leave empty for no limit.

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

For outputLevel "reviews": newest reviews to output per product (0 = all, up to ~1,000 per product). Stores that pool reviews across product variants (common with Okendo and Judge.me) show the same review on several products only once.

## `reviewMinRating` (type: `integer`):

For outputLevel "reviews": only reviews with at least this many stars. Leave empty for all.

## `reviewMaxRating` (type: `integer`):

For outputLevel "reviews": only reviews with at most this many stars, e.g. 2 = complaints only (competitor weaknesses, product defects). Leave empty for all.

## `reviewsSince` (type: `string`):

For outputLevel "reviews": only reviews written on or after this date, e.g. 2026-09-01. Paging stops at older reviews, so this also makes runs faster.

## `changeTypes` (type: `array`):

Changes mode: report only these change types (e.g. just price drops and restocks). Empty = all types. You only pay for reported changes.

## `minChangePercent` (type: `integer`):

Changes mode: ignore price drops/increases smaller than this percentage, e.g. 10 = only report changes of 10% or more.

## Actor input object example

```json
{
  "stores": [
    "https://www.allbirds.com",
    "https://gymshark.com/collections/sale"
  ],
  "mode": "catalog",
  "stateKey": "default",
  "outputLevel": "product",
  "includeDescription": false,
  "includeInventory": false,
  "includeRatings": false,
  "maxProductsPerStore": 0,
  "keywords": [],
  "excludeKeywords": [],
  "onlyOnSale": false,
  "onlyAvailable": false,
  "maxReviewsPerProduct": 20,
  "changeTypes": [],
  "minChangePercent": 0
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "stores": [
        "https://www.allbirds.com",
        "https://gymshark.com/collections/sale"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalscope-data/shopify-store-monitor").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 = { "stores": [
        "https://www.allbirds.com",
        "https://gymshark.com/collections/sale",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("signalscope-data/shopify-store-monitor").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 '{
  "stores": [
    "https://www.allbirds.com",
    "https://gymshark.com/collections/sale"
  ]
}' |
apify call signalscope-data/shopify-store-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,signalscope-data/shopify-store-monitor"
        }
    }
}
```

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/u3c6qhJYv4xROfBqS/builds/KiLPskQGUREjlcbWg/openapi.json
