Shopify Store Scraper avatar

Shopify Store Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Shopify Store Scraper

Shopify Store Scraper

Extract full product catalogs from any Shopify store — prices, variants, inventory, reviews & collections. Auto-detects Judge.me, Yotpo, Okendo & more. Filter by availability, discount %, or date. No browser or credentials needed.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

ScrapeFlux

ScrapeFlux

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Categories

Share

Extract complete product data from any Shopify store — prices, variants, inventory, reviews, collections, currency, and more. Works on any store powered by Shopify including custom domains. No browser required. Fast, cheap, and reliable.

New: Monitor mode. Run on a schedule and get only what changed since the last run — price_drop, back_in_stock, out_of_stock, price_increase, new, updated, and removed products, each with the previous price attached. Perfect for competitor price alerts and restock notifications, and you only pay for actual changes.

Features

  • Scrapes any Shopify store by URL — no template or configuration needed
  • Monitor mode — price/stock change detection across runs with typed change_type deltas
  • Extracts full product catalog with descriptions, variants, images, and tags
  • Store metadata — store name, currency, country auto-detected per store
  • Price rangemin_price and max_price across all variants
  • Discount percentage calculated automatically from compare-at price
  • Product timestampscreated_at, updated_at, published_at
  • Reviews — auto-detects and scrapes from Judge.me, Yotpo, Stamped.io, Okendo, and Loox
  • Average rating computed from fetched reviews
  • Collections/categories — scrapes store collection hierarchy
  • Filters — only available products, minimum discount %, created after date
  • Option to output each variant as a separate row (great for price sheets)
  • Handles pagination — scrapes the full catalog regardless of size
  • No browser, no credentials required
  • Pay Per Event pricing — you only pay per product scraped

Use cases

  • Price-drop alerts — schedule daily monitor runs with changeTypes: ["price_drop"] and get a feed of every competitor price cut, with old and new price
  • Restock notificationschangeTypes: ["back_in_stock"] on high-demand products
  • Price monitoring — track competitor prices and sale discounts across Shopify stores
  • Dropshipping research — products, reviews, and availability in one run
  • Market research — analyze catalogs, categories, pricing trends, and review sentiment
  • New-product trackingchangeTypes: ["new"] to see every product a competitor launches
  • Discount hunting — filter to only products on sale above a threshold

Input

FieldTypeRequiredDescription
storeUrlsArray of stringsYesShopify store URLs (e.g. https://allbirds.com)
maxProductsPerStoreIntegerNoMax products per store (default: unlimited)
includeVariantsBooleanNoOutput each variant as a separate row (default: false)
scrapeReviewsBooleanNoFetch product reviews (default: false)
maxReviewsPerProductIntegerNoMax reviews per product (default: 50, max: 1000)
scrapeCollectionsBooleanNoScrape store collections/categories (default: false)
onlyAvailableBooleanNoSkip products where all variants are out of stock (default: false)
minDiscountIntegerNoOnly return products discounted by at least this % (1–99)
createdAfterStringNoOnly return products created after this date (YYYY-MM-DD)
monitorModeBooleanNoOnly output changes since the last run (default: false)
snapshotKeyStringNoState namespace for monitor mode (default: "default")
changeTypesArrayNoIn monitor mode, only output these change types (empty = all)
proxyConfigObjectNoProxy settings (datacenter proxies work fine)

Output — Products

{
"record_type": "product",
"store_url": "https://allbirds.com",
"store_name": "Allbirds",
"currency": "USD",
"product_id": 1234567890,
"title": "Tree Runner",
"handle": "tree-runner",
"vendor": "Allbirds",
"product_type": "Footwear",
"description": "Made from eucalyptus tree fiber...",
"tags": ["sustainable", "running"],
"price": "98.00",
"compare_at_price": "135.00",
"discount_percentage": 27,
"min_price": "78.00",
"max_price": "118.00",
"available": true,
"variants_count": 8,
"images": ["https://cdn.shopify.com/..."],
"product_url": "https://allbirds.com/products/tree-runner",
"created_at": "2023-01-15T08:00:00-05:00",
"updated_at": "2026-06-01T12:00:00-05:00",
"published_at": "2023-01-15T10:00:00-05:00",
"reviews": [
{
"platform": "judgeme",
"author": "Jane D.",
"rating": 5,
"title": "Best shoes I've ever owned",
"body": "Super comfortable right out of the box...",
"date": "2026-05-01T00:00:00Z",
"verified": true,
"helpful_votes": 12,
"photos": []
}
],
"review_count": 1,
"average_rating": 4.8,
"scraped_at": "2026-06-26T10:00:00.000Z"
}

With includeVariants: true

Each variant becomes its own row with all product fields plus:

{
"variant_id": 9876543210,
"variant_title": "US 10 / Gray",
"sku": "TR-US10-GRY",
"price": "98.00",
"compare_at_price": "135.00",
"discount_percentage": 27,
"available": true,
"inventory_quantity": 14
}

Monitor mode

Set monitorMode: true and run the actor on a schedule. The first run snapshots the catalog and outputs every product as change_type: "new"; each later run outputs only products that changed, with one of:

change_typeMeaning
newProduct/variant appeared since the last run
price_dropPrice is lower than the last run (previous_price included)
price_increasePrice is higher than the last run (previous_price included)
back_in_stockWas unavailable, now available
out_of_stockWas available, now sold out
updatedOther catalog change (title, vendor, compare-at price, …)
removedProduct/variant disappeared from the store (last-known data is output)

Changed records additionally carry previous_price and previous_available. Use changeTypes to narrow the feed — e.g. ["price_drop"] for a pure price-drop alert stream. Snapshots are stored per store and per snapshotKey, so separate watchlists don't interfere. If a store's crawl fails mid-run, its snapshot is left untouched rather than emitting false removed records.

Example price-drop alert input:

{
"storeUrls": ["https://competitor-one.com", "https://competitor-two.com"],
"monitorMode": true,
"changeTypes": ["price_drop", "back_in_stock"],
"snapshotKey": "competitors"
}

Note: in monitor mode, collections are not output and per-run filters (onlyAvailable, minDiscount) define the watched set — a product that stops matching the filters is reported as removed.

Output — Collections (when scrapeCollections: true)

{
"record_type": "collection",
"store_url": "https://allbirds.com",
"collection_id": 987654321,
"title": "Men's Shoes",
"handle": "mens-shoes",
"description": "Shop all men's shoes...",
"image_url": "https://cdn.shopify.com/...",
"products_count": 24,
"collection_url": "https://allbirds.com/collections/mens-shoes"
}

Supported review platforms

PlatformDetection
Judge.meAuto-detected from page source
YotpoAuto-detected, extracts public app key
Stamped.ioAuto-detected, extracts public API key
OkendoAuto-detected, extracts subscriber ID
LooxAuto-detected from page source

How it works

Uses Shopify's public /products.json and /collections.json endpoints — available on every Shopify store without credentials. Paginates with limit=250 until the full catalog is retrieved. Store currency and name are auto-detected via /shop.json (with an HTML fallback for stores that block it). Reviews are fetched from the platform's public CDN API after detecting which review app the store uses.