Shopify Scraper - Products & Price Monitor avatar

Shopify Scraper - Products & Price Monitor

Pricing

from $0.75 / 1,000 product results

Go to Apify Store
Shopify Scraper - Products & Price Monitor

Shopify Scraper - Products & Price Monitor

Scrape any Shopify store's products (prices, compare-at and discount %, variants, SKUs, stock, images, tags, dates) from its public JSON feed. Monitor mode compares with the previous run and returns only new, removed, price-changed and stock-changed products.

Pricing

from $0.75 / 1,000 product results

Rating

0.0

(0)

Developer

Wrenfield Data

Wrenfield Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Categories

Share

Shopify Store Scraper & Price Monitor - Products, Variants, Stock Changes

Scrape the full product catalog of any Shopify store and track competitors' price and stock changes. Paste store domains such as allbirds.com and get every product with title, vendor, product type, tags, created/updated/published dates, price range, compare-at price and discount %, availability, images and every variant (SKU, price, compare-at, stock, options). Turn on monitor mode to get only the products that are new, removed, price-changed or stock-changed since the last run.

It reads the store's own public JSON feed (/products.json), so it is fast, cheap and needs no browser, no login and no API key.

  • ✅ Any Shopify store: brand domains (gymshark.com), *.myshopify.com or a pasted collection or product URL. Domains that aren't Shopify stores get a free error row explaining why (not Shopify, password-protected, feed disabled, unreachable).
  • ✅ Change monitor built in: snapshots are kept in your own key-value store, one per store. Schedule it daily and get a clean change feed with previous and current values.
  • ✅ Collections and keywords: limit the scrape to collection handles (e.g. mens-shoes) or keywords that match the title, vendor, product type or tags.
  • ✅ Inventory quantities when the store exposes them, plus barcodes (GTIN/UPC). Checked automatically per store.
  • ✅ Polite by design: one request at a time per store with jittered pauses. A proxy is used only if a store rate-limits (HTTP 429/430).
  • ✅ Pay only for results: error rows, retries and rate-limited requests are free.

💸 $1 per 1,000 products with variants, prices and stock. In monitor mode, $3 per 1,000 changes (price drops, restocks, new or removed products). Try it on Apify's free plan ($5 of monthly credit, no credit card).

Sample output

StoreProductPriceCompare atType
allbirds.comWomen's Allbirds Flip Flop - Dust…2550Shoes
allbirds.comMen's Canvas Runner NZ - Deep Nav…100–Shoes
allbirds.comWomen's Canvas Runner NZ - Deep N…100–Shoes

Who uses it

  • Ecommerce sellers and brands: watch competitors' prices, discounts, new launches and sell-outs.
  • Competitor-tracking and pricing teams: daily price/stock change feeds into Sheets, Slack, BI or a database.
  • Dropshippers and product researchers: find what a store sells, how it is priced and what is on sale.
  • Agencies and data teams: catalog exports and assortment analysis across many stores.

How to use

  1. Add one or more Shopify stores (domains or URLs).
  2. Optional: add collection handles, a keyword filter and max products per store.
  3. For change tracking, turn on Monitor mode and schedule the Actor (for example daily).
  4. Click Start. Download the results as JSON, CSV or Excel, or read them through the API.

Input example

{
"stores": ["allbirds.com", "https://www.gymshark.com/collections/new-releases", "kyliecosmetics.com"],
"collections": [],
"keywords": ["runner", "hoodie"],
"maxProductsPerStore": 1000,
"monitorMode": false,
"includeInventory": false
}

Output: product rows (type = product)

{
"type": "product",
"store": "allbirds.com",
"storeName": "Allbirds",
"storeUrl": "https://allbirds.com",
"currency": "USD",
"productId": 7340901859408,
"title": "Women's Allbirds Flip Flop - Dusty Pink",
"handle": "womens-allbirds-flip-flop-dusty-pink",
"url": "https://allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": ["allbirds::gender => womens", "allbirds::material => sugar"],
"createdAt": "2026-03-27T14:03:50-07:00",
"updatedAt": "2026-10-08T18:17:32-07:00",
"publishedAt": "2026-09-25T16:58:13-07:00",
"price": 25.0, "priceMin": 25.0, "priceMax": 25.0,
"compareAtPrice": 50.0, "discountPercent": 50.0, "onSale": true,
"available": true, "variantsCount": 7, "availableVariantsCount": 4,
"image": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_...png",
"images": ["https://cdn.shopify.com/..."],
"options": [{"name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"]}],
"variants": [
{"id": 42146889039952, "title": "5", "sku": "A12513W050", "price": 25.0, "compareAtPrice": 50.0,
"available": false, "options": {"Size": "5"}, "grams": 455, "requiresShipping": true}
],
"description": "Sun on your feet. Comfort underneath...",
"scrapedAt": "2026-10-09T01:22:00Z"
}

