WooCommerce Product Scraper avatar

WooCommerce Product Scraper

Pricing

from $4.00 / 1,000 product returneds

Go to Apify Store
WooCommerce Product Scraper

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

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

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

FieldTypePurpose
storeUrlsarray of stringsPublic WooCommerce store URLs, including a homepage or a store in a subdirectory
maxProductsintegerOne run-wide product cap across all stores, from 1 to 10,000
searchstringPublic Store API search phrase for products
categoryIdsarray of integersPublic WooCommerce category IDs to narrow the result set
stockStatusesarray of stringsFilter by instock, outofstock, or onbackorder
onSalebooleanFilter to products marked on sale by the public Store API
featuredbooleanFilter to products marked as featured
sortBystringSort field: date, price, popularity, or rating
sortOrderstringSort direction: asc or desc
proxyConfigurationobjectOptional 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

FieldTypePurpose
productIdstringStable WooCommerce product ID
titlestringPublished product name
slugstring or nullStore-provided product slug, when present
productUrlstringCanonical public product URL
storeUrlstringNormalized store URL supplied to the Actor
storeDomainstringStore hostname without the www prefix
sourceEndpointstringPublic WooCommerce Store API endpoint used as provenance
skustring or nullPublic SKU, when available
productTypestring or nullWooCommerce product type
descriptionstring or nullPlain-text product description
shortDescriptionstring or nullPlain-text short description
currencystring or nullISO 4217 currency code
currencyMinorUnitinteger or nullNumber of fractional digits used in price normalization
pricenumber or nullCurrent public price
regularPricenumber or nullRegular public price
salePricenumber or nullSale public price
onSalebooleanWhether the product is marked on sale
purchasablebooleanWhether the product is purchasable
inStockbooleanWhether the product is marked in stock
onBackorderbooleanWhether the product is marked available on backorder
stockStatusstringNormalized stock state
lowStockRemaininginteger or nullPublic low-stock quantity, when exposed
averageRatingnumber or nullPublished average rating
reviewCountintegerPublished customer review count
catalogVisibilitystring or nullStore API visibility state
isPasswordProtectedbooleanWhether the product is password protected
categoriesarray of stringsPublic category names
tagsarray of stringsPublic product tag names
attributesarray of objectsPublic attribute dimensions and values
variationsCountintegerNumber of variation IDs returned
imageUrlstring or nullPrimary product image URL
imageUrlsarray of stringsUp to ten public product image URLs
scrapedAtstringUTC 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:

  • OUTPUT for compact terminal outcome and product-count contract
  • RUN_SUMMARY for 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
  • sourceEndpoint shows the public Store API endpoint used as provenance
  • productUrl points to the canonical public product page
  • stockStatus, price, regularPrice, averageRating, and reviewCount are 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.

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.