WooCommerce Product Scraper
Pricing
from $4.00 / 1,000 product returneds
WooCommerce Product Scraper
Scrape public WooCommerce product catalogs for price, stock, rating, and category monitoring. Use for competitor or supplier research, not private data. Returns normalized product rows with price, availability, reviews, and source provenance. $0.004/product plus a $0.00005 start fee; usage extra.
Pricing
from $4.00 / 1,000 product returneds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
WooCommerce Product Scraper is an Apify Actor for public WooCommerce catalogs. It accepts one or more store URLs and returns one normalized product record per dataset item. Each row can include product ID, title, canonical product URL, store URL and domain, source endpoint, price fields, sale status, stock status, review counts, categories, tags, attributes, variation count, image URLs, and scrape timestamp.
Use it for public competitor or supplier catalog research where published product data is the source of truth. The Actor works through the Apify platform and can also be invoked through Apify MCP for agent workflows that need structured WooCommerce catalog rows from known store URLs.
Best fit and connected workflows
This Actor fits workflows that start from a public WooCommerce storefront and end with normalized product data ready for analysis.
Good routing patterns include:
- catalog monitoring for price, stock, and rating changes across known stores
- supplier assortment review from public product pages and store categories
- product discovery by text search, category IDs, sale status, featured status, or stock status
- agent pipelines that need a compact dataset row rather than raw HTML
Because this Actor returns one validated product row per dataset item, it works well when downstream steps expect predictable fields and provenance through sourceEndpoint.
Practical scenario
Maya manages a merchandising dashboard and starts with two public store URLs plus a search phrase for a product family. She runs the Actor with maxProducts set to 50 and stockStatuses set to instock. The returned rows include title, price, stockStatus, averageRating, reviewCount, and productUrl. Maya uses the stock and review fields to shortlist products for a weekly assortment review, then opens the productUrl links for manual comparison.
Input
The Actor accepts up to 100 public WooCommerce store URLs. It uses the public Store API and extracts published product data only.
Input fields
| Field | Type | Purpose |
|---|---|---|
storeUrls | array of strings | Public WooCommerce store URLs, including a homepage or a store in a subdirectory |
maxProducts | integer | One run-wide product cap across all stores, from 1 to 10,000 |
search | string | Public Store API search phrase for products |
categoryIds | array of integers | Public WooCommerce category IDs to narrow the result set |
stockStatuses | array of strings | Filter by instock, outofstock, or onbackorder |
onSale | boolean | Filter to products marked on sale by the public Store API |
featured | boolean | Filter to products marked as featured |
sortBy | string | Sort field: date, price, popularity, or rating |
sortOrder | string | Sort direction: asc or desc |
proxyConfiguration | object | Optional Apify Proxy configuration for public Store API access |
Focused JSON input example
{"storeUrls": ["https://porterandyork.com","https://example.com/shop"],"maxProducts": 100,"search": "organic coffee","categoryIds": [12, 27],"stockStatuses": ["instock"],"onSale": true,"featured": false,"sortBy": "price","sortOrder": "asc","proxyConfiguration": {"useApifyProxy": false}}
Output
The Actor writes one validated public WooCommerce product per dataset row. The default key-value store also contains OUTPUT and RUN_SUMMARY records for terminal outcome, counts, warnings, and charge details.
Output fields
| Field | Type | Purpose |
|---|---|---|
productId | string | Stable WooCommerce product ID |
title | string | Published product name |
slug | string or null | Store-provided product slug, when present |
productUrl | string | Canonical public product URL |
storeUrl | string | Normalized store URL supplied to the Actor |
storeDomain | string | Store hostname without the www prefix |
sourceEndpoint | string | Public WooCommerce Store API endpoint used as provenance |
sku | string or null | Public SKU, when available |
productType | string or null | WooCommerce product type |
description | string or null | Plain-text product description |
shortDescription | string or null | Plain-text short description |
currency | string or null | ISO 4217 currency code |
currencyMinorUnit | integer or null | Number of fractional digits used in price normalization |
price | number or null | Current public price |
regularPrice | number or null | Regular public price |
salePrice | number or null | Sale public price |
onSale | boolean | Whether the product is marked on sale |
purchasable | boolean | Whether the product is purchasable |
inStock | boolean | Whether the product is marked in stock |
onBackorder | boolean | Whether the product is marked available on backorder |
stockStatus | string | Normalized stock state |
lowStockRemaining | integer or null | Public low-stock quantity, when exposed |
averageRating | number or null | Published average rating |
reviewCount | integer | Published customer review count |
catalogVisibility | string or null | Store API visibility state |
isPasswordProtected | boolean | Whether the product is password protected |
categories | array of strings | Public category names |
tags | array of strings | Public product tag names |
attributes | array of objects | Public attribute dimensions and values |
variationsCount | integer | Number of variation IDs returned |
imageUrl | string or null | Primary product image URL |
imageUrls | array of strings | Up to ten public product image URLs |
scrapedAt | string | UTC timestamp for normalization |
Illustrative output record
{"productId": "42","title": "Organic Espresso Blend","slug": "organic-espresso-blend","productUrl": "https://example.com/product/organic-espresso-blend/","storeUrl": "https://example.com","storeDomain": "example.com","sourceEndpoint": "https://example.com/wp-json/wc/store/v1/products?page=1&per_page=100","sku": "ESP-500","productType": "simple","description": "A balanced medium-roast espresso blend.","shortDescription": "Whole-bean espresso coffee.","currency": "USD","currencyMinorUnit": 2,"price": 19.99,"regularPrice": 24.99,"salePrice": 19.99,"onSale": true,"purchasable": true,"inStock": true,"onBackorder": false,"stockStatus": "instock","lowStockRemaining": 3,"averageRating": 4.75,"reviewCount": 12,"catalogVisibility": "visible","isPasswordProtected": false,"categories": ["Coffee"],"tags": ["Organic"],"attributes": [{"name": "Grind","values": ["Whole bean", "Ground"]}],"variationsCount": 2,"imageUrl": "https://cdn.example.com/product.jpg","imageUrls": ["https://cdn.example.com/product.jpg"],"scrapedAt": "2026-07-14T12:00:00.000Z"}
How it works
For each store URL, the Actor requests the public WooCommerce Store API and normalizes the published product data into validated dataset rows. It applies the supported filters before pagination, follows the Store API pagination flow, and writes each validated product row together with source provenance.
The implementation uses direct HTTP requests by default. Apify Proxy can be enabled when a public Store API needs a proxy path. The Actor also writes outcome records to the default key-value store:
OUTPUTfor compact terminal outcome and product-count contractRUN_SUMMARYfor per-store diagnostics and charge summary
Pricing
This Actor uses Pay per event pricing plus Apify platform usage. The live Pricing tab on the Actor page is the place to review the current event charges and platform usage details.
The charged events are:
- Actor start
- Product returned
For example, a run that returns one hundred products includes one Actor start event and one hundred Product returned events, and the billed total also includes Apify platform usage. The exact amount is shown in the live Pricing tab and in the run cost breakdown.
Use with AI agents (MCP)
This Actor is available as an Apify Actor usable through Apify MCP. It is a structured tool for agent workflows that need public WooCommerce catalog rows, provenance, and predictable product fields.
Actor identity: khadinakbar/woocommerce-product-scraper
Pull the public WooCommerce catalog for
https://porterandyork.com, keep the result set to 25 products, return only items in stock, and summarize the returned price, rating, review count, and source endpoint for each product.
How to interpret the output:
- each dataset item represents one validated public product row
sourceEndpointshows the public Store API endpoint used as provenanceproductUrlpoints to the canonical public product pagestockStatus,price,regularPrice,averageRating, andreviewCountare ready for downstream sorting or comparison- pagination follows the Store API flow until the run reaches
maxProducts - billing tracks the Actor start event and each Product returned event, plus Apify platform usage
Apify API example
import { ApifyClient } from "apify-client";const client = new ApifyClient({token: process.env.APIFY_TOKEN,});const input = {storeUrls: ["https://porterandyork.com"],maxProducts: 10,search: "coffee",stockStatuses: ["instock"],sortBy: "price",sortOrder: "asc",proxyConfiguration: { useApifyProxy: false },};const run = await client.actor("khadinakbar/woocommerce-product-scraper").call(input);const dataset = await client.dataset(run.defaultDatasetId).listItems({ clean: true });console.log(dataset.items);
Set APIFY_TOKEN in your environment before running the example. The readback uses the run's default dataset, which contains the normalized product rows.
Best results and outcome guidance
Use a focused set of store URLs and filters that match the research question. maxProducts applies as one run-wide cap across all requested stores, so it works well for bounded catalog checks. search is useful for product families, while categoryIds, stockStatuses, onSale, and featured narrow the result set in different ways. If a store exposes the public Store API through a subdirectory, include that subdirectory in the store URL. For agent workflows, read OUTPUT first when you need the terminal run state, then inspect the dataset rows for product-level analysis.
Design note
I found that maxProducts is a single hard cap across every requested store, and it stops billing and pagination after that many validated product rows.
Focused standalone workflow
This Actor is designed as a focused standalone workflow.
FAQ
When should I use storeUrls versus search?
Use storeUrls to identify the public WooCommerce store sources, then use search when you want product rows matching a text phrase within those stores.
How do I narrow results to a category?
Provide public WooCommerce category IDs in categoryIds. The IDs are store-specific and come from the public Store API or product data.
How does this Actor handle stock-related workflows?
Use stockStatuses to return instock, outofstock, or onbackorder products. The dataset rows also include inStock, onBackorder, and stockStatus.
Can this Actor be used for store comparison through Apify MCP?
Yes. It is an Apify Actor usable through Apify MCP, and it is well suited to agent workflows that compare public product rows from known WooCommerce stores.
Where should I look for terminal run status?
Check the OUTPUT record for the compact result state and the RUN_SUMMARY record for per-store diagnostics and charge details.
Responsible use
This Actor collects publicly accessible WooCommerce product catalog data. Use it in line with each target store's terms, applicable law, copyright and database rights, privacy obligations, and internal policies. It is intended for public catalog research and monitoring rather than private, authenticated, or personal data access.