Shopify Price & Stock Monitor – Products Scraper avatar

Shopify Price & Stock Monitor – Products Scraper

Pricing

from $0.65 / 1,000 products

Go to Apify Store
Shopify Price & Stock Monitor – Products Scraper

Shopify Price & Stock Monitor – Products Scraper

Shopify price & stock monitor and products scraper for any store's public feed. Input: store domains, collection or product URLs. Output: products, variants, prices, stock, images, or only new, repriced, out-of-stock ones. $0.83/1k items.

Pricing

from $0.65 / 1,000 products

Rating

0.0

(0)

Developer

Glidepath

Glidepath

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Shopify price monitor and Shopify scraper in one: watch any Shopify store and get only the products that are new, removed, repriced, out of stock or back in stock since your last run (with old and new prices per variant), or export the whole catalog (title, vendor, type, variants with prices, sale prices and stock, currency, images and description).

  • Daily competitor price and stock alerts: schedule it, add the Slack or e-mail integration, done. You pay only for changed products (setup below).
  • Full Shopify products export: every product and variant of a store or a collection, as JSON, CSV or Excel.

It reads the store's own public products.json feed — the same JSON every Shopify storefront publishes for its own storefront and app integrations (no login, no cookies, no browser), so runs are fast, cheap and stable.

Who uses it

  • Market and competitor research — track a competitor's catalog, prices and stock over time.
  • Price monitoring and repricing — watch a set of stores for price or stock changes.
  • Product aggregators and dropshippers — pull a clean product feed from any Shopify store or collection.
  • Buyers and deal hunters — filter a store's catalog by price range or in-stock only.
  • AI agents — a single, predictable tool for "what does store X sell, and at what price?".

How to use it

  1. Add stores to Store domains or collection URLs — a bare domain (allbirds.com), a full store URL, or a collection URL to scrape only that collection.
  2. Optionally filter by price range or in-stock only, and cap how many products per store.
  3. Run it and download the products as JSON, CSV or Excel — or call it via API, schedule it, or connect it to Make, Zapier, n8n, Google Sheets or your AI agent (Apify MCP).

Sales, currency, variants and store checks

  • Every row has currency (ISO code from the store's /meta.json or the product feed), and product-level compareAtPrice, discountPct and onSale (the deepest discount among the variants).
  • outputMode: "variants" gives one flat row per variant (size, color…), handy in spreadsheets; you are still charged once per product.
  • Add product URLs (…/products/<handle>) to read single products, and keywords to keep only matching products (title, vendor, type or tags).
  • Each store is pre-checked through its public /meta.json. STORE_STATUS in the run's key-value store says per store: OK, NOT_SHOPIFY, PASSWORD_PROTECTED, ROBOTS_DISALLOWED, RATE_LIMITED or PARTIAL (fewer products in the feed than the store's published count), with currency and counts. Stores that return nothing are never charged.
  • Single-product URLs come from the product's own JSON, which has no stock flag: available is empty there.

Monitor competitor prices and stock daily

Turn on Only changes since the last run and the Actor remembers every product it saw (in a key-value store in your own Apify account). Each later run returns only what changed:

  • changeType: one or more of new, price_changed, stock_changed, removed
  • previousPriceMin, previousPriceMax, previousAvailable: the values at the previous run; priceChangePct and stockChange (out_of_stock / back_in_stock)
  • variantChanges: every changed variant (new, removed, price up/down with %, out of stock, back in stock) with its old and new price and availability

The first run is the baseline and returns every product as new. After that you pay only for changed products, so a daily check of a 1,000-product store usually costs a few cents.

{
"stores": ["competitor-store.com"],
"onlyChangesSinceLastRun": true,
"stateStoreName": "competitor-watch"
}
  1. Save this input as a Task and add a daily Schedule in Apify.
  2. Add the Slack or e-mail integration to the Task (Integrations tab), so changes reach you on every successful run. Webhooks, Google Sheets, Make, Zapier and n8n work too.
  3. Use one stateStoreName per watchlist. Delete that key-value store to start a new baseline.

Notes: a change is remembered only once it has been delivered, so changes cut off by your cost limit or maxProducts show up again in the next run. Removed products are detected only when the whole catalog was read (not when maxProductsPerStore cut it). Filters (onlyAvailable, price range) apply to the product's current state.

Input example

{
"stores": ["allbirds.com", "https://gymshark.com/collections/leggings"],
"onlyAvailable": true,
"maxProductsPerStore": 200
}

Output example

