# Shopify & WooCommerce Scraper — $0.50/1k · Products & Prices (`tidydata/shopify-woocommerce-scraper`) Actor

Scrape every product of any Shopify or WooCommerce store: title, price, compare-at/sale price, variants, SKU, stock, images, tags, description. Track price drops, new products and stock changes between runs. $0.50 per 1,000 products.

- **URL**: https://apify.com/tidydata/shopify-woocommerce-scraper.md
- **Developed by:** [tidydata](https://apify.com/tidydata) (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

from $0.40 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 🛍️ Shopify & WooCommerce Scraper — Products, Prices & Stock

Scrape **every product of any Shopify or WooCommerce store** — or just one collection, category or product — in one fast run: **title, price, compare-at / sale price, discount %, variants (size, colour…), SKU, stock, images, vendor, product type, tags, categories, ratings and description**. Then turn on **change tracking** and schedule it: each run tells you which products are **new**, which **dropped or raised their price** and what went **out of / back in stock**.

**$0.50 per 1,000 products.** No login, no API key, no browser. The platform is detected for you.

- ✅ **Shopify** (any store, including custom domains) and **WooCommerce** stores
- ✅ **Whole catalog**, a **collection** (`/collections/sale`), or single **product** pages
- ✅ **Prices**: lowest and highest variant price, compare-at price, `onSale`, `discountPercent`, currency
- ✅ **Variants** with their own price, SKU, stock and options — nested, or **one row per variant**
- ✅ **Price & stock monitoring**: `change` = `new` · `price_down` · `price_up` · `back_in_stock` · `out_of_stock` · `unchanged`, with `previousPrice` and `% change`
- ✅ **Only changes** mode: you pay only for products that changed — a cheap daily competitor alert
- ✅ Filters: keywords (title, tags, type) and in-stock only
- ✅ Fast: ~3,000 products from 3 stores in under a minute

### Who uses it

- **E-commerce brands** — watch competitors' prices, discounts and new launches every morning.
- **Dropshippers & resellers** — find winning products and copy-ready catalogs (images, variants, SKUs).
- **Marketplaces & price-comparison sites** — feed your catalog from hundreds of stores.
- **Agencies & analysts** — catalog size, price ranges and discount strategy of any DTC brand.
- **AI teams** — product data with clean descriptions for search, RAG or classification.

### How to use it

1. **Stores** — one per line:
   ```
   https://www.allbirds.com
   https://kyliecosmetics.com/collections/all
   https://gymshark.com/products/gymshark-x-sam-sulek-cap-headwear-black-aw26
   https://woocommerce.com
   ```
2. Optional: **max products per store**, **keywords**, **only in stock**, **one row per variant**.
3. For monitoring: tick **Track changes** (and **Only return what changed**), save it as a task and **schedule it daily**. The first run saves the baseline; every later run compares with the previous one.

### Output example

```json
{
  "type": "product",
  "platform": "shopify",
  "storeName": "Allbirds",
  "storeUrl": "https://www.allbirds.com",
  "productId": "…",
  "title": "Women's Allbirds Flip Flop - Dusty Pink",
  "url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
  "vendor": "Allbirds",
  "price": 25,
  "priceMax": 25,
  "compareAtPrice": 50,
  "currency": "USD",
  "onSale": true,
  "discountPercent": 50,
  "available": true,
  "variantsCount": 7,
  "productType": "Shoes",
  "options": [{"name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"]}],
  "variants": [{"variantId": "42146889039952", "variantTitle": "5", "sku": "A12513W050", "price": 25, "compareAtPrice": 50, "available": false, "option1": "5", "weightGrams": 455}],
  "image": "https://cdn.shopify.com/…",
  "change": "price_down",
  "previousPrice": 35,
  "priceChangePercent": -28.6,
  "scrapedAt": "2026-10-20T08:45:12+00:00",
  "charged": true
}
```

Also: `handle`, `productType`, `tags`, `categories` (WooCommerce), `options` (e.g. Size: S, M, L), `sku`, `images`, `description`, `rating` and `reviewsCount` (WooCommerce), `createdAt`, `updatedAt`, `publishedAt` (Shopify). With tracking, a free `"type": "removed"` row lists the products that disappeared since the last run.

### Pricing

**$0.0005 per product row ($0.50 per 1,000).** In variant mode each variant row counts as one row. Store discounts apply automatically on paid Apify plans (−10 % Bronze, −15 % Silver, −20 % Gold). Error and "removed" rows are free. Set a maximum cost per run and the scraper stops right there.

Examples: a 700-product store = **$0.35**. A daily "only changes" alert on 10 competitors usually costs **a few cents a day**.

### Good to know

- Works with stores that use Shopify's and WooCommerce's **standard public product feeds** (the vast majority). Headless stores that turned those feeds off, and password-protected stores, return a free error row.
- **Stock**: Shopify gives in stock / sold out per variant (not quantities). WooCommerce gives in stock per product.
- WooCommerce variant prices aren't in the public feed: you get the product's price range (`price` – `priceMax`).
- Prices are in the store's own currency (`currency`).

### More from TidyData

[Merge, Deduplicate & Transform](https://apify.com/tidydata/merge-dedupe-datasets) — combine stores, dedupe, compute columns · [Google Sheets Export](https://apify.com/tidydata/google-sheets-export-import) — send results to a sheet · [Website Contact Extractor](https://apify.com/tidydata/website-contact-extractor) — emails and socials of the stores · [Bulk Image Downloader](https://apify.com/tidydata/bulk-image-downloader-converter) — download and convert all product images.

### FAQ

**Is it legal?** It reads the public product feeds that the stores publish, like a visitor would, without login, at a gentle pace. You are responsible for how you use the data (product photos and texts are the stores' property).

**Something missing?** Open an issue in the Issues tab — we answer fast.

# Actor input Schema

## `stores` (type: `array`):

One per line: a store's homepage (whole catalog), a collection/category page (…/collections/sale) or a product page (…/products/…). Shopify and WooCommerce are detected automatically.

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

Upper limit of products read per store.

## `keywords` (type: `array`):

Keep products whose title, tags or product type contain ANY of these words (e.g. 'hoodie', 'vegan'). Empty = all.

## `onlyInStock` (type: `boolean`):

Skip sold-out products (and sold-out variants in variant mode).

## `oneRowPerVariant` (type: `boolean`):

Each size/colour as its own row with its own price, SKU and stock (Shopify). Off = one row per product with the variants inside.

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

Product description as clean text.

## `trackChanges` (type: `boolean`):

Adds 'change' (new, price_down, price_up, back_in_stock, out_of_stock, unchanged), 'previousPrice' and '% change' compared with your previous run on the same store/page, plus a free row listing removed products. The first run saves the baseline.

## `onlyChanges` (type: `boolean`):

With tracking: return only new products and price/stock changes — you pay only for those. Ideal for a daily schedule.

## Actor input object example

```json
{
  "stores": [
    "https://www.allbirds.com",
    "https://kyliecosmetics.com/collections/lips"
  ],
  "maxProductsPerStore": 5000,
  "onlyInStock": false,
  "oneRowPerVariant": false,
  "includeDescription": true,
  "trackChanges": false,
  "onlyChanges": false
}
```

# Actor output Schema

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

One row per result.

# 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 = {
    "stores": [
        "https://www.allbirds.com",
        "https://kyliecosmetics.com/collections/lips"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidydata/shopify-woocommerce-scraper").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 = { "stores": [
        "https://www.allbirds.com",
        "https://kyliecosmetics.com/collections/lips",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tidydata/shopify-woocommerce-scraper").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 '{
  "stores": [
    "https://www.allbirds.com",
    "https://kyliecosmetics.com/collections/lips"
  ]
}' |
apify call tidydata/shopify-woocommerce-scraper --silent --output-dataset

```

## MCP server setup

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

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/oOqwvnkEqqJPMx8ly/builds/PNM6lWyqigiCyf7Ta/openapi.json
