WooCommerce Sale Price Scraper: Products & Stock avatar

WooCommerce Sale Price Scraper: Products & Stock

Pricing

from $0.64 / 1,000 products

Go to Apify Store
WooCommerce Sale Price Scraper: Products & Stock

WooCommerce Sale Price Scraper: Products & Stock

Regular and sale prices, on-sale flag, stock, SKUs, categories and ratings from any WooCommerce store's public Store API. On-sale and in-stock filters.

Pricing

from $0.64 / 1,000 products

Rating

0.0

(0)

Developer

MRSLM Data

MRSLM Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Get every public product, price, sale price, stock status, category and rating from any WooCommerce store as JSON/CSV. $0.80 per 1,000 products.

Uses each store's own public WooCommerce Store API, the same feed the shop's cart uses, so the data is exact and fast. No HTML guessing, no browser.

Quick start

  1. Press Start. The form is already filled with this example input, so the first run returns real rows in under a minute:
{
"stores": [
"porterandyork.com",
"www.nutribullet.com"
],
"maxProductsPerStore": 50
}
  1. Swap in your own values, or call the Actor through the Apify API, Make, Zapier, n8n or the Python/JS clients with the same JSON.
  2. Download the results as JSON, CSV or Excel from the Output tab, or schedule the run to repeat.

Full guide: How to Scrape Products from Any WooCommerce Store: Prices, Sales, Stock and Variations (No API Key)

What the WooCommerce Products Scraper does

You give the Actor one or more store domains. For each store it pages through the public Store API, newest products first, and saves one row per product with the store, product ID, name, link, SKU, type (simple or variable), price, regular price, sale price, price range for variable products, currency, on-sale flag, stock status, backorder flag, stock text, low-stock count, whether it can be bought, categories, tags, brands, attributes with their values, number of variations, average rating, review count, main image and all images, and the short description. The full description can be added too.

You can filter by keyword, category, on-sale products only or in-stock products only. These filters are applied by the store itself, so you only pay for the products you keep.

  • Any WooCommerce store with the public Store API, no login.
  • Regular price, sale price and stock on every row.
  • On-sale and in-stock filters for deal tracking.

Who it is for

  • Ecommerce brands: track competitors' prices, sales and stock.
  • Resellers and deal finders: pull every product on sale from the stores you follow.
  • Agencies and developers: audit or migrate a client's catalog.
  • Market researchers: compare product ranges and price points across stores.

Real example: newest products from a food shop and a blender brand

Say you want a quick look at what two WooCommerce stores have added most recently: Porter & York and nutribullet. You take the 12 newest products from each, without long descriptions.

Step 1: Enter the input

Open the WooCommerce Products Scraper in Apify Console, switch the input form to JSON and paste this. It is the exact input used for the run in this guide:

{
"stores": [
"porterandyork.com",
"www.nutribullet.com"
],
"maxProductsPerStore": 12
}

What each setting does:

  • stores: store domains, one per line. A full URL works too.
  • maxProductsPerStore: 12, the newest 12 from each store. 0 reads the whole catalog.

Step 2: Run it

Press Start. On 30 October 2026 this input finished with status SUCCEEDED in about 8 seconds and saved 24 rows to the run's dataset. The run was charged 24 product events plus one start event, so the bill was $0.0193 on the Free/Bronze tier. Both stores answered and gave 12 products each, 24 in total.

Step 3: Read the output

Here are the first rows of the real dataset, cut to the most useful columns:

