WooCommerce Store Products Scraper avatar

WooCommerce Store Products Scraper

Pricing

Pay per usage

Go to Apify Store
WooCommerce Store Products Scraper

WooCommerce Store Products Scraper

Get every product from any WooCommerce store through its public Store API: prices in real decimals, discount %, stock, categories and ratings, one row per product.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Sampon

Sampon

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

WooCommerce stores publish their catalogue through a public, read-only endpoint called the Store API. It is the same endpoint the store's own cart and product blocks use, so it is open without a login or an API key on most stores.

This Actor reads that endpoint for the stores you list and gives you one row per product: name, SKU, categories, prices, discount, stock and rating. No HTML parsing is involved, so the numbers are the store's own numbers, not text scraped off a theme that may change next month.

What you put in

The only thing you need is the store's address. The home page or the shop page both work:

{
"startUrls": [{ "url": "https://mercantile.wordpress.org/" }],
"maxItems": 200
}

You can list several stores in one run. They are read one after another.

Optional settings:

SettingWhat it does
maxItemsStops after this many products in total.
maxItemsPerStoreCaps each store, so one large store does not use up the whole run.
categoriesKeeps products in any of these categories. Use the slug from the store's category URLs (such as drinkware), the category ID, or its name.
tagsThe same for product tags.
searchPassed to the store's own product search.
onSaleOnlyKeeps only products that have a sale price right now.
inStockOnlySkips products that are out of stock.
includeShortDescriptionThe short description as plain text. On by default.
trackPriceChangesCompares every price with the previous run and adds the difference to the row.
changesOnlySame comparison, but leaves out products whose price did not move.
historyNameWhere the previous prices are kept. Use a different name for each monitoring task.

Category, tag, sale and stock filters are sent to the store, so the store does the work and the run stays short. If a store rejects a category or tag value, the Actor reads the full catalogue and applies the filter itself.

What you get

{
"store": "https://shop.example.com",
"productId": 1042,
"name": "Enamel Camp Mug",
"slug": "enamel-camp-mug",
"sku": "MUG-350-BLU",
"type": "simple",
"categories": ["Drinkware", "Outdoor"],
"categorySlugs": ["drinkware", "outdoor"],
"tags": ["Gift"],
"currency": "USD",
"price": 14.4,
"regularPrice": 18.0,
"salePrice": 14.4,
"priceMin": null,
"priceMax": null,
"onSale": true,
"discountPercent": 20.0,
"isInStock": true,
"stockStatus": "in_stock",
"stockQuantity": 37,
"stockText": "37 in stock",
"averageRating": 4.6,
"reviewCount": 23,
"url": "https://shop.example.com/product/enamel-camp-mug/",
"imageUrl": "https://shop.example.com/wp-content/uploads/camp-mug.jpg",
"shortDescription": "Holds 350 ml. Safe on a camp stove.",
"scrapedAt": "2026-10-10T08:00:00+00:00"
}

A few details that save you a cleanup step:

  • Prices are real numbers. The Store API sends prices as whole numbers in the smallest currency unit, so "1440" can mean 14.40 or 1,440 depending on the currency. The Actor reads each store's decimal setting and converts, so 14.4 means 14.40 and a yen price stays in yen.
  • salePrice is only filled when the product is actually on sale. The raw API repeats the normal price there, which makes every product look discounted.
  • discountPercent is worked out from the regular and sale price, rounded to one decimal.
  • priceMin and priceMax are filled when the store reports a price range (variable or grouped products).
  • stockQuantity is only filled when the store shows a number. Many stores only say "in stock".
  • Ratings are numbers only. Review text and reviewer names are never collected.

When trackPriceChanges or changesOnly is on, each row also gets changeType (new, up, down, unchanged, currency_changed), previousPrice, priceChange, priceChangePercent and previousScrapedAt. Schedule the Actor daily with changesOnly and the dataset becomes a list of what moved since yesterday. The "Price changes" view in the dataset shows just those columns.

If a store has no Store API, or has it switched off, you get one row for that store with an error field explaining what was tried, and the run moves on to the next store.

Price

Free for now. You only pay Apify's usual platform usage for the run. In our tests, 20 products took 2 requests and under 2 seconds of fetching, and two stores with 107 products in total took 4 requests and about 6 seconds, so a run of that size should cost a fraction of a cent in platform usage. A per-product price may be added later. If that happens, it will be shown on this page before it applies to you.

How it treats the stores it reads

  • It reads the store's robots.txt first and does not request anything robots.txt disallows. A crawl delay in robots.txt is respected.
  • It asks for up to 100 products per request, so a store with 1,000 products takes about 10 requests.
  • It waits at least one second between requests to the same store by default, and reads one store at a time.
  • If the pretty /wp-json/ address is blocked or missing, it tries the plain ?rest_route= form of the same endpoint before giving up.

Limits

  • It works only with stores built on WooCommerce. Shopify, Magento and other platforms are not supported.
  • Some stores put a firewall or bot protection in front of the API, and some switch the Store API off. Those stores come back as an error row.
  • Product variations (sizes, colours) are not listed as separate rows. A variable product appears once, with its price range when the store provides it.
  • Prices are what the store shows to a visitor with no account and no cart, from the location of the Apify server. Stores that switch currency by country, or give member prices, may show you something different in your browser.
  • The price comparison works per store URL and per history name. If you change filters between runs, products you filtered out are simply not compared.

This Actor is an independent tool. It is not made by, or affiliated with, WooCommerce, Automattic, or the stores it reads.