WooCommerce logo

Online shops · Coming soon

WooCommerce Store Products Export

Add a store URL and get its public products in one table. Each row has prices, stock status, SKUs, categories, attributes and images. You need no login.

Built and tested. Prices will be shown after release.

Coming soon to the Apify StoreFollow us on Apify

What you get, for example

recordTypeproduct
storewww.passion4pens.com
storeUrlhttps://www.passion4pens.com

How it will work: 3 steps

  1. Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: https://woocommerce.com in WooCommerce store URLs. Each start is one run.
  3. Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

Export public products from any WooCommerce store to JSON, CSV or Excel. You get one row per product with prices, sale prices, stock, SKUs, categories, attributes, images and the product link. Add one store URL, such as https://woocommerce.com, and click Start. There is no login and no API key.

Good for

  • Watch a competitor's prices, sales and stock.
  • Copy a supplier's catalog with SKUs and images into your own system.
  • Get a daily list of only the new products in a store.

Not a good fit

  • Stores that are not on WooCommerce, or that closed the Store API. You get a status row, not products.
  • Exact stock numbers. Most stores only say if a product is in stock. Some show a low-stock number (lowStockRemaining).
  • Private data: orders, customers, costs, admin-only fields and hidden or draft products.
  • Price per variation (size, color). You get the price range of a variable product and its attribute values, not one row per variation.

Who uses it

Online sellers

Watch a competitor's prices, sales and stock.

Resellers

Copy a supplier catalog with SKUs and images into your system.

Marketing agencies

Watch prices for many brands on a schedule.

Price

Prices will be shown after release.

Questions

Do I need a WooCommerce login or API key?

No. It reads the public Store API. Stores that close it are skipped with a status row.

Is the stock number exact?

Most stores only say if a product is in stock. Some show a low-stock number.

Why are there no products in an only-new run?

Nothing was added since the last run with the same stateKey.

Does it get orders or buyer data?

No. It gets public product data only.

How fresh is the data?

Each row is read live from the store at fetchedAt.

Details

Step by step on Apify
  1. Open the Input tab.
  2. In Store URLs (storeUrls), add a store, for example https://woocommerce.com.
  3. Keep the prefilled Max products per store (maxProducts) of 20 for a first test. The default for runs without this field is 1,000.
  4. Click Start.
  5. Open the Products view in the Output tab. Check name, price and inStock. Rows with recordType: product are products.
Use cases
TaskInputYou getKey fieldsNext step
Competitor price and sale watchstoreUrls, scheduleProduct rowprice, regularPrice, salePrice, onSale, inStockDataset export or API to a sheet
Supplier catalog importstoreUrlsProduct rowsku, price, images, description, attributesJSON/CSV import into your store or PIM
New product alertsstoreUrls, onlyNew: true, scheduleNew product rowsname, url, isNewWebhook or integration on run finish
Category researchCategory URL or categoryProduct rowcategories, brands, tags, priceDataset export
Tips for better results
  • Use only-new mode on a daily schedule to get new products only.
  • Pick one category when you need only part of a store.
  • Variable products show a price range, not one row per variation.