storenametypepriceregularPriceonSaleinStock
porterandyork.comWashington Trust Bank Employee Giftvariable295295noyes
porterandyork.comOrganic Diestel Whole Turkey 12 – 14lbsimple115115nono
porterandyork.com31/40 Shrimp – 2LBsimple2424noyes
porterandyork.comBeef Fajita Meat – 2LBsimple1515noyes
porterandyork.comNatural Angus Ground Chuck – 2LBsimple2020noyes
porterandyork.comChicken Apple Links – 2 LBsimple1515noyes
porterandyork.comGround Chicken – 2LBsimple1010noyes
porterandyork.comItalian Sausage Linksvariable1515noyes
porterandyork.comGround Pork – 2LBsimple1010noyes
porterandyork.comValentines Day Gift Boxvariable125150yesno
porterandyork.comGift Cardssimple00noyes
porterandyork.comNatural Pork Tenderloinsimple1313noyes
nutribullet.comnutribullet Cold Press Juicer – Extended warrant…simple35.9935.99noyes
nutribullet.comnutribullet Cold Press Juicersimple149.99149.99noyes
nutribullet.comTurbo & Chill Bundlevariable224.99299.98yesyes
nutribullet.comnutribullet Personal Blender – Extended warrantysimple14.9914.99noyes
nutribullet.comnutribullet Personal Blendersimple59.9959.99noyes
nutribullet.comnutribullet Turbo Tumbler Edition – Extended war…simple19.9919.99noyes
nutribullet.comnutribullet CrispLite Vision – Extended warrantysimple34.9934.99noyes
nutribullet.comnutribullet CrispLite Visionsimple149.99149.99noyes
nutribullet.comnutribullet Flex Accessory Setvariable34.9934.99noyes
nutribullet.comnutribullet Chill™ Blade Block with Coversimple41.9941.99noyes
nutribullet.comnutribullet Chill™ Pint Cup Setsimple29.9929.99nono
nutribullet.comnutribullet Chill™ Pint Cup & Lidsimple16.9916.99noyes

And one full row as JSON (long text shortened with …):

{
"store": "porterandyork.com",
"productId": 68510,
"name": "Washington Trust Bank Employee Gift",
"url": "https://porterandyork.com/product/washington-trust-bank-employee-gift/",
"sku": "PYGB",
"type": "variable",
"price": 295,
"regularPrice": 295,
"salePrice": null,
"currency": "USD",
"onSale": false,
"inStock": true,
"onBackorder": false,
"stockText": null,
"purchasable": true,
"categories": [
"Beef"
],
"tags": [],
"attributes": [
{
"name": "Gift Box",
"values": [
"Beef Tenderloin",
"Beef Rib Roast",
"Steak Trio"
]
}
],
"variationCount": 1,
"averageRating": null,
"reviewCount": 0,
"imageUrl": "https://porterandyork.com/wp-content/uploads/AB2A18602.jpg"
}

What the 24 real products show:

  • Two sales. nutribullet's Turbo & Chill Bundle is $224.99, down from $299.98 (25% off), and Porter & York's Valentines Day Gift Box is $125, down from $150. The gift box has 9 sizes priced from $125 to $390, which the priceRangeMin and priceRangeMax fields show.
  • Three products are out of stock: Porter & York's Organic Diestel Whole Turkey (12–14 lb, $115) a few weeks before Thanksgiving, the Valentines Day Gift Box, and nutribullet's Chill Pint Cup Set ($29.99).
  • A third of nutribullet's newest products are warranties. 4 of its 12 newest products are extended warranties from $14.99 to $35.99, each tagged 4-Year and Upsell and listed in a Warranty category. Filter on categories to leave them out of a price comparison, or keep them to study how the brand sells add-ons.
  • Tags carry product specs. nutribullet uses tags for wattage and cup sizes (for example 1000 watts, 24oz, 32oz on the bundle), which makes them useful for filtering.
  • Porter & York sells everyday cuts. Most of its newest products cost $10 to $24, such as 2 lb packs of ground pork, ground chicken and shrimp, next to a $295 corporate gift box with 3 options.
  • No ratings on either store. All 24 products have no average rating and 0 reviews in WooCommerce. A store can still show reviews on its pages through a separate review app, but those are not part of the WooCommerce catalog.

The Gift Cards product shows a price of 0 because the buyer chooses one of its 6 amounts; check attributes for products like this.

How to tell if a store runs WooCommerce

Open https://<store>/wp-json/wc/store/v1/products in your browser. If you see a list of products in JSON, the Actor can read the store. If you get an error or a login page, the store has turned the Store API off or blocks automated access, and the Actor will report it in the run summary. Some stores behind Cloudflare only answer through a proxy; turn on proxyConfiguration for those.

For stores on Shopify, use our Shopify Products scraper. For one product page on any platform, use Product Page to JSON.

Output fields

Each row in the dataset has these fields. The example column shows a value from the run above.

