E-commerce Product Scraper & Price Monitor - Any Store avatar

E-commerce Product Scraper & Price Monitor - Any Store

Pricing

from $3.50 / 1,000 product returneds

Go to Apify Store
E-commerce Product Scraper & Price Monitor - Any Store

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

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

11 days ago

Last modified

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-checked event instead of a full product row.
  • You can see where every number came from. sources says, per column, json-ld, microdata, rdfa, opengraph or shopify-js. When two places in the page disagree on the price, priceCandidates lists 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, price is null and priceMin / priceMax give the range. If the page describes several products and none matches the page URL, none is chosen. Each case comes with a reason in warnings and note.
  • 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
}
FieldWhat it does
productUrlsProduct pages, up to 1,000 per run. For a product with variants, paste the URL of the variant you care about.
onlyChangesMonitor mode. First run: records the starting point, free, no product rows. Later runs: only changed products.
watchNameOptional. A separate memory per name (for example one per schedule).
resetMonitoringStateForget what this watch remembers and start again.
useShopifyJsOn Shopify stores also read /products/<handle>.js for per-variant price and stock (default on).
maxConcurrencyPages read at the same time, 1 to 8 (default 4).
requestTimeoutSecsSeconds 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-data or no-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 blocked and 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 currency column 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 (taxIncluded is 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.

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.