E-commerce Product Scraper for Any Online Store
Pricing
from $4.00 / 1,000 product reads
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
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:
| Works | Examples |
|---|---|
| Shopify (with or without JSON-LD in the theme) | The Sill, Brooklinen, Stumptown, Cotopaxi, Natori, Tentree, Cosmoparis, Burrow |
| WooCommerce | Nalgene |
| Salesforce Commerce Cloud stores that print JSON-LD | Christopher Ward |
| BigCommerce, Magento, PrestaShop, Shopware, Wix, Squarespace, Tiendanube, VTEX and custom stores | whenever 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
| Field | What it does |
|---|---|
| Store URLs | Whole stores, one per line (thesill.com). The Actor finds the product pages in the store's sitemap. |
| Product URLs | Single product pages from any store. |
| Max products per store | 100 by default, up to 5,000. Product pages you list yourself are always read. |
| Compare with the previous run | For schedules: each product gets changes against the last time it was read. |
| Only changes | With 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 name | Optional: a separate price history, for example one per client, or a new name to start over. |
| Variants / Description | Each 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"}
priceis the product's price, or the lowest one when variants differ (minPriceandmaxPricethen give the range).listPriceis the price before a sale (a strikethrough, list or compare-at price), only when it is higher thanprice.availabilityis one ofin_stock,limited_stock,out_of_stock,pre_order,back_order,made_to_order,in_store_only,discontinued,reservedornull(not published).inStockistruewhen any variant can be bought.gtinis only filled when its check digit is valid; some stores put other numbers in that field.dataSourcessays 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.txtfirst, for every store and every page: pages it disallows are not read, and aCrawl-delayis 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.xmlon Shopify,product-sitemap.xmlon 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.