FieldWhat it meansExample from this run
store / productId / urlStore domain, WooCommerce product ID and product link.porterandyork.com / 68510 / https://porterandyork.com/product/washington-trust-bank-empl…
name / sku / typeProduct name, SKU and type: simple, variable, grouped or external.Washington Trust Bank Employee Gift / PYGB / variable
price / regularPrice / salePrice / currencyCurrent, regular and sale price in the store currency.295 / 295 / 125 / USD
priceRangeMin / priceRangeMaxLowest and highest variation price, for variable products when the store gives a range.125 / 390
onSale / inStock / onBackorder / stockText / lowStockRemainingSale and stock status as the store publishes it.no / yes / no / Out of stock / (empty in this run)
purchasableWhether the product can be added to the cart.yes
categories / tags / brandsProduct taxonomy.Beef / Gift, meat, Cards … / [] (empty in every row)
attributes / variationCountOptions such as size or colour with their values, and the number of variations.{"name": "Gift Box", "values": ["Beef Tenderloin", "Beef Rib… / 1
averageRating / reviewCountWooCommerce's own product reviews.(empty in this run) / 0
imageUrl / imageUrlsMain image and all images.https://porterandyork.com/wp-content/uploads/AB2A18602.jpg / https://porterandyork.com/wp-content/uploads/AB2A18602.jpg,…
shortDescription / descriptionShort description (always) and the full description (with includeDescription).Your gift, your choice. Choose one of the preselected option… / (empty in this run)

Export WooCommerce products to CSV, Excel or Google Sheets

Every run saves its rows to a dataset, and a dataset can be downloaded in any common format. You do not need to write code for this.

From Apify Console. Open the run, go to the Output tab and click Export. Pick CSV, Excel (XLSX), JSON, XML, HTML or RSS. You can tick only the columns you want, for example store, name, sku, price, regularPrice. Nested values such as lists are flattened into columns like categories/0 in CSV and Excel.

From a URL. The same export is a plain HTTPS link. Replace <DATASET_ID> with the dataset ID shown on the run's Storage tab:

# CSV with just the columns you need
curl -H "Authorization: Bearer $APIFY_TOKEN" \
"https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=1&fields=store,name,sku,price,regularPrice,salePrice,onSale,inStock,url" -o woocommerce-products.csv
# Excel
curl -H "Authorization: Bearer $APIFY_TOKEN" \
"https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=xlsx&clean=1" -o woocommerce-products.xlsx

Into Google Sheets. You have three good options:

  1. One-off: download the CSV and use File > Import > Upload in Google Sheets. Choose "Replace current sheet" to refresh an existing tab.
  2. Automatic, no code: in Make, Zapier or n8n, use the Apify app's "Watch Actor runs" (or "Run Actor") trigger, then "Get dataset items", then the Google Sheets "Add row" action. Every scheduled run then lands in your sheet. Apify's own Google Sheets Import & Export Actor can also append a dataset to a sheet, and you can chain it to this Actor's runs with an integration.
  3. Formula: =IMPORTDATA("https://api.apify.com/v2/actor-tasks/<USERNAME>~<TASK_NAME>/runs/last/dataset/items?status=SUCCEEDED&format=csv&token=<YOUR_TOKEN>") always pulls the latest successful run of a saved task. The token sits in the formula, so anyone who can open the sheet can see it. Only use this in a private sheet.

Schedule it to run every day at 8 AM

A daily run gives you a price and stock snapshot for each store. To get only what changed between runs, use our Store Change Watcher, which compares runs for you and also covers Shopify.

  1. In the Actor's input form, set up the input from Step 1 and click Save as new task. Give it a clear name such as woo-prices-daily.
  2. Go to Schedules > Create new, set the cron expression to 0 8 * * * and pick your timezone, so it runs every day at 8 AM.
  3. Add the task to the schedule and save. Each run gets its own fresh dataset.
  4. Optional: on the task's Integrations tab, add a webhook, Slack or email notification for "Run succeeded", or connect Make, Zapier or n8n, so the new rows go where you need them.

To fetch the newest results without looking up a run ID, use the task's last-run link: https://api.apify.com/v2/actor-tasks/<USERNAME>~woo-prices-daily/runs/last/dataset/items?status=SUCCEEDED&format=json.

Call it from the API (Python, JavaScript or curl)

You can start the Actor from your own code with the official Apify clients. Put your API token (Console > Settings > API & Integrations) in an environment variable called APIFY_TOKEN rather than in the code.

Python (pip install "apify-client>=3"). Tested with apify-client 3.4:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"stores": [
"porterandyork.com",
"www.nutribullet.com"
],
"maxProductsPerStore": 12
}
run = client.actor("mrslm_data/woocommerce-products").call(run_input=run_input)
# apify-client 3.x returns a Run object, so use run.default_dataset_id
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item["name"], item["price"])

In apify-client 3.x, call() returns a typed object. Older examples that use run["defaultDatasetId"] were written for 1.x and 2.x and fail in 3.x with TypeError: 'Run' object is not subscriptable.

JavaScript / Node.js (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
"stores": [
"porterandyork.com",
"www.nutribullet.com"
],
"maxProductsPerStore": 12
};
const run = await client.actor('mrslm_data/woocommerce-products').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);

curl, one request that runs the Actor and returns the rows as CSV (it waits up to 5 minutes, so keep the input small):

curl -X POST "https://api.apify.com/v2/acts/mrslm_data~woocommerce-products/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"stores": ["porterandyork.com", "www.nutribullet.com"], "maxProductsPerStore": 12}' -o woocommerce-products.csv

What it costs

The Actor uses pay-per-event pricing. Product: $0.80 per 1,000 on the Free and Bronze tiers, $0.72 on Silver and $0.64 on Gold. Each run also has a start fee of $0.00005 per GB of memory (one event at the default memory). You are not billed separately for compute on normal runs: the event prices are the whole bill.

Price per event

Current pay-per-event prices for this Actor on Apify, by Apify subscription plan:

Event (per 1,000)Free / BronzeSilverGold / Platinum / Diamond
Product (product)$0.80$0.72$0.64
Actor start (once per run at the default memory, not per 1,000)$0.00005$0.00005$0.00005

You are charged only for the events in this table: nothing for compute, and nothing for searches that return no rows beyond the start fee.

ScenarioFree / BronzeSilverGold
The run in this guide (24 products)$0.0193$0.0173$0.0154
1 store of 500 products, weekly (4 runs)$1.60$1.44$1.28
5 stores of 1,000 products, daily (30 runs)$120.00$108.00$96.00
On-sale products only from 10 stores, daily (~300 a day, 30 runs)$7.20$6.48$5.76

To cap spending, set Maximum cost per run in the run options (or maxTotalChargeUsd in the API). The Actor stops cleanly at the cap and you are never billed past it. Use onSaleOnly, inStockOnly, search or category so the store only returns the products you need.

Limits

  • Only WooCommerce stores with the public Store API turned on.
  • One row per product. Variations are counted and their options listed, but each variation's own price and stock are not separate rows.
  • Stock counts are only shown when the store publishes them (low stock).
  • Ratings are WooCommerce's own reviews; review apps are not included.
  • Prices are what the store shows to a guest, before tax rules, coupons or customer-specific prices.

FAQ

Do I need the store's WooCommerce API keys? No. The Store API is public and needs no key. The Actor only reads what any visitor can see.

How do I get the whole catalog? Set maxProductsPerStore to 0.

Can I get only products on sale? Yes. Turn on onSaleOnly.

Why is a price 0? The product has a price the buyer chooses, such as a gift card. Check attributes.

Does it work on Shopify? No. Use Shopify Products for Shopify stores.

Can I run it on a schedule? Yes. Save your input as a task and attach a schedule, as shown above. Each run is independent and returns the WooCommerce products available at that moment.

Does it work with Make, Zapier or n8n? Yes. All three have an Apify app. Use "Run Actor" (or run a saved task), then "Get dataset items" to pass the rows to the next step, such as Google Sheets, Airtable, a CRM or Slack.

Can AI agents use it through MCP? Yes. Apify's hosted MCP server can expose this Actor as a tool to any MCP client (Claude Desktop, Cursor, VS Code and others). Add https://mcp.apify.com/?tools=mrslm_data/woocommerce-products as a remote MCP server and sign in with your Apify account or API token. The agent fills in the same input fields shown above and gets the same rows back, billed at the same per-event prices.

This Actor only reads pages and feeds that the website itself publishes to every visitor without a login. It obeys each site's robots.txt, keeps a polite request rate, and never tries to get past logins, paywalls, captchas or bot checks. It does not collect personal data such as emails, phone numbers or names of private individuals. You are responsible for how you use the data: follow the source site's terms, copyright and the privacy laws that apply to you (GDPR, CCPA, etc.). This tool is independent and not affiliated with or endorsed by the platforms it reads.