WooCommerce Scraper & Product Reviews
Pricing
from $2.99 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
13
Total users
0
Monthly active users
an hour ago
Last modified
Categories
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.comor a sub-directory install likehttps://example.com/shop); no product URLs to collect first - 💬 Reviews attached per product —
product_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 units —
price_value,regular_price_valueandsale_price_valueconverted from the store's minor-unit integers, next to the rawpricesblock andcurrency_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.
| Field | Example value | Use 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 |
id | 243589 | Stable 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_sale | true | Flag 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_value | 29.99 / 34.99 / 29.99 | Price 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_count | 84 | Total reviews the store reports for the product |
is_in_stock / is_on_backorder / stock_availability | true / 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_total | 10 / true / 84 | How many reviews this run actually pulled vs. how many the store reports in total |
verified_review_count | 7 | Count of reviews WooCommerce flags as written by a verified buyer |
lowest_rating_returned / highest_rating_returned / average_rating_returned | 3 / 5 / 4.5 | Stats 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.
| Feature | WooCommerce REST API (wc/v3) | WooCommerce Scraper & Product Reviews |
|---|---|---|
| Authentication | Consumer key/secret generated in that store's wp-admin | None — reads the same public Store API the storefront's own cart scripts use |
| Who can query a given store | Only someone the store owner grants a key to | Any publicly reachable WooCommerce store |
| Reviews joined to the product | Live under wp/v2/comments, a separate authenticated endpoint from the product endpoint | Fetched per product and merged onto that product's own row automatically |
| Multiple stores in one call | One key pair, generated per store | One run accepts many startUrls, no per-store credential setup |
| Setup required | WordPress admin access and key generation (or an app-auth flow) per store | Paste a store URL and run |
| Output shape | Raw store schema, shaped by whatever plugins and extensions that store runs | One 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
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
startUrls | No | array | Store home pages to read. Merged with url below. | ["https://woocommerce.com"] |
url | No | array | Alternative array of store URLs, merged with startUrls. | ["https://example.com/shop"] |
limit | No | integer | Catalogue records read per store. Default 10, min 1, max 1000. | 50 |
attachProductReviews | No | boolean | Attach each product's reviews to its row. Default true. | true |
maxReviewsPerProduct | No | integer | Reviews kept per product. Default 10, min 1, max 500. | 25 |
reviewOrder | No | string | Order requested from the store. Default "newest"; enum newest, oldest, highest_rating, lowest_rating. | "lowest_rating" |
minProductReviewCount | No | integer | Skip the review request below this store-reported count. Default 1, min 0, max 100000. | 5 |
onlyVerifiedReviews | No | boolean | Keep only verified-buyer reviews. Default false. | true |
minReviewRating | No | integer | Drop reviews below this star rating. Default 0, min 0, max 5. | 3 |
onlyProductsWithReviews | No | boolean | Drop products with no review matching your filters. Default false. | false |
reviewOutput | No | string | Where flat review rows go. Default "attached"; enum attached, attached_and_rows, attached_and_child_dataset. | "attached_and_rows" |
resource | No | string | Record type to read. Default "products"; enum products, categories, brands, tags, attributes, reviews, pages, posts, comments, post-categories, post-tags, users. | "products" |
include_variations | No | boolean | Also fetch every variation of variable products. Default false. | false |
format | No | string | Rendering of descriptions and review text. Default "md"; enum md, text, html. | "md" |
sort | No | string | Sort order requested from the store. Default "comment_count"; enum includes date, title, price, rating, popularity, menu_order, and more. | "comment_count" |
order | No | string | Sort direction. Default "desc"; enum "", asc, desc. | "desc" |
search | No | string | Free-text search applied by the store. | "charger" |
sku | No | string | Return only the product with this SKU. Products resource only. | "ECO-CHRG-01" |
rating | No | string | Products whose rounded average equals this. Enum "", 1–5. Products resource only. | "5" |
min_price | No | integer | Minimum price, in the store's minor currency unit. Min 0. | 1999 |
max_price | No | integer | Maximum price, in the store's minor currency unit. Min 0. | 4999 |
category | No | string | Category ID(s), comma separated. Products resource only. | "24,31" |
tag | No | string | Tag ID(s), comma separated. Products resource only. | "58" |
product_type | No | string | Enum "", simple, grouped, external, variable, wbs_bundle, variation. | "simple" |
stock | No | string | Enum "", instock, outofstock, onbackorder. | "instock" |
featured | No | boolean | Featured products only. Default false. | true |
sale | No | boolean | On-sale products only. Default false. | true |
proxyConfiguration | No | object | Apify proxy tiers. Default {"useApifyProxy": false}. | {"useApifyProxy": true} |
dev_proxy_config | No | string | Your own HTTP(S) proxy, used instead of the Apify proxy. SOCKS is not supported. | "http://user:pass@proxy.example.com:8000" |
dev_custom_headers | No | string | Extra HTTP headers as JSON pairs, a JSON object, or Name: value lines. | [{"name": "Accept-Language", "value": "en-GB"}] |
dev_custom_cookies | No | string | Extra HTTP cookies in the same accepted formats. | [{"name": "session", "value": "abc123"}] |
dev_transform_fields | No | string | Keep only these fields on catalogue rows; dot for nested, index for array element. | "sku,prices.price,product_reviews.0.rating" |
dev_dataset_name | No | string | Write to a named dataset. Masks {ACTOR}, {DATE}, {TIME}. | "data-{DATE}" |
dev_dataset_clear | No | boolean | Empty the named dataset first. Default false. No effect without dev_dataset_name. | false |
dev_no_strip | No | boolean | Keep empty values (null, "", [], {}) in the output. Default false. | false |
dev_fileupload | No | string | URL 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?
- Category/tag ID vs. free-text
search—categoryandtagmatch the store's own taxonomy exactly by numeric ID (run once withresource: "categories"or"tags"to look up the IDs), whilesearchdoes a fuzzy text match across title and description. Use the ID filters when you know the taxonomy; usesearchwhen you only know a keyword. - Scope precision —
min_price/max_price(in the store's minor currency unit),stock,product_type,featuredandsalenarrow the catalogue before you pay for a single row;ratingfilters on the product's own rounded average, separate fromminReviewRatingwhich filters individual reviews. - Review quality thresholds —
minProductReviewCountskips the review request entirely for products below that store-reported count (a genuine request saver),onlyVerifiedReviewskeeps only buyer-confirmed reviews, andonlyProductsWithReviewsdrops any product whose reviews don't survive your filters. - Volume controls —
limitcaps catalogue rows per store (1–1,000) and does not count review requests against it;maxReviewsPerProductcaps reviews per product (1–500, paged 100 at a time — the store's own per-request ceiling), andreviewOrderdecides 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 name | What it extracts |
|---|---|
| Shopify Products Scraper With Variant & SKU Rows | Shopify storefront products broken out by variant and SKU |
| Shopify Store Scraper — Markets, Currencies & Catalogs | Shopify storefronts profiled by market, currency and catalogue |
| Alibaba Listings Scraper & Supplier Profiles | Alibaba search listings plus the supplier behind each one |
| Amazon Price Tracker — Title, Image & Product Updates | Amazon price, title and image drift on watched ASINs |
| eBay Product Listing Scraper With Sold Price Data | eBay listings plus sold/completed-listing price data |
| Walmart Reviews Scraper With Seller & Variant Details | Walmart 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 ApifyClientclient = 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.
Is it legal to scrape WooCommerce?
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.