# WooCommerce Scraper: Store Products, Prices and Stock (`pistachio_implementation/woocommerce-store-products`) Actor

Export the full product catalog of any WooCommerce store from its public Store API: name, SKU, price, regular and sale price, currency, stock status, categories, tags, brands, attributes, images and ratings. Just enter the store URL. No login, no API keys.

- **URL**: https://apify.com/pistachio_implementation/woocommerce-store-products.md
- **Developed by:** [Hay Equipos](https://apify.com/pistachio_implementation) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.80 / 1,000 product saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## WooCommerce Scraper: Store Products, Prices and Stock

Enter the address of any WooCommerce store and get its whole product catalog as clean rows: name, SKU, price, regular price and sale price, currency, price range for variable products, stock status, categories, tags, brands, attributes (sizes, colors), images, rating and review count.

The actor reads the store's **public WooCommerce Store API** (`/wp-json/wc/store/v1/products`), the same API that WooCommerce's own cart and checkout blocks use in the browser. It is on by default in every WooCommerce store since version 4. No login, no API keys, no browser, no proxies.

### What you can use it for

- **Competitor price tracking:** export competitors' catalogs every day and compare prices, sales and stock.
- **Supplier and dropshipping catalogs:** pull a supplier's full product list with SKUs and images.
- **Market research:** see which categories, brands and price points a store carries.
- **Catalog migration and audits:** list every product, SKU and attribute of a store you manage.
- **AI agents:** one job, one input (store URLs), predictable rows.

### Input

| Field | What it does | Default |
|---|---|---|
| Store URLs | Store home pages, one per line; a product link from the store also works | required |
| Maximum products per store | Cap per store | 1000 |
| Keyword filter | Only products matching a keyword (the store's own search) | none |
| Only products on sale | Products with a sale price | off |
| Only products in stock | Skip out of stock products | off |
| Sort by | Store default, newest, price, best selling, top rated, name | store default |
| Include full description | Long description as plain text | off |
| Respect robots.txt | Skip stores that close the API to automated tools | on |
| Maximum products in total | Cap across all stores | 20000 |

Example input:

```json
{
  "storeUrls": ["https://porterandyork.com", "https://www.nutribullet.com"],
  "maxProductsPerStore": 500,
  "sortBy": "newest"
}
```

### Output

One row per product. Example (trimmed):

```json
{
  "store": "porterandyork.com",
  "productId": 63137,
  "name": "Italian Sausage Links",
  "url": "https://porterandyork.com/product/italian-sausage-links/",
  "type": "variable",
  "sku": null,
  "price": 15,
  "regularPrice": 15,
  "salePrice": null,
  "onSale": false,
  "currency": "USD",
  "minPrice": 15,
  "maxPrice": 15,
  "inStock": true,
  "stockStatus": "in-stock",
  "rating": 0,
  "reviewCount": 0,
  "categories": ["Grinds", "Pork"],
  "brands": [],
  "imageUrl": "https://porterandyork.com/wp-content/uploads/Italian-Sausage-links-HOT-scaled.jpg",
  "attributes": [{ "name": "Italian Sausage Links", "values": ["Mild Italian Sausage Links", "Hot Italian Sausage Links"] }],
  "variationCount": 2,
  "scrapedAt": "2026-09-27T07:28:52.693Z"
}
```

Prices are converted from the API's minor units to normal amounts (19.99, not 1999). For variable products, `price` is the lowest variant price and `minPrice` and `maxPrice` give the range.

A store that is not WooCommerce, has the API turned off, or blocks the request comes back as one row with `store` and `error`, which is free. A `RUN_SUMMARY` record in the run's key value store gives products found and saved for each store.

### Pricing

Pay per event. No subscription and no platform usage charge on top.

| Event | Price |
|---|---|
| Product saved | $0.0008 (0.80 dollars per 1,000 products) |

Error rows are free. Example: a 2,000 product store costs $1.60 per full export.

### Limits

- Works only on WooCommerce stores (version 4 or later) that leave the public Store API on, which is the default. Some stores turn it off or put it behind a firewall; those return a free error row.
- Stores behind strong bot protection may block datacenter traffic. The actor does not try to get around blocks.
- Variations of variable products are counted (`variationCount`) but not listed one by one; the price range covers them.
- Prices are what the store shows a guest visitor from a US datacenter; stores that change price by country or customer group may show you different prices.
- To find WooCommerce stores in the first place, use a tech stack detection tool; this actor needs the store address.

### FAQ

**Do I need API keys from the store?** No. The Store API is public and read only for product data.

**How do I know if a site uses WooCommerce?** Try it: a site that is not WooCommerce returns a free error row.

**Can I get only new products?** Set "Sort by" to newest and a small maximum, and schedule the actor.

**Is this affiliated with WooCommerce or Automattic?** No. It is an independent tool that reads the public Store API that WooCommerce stores expose.

# Actor input Schema

## `storeUrls` (type: `array`):

WooCommerce store home pages, one per line, for example https://porterandyork.com or nutribullet.com. A product or shop link from the store also works.

## `maxProductsPerStore` (type: `integer`):

Stop each store after this many products.

## `search` (type: `string`):

Optional. Only products matching this keyword (the store's own product search).

## `onSaleOnly` (type: `boolean`):

Only products that currently have a sale price.

## `inStockOnly` (type: `boolean`):

Skip products the store marks out of stock.

## `sortBy` (type: `string`):

Order in which the store returns products. Useful with a small maximum, for example the 50 newest products.

## `includeDescription` (type: `boolean`):

Add the long product description as plain text (the short description is always included).

## `respectRobotsTxt` (type: `boolean`):

Skip stores whose robots.txt closes the product API to automated tools.

## `maxItems` (type: `integer`):

Stop after saving this many products across all stores.

## Actor input object example

```json
{
  "storeUrls": [
    "https://porterandyork.com"
  ],
  "maxProductsPerStore": 1000,
  "onSaleOnly": false,
  "inStockOnly": false,
  "sortBy": "default",
  "includeDescription": false,
  "respectRobotsTxt": true,
  "maxItems": 20000
}
```

# Actor output Schema

## `results` (type: `string`):

All rows the run saved to the default dataset.

## `summary` (type: `string`):

The RUN_SUMMARY record: counts and problems for the whole run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "storeUrls": [
        "https://porterandyork.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pistachio_implementation/woocommerce-store-products").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "storeUrls": ["https://porterandyork.com"] }

# Run the Actor and wait for it to finish
run = client.actor("pistachio_implementation/woocommerce-store-products").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "storeUrls": [
    "https://porterandyork.com"
  ]
}' |
apify call pistachio_implementation/woocommerce-store-products --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pistachio_implementation/woocommerce-store-products"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ZZJEp3XUVjxV0cjJ6/builds/V1sxYTpOQSS8YvoQ3/openapi.json
