E-commerce Product Scraper for Any Online Store avatar

E-commerce Product Scraper for Any Online Store

Pricing

from $4.00 / 1,000 product reads

Go to Apify Store
E-commerce Product Scraper for Any Online Store

E-commerce Product Scraper for Any Online Store

Products from any online store: price, sale price, stock, variants, SKU, GTIN, rating, images. Give a store to read its whole catalog, or product pages. Schedule it to get price drops, stock changes, new and removed products. Shopify, WooCommerce and more.

Pricing

from $4.00 / 1,000 product reads

Rating

0.0

(0)

Developer

Bruno Petrelli

Bruno Petrelli

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

Share

Get the products of any online store: name, brand, SKU, GTIN, price, sale price and discount, currency, stock, every variant with its own price and stock, rating and reviews, images and description.

  • A whole catalog: give the store (thesill.com) and the Actor finds every product page in the store's sitemap.
  • Just some products: give product page URLs from any store.
  • Price monitoring: schedule it daily or weekly and each product says what changed since the last run: price drops and increases with the amount and percent, back in stock, sold out, new products, and products removed from the store.

It reads the product data that stores publish for Google and link previews: schema.org JSON-LD, microdata, Open Graph product tags, and the product object every Shopify page carries. No browser, so it is fast and cheap, and no guessing from the page layout: a value is either published by the store or null.

What it works on

Checked live on 2026-09-25 against 31 stores:

WorksExamples
Shopify (with or without JSON-LD in the theme)The Sill, Brooklinen, Stumptown, Cotopaxi, Natori, Tentree, Cosmoparis, Burrow
WooCommerceNalgene
Salesforce Commerce Cloud stores that print JSON-LDChristopher Ward
BigCommerce, Magento, PrestaShop, Shopware, Wix, Squarespace, Tiendanube, VTEX and custom storeswhenever the product page carries schema.org, Open Graph or microdata product data

What it does not do: big retailers that block automated visits (REI, Decathlon, LEGO, Newegg and others answered 403 in the test) and pages built only by JavaScript. The Actor does not try to get around a block: those pages are reported as blocked_by_site or no_product_data and cost nothing.

Input

FieldWhat it does
Store URLsWhole stores, one per line (thesill.com). The Actor finds the product pages in the store's sitemap.
Product URLsSingle product pages from any store.
Max products per store100 by default, up to 5,000. Product pages you list yourself are always read.
Compare with the previous runFor schedules: each product gets changes against the last time it was read.
Only changesWith monitoring on, unchanged products are not saved (they are still read and charged).
Minimum price change (%)Smaller price changes are not reported; the last reported price stays the reference, so small changes that add up are reported once the total passes it.
Memory nameOptional: a separate price history, for example one per client, or a new name to start over.
Variants / DescriptionEach size or color with its own price, SKU, GTIN and stock; the first 1,000 characters of the description. Both on by default.
{
"storeUrls": ["https://www.thesill.com", "brooklinen.com"],
"productUrls": ["https://www.cotopaxi.com/products/allpa-50l-duffel"],
"maxProductsPerStore": 500,
"compareWithPreviousRun": true,
"minPriceChangePercent": 5
}

Output

One row per product:

{
"type": "product",
"store": "thesill.com",
"url": "https://www.thesill.com/products/plant-mom-tote-bag",
"status": "ok",
"name": "Plant Mom Tote Bag",
"brand": "The Sill",
"sku": "AC-TBG-PM-NT",
"gtin": null,
"productId": "9400312081",
"category": "Accessory",
"price": 15,
"currency": "USD",
"listPrice": 19,
"onSale": true,
"discountPercent": 21.1,
"minPrice": null,
"maxPrice": null,
"availability": "out_of_stock",
"inStock": false,
"rating": 5,
"reviewCount": 1,
"variantCount": 1,
"variants": [
{ "id": "34400340561", "name": "Plant Mom Tote Bag", "sku": "AC-TBG-PM-NT", "gtin": null, "price": 15, "listPrice": 19,
"currency": "USD", "availability": "out_of_stock", "url": "https://www.thesill.com/products/plant-mom-tote-bag?variant=34400340561" }
],
"image": "https://www.thesill.com/cdn/shop/products/the-sill_plant-mom-tote_variant_01.jpg",
"platform": "shopify",
"dataSources": ["json-ld", "shopify", "open-graph"],
"checkedAt": "2026-09-25T20:32:33.842Z"
}
  • price is the product's price, or the lowest one when variants differ (minPrice and maxPrice then give the range).
  • listPrice is the price before a sale (a strikethrough, list or compare-at price), only when it is higher than price.
  • availability is one of in_stock, limited_stock, out_of_stock, pre_order, back_order, made_to_order, in_store_only, discontinued, reserved or null (not published). inStock is true when any variant can be bought.
  • gtin is only filled when its check digit is valid; some stores put other numbers in that field.
  • dataSources says where the data came from.

When you give a store, a summary row per store (type: "store") says how many product pages its sitemap lists, how many were read, and truncated: true when there were more than the limit.

Rows for pages you listed that could not be read are free and say why: blocked_by_robots, blocked_by_site (the store answered 401/403), not_found, no_product_data, error or invalid.

Price monitoring: only what changed

Turn on Compare with the previous run and schedule the Actor. Each product then has:

"changes": { "status": "changed", "price": { "from": 10, "to": 8, "change": -2, "percent": -20 }, "availability": null, "currency": null }

status is new (the first time this product is checked: when the whole store fits in the limit, a product added to the store), changed or unchanged. The store row adds changes with the counts of new products, price drops, price increases, products back in stock and sold out, and the products removed from the store since the last run. Removed products are only reported when the whole catalog was read, so a run cut by the limit never claims a product disappeared.

  • Only save products that changed keeps the dataset small for alerts: unchanged products are still checked, and charged, but not saved.
  • Minimum price change (%) ignores small moves. The last reported price stays the reference, so small changes that add up are reported once the total passes the threshold.
  • Give a Memory name to keep separate histories, for example one per client.
  • The first run has nothing to compare with (changes: null).
  • Some stores show prices in the visitor's currency. If a store switches currency, the change is reported as currency: { from, to } and the prices are not compared.

Pricing

Pay per event: one product event per product page read with product data. Store summary rows, pages without product data, blocked pages and errors are free. Set a maximum charge per run in Apify and the Actor stops there.

How it reads a store

  • It asks robots.txt first, for every store and every page: pages it disallows are not read, and a Crawl-delay is respected.
  • Pages are read at most 2 at a time per store, and 429 or 503 answers are retried after a pause.
  • Product pages come from the store's product sitemap (sitemap_products_1.xml on Shopify, product-sitemap.xml on WooCommerce, and others). Without one, the Actor tries the sitemap pages that are not blog posts, categories or other obvious non-product pages.

Use it on stores whose terms allow reading their public pages, such as your own store, stores that have given you permission, or public price information you are allowed to collect. The User-Agent names the Actor, so store owners can see it and allow or block it in their robots.txt.

FAQ

Can it read Amazon, Walmart or other marketplaces? No. They block automated visits and their terms forbid it.

Why is a price null? The store does not publish a price in its product data (for example, "price on request"). The Actor never guesses a price from the page layout.

Does it follow a category page? Give the store address instead: the sitemap lists every product, including ones not shown in any category.