WooCommerce Products Scraper — Prices, Stock, Variations avatar

WooCommerce Products Scraper — Prices, Stock, Variations

Pricing

from $1.50 / 1,000 product extracteds

Go to Apify Store
WooCommerce Products Scraper — Prices, Stock, Variations

WooCommerce Products Scraper — Prices, Stock, Variations

Scrape products from any WooCommerce shop through its public Store API: name, SKU, price and sale price, currency, stock, categories, tags, images, attributes, variations, rating average and count. No login, no browser. Shops with the API closed are reported, not charged.

Pricing

from $1.50 / 1,000 product extracteds

Rating

0.0

(0)

Developer

Datakiln

Datakiln

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Give it the address of a WooCommerce shop and it returns the product catalogue: name, SKU, price and sale price, currency, stock, categories, tags, images, attributes, variations, and the average rating with its review count.

It does not scrape the shop's HTML. Almost every WooCommerce shop exposes a public, read-only JSON endpoint (the Store API, /wp-json/wc/store/v1/products) that the shop's own front end uses. This actor reads that endpoint, politely, 100 products per request. No browser, no login, no API key.

  • One request per 100 products. A 700-product shop takes about 8 requests, with a pause between each.
  • Prices in two forms. The smallest currency unit (1999) and a decimal (19.99), plus the currency code and decimals, so JPY and KWD come out right.
  • Closed shops are reported, not charged. If a shop has switched the API off, you get one status line with the reason and the run carries on.
  • Stops at your spending limit. Charging happens per batch of products saved. Set a max cost per run and the actor stops when it is reached.
  • No personal data. Ratings are an average and a count. There is no review text, no reviewer name, no customer data. E-mail addresses and phone numbers that a shop writes into a product description are removed.

What can I use it for?

UseHow
Price monitoringRun on a schedule against competitor shops, compare price, salePrice, onSale
Catalogue import or migrationExport names, SKUs, categories, images and attributes to CSV/JSON
Stock watchinginStockOnly plus inStock and lowStockRemaining
Market researchCompare category trees, price ranges and rating counts across shops
AI agents / MCPSmall, flat JSON; ask an agent to "list the in-stock mugs under 20 USD from shop X"

How to use it

  1. Paste one or more shop addresses into Store URLs. shop.example.com and https://shop.example.com/product/mug/ both work.
  2. Set Max products per store. The default is 100.
  3. Optionally add a Category filter (slugs, names or IDs, comma-separated) or tick In-stock only.
  4. Run it and download the dataset as JSON, CSV or Excel.

Example input:

{
"storeUrls": ["https://jococups.com", "https://offermanwoodshop.com"],
"maxProductsPerStore": 100,
"categoryFilter": "insulated-bottles",
"inStockOnly": false
}
FieldDefaultMeaning
storeUrlsrequiredShop addresses
maxProductsPerStore100Stop after this many products per shop
categoryFilteremptyCategory slugs, names or IDs
inStockOnlyfalseSkip out-of-stock products (backorder counts as out of stock)
respectRobotsTxttrueSkip a shop whose robots.txt disallows the API; follows Crawl-delay up to 10 s
maxConcurrency3Shops read at the same time (each shop is read one request at a time)
perStoreDelayMs1000Pause between two requests to the same shop
requestTimeoutSecs30Timeout for one request
maxRetries2Retries on timeouts, 429 and 5xx; Retry-After is honoured

Output

One dataset item per product (shortened):

{
"type": "product",
"status": "ok",
"store": "https://jococups.com",
"productId": 273076,
"name": "Active Flask Utility Insulated 16oz",
"url": "https://jococups.com/product/16oz-insulated-flask/",
"productType": "variable",
"sku": "AUIFL16",
"currency": "AUD",
"minorUnit": 2,
"priceMinor": 6045,
"price": 60.45,
"regularPrice": 54.95,
"salePrice": null,
"onSale": false,
"inStock": false,
"categories": [{ "id": 214, "name": "Insulated Bottles", "slug": "insulated-bottles" }],
"attributes": [{ "name": "Colour", "terms": ["Desert Sage", "Sandstone", "Ultra Black"] }],
"variationCount": 3,
"averageRating": null,
"reviewCount": 0
}

A shop that returns nothing gets one item with "type": "store", a status (api-closed, failed, skipped or invalid-input) and an error that says why. These items are free. The full field list is in the dataset schema.

How much does it cost?

You pay per product returned (event product-extracted), as set on the pricing tab, plus the usual Apify platform usage. You are not charged for shops with a closed API, failed requests, robots.txt skips or invalid input. Set Max cost per run and the actor stops when it is reached. Products are saved first and charged in batches; the actor never saves more products than your limit allows.

Limitations — read before you buy

  • Only shops with an open Store API. In a test of 12 shops, 8 answered. The other four: one blocks the endpoint (HTTP 403), two return a normal web page or a 404 (probably not WooCommerce), and one is WordPress without the Store API. You cannot know in advance; the status line tells you.
  • Variations have no price of their own. The list endpoint gives the variation IDs and their attribute values, plus a price range for the product. Per-variation prices need one extra request per product, which this actor does not make.
  • Short description only. The full description is not returned.
  • Category filter and stock filter run on what the API returns. A misspelled category simply returns nothing. Backorder products are treated as out of stock.
  • Prices are what the shop shows to a visitor, in the shop's currency and its tax display setting (with or without tax). Geo-pricing plugins can show different prices to different countries; the actor reads what a cloud server sees.
  • Large shops are capped at 10,000 products per run to keep the load reasonable.
  • Some shops sit behind a firewall (Cloudflare, Sucuri, Wordfence) and answer 403 to anything that is not a browser. Those show up as api-closed. The actor does not try to get around that and has no proxy by default.
  • Shops can change or remove the API at any time.

It reads public product data that the shop serves to anyone without a login, through an endpoint meant for that. It collects no personal data, identifies itself with its own user agent, checks robots.txt, limits request speed per shop, and backs off on HTTP 429. Whether you may use product data for a given purpose depends on the shop's terms and on your local law. Check that for your case.

Integrations

Use it through the Apify API, schedules, webhooks, or the Apify MCP server. Output goes to JSON, CSV, Excel, Google Sheets, Make, Zapier or n8n through the standard Apify integrations.

FAQ

Does it work on any WordPress shop? Only on shops running a reasonably recent WooCommerce with the Store API reachable. Shopify, Magento and others are not supported.

Why did a shop return api-closed? The API answered 403/404, or returned a normal web page. Open https://<shop>/wp-json/wc/store/v1/products in a browser to see what the shop says.

Can it read reviews? Only the average rating and the review count. Review text and reviewer names are deliberately not collected.

This actor is not affiliated with WooCommerce, Automattic or any shop it reads.