E-commerce Product Scraper & Price Monitor - Any Store
Pricing
from $3.50 / 1,000 product returneds
E-commerce Product Scraper & Price Monitor - Any Store
Paste product page URLs from any online store and get price, currency, stock, sale price, rating, SKU/GTIN and brand, read from the structured data in the page, with the source of every value. Monitor mode returns only products whose price or stock changed. Unreadable pages are free.
Pricing
from $3.50 / 1,000 product returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
11 days ago
Last modified
Categories
Share
E-commerce Product Scraper & Price Monitor
Paste product page URLs from any online store and get one row per product: name, brand, SKU / GTIN / MPN, price, currency, stock status, original (pre-sale) price, rating and review count, one image URL, seller, and where each value was read from. Turn on monitor mode and later runs return only the products whose price, stock or review count changed, with the previous values next to the new ones.
It reads the structured data that stores put in their HTML for search engines: JSON-LD Product / Offer / AggregateOffer, microdata, RDFa, OpenGraph product:price tags, and on Shopify stores the product file /products/<handle>.js. It does not guess prices from visible text.
Why this one
- Only what changed. A daily price watch over 500 products usually has a handful of changes. Monitor mode returns those rows only; an unchanged product costs one small
product-checkedevent instead of a full product row. - You can see where every number came from.
sourcessays, per column,json-ld,microdata,rdfa,opengraphorshopify-js. When two places in the page disagree on the price,priceCandidateslists both. - No wrong price is better than a wrong price. If the variants have different prices and the URL does not say which one is selected,
priceisnullandpriceMin/priceMaxgive the range. If the page describes several products and none matches the page URL, none is chosen. Each case comes with a reason inwarningsandnote. - Pages without a readable price are free. Blocked pages, pages that robots.txt does not allow, pages with no product data and products with no readable price come back as free rows that say why.
Input
{"productUrls": ["https://www.sonos.com/en-us/shop/era-100","https://www.deathwishcoffee.com/products/white-chocolate-pistachio-coffee?variant=42446944174135"],"onlyChanges": false}
| Field | What it does |
|---|---|
productUrls | Product pages, up to 1,000 per run. For a product with variants, paste the URL of the variant you care about. |
onlyChanges | Monitor mode. First run: records the starting point, free, no product rows. Later runs: only changed products. |
watchName | Optional. A separate memory per name (for example one per schedule). |
resetMonitoringState | Forget what this watch remembers and start again. |
useShopifyJs | On Shopify stores also read /products/<handle>.js for per-variant price and stock (default on). |
maxConcurrency | Pages read at the same time, 1 to 8 (default 4). |
requestTimeoutSecs | Seconds to wait for one page, 5 to 60 (default 20). |
Output
{"status": "ok","url": "https://www.example-store.com/products/trail-shoe?variant=4411","name": "Trail Shoe","brand": "Example","sku": "TS-42-BLK","gtin": "4006381333931","price": 89.0,"currency": "USD","priceType": "selected-variant","priceMin": 89.0,"priceMax": 99.0,"originalPrice": 120.0,"availability": "InStock","inStock": true,"variantCount": 6,"variantsInStock": 4,"ratingValue": 4.6,"reviewCount": 312,"imageUrl": "https://www.example-store.com/img/trail-shoe.jpg","matchedBy": "url","sources": { "name": "json-ld", "price": "shopify-js", "availability": "shopify-js", "currency": "json-ld", "reviewCount": "json-ld" },"changeType": "price-drop","previousPrice": 99.0,"previousAvailability": "InStock","previousCheckedAt": "2026-10-04T06:00:11.000Z","warnings": null,"note": null}
changeType is one of price-drop, price-increase, price-range-changed, back-in-stock, out-of-stock, availability-changed, review-count-changed (all of them in changeTypes).
Free rows have a status that says why: no-price, no-product-data, blocked, robots-disallowed, robots-unreachable, login-required, not-found, not-html, unreachable, unreadable, bad-input, budget-reached, and in monitor mode baseline-recorded and no-change.
What it cannot do (please read)
- Pages that fill in the price with JavaScript cannot be read. This Actor reads the HTML the server sends and does not run a browser. Such pages come back as
no-product-dataorno-price, free. - It does not go past sign-in pages, check pages (CAPTCHA) or refusals. It identifies itself honestly, follows each site's robots.txt, and does not switch to proxies to get around a 403. Several large marketplaces refuse it; those rows are
blockedand free. - The currency and price can depend on the country of the connection. Runs come from Apify's servers (usually in the United States), so a store that localises prices shows the price it shows to that country. The
currencycolumn says which currency was read. If the currency of a product changes between two monitor runs, it is not reported as a price change; the starting point is recorded again. - The price is the one in the page's data, as the store published it. Tax-inclusive or exclusive follows the store (
taxIncludedis filled only when the page says so). A store can leave an old price in its data for a product it no longer sells. - A product with several variant prices has no single price unless the URL selects a variant; you get the range.
- Review count and rating are the store's own figures from the page data.
How it was checked
On 2026-10-05, 42 real product pages (Shopify stores, WooCommerce stores, large retailers, brand stores, non-English stores) were read with this Actor's reader and each price that was read was compared by eye with the price a browser shows: 24 pages gave a price; of the 23 that could be compared, 22 matched (including one honest range and one page where the browser showed another currency for another country). The one that did not match was a discontinued product whose page no longer shows a price while its data still carries one. 18 pages gave no price (refused, no product data in the HTML, or page not found) and were free rows.
Pricing
product-returned: one event per product row with a readable price.product-checked: one small event per product that was compared in monitor mode and had no change.- No start fee. The first monitor run (starting point) is free. Rows without a readable price are free.
Related
- Shopify Products & Price Monitor: a whole Shopify store's catalogue with price changes, from a store domain instead of product URLs.
- Embedded Page Data Extractor: every JSON block a page ships in its HTML, for pages this Actor has no product schema for.
Thanks for using this Actor
We build these tools for people who run them every day, and we improve them from what users tell us.
- Missing a field, or need another filter? Tell us in the Issues tab. If the data is there, we add it.
- Found a bug or a wrong value? Post the run ID in the Issues tab. Wrong data is the thing we fix first.
If this Actor saved you time, a short review helps other people find it.