Limits and good to know
  • Tested size. The biggest tested run saved 2,009 products from 4 stores in under 2 minutes. The biggest tested store had 1,757 products. The input allows up to 50,000 products per store, but bigger stores were not tested
  • Time. Speed depends on the store. In tests one store gave 1,000 products in about 15 seconds, and a slower store gave 1,757 products in under 2 minutes. The Actor asks each store at most once per second. Up to 5 stores are read at the same time. For many big stores, raise the timeout in Run options (default 300 seconds) or split the stores
  • Price 0. Some stores show 0 for products that you cannot buy online. The row then has price: 0 and purchasable: false, as the store gives it
  • Variable products. price is the lowest variation price. priceMin and priceMax show the range. There is no row per variation
  • No proxy needed. The API is public. The Actor waits when a store asks it to slow down (HTTP 429 or 503)
  • Order. Rows come newest first by date added
  • Unreachable stores. If the first 5 stores in a row cannot be reached, the run stops early to save your money. Stores that it did not check are not charged
  • Partial results. If a store fails, the rows already saved stay in the Dataset, and the other stores go on. The store also gets a status row with status: error and productsFound. The run summary lists every store with its result

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one result · JSON
{
  "recordType": "product",
  "status": "complete",
  "store": "www.passion4pens.com",
  "storeUrl": "https://www.passion4pens.com",
  "category": null,
  "productId": 21466,
  "name": "Lamy® Safari Yellow Fountain Pens-four nibs sizes available",
  "slug": "lamy-safari-yellow-fountain-pens-four-nibs-sizes-available",
  "sku": "L18",
  "type": "variable",
  "parentId": null,
  "price": 30.25,
  "regularPrice": 37,
  "salePrice": 30.25,
  "priceMin": 30.25,
  "priceMax": 30.25,
  "onSale": true,
  "currency": "USD",
  "inStock": true,
  "stockStatus": "in-stock",
  "lowStockRemaining": null,
  "purchasable": true,
  "categories": ["Fountain Pens"],
  "categorySlugs": ["foutain-pens"],
  "tags": ["fountain pens", "stainless steel nibs"],
  "brands": ["Lamy Pens & Refills"],
  "attributes": [{ "name": "size", "values": ["B", "EF", "F", "M"] }],
  "variationsCount": 4,
  "averageRating": null,
  "reviewCount": 0,
  "imageUrl": "https://passion4pens.com/wp-content/uploads/2026/05/LAMY-018-safari-Fountain-pen-yellow-1.webp",
  "images": ["https://passion4pens.com/wp-content/uploads/2026/05/LAMY-018-safari-Fountain-pen-yellow-1.webp"],
  "url": "https://passion4pens.com/product/lamy-safari-yellow-fountain-pens-four-nibs-sizes-available/",
  "isNew": null,
  "source": "woocommerce-store-api",
  "sourceUrl": "https://www.passion4pens.com/wp-json/wc/store/v1/products?per_page=100&page=1&orderby=date&order=desc&_fields=...",
  "fetchedAt": "2026-10-17T12:57:48.472Z"
}
Data fields (40)
FieldTypeMeaning
recordTypestringRow type: product, or store-status for a store that was not found, failed or stopped early.
statusstringcomplete for product rows; not_found (not a WooCommerce store, Store API closed, category missing, empty) or error (blocked, rate limited, unavailable, stopped) for store-status rows.
storestringStore domain the data came from (after redirects), e.g. woocommerce.com.
storeUrlstringStore homepage URL.
categorystringCategory slug the export was limited to; null for the whole catalog.
productIdintegerWooCommerce product ID.
namestringProduct name, HTML entities decoded.
slugstringProduct slug (URL part).
skustringSKU as published by the store; null when the store leaves it empty.
typestringProduct type: simple, variable, grouped, external, or a type added by a plugin.
parentIdintegerParent product ID for child products; null for top-level products.
pricenumberCurrent price in the store currency (sale price when on sale). Null when the store shows no price; 0 only for a free product.
regularPricenumberRegular (non-sale) price. Null when not published.
salePricenumberSale price, only when the product is on sale; otherwise null.
priceMinnumberLowest price across variations (variable products) or the price.
priceMaxnumberHighest price across variations (variable products) or the price.
onSalebooleanTrue when the store marks the product as on sale.
currencystringISO 4217 currency code of the prices, e.g. USD.
inStockbooleanTrue when the product is in stock (or on backorder), as the store reports it.
stockStatusstringStock label class from the store, e.g. in-stock, out-of-stock, available-on-backorder.
lowStockRemainingintegerUnits left when the store shows a low-stock notice; null otherwise.
purchasablebooleanTrue when the product can be added to the cart.
categoriesarrayCategory names.
categorySlugsarrayCategory slugs.
tagsarrayTag names.
brandsarrayBrand names (WooCommerce Brands).
attributesarrayPublic attributes with their values, e.g. Size: S, M, L.
variationsCountintegerNumber of variations for variable products.
averageRatingnumberAverage review rating from 0 to 5; null when the product has no reviews.
reviewCountintegerNumber of reviews.
shortDescriptionstringShort description as plain text (up to 2,000 characters).
descriptionstringFull description as plain text (up to 5,000 characters).
imageUrlstringMain image URL.
imagesarrayAll image URLs.
urlstringProduct page URL on the store.
isNewbooleanonlyNew mode: true for products added since the previous run; null on the first run and when onlyNew is off.
sourcestringData source: woocommerce-store-api.
sourceUrlstringStore API page the row was read from.
fetchedAtstringWhen the row was fetched (ISO 8601, UTC).
statusCodestringstore-status rows: NOT_WOOCOMMERCE, STORE_API_DISABLED, CATEGORY_NOT_FOUND, NO_PRODUCTS, BLOCKED, RATE_LIMITED, SOURCE_UNAVAILABLE, CHARGE_LIMIT, INVALID_URL and others.
Input settings (5)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
WooCommerce store URLs requiredstoreUrlsarray["https://woocommerce.com"]
Category (optional)categorystring
Max products per storemaxProductsinteger20
Only new productsonlyNewbooleanfalse
State key (only new products)stateKeystring

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure