WooCommerce Sale Price Scraper: Products & Stock
Pricing
from $0.64 / 1,000 products
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
Maintained by CommunityActor 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
- 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}
- 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.
- 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:
| store | name | type | price | regularPrice | onSale | inStock |
|---|---|---|---|---|---|---|
| porterandyork.com | Washington Trust Bank Employee Gift | variable | 295 | 295 | no | yes |
| porterandyork.com | Organic Diestel Whole Turkey 12 – 14lb | simple | 115 | 115 | no | no |
| porterandyork.com | 31/40 Shrimp – 2LB | simple | 24 | 24 | no | yes |
| porterandyork.com | Beef Fajita Meat – 2LB | simple | 15 | 15 | no | yes |
| porterandyork.com | Natural Angus Ground Chuck – 2LB | simple | 20 | 20 | no | yes |
| porterandyork.com | Chicken Apple Links – 2 LB | simple | 15 | 15 | no | yes |
| porterandyork.com | Ground Chicken – 2LB | simple | 10 | 10 | no | yes |
| porterandyork.com | Italian Sausage Links | variable | 15 | 15 | no | yes |
| porterandyork.com | Ground Pork – 2LB | simple | 10 | 10 | no | yes |
| porterandyork.com | Valentines Day Gift Box | variable | 125 | 150 | yes | no |
| porterandyork.com | Gift Cards | simple | 0 | 0 | no | yes |
| porterandyork.com | Natural Pork Tenderloin | simple | 13 | 13 | no | yes |
| nutribullet.com | nutribullet Cold Press Juicer – Extended warrant… | simple | 35.99 | 35.99 | no | yes |
| nutribullet.com | nutribullet Cold Press Juicer | simple | 149.99 | 149.99 | no | yes |
| nutribullet.com | Turbo & Chill Bundle | variable | 224.99 | 299.98 | yes | yes |
| nutribullet.com | nutribullet Personal Blender – Extended warranty | simple | 14.99 | 14.99 | no | yes |
| nutribullet.com | nutribullet Personal Blender | simple | 59.99 | 59.99 | no | yes |
| nutribullet.com | nutribullet Turbo Tumbler Edition – Extended war… | simple | 19.99 | 19.99 | no | yes |
| nutribullet.com | nutribullet CrispLite Vision – Extended warranty | simple | 34.99 | 34.99 | no | yes |
| nutribullet.com | nutribullet CrispLite Vision | simple | 149.99 | 149.99 | no | yes |
| nutribullet.com | nutribullet Flex Accessory Set | variable | 34.99 | 34.99 | no | yes |
| nutribullet.com | nutribullet Chill™ Blade Block with Cover | simple | 41.99 | 41.99 | no | yes |
| nutribullet.com | nutribullet Chill™ Pint Cup Set | simple | 29.99 | 29.99 | no | no |
| nutribullet.com | nutribullet Chill™ Pint Cup & Lid | simple | 16.99 | 16.99 | no | yes |
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
priceRangeMinandpriceRangeMaxfields 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-YearandUpselland listed in a Warranty category. Filter oncategoriesto 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,32ozon 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.
| Field | What it means | Example from this run |
|---|---|---|
store / productId / url | Store domain, WooCommerce product ID and product link. | porterandyork.com / 68510 / https://porterandyork.com/product/washington-trust-bank-empl… |
name / sku / type | Product name, SKU and type: simple, variable, grouped or external. | Washington Trust Bank Employee Gift / PYGB / variable |
price / regularPrice / salePrice / currency | Current, regular and sale price in the store currency. | 295 / 295 / 125 / USD |
priceRangeMin / priceRangeMax | Lowest and highest variation price, for variable products when the store gives a range. | 125 / 390 |
onSale / inStock / onBackorder / stockText / lowStockRemaining | Sale and stock status as the store publishes it. | no / yes / no / Out of stock / (empty in this run) |
purchasable | Whether the product can be added to the cart. | yes |
categories / tags / brands | Product taxonomy. | Beef / Gift, meat, Cards … / [] (empty in every row) |
attributes / variationCount | Options such as size or colour with their values, and the number of variations. | {"name": "Gift Box", "values": ["Beef Tenderloin", "Beef Rib… / 1 |
averageRating / reviewCount | WooCommerce's own product reviews. | (empty in this run) / 0 |
imageUrl / imageUrls | Main image and all images. | https://porterandyork.com/wp-content/uploads/AB2A18602.jpg / https://porterandyork.com/wp-content/uploads/AB2A18602.jpg,… |
shortDescription / description | Short 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 needcurl -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# Excelcurl -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:
- One-off: download the CSV and use File > Import > Upload in Google Sheets. Choose "Replace current sheet" to refresh an existing tab.
- 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.
- 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.
- 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. - Go to Schedules > Create new, set the cron expression to
0 8 * * *and pick your timezone, so it runs every day at 8 AM. - Add the task to the schedule and save. Each run gets its own fresh dataset.
- 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 osfrom apify_client import ApifyClientclient = 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_idfor 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 / Bronze | Silver | Gold / 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.
| Scenario | Free / Bronze | Silver | Gold |
|---|---|---|---|
| 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.
Is it legal?
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.