WooCommerce Products Scraper & Price Tracker avatar

WooCommerce Products Scraper & Price Tracker

Pricing

$1.00 / 1,000 product scrapeds

Go to Apify Store
WooCommerce Products Scraper & Price Tracker

WooCommerce Products Scraper & Price Tracker

Scrape every product from any WooCommerce store through its public Store API: prices, sale prices, stock, SKUs, categories, tags, attributes, ratings and images. Schedule it to track price drops, price increases, restocks, sell-outs, new and removed products. Pay only per product.

Pricing

$1.00 / 1,000 product scrapeds

Rating

0.0

(0)

Developer

JT Palms

JT Palms

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Share

WooCommerce Products Scraper & Price Tracker: scrape any WooCommerce store, then track its price changes

Give it a list of WooCommerce stores and get every product back: title, type, SKU, price, regular and sale price, discount, price range, stock status, low-stock count, categories, tags, brands, attributes, variation IDs, rating, review count, images and description. Turn on change tracking, schedule it daily, and each run tells you which products dropped in price, went up, came back in stock, sold out, are new, or were removed.

USD 1 per 1,000 products. Stores that are not WooCommerce, unreachable or blocked are reported free. Removed-product alerts are free.

What people use it for

  • Competitor price monitoring. Schedule a daily run over your competitors' WooCommerce stores with Only output changes on. You get a short list of price drops, price increases, restocks, sell-outs and new launches, and pay only for those rows.
  • Catalog research. See a store's full range, price points, discount depth (regular vs sale price), categories, best-rated products and stock gaps before you pick a niche, a supplier or a wholesale partner.
  • Product feeds. Pull a clean product feed (SKU, price, stock, categories, images, permalink) from your own store or a partner's for Google Sheets, a comparison site, a marketplace listing or an affiliate catalog.
  • Sale and stock watching. Use the On sale only or Stock status filters to track just a store's discounted or out-of-stock products, and pay only for those.

Change tracking (the main reason to schedule it)

With Track changes between runs on, every row gets a change field that compares it with the previous run:

changeMeaning
newNot seen in the previous run (a new launch, or the first run for this store)
price_dropLowest price went down (or, if equal, the highest price went down)
price_increaseLowest price went up (or, if equal, the highest price went up)
back_in_stockWas out of stock, now in stock
sold_outWas in stock, now out of stock
unchangedSame price range and same stock status
removedWas in the previous run, no longer listed (deleted, unpublished, hidden, or no longer matching your filters). Free.

previousPriceMin and previousPriceMax hold the earlier prices, and changes lists every label that applies when more than one does (for example ["price_drop", "back_in_stock"]). A product that got cheaper looks like this (other fields left out):

{ "title": "Insulated Flask 16oz", "priceMin": 34.95, "previousPriceMin": 44.95, "currency": "AUD", "change": "price_drop", "changes": ["price_drop"] }

Only output changes skips the unchanged rows, so you pay only for products that actually changed.

Schedule tip. Save your store list as a task with Track changes and Only output changes on, then add a schedule (for example daily at 06:00). The first run sets the baseline and marks every product new; from the second run on you get only real changes. Add an integration (email, Slack, Google Sheets, Make, Zapier or a webhook) on "run succeeded" to receive each day's changes automatically.

How it works: after each run the actor keeps a small snapshot per store (product ID, title, URL, price range, currency, in stock) in a key-value store named woocommerce-price-tracker in your account. Each store gets one record, and each store plus filter combination (category, tag, search, on sale, stock status) gets its own. Named stores do not expire, so the history survives between runs. Good to know:

  • Snapshots are shared by every run in your account that tracks the same store and filters. An extra manual run with tracking on moves the baseline forward.
  • removed is only reported when the whole catalog (or the whole filtered list) was read. Runs limited by Max products per store, stopped by your cost limit, or cut short by an error do not report removals, and they keep the older snapshot entries for products they did not reach.
  • Some stores convert prices to the visitor's currency based on location. If a product comes back in a different currency than last run, its price is not compared (so you never get a fake price drop), and the run log explains why. Pick a proxy country under Advanced to keep one currency.
  • To start over for a store, delete its record from the woocommerce-price-tracker store under Storage.

Sample output

One row per product (from a real run on nalgene.com with tracking on; arrays and text shortened):

{
"store": "nalgene.com",
"productId": 959,
"title": "24oz Neoprene Sleeve",
"slug": "24oz-sleeve-gray",
"type": "variable",
"sku": "Z0119",
"url": "https://nalgene.com/product/24oz-sleeve-gray/",
"price": 5,
"regularPrice": 13.99,
"salePrice": 5,
"priceMin": 5,
"priceMax": 5,
"currency": "USD",
"onSale": true,
"discountPercent": 64,
"inStock": true,
"purchasable": true,
"onBackorder": false,
"lowStockRemaining": null,
"stockText": "In stock",
"categories": ["Accessories", "Sleeves", "Today's Sales"],
"categorySlugs": ["accessories", "sleeves", "sales"],
"tags": ["Sale"],
"brands": [],
"attributes": [
{ "name": "Bottle Color", "options": ["Cerulean", "Electric Magenta", "Gray"], "usedForVariations": true },
{ "name": "Weight", "options": ["4.8 oz (136g)"], "usedForVariations": false }
],
"variationCount": 2,
"variations": [
{ "id": 653154, "attributes": { "Bottle Color": "Cerulean" } },
{ "id": 653147, "attributes": { "Bottle Color": "Electric Magenta" } }
],
"averageRating": 4,
"reviewCount": 1,
"images": ["https://nalgene.com/wp-content/uploads/2022/10/24oz-neoprene-RED_Front.jpg"],
"shortDescription": "Keep your 24oz OTF bottle dry with a neoprene sleeve.",
"description": "... Fits snugly around the 24oz OTF bottle , keeps your refreshment at a refreshing temperature longer. This product is imported.",
"scrapedAt": "2026-09-28T18:42:52.933Z",
"change": "new",
"changes": ["new"],
"previousPriceMin": null,
"previousPriceMax": null,
"previousCurrency": null
}

