WooCommerce Scraper & Product Reviews avatar

WooCommerce Scraper & Product Reviews

Pricing

from $2.99 / 1,000 results

Go to Apify Store
WooCommerce Scraper & Product Reviews

WooCommerce Scraper & Product Reviews

WooCommerce Scraper extracts product listings and reviews, including titles, prices, descriptions, ratings, review text, images, availability, categories, and URLs. Ideal for e-commerce research, competitor analysis, product monitoring, review insights, and market intelligence.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

0

Monthly active users

an hour ago

Last modified

Share

WooCommerce Scraper — Products, Prices and Customer Reviews

WooCommerce Scraper & Product Reviews reads any WooCommerce store's public Store API and returns every product with its own customer reviews already attached — price, SKU, stock status, categories, tags and average rating on the product row, plus each review's star rating, text, author, date and verified-buyer flag. No login, cookie or API key. Store owners, dropshippers, pricing analysts and review-mining researchers use it to pull a catalog and its social proof in a single run.

What is WooCommerce Scraper & Product Reviews?

WooCommerce Scraper & Product Reviews reads the public /wp-json/wc/store/* Store API that every WooCommerce storefront exposes for its own cart and checkout scripts, plus the WordPress /wp-json/wp/v2/* API for non-commerce content. No WooCommerce account, login, cookie or API key is required for any of it. Point it at one or more store URLs and it returns products, and — unlike a plain catalogue scraper — joins each product to the reviews written about it, on that product's own row.

Key features:

  • 🛍️ URL-based discovery — paste one or more store home pages (https://example.com or a sub-directory install like https://example.com/shop); no product URLs to collect first
  • 💬 Reviews attached per productproduct_reviews[] with rating, review text, reviewer, date and the verified-buyer flag, plus a computed per-product summary (reviews_returned, verified_review_count, average_rating_returned)
  • 💰 Prices in real currency unitsprice_value, regular_price_value and sale_price_value converted from the store's minor-unit integers, next to the raw prices block and currency_code
  • 📦 Catalogue fields — SKU, stock status, categories, tags, brands, attributes, images and variations, in one normalized row shape across any store
  • 🔍 Real store-side filters — category, tag, SKU, product type, stock status, price range, featured/sale flags, and free-text search
  • 🔁 Automatic proxy escalation — runs with no proxy by default and steps up through Apify's datacenter and then residential proxy tiers on its own if a store blocks the direct request

Results are saved to an Apify dataset and are exportable as JSON, CSV, Excel and the other formats the Apify platform supports for any dataset. A named reviews dataset view is also predefined (see the Where the review rows go input) for pulling just the flat review rows.

What data can I extract with WooCommerce Scraper & Product Reviews?

Every product row can carry the fields below; reviews sit nested under product_reviews[] and, optionally, as their own flat rows.

FieldExample valueUse case
row_type"product"Tell a product row apart from a flat "review" row in the same dataset
url"https://woocommerce.com/product/ecopower-charger/"Canonical product link
id243589Stable product ID, used to re-request reviews or variations later
name"EcoPower Wireless Charger"Product title
slug"ecopower-wireless-charger"URL-safe identifier
type"simple"simple / variable / grouped / external, for segmenting by product type
sku"ECO-CHRG-01"Cross-reference against your own inventory
description / short_description"Fast wireless charging pad for Qi-enabled phones."Rendered as Markdown, plain text or HTML per the format input
on_saletrueFlag currently discounted products
prices{"price": "2999", "currency_code": "USD", "currency_minor_unit": 2, ...}Raw Store API price block, kept alongside the converted values
price_value / regular_price_value / sale_price_value29.99 / 34.99 / 29.99Price in real currency units, not the store's minor-unit integer
currency_code"USD"Store's billing currency
average_rating"4.60"Store-computed average across all of that product's reviews, not just what this run pulled
review_count84Total reviews the store reports for the product
is_in_stock / is_on_backorder / stock_availabilitytrue / false / {"text": "In stock"}Stock filtering and storefront display text
categories / tags / brands[{"id": 24, "name": "Chargers", "slug": "chargers"}]Taxonomy for segmenting the catalogue
attributes[{"name": "Color", "terms": [{"name": "Black"}]}]Variant/option data for variable products
images[{"src": "https://woocommerce.com/.../ecopower.jpg"}]Product photography
add_to_cart{"minimum": 1, "maximum": 0, "url": "?add-to-cart=243589"}Purchase-limit rules the storefront enforces
product_reviews[][{"rating": 5, "review_text": "Charges fast."}]Every review attached to this product — see below
reviews_returned / reviews_available / reviews_total10 / true / 84How many reviews this run actually pulled vs. how many the store reports in total
verified_review_count7Count of reviews WooCommerce flags as written by a verified buyer
lowest_rating_returned / highest_rating_returned / average_rating_returned3 / 5 / 4.5Stats computed only from the reviews this run collected, not the store's full set
reviews_status"ok"Why a product has 0 reviews: below the review floor, the store publishes none, or a request error
store / resource_type / scraped_at"https://woocommerce.com" / "products" / "2026-08-16T09:12:04Z"Run provenance for every row

Customer reviews

Turn on Attach each product's reviews (default on) and every product row gets product_reviews[]: one object per review with review_id, rating, review_text, reviewer, date_created, verified_buyer and reviewer_avatar_url. A product manager reading feature complaints sets Which reviews to take first to "Lowest rating first" and Minimum stars on a review stays at 0 to pull the worst reviews across a whole catalogue in one run, instead of opening each product page. ⚠️ Reviews are not universal: WooCommerce stores can disable their review feed entirely, and a product the store reports zero reviews for is returned as reviews_available: false — never as an empty product_reviews: [] that reads like nobody responded.

Catalogue targeting fields

category and tag (numeric taxonomy IDs), product_type, stock, min_price/max_price (in the store's minor currency unit) and rating (the product's own rounded average) are the fields you filter and segment the catalogue on before you pay for a single row. featured and sale narrow to merchandised or currently discounted products. All of them apply to the products resource only.

How does WooCommerce Scraper & Product Reviews differ from the official WooCommerce REST API?

WooCommerce ships an official REST API (wc/v3), but its keys are generated inside a store's own wp-admin — WooCommerce → Settings → Advanced → REST API — by that store's owner or an authorized WordPress user, and are scoped to that user's role (per WooCommerce's own REST API documentation, checked 2026-08-16). That means the official API can only ever reach stores you administer or that have explicitly granted you a key; it was never meant for reading someone else's storefront.

FeatureWooCommerce REST API (wc/v3)WooCommerce Scraper & Product Reviews
AuthenticationConsumer key/secret generated in that store's wp-adminNone — reads the same public Store API the storefront's own cart scripts use
Who can query a given storeOnly someone the store owner grants a key toAny publicly reachable WooCommerce store
Reviews joined to the productLive under wp/v2/comments, a separate authenticated endpoint from the product endpointFetched per product and merged onto that product's own row automatically
Multiple stores in one callOne key pair, generated per storeOne run accepts many startUrls, no per-store credential setup
Setup requiredWordPress admin access and key generation (or an app-auth flow) per storePaste a store URL and run
Output shapeRaw store schema, shaped by whatever plugins and extensions that store runsOne normalized row shape (prices, product_reviews[], stock fields) across any store

Can you use the WooCommerce REST API without owning the store?

No. WooCommerce's own documentation ties key generation to a WordPress user on that specific store — there is no self-serve way to get a key for a store you don't administer, so the official API cannot answer "what does this other store sell, and what are people saying about it." This Actor covers that gap by reading the Store API instead: the same no-authentication endpoints WooCommerce enables by default for every storefront's cart and checkout UI, which any public visitor's browser already calls.

Use the official REST API when you manage the store yourself and need to write data — create orders, update stock. Use this Actor to read any public WooCommerce store's catalogue and reviews without needing store-owner permission.

How to use data extracted from WooCommerce?

Dropshippers and procurement

Filter by category, stock and a min_price/max_price band to shortlist in-stock suppliers in your niche, then read sku, price_value and is_in_stock straight off each row into a sourcing sheet — no manual page-by-page price checking across supplier sites.

Agencies and pricing analysts

Run the same competitor store list on a recurring schedule, writing each run to a masked dataset name (data-{DATE}) so price_value, on_sale and stock_availability are comparable day over day, and flag when a competitor's sale_price_value moves.

Market research and review intelligence

Pull average_rating, review_count and the attached product_reviews[] across a whole category to see which products and complaints cluster together — combine onlyVerifiedReviews with minReviewRating to separate genuine buyer feedback from unverified noise before building a sentiment summary.

AI agents and automated pipelines

Because every row is one consistent JSON shape from any WooCommerce store, an agent can call the Actor with a store URL, read product_reviews[].review_text as grounding context for a customer-sentiment or product-Q&A tool, and act on is_in_stock or price_value without a custom parser per store.

🔼 Input sample

ParameterRequiredTypeDescriptionExample value
startUrlsNoarrayStore home pages to read. Merged with url below.["https://woocommerce.com"]
urlNoarrayAlternative array of store URLs, merged with startUrls.["https://example.com/shop"]
limitNointegerCatalogue records read per store. Default 10, min 1, max 1000.50
attachProductReviewsNobooleanAttach each product's reviews to its row. Default true.true
maxReviewsPerProductNointegerReviews kept per product. Default 10, min 1, max 500.25
reviewOrderNostringOrder requested from the store. Default "newest"; enum newest, oldest, highest_rating, lowest_rating."lowest_rating"
minProductReviewCountNointegerSkip the review request below this store-reported count. Default 1, min 0, max 100000.5
onlyVerifiedReviewsNobooleanKeep only verified-buyer reviews. Default false.true
minReviewRatingNointegerDrop reviews below this star rating. Default 0, min 0, max 5.3
onlyProductsWithReviewsNobooleanDrop products with no review matching your filters. Default false.false
reviewOutputNostringWhere flat review rows go. Default "attached"; enum attached, attached_and_rows, attached_and_child_dataset."attached_and_rows"
resourceNostringRecord type to read. Default "products"; enum products, categories, brands, tags, attributes, reviews, pages, posts, comments, post-categories, post-tags, users."products"
include_variationsNobooleanAlso fetch every variation of variable products. Default false.false
formatNostringRendering of descriptions and review text. Default "md"; enum md, text, html."md"
sortNostringSort order requested from the store. Default "comment_count"; enum includes date, title, price, rating, popularity, menu_order, and more."comment_count"
orderNostringSort direction. Default "desc"; enum "", asc, desc."desc"
searchNostringFree-text search applied by the store."charger"
skuNostringReturn only the product with this SKU. Products resource only."ECO-CHRG-01"
ratingNostringProducts whose rounded average equals this. Enum "", 15. Products resource only."5"
min_priceNointegerMinimum price, in the store's minor currency unit. Min 0.1999
max_priceNointegerMaximum price, in the store's minor currency unit. Min 0.4999
categoryNostringCategory ID(s), comma separated. Products resource only."24,31"
tagNostringTag ID(s), comma separated. Products resource only."58"
product_typeNostringEnum "", simple, grouped, external, variable, wbs_bundle, variation."simple"
stockNostringEnum "", instock, outofstock, onbackorder."instock"
featuredNobooleanFeatured products only. Default false.true
saleNobooleanOn-sale products only. Default false.true
proxyConfigurationNoobjectApify proxy tiers. Default {"useApifyProxy": false}.{"useApifyProxy": true}
dev_proxy_configNostringYour own HTTP(S) proxy, used instead of the Apify proxy. SOCKS is not supported."http://user:pass@proxy.example.com:8000"
dev_custom_headersNostringExtra HTTP headers as JSON pairs, a JSON object, or Name: value lines.[{"name": "Accept-Language", "value": "en-GB"}]
dev_custom_cookiesNostringExtra HTTP cookies in the same accepted formats.[{"name": "session", "value": "abc123"}]
dev_transform_fieldsNostringKeep only these fields on catalogue rows; dot for nested, index for array element."sku,prices.price,product_reviews.0.rating"
dev_dataset_nameNostringWrite to a named dataset. Masks {ACTOR}, {DATE}, {TIME}."data-{DATE}"
dev_dataset_clearNobooleanEmpty the named dataset first. Default false. No effect without dev_dataset_name.false
dev_no_stripNobooleanKeep empty values (null, "", [], {}) in the output. Default false.false
dev_fileuploadNostringURL or path to a text/JSON file of store URLs, added to the list above."https://example.com/stores.txt"

No parameter is required, but the run fails if startUrls, url and dev_fileupload are all empty.

{
"startUrls": ["https://woocommerce.com"],
"limit": 25,
"attachProductReviews": true,
"maxReviewsPerProduct": 20,
"reviewOrder": "newest",
"minProductReviewCount": 1,
"onlyVerifiedReviews": false,
"minReviewRating": 0,
"onlyProductsWithReviews": false,
"reviewOutput": "attached",
"resource": "products",
"format": "md",
"sort": "comment_count",
"order": "desc"
}

Common pitfall: reviews are always attached to product_reviews[], but the predefined "Review rows only" dataset view stays empty at the default reviewOutput: "attached". To get one flat row per review — for a spreadsheet import or a join key on parent_product_id — set reviewOutput to "attached_and_rows" (same dataset) or "attached_and_child_dataset" (separate dataset per run). Each review row is billed as its own result row either way.

🔽 Output sample

Every row is typed, normalized JSON with a consistent shape across any store. Results are saved to the run's Apify dataset and are downloadable as JSON, CSV, Excel or the platform's other standard dataset export formats.

{
"row_type": "product",
"url": "https://woocommerce.com/product/ecopower-charger/",
"id": 243589,
"name": "EcoPower Wireless Charger",
"slug": "ecopower-wireless-charger",
"parent": 0,
"type": "simple",
"sku": "ECO-CHRG-01",
"short_description": "Fast wireless charging pad for Qi-enabled phones.",
"description": "10W fast charging, non-slip base, LED charge ring.",
"on_sale": true,
"prices": {
"price": "2999",
"regular_price": "3499",
"sale_price": "2999",
"price_range": null,
"currency_code": "USD",
"currency_symbol": "$",
"currency_minor_unit": 2,
"currency_decimal_separator": ".",
"currency_thousand_separator": ",",
"currency_prefix": "$",
"currency_suffix": ""
},
"price_value": 29.99,
"regular_price_value": 34.99,
"sale_price_value": 29.99,
"currency_code": "USD",
"average_rating": "4.60",
"review_count": 84,
"images": [
{ "id": 5271, "src": "https://woocommerce.com/wp-content/uploads/ecopower.jpg", "name": "ecopower.jpg", "alt": "" }
],
"categories": [{ "id": 24, "name": "Chargers", "slug": "chargers" }],
"tags": [{ "id": 58, "name": "wireless", "slug": "wireless" }],
"brands": [],
"attributes": [
{ "id": 0, "name": "Color", "taxonomy": "", "has_variations": true, "terms": [{ "id": 12, "name": "Black", "slug": "black" }] }
],
"variations": [],
"grouped_products": [],
"has_options": false,
"is_purchasable": true,
"is_in_stock": true,
"is_on_backorder": false,
"sold_individually": false,
"stock_availability": { "text": "In stock", "class": "" },
"add_to_cart": {
"minimum": 1,
"maximum": 0,
"multiple_of": 1,
"single_text": "Add to cart",
"url": "?add-to-cart=243589"
},
"extensions": {},
"reviews_status": "ok",
"reviews_total": 84,
"reviews_available": true,
"product_reviews": [
{
"review_id": 98213,
"product_id": 243589,
"product_name": "EcoPower Wireless Charger",
"product_permalink": "https://woocommerce.com/product/ecopower-charger/",
"product_image": "https://woocommerce.com/wp-content/uploads/ecopower.jpg",
"rating": 5,
"reviewer": "Jamie L.",
"review_text": "Charges fast and the LED ring is a nice touch.",
"date_created": "2026-08-01T14:22:10",
"date_created_gmt": "2026-08-01T14:22:10",
"formatted_date_created": "August 1, 2026",
"verified_buyer": true,
"reviewer_avatar_url": "https://secure.gravatar.com/avatar/abc123?s=96",
"avatar_sizes": {
"24": "https://secure.gravatar.com/avatar/abc123?s=24",
"48": "https://secure.gravatar.com/avatar/abc123?s=48",
"96": "https://secure.gravatar.com/avatar/abc123?s=96"
}
}
],
"reviews_returned": 10,
"verified_review_count": 7,
"lowest_rating_returned": 3,
"highest_rating_returned": 5,
"average_rating_returned": 4.5,
"store": "https://woocommerce.com",
"resource_type": "products",
"scraped_at": "2026-08-16T09:12:04Z"
}

How do you filter and target specific products?

  1. Category/tag ID vs. free-text searchcategory and tag match the store's own taxonomy exactly by numeric ID (run once with resource: "categories" or "tags" to look up the IDs), while search does a fuzzy text match across title and description. Use the ID filters when you know the taxonomy; use search when you only know a keyword.
  2. Scope precisionmin_price/max_price (in the store's minor currency unit), stock, product_type, featured and sale narrow the catalogue before you pay for a single row; rating filters on the product's own rounded average, separate from minReviewRating which filters individual reviews.
  3. Review quality thresholdsminProductReviewCount skips the review request entirely for products below that store-reported count (a genuine request saver), onlyVerifiedReviews keeps only buyer-confirmed reviews, and onlyProductsWithReviews drops any product whose reviews don't survive your filters.
  4. Volume controlslimit caps catalogue rows per store (1–1,000) and does not count review requests against it; maxReviewsPerProduct caps reviews per product (1–500, paged 100 at a time — the store's own per-request ceiling), and reviewOrder decides which reviews survive that cap.
{ "startUrls": ["https://example-shop.com"], "category": "24", "stock": "instock", "min_price": 1000, "max_price": 5000 }

In-stock products in category 24, priced $10–$50.

{ "startUrls": ["https://example-shop.com"], "minProductReviewCount": 10, "onlyVerifiedReviews": true, "minReviewRating": 4 }

Only well-reviewed products, keeping just their verified 4- and 5-star reviews.

{ "startUrls": ["https://example-shop.com"], "reviewOrder": "lowest_rating", "maxReviewsPerProduct": 5, "onlyProductsWithReviews": true }

Surface the five worst reviews per product across the catalogue, skipping products with none.

▶️ Want to try other product and review scrapers?

Scraper nameWhat it extracts
Shopify Products Scraper With Variant & SKU RowsShopify storefront products broken out by variant and SKU
Shopify Store Scraper — Markets, Currencies & CatalogsShopify storefronts profiled by market, currency and catalogue
Alibaba Listings Scraper & Supplier ProfilesAlibaba search listings plus the supplier behind each one
Amazon Price Tracker — Title, Image & Product UpdatesAmazon price, title and image drift on watched ASINs
eBay Product Listing Scraper With Sold Price DataeBay listings plus sold/completed-listing price data
Walmart Reviews Scraper With Seller & Variant DetailsWalmart product reviews with SKU/variant and seller detail

How to extract WooCommerce data programmatically

This Actor runs as a standard Apify Actor: one authenticated call starts the run, and structured JSON comes back from its dataset — no WooCommerce-side API key involved.

Python example

from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("YOUR_USERNAME/woocommerce-scraper-and-product-reviews").call(
run_input={
"startUrls": ["https://woocommerce.com"],
"limit": 25,
"attachProductReviews": True,
"minReviewRating": 4,
"onlyVerifiedReviews": True,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["name"], item["price_value"], item["reviews_returned"])

Export to spreadsheets or CRM

Use the Apify Console's dataset "Export" button, or the API's dataset export endpoint, to pull results as CSV or Excel. Map name → product name, sku → SKU column, price_value → list price, is_in_stock → stock status, and average_rating/review_count → your rating columns.

Scraping a WooCommerce store's public product catalogue is generally legal — this Actor only reads what the store's own Store API already serves to any visitor's browser for cart and checkout, no login bypass or private data involved. Product records (price, SKU, stock, categories) are business and product data, not personal data, so they fall under the store's Terms of Service and general database-rights considerations rather than GDPR or CCPA. Review rows are different: reviewer, reviewer_avatar_url and review_text can be personal data about an identifiable individual, so storing or reusing review rows in bulk should have a lawful basis under GDPR/CCPA where those regimes apply. Consult legal counsel for commercial applications involving bulk storage of personal data.

❓ FAQ

Does this Actor tell me if a product is out of stock or discontinued?

Yes — is_in_stock, is_on_backorder and stock_availability are read directly from the Store API on every run. There is no separate "discontinued" flag: a product removed from the store entirely simply stops appearing in the next run's results, since the Store API no longer lists it.

Can I get reviews along with the main product records?

Yes, by default. attachProductReviews (default true) fetches each product's reviews and attaches them as product_reviews[] on that product's row, with reviews_returned, verified_review_count and rating stats computed from what was pulled. maxReviewsPerProduct caps how many are kept per product (1–500).

How accurate is the price and stock data?

The Actor returns prices, stock status and review counts exactly as the store's Store API reports them at request time — it does not interpret or adjust any value. Because store inventory and pricing change continuously, treat an older run as a snapshot and re-run for current figures before acting on them.

How many products and reviews can I get per run?

limit caps catalogue rows at 1–1,000 per store, and reviews are fetched for those products without counting against that number. maxReviewsPerProduct caps reviews at 1–500 per product; because the store serves at most 100 reviews per request, a cap above 100 costs multiple requests per product. A run-wide review-request budget also exists as a hard stop so a very large run cannot spiral into an unbounded number of requests.

What does "Minimum reviews before fetching" actually save me?

minProductReviewCount skips the review request entirely for a product the store already reports fewer reviews than that threshold for — the count is visible on the product row before any review call is made, so it's a genuine request saved, not just a filter applied after the fact. The product itself is still returned, with reviews_status explaining why no request was made.

⚠️ Why are product_reviews empty for some stores?

Some WooCommerce stores disable or hide their review feed even though the storefront still answers normally — the reviews endpoint returns 200 with zero results rather than an error. A product with genuinely no reviews is reported as reviews_available: false, distinct from a request that failed (reviews_status explains which happened). This is a real property of the target store, not a bug in the run.

Does WooCommerce Scraper & Product Reviews work with Claude, ChatGPT and AI agent frameworks?

It runs as a standard Apify Actor callable over HTTP: any agent framework that can make an authenticated API call or use the apify-client SDK can trigger a run and read the resulting dataset rows.

How does this compare to other WooCommerce scrapers on Apify?

As observed on their Apify Store listings on 2026-08-16, one competing WooCommerce reviews scraper's example configuration caps at 20 reviews per product, and a separate general-purpose WooCommerce scraper defaults to 100 products per store with no stated review limit at all. This Actor supports up to 500 reviews per product and up to 1,000 products per store, with the reviews joined onto the product row by default rather than returned as a separate unlinked list.

Can I use this Actor without a WooCommerce API key or developer account?

Yes. You only need an Apify account to run it. No WooCommerce consumer key/secret, WordPress login, or developer application of any kind is required — the Actor reads the store's public Store API directly.

Conclusion

WooCommerce Scraper & Product Reviews turns any public WooCommerce store into structured product data with its own customer reviews already joined on — price, SKU, stock, categories and tags on one row, rating and review text on the next. It fits dropshippers sourcing inventory, agencies tracking competitor pricing, researchers mining review sentiment across a catalogue, and agent pipelines that need current store data without a WooCommerce API key. Add your store URLs in the Apify Console or via the API and run it to get your first dataset.