With Inventory quantities & barcodes on, variants also get barcode and, if the store exposes it, inventoryQuantity and inventoryPolicy, and the product gets a total inventoryQuantity. Many stores hide quantities. The Actor checks once per store and skips the extra requests when they are hidden. Prices are in the store's currency (currency).

Monitor mode: change rows (type = change)

Each run compares the store with its saved snapshot and outputs one row per change:

changeTypeWhenprevious / current
newProduct appeared since the last runcurrent has price, compare-at, availability, dates, tags; the full product is in product
removedProduct is gone (double-checked on its product page)previous has the last price and availability
price_changedAny variant's price or compare-at price changedpriceMin/priceMax, priceChangePercent, priceDirection, and variantChanges with old/new price per variant
stock_changedProduct or a variant went in or out of stock (optionally: inventory quantity changed)available, availableVariantsCount, inventoryQuantity; stockEvent = back_in_stock, out_of_stock or variant_stock_changed
{
"type": "change", "changeType": "price_changed", "store": "allbirds.com",
"title": "Women's Allbirds Flip Flop - Dusty Pink", "url": "https://allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
"priceDirection": "down", "priceChangePercent": -28.57,
"previous": {"priceMin": 35.0, "priceMax": 35.0},
"current": {"priceMin": 25.0, "priceMax": 25.0, "compareAtPrice": 50.0, "discountPercent": 50.0},
"variantChanges": [{"variantId": 42146889039952, "variantTitle": "5", "sku": "A12513W050", "previousPrice": 35.0, "currentPrice": 25.0, "changePercent": -28.57}],
"detectedAt": "2026-10-09T01:30:43Z", "previousRunAt": "2026-10-08T01:30:00Z"
}

How monitoring works

  • Snapshots live in a named key-value store in your account (default shopify-store-monitor), one record per store. Different collection or keyword filters get separate snapshots automatically. Use Monitor ID to keep two monitors of the same store apart.
  • On the first run there is nothing to compare with: the Actor saves the baseline and outputs the full product list (turn that off with Output full products on the first monitor run).
  • Removed products are reported only when the whole catalog (or collection) was read in both runs, so set Max products per store above the store's size. When a scan is cut short, new products are still detected by their creation date.
  • If any page fails, the snapshot is not updated, so the next run still compares against good data. You never get false "removed" rows from a network error.

Errors are free

Rows with type = error are never charged. errorType is one of not_shopify, password_protected, feed_disabled, unreachable, collection_not_found (with a list of available collections), product_not_found, fetch_failed or invalid_input.

Pricing

This Actor uses pay-per-event pricing: you pay per product row and per change row. Platform usage and proxy are included. See the Pricing tab for the current prices. Error rows, retries and rate-limited requests are free. Set a maximum cost per run in the run options: the Actor stops cleanly at that limit and keeps everything it collected.

Performance

Measured on the Apify platform (October 2026), see the dev notes for run IDs:

  • Whole-catalog scrape: about 250 products per request, typically 1,000 products in 10-20 seconds per store.
  • Several stores run in parallel (default 5), each fetched politely one page at a time.
  • Inventory mode adds one request per product (about 1 s each per store at the default delay).

Find Shopify stores with the tech stack detector, then compare their prices across Google Shopping and Walmart.

All of these are maintained by the same developer and export flat JSON, CSV or Excel, so you can feed one tool's dataset into the next.

FAQ

Does it work on every Shopify store? It works on stores that keep Shopify's public product feed on, which is the default and most stores. Stores that are password-protected or that block the feed get a free error row.

How many products can I get? The whole public catalog. Shopify returns up to 250 products per page and the Actor pages through all of them.

Why is inventoryQuantity missing? Most stores don't publish stock quantities; you still get available per variant. When a store does publish them, turn on Inventory quantities & barcodes.

Can I get the price in another currency or market? You get the store's default currency (currency). For international storefronts on their own domain (e.g. uk.gymshark.com), add that domain.

Do I need a proxy? No. Requests go directly to the store. The proxy setting is a fallback that is used only for stores that rate-limit (HTTP 429/430).

Can I use it from Make, Zapier, n8n, Python or an AI agent? Yes. Use the Apify API, the Python/JavaScript clients, schedules and webhooks, any Apify integration or the Apify MCP server.

Is it legal to scrape Shopify stores? The Actor reads only public product data that every Shopify storefront publishes at /products.json, with no login and no personal data. Each store's own terms of service and your local laws still apply, and some stores forbid automated access. Use the data responsibly (for example price comparison and market research) and don't overload stores. The Actor paces its requests for that reason. If you're unsure, ask a lawyer.