Field notes:

  • Prices are normal numbers in the store's currency (the Store API sends them in cents or the currency's smallest unit; the actor converts them, including zero-decimal and three-decimal currencies).
  • price is the current price. For a product with several prices (a variable product), priceMin and priceMax are the range the storefront shows and price is its lowest ("from") price. regularPrice is the price before any sale, salePrice is set only while the product is on sale, and discountPercent compares the two.
  • lowStockRemaining is filled only when the store shows a low-stock count such as "Only 3 left in stock".
  • variations lists each variation's ID and options. The Store API product list does not include per-variation prices or stock, so the price range covers them.

A store that could not be read comes back as one free row with an error, for example "Not a WooCommerce store: no Store API found (HTTP 404, not JSON).", "Not a WooCommerce store, or its Store API is turned off: the site runs WordPress but has no /wc/store route (rest_no_route). ...", "Store blocked the request with a bot check (HTTP 403). Try again with a proxy under Advanced." or "Domain not found (DNS lookup failed). Check the spelling."

Export as JSON, CSV or Excel, or read the results through the Apify API. The dataset has three table views: Products, Changes, and Stock and sales.

How to use it

  1. Put your stores in WooCommerce stores, one per line. Bare domains (lunchconcept.com) and full URLs both work. A category page URL such as https://store.com/product-category/sale/ reads only that category, and a tag page URL such as https://store.com/product-tag/summer/ only that tag.
  2. Optional: set Max products per store for a quick sample, or use the filters (Category, Tag, Search text, On sale only, Stock status). Filters run on the store's side, so you pay only for matching products. Category and tag take the slug from the store's URL or the numeric ID; the categorySlugs field in the results shows the slugs.
  3. Optional: turn on Track changes between runs and Only output changes, then schedule the actor (see the tip above).
  4. Click Start, then download the results or connect them to your tools.

Pricing

WhatPrice
Product rowUSD 0.001 (USD 1 per 1,000)
Unchanged product skipped by Only output changesFree
removed rowFree
Store that is not WooCommerce, unreachable, blocked or has the Store API turned offFree

Examples: a full read of a 2,000-product store costs USD 2. Tracking 5 stores of 2,000 products each with Only output changes costs USD 10 for the first (baseline) run; after that you pay per changed product, so a day on which 200 products change costs USD 0.20.

Set a maximum cost per run in the run options and the actor stops cleanly when it reaches it; everything saved before that is kept.

Limits

  • It reads the public WooCommerce Store API (/wp-json/wc/store/v1/products), which ships with WooCommerce itself (version 5 and later) and powers the store's own block-based product grids, cart and checkout. It also tries the older /wp-json/wc/store/products route and the ?rest_route= form for sites without pretty URLs.
  • The Store API must be reachable. Some stores turn it off, close the WordPress REST API to visitors, or put it behind a bot check (such as a Cloudflare challenge). Those are reported free with a clear error. The actor also tries the www. or bare host before giving up; a proxy under Advanced often gets past a data-center block.
  • Only published products appear. Drafts and private products do not.
  • Stock is in stock, out of stock or on backorder. Exact inventory counts are not public; lowStockRemaining appears only when the store itself shows a low-stock count.
  • Prices are what a visitor sees: they may include tax depending on the store's settings, and stores with a currency switcher may convert them to the visitor's currency based on location (see the note under change tracking).
  • Category and tag page URLs are recognized with WooCommerce's default product-category and product-tag bases. If a store renamed them, put the slug in the Category or Tag field instead.
  • Descriptions are plain text capped at 2,000 characters (short descriptions at 500), and up to 10 images are listed per product.
  • Pages of 100 products are read one at a time per store with a short pause between them, and rate limits (HTTP 429) and server errors are retried up to 3 times. A 500-product store takes about 10 to 20 seconds; very large catalogs (10,000+ products) take a few minutes each.

FAQ

Is it legal? It reads the Store API, a public endpoint that every WooCommerce store serves to its own storefront so shoppers' browsers can load products, the same product data shown on the store's pages. It does not log in, bypass protections, or collect personal data. As with any data, check how you use it against the store's terms and your local rules.

Do I need a WooCommerce API key or store access? No. The Store API needs no keys, apps or login. (It is not the admin REST API at /wc/v3, which does need keys.)

How do I know which sites run WooCommerce? Just add them. Sites that are not WooCommerce come back free with an error. To filter a big list first, run it through a tech stack detector.

Why do I see a different price in my browser? The store may show prices with or without tax depending on your location or login, or convert them to your local currency. This actor reports what an anonymous visitor from the proxy's location sees, with the currency on every row.

Why are there no prices per variation? The Store API's product list gives each variation's ID and options but not its own price or stock. The row's priceMin and priceMax cover the range across all variations, and change tracks that range.

Can I get an alert when a competitor drops a price? Yes. Schedule a task with Only output changes on and add an email, Slack or webhook integration. Each run then sends only the changed products.

Something looks wrong for a store? Open an issue with the store domain.