{
"store": "allbirds.com",
"collection": null,
"id": 7289263685712,
"handle": "mens-wool-runner-natural-black",
"title": "Men's Wool Runner - Natural Black",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": ["mens", "shoes", "wool"],
"priceMin": 89.0,
"priceMax": 98.0,
"available": true,
"variantsCount": 3,
"variants": [
{"id": 1001, "title": "8", "sku": "WR-8-BLK", "price": 98.0, "compareAtPrice": null, "available": true,
"option1": "8", "option2": null, "option3": null}
],
"options": [{"name": "Size", "position": 1, "values": ["8", "9", "10"]}],
"images": [{"src": "https://cdn.shopify.com/.../wool-runner-1.jpg", "width": 1200, "height": 1200}],
"url": "https://allbirds.com/products/mens-wool-runner-natural-black",
"createdAt": "2025-08-29T18:36:38Z",
"updatedAt": "2026-09-25T22:50:41Z",
"publishedAt": "2026-09-25T22:24:49Z",
"descriptionText": "Our original sneaker. Soft, breathable and machine washable.",
"descriptionHtml": null,
"scrapedAt": "2026-09-26T09:00:00Z"
}
FieldDescription
store, collectionStore domain and collection handle (when the input was a collection URL)
id, handleShopify product id and URL slug (use id to de-duplicate)
title, vendor, productType, tagsAs published by the store
priceMin, priceMax, availableLowest/highest variant price and whether any variant is purchasable
variantsCount, variantsEvery variant with its own price, stock status and option values
optionsOption names and their possible values (e.g. Size, Color)
imagesProduct images (URL, width, height); capped by Max images per product
urlPublic product page
createdAt, updatedAt, publishedAtISO 8601 UTC
descriptionText, descriptionHtmlPlain text by default; HTML on request

A per-store summary (products found, matched, saved, errors) is stored in the run's key-value store as SUMMARY.

Use it with

  • Schedules: save your input as a Task and run it hourly, daily or weekly.
  • Integrations: Slack, e-mail, Google Sheets and Google Drive, webhooks, Make, Zapier and n8n (the Integrations tab of the Actor or Task).
  • API and code: the Apify API, the JavaScript and Python clients, or CSV/JSON/Excel downloads.
  • AI agents: the Apify MCP server exposes this Actor as a tool; the input is plain text and short lists.

Pricing

Pay per result: $0.83 per 1,000 products on the Apify Free plan; on paid plans $0.83 (Starter), $0.75 (Scale) and $0.65 (Business and higher) (the price for your plan is shown on the Pricing tab). The examples below use the Free-plan price. A store or collection that can't be read (not a Shopify store, no products) is never charged, and the same store/collection is never charged twice in one run.

  • Watch 30 stores with 100 products each, weekly: 3,000 products/week → about $9.96/month.
  • Full export of a 5,000-product catalog → about $4.15.

Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached.

Limits and notes

  • Only public storefronts on the Shopify platform are supported. An entry that isn't a live Shopify store is reported in SUMMARY as an error, not silently skipped.
  • A collection URL (/collections/<handle>) scrapes only that collection; a bare domain scrapes the whole catalog.
  • Prices are in the store's own currency as published (the feed does not include a currency code); compare prices only between stores that price in the same currency.
  • Descriptions are cleaned to plain text. E-mail addresses and phone numbers a merchant left in a description are removed by default.
  • No customer, order or checkout data is collected — product data only.
  • Some large stores rate-limit their whole-catalog feed (/products.json, HTTP 429) for requests from cloud servers. The Actor then waits and retries, and if the limit holds it reads the same catalog from the store's public /collections/all feed (when robots.txt allows it), from the same IP and without any proxy. SUMMARY shows which feed each store was read from.
  • Each store's robots.txt is respected: if a store disallows automated access to its product feed, that store is skipped, reported in SUMMARY and not charged.

FAQ

Is it legal to scrape Shopify product listings? This Actor only reads the products.json feed every Shopify store publishes on purpose for its own storefront and third-party integrations. It checks each store's robots.txt first, doesn't log in, doesn't bypass any protection and doesn't collect personal or customer data. You are responsible for how you use the data; respect the store's terms if you republish listings.

Why did a store return 0 products? It may not be on Shopify, the domain may be wrong, the collection handle may not exist, or the store's robots.txt may disallow its product feed. Check SUMMARY for the exact error, or try the bare domain instead of a collection URL.

Can I limit the price range or only get in-stock items? Yes — set Minimum/maximum price and Only in-stock products in the input.

Can I use it from an AI agent? Yes, via the Apify MCP server or API. Pass stores as a list; results are the dataset items above.

Support

Open an issue on the Actor's Issues tab with the input you used and the run link — we reply within a few days.

Made by Glidepath. See the changelog for updates.