Shopify & WooCommerce Products Scraper avatar

Shopify & WooCommerce Products Scraper

Pricing

from $1.20 / 1,000 products

Go to Apify Store
Shopify & WooCommerce Products Scraper

Shopify & WooCommerce Products Scraper

Scrape Shopify and WooCommerce product catalogs in one Actor: titles, prices, compare-at, variants, stock, images, tags and categories. Auto-detects platform from any store URL, collection or product page. Unified JSON/CSV. $1.20 per 1,000 products for both platforms.

Pricing

from $1.20 / 1,000 products

Rating

0.0

(0)

Developer

A Q

A Q

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Share

One Actor for both platforms. Scrape Shopify and WooCommerce product catalogs into a single clean schema: title, price, compare-at, discount, variants, stock, images, tags, categories, vendor and ratings (Woo). Paste any store URL — we auto-detect the platform. $1.20 per 1,000 products.

What can this scraper do?

  • 🛍️ Shopify + WooCommerce in one run — no need for two Actors or two schemas.
  • 🔗 Any URL works: store homepage, Shopify /collections/…, /products/…, or a Woo /product-category/… page.
  • 💰 Prices done right: Shopify currency from /meta.json / cart.js; Woo minor-unit handling from the Store API.
  • 📦 Variants: nested under each product by default, or one dataset row per variant (variantRows).
  • 🔎 Filters: include/exclude keywords on title & tags, only in-stock.
  • ⚡ Pure JSON APIs (Shopify products.json, Woo Store API) — fast, no browser, no login.
  • 🤖 Flat JSON input for the API, Zapier, Make, n8n and the Apify MCP server.

Why both platforms in one Actor?

Most Store scrapers cover either Shopify or WooCommerce. Catalogs, price monitors and dropshipping tools usually need both. This Actor auto-detects the platform per URL and returns the same fields every time, so your pipeline stays simple.

How to use it

  1. Add store URLs (one per line). Homepages are fine.
  2. Optionally set max products per store / total, keywords or only in-stock.
  3. Click Start, or call the Actor from the API and schedule it.

Input example

{
"storeUrls": [
"https://gymshark.com",
"https://www.allbirds.com/collections/mens",
"https://woocommerce.com"
],
"maxProductsPerStore": 50,
"onlyInStock": false,
"variantRows": false
}

Empty input runs a small demo (Gymshark + the public WooCommerce demo store, capped for a fast test).

Output example

{
"platform": "shopify",
"store": "Allbirds",
"storeUrl": "https://gymshark.com",
"productId": "7340901859408",
"handle": "womens-allbirds-flip-flop-dusty-pink",
"title": "Women's Allbirds Flip Flop - Dusty Pink",
"url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
"vendor": "Allbirds",
"productType": "Shoes",
"categories": [],
"tags": ["shoprunner"],
"description": "…",
"price": 25,
"compareAtPrice": 50,
"discountPercent": 50,
"currency": "USD",
"priceMin": 25,
"priceMax": 25,
"inStock": true,
"variantsCount": 7,
"variants": [{ "id": "42146889039952", "title": "5", "sku": "A12513W050", "price": 25, "compareAtPrice": 50, "available": true, "options": ["5"], "barcode": null }],
"options": [{ "name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"] }],
"images": ["https://cdn.shopify.com/…"],
"mainImage": "https://cdn.shopify.com/…",
"createdAt": "2026-03-27T21:03:50.000Z",
"updatedAt": "2026-10-15T05:17:19.000Z",
"publishedAt": "2026-09-25T23:58:13.000Z",
"averageRating": null,
"reviewCount": null,
"scrapedAt": "2026-10-15T05:20:00.000Z"
}

Per-store results (platform, found, saved, errors) are saved to the RUN_STATS record. Stores that are neither Shopify nor Woo get an uncharged error row.

How much does it cost?

This Actorautofacts/shopifytrovevault Shopify / Woowebdatalabs Shopify
Per 1,000 products$1.20$1.20 (FREE tier)~$1.00$10.00
PlatformsShopify + WooCommerceShopify onlySeparate ActorsShopify only
Actor start$0.002variesvariesvaries

You only pay for products pushed to the dataset. A store that can't be read costs nothing, and the max cost per run setting is respected exactly.

Use cases

  • Competitor price monitoring — track price and compare-at across Shopify and Woo shops on a schedule.
  • Catalog export — pull a full product feed (CSV/JSON/Excel) for analysis or migration.
  • Dropshipping research — discover products, variants, vendors and stock signals at scale.
  • Market / assortment analysis — categories, tags, ratings (Woo) and image counts in one table.

API / JS / Python

curl "https://api.apify.com/v2/acts/best_apis~shopify-woocommerce-products-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"storeUrls":["https://gymshark.com"],"maxProductsPerStore":20}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('best_apis/shopify-woocommerce-products-scraper').call({
storeUrls: ['https://gymshark.com'],
maxProductsPerStore: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('best_apis/shopify-woocommerce-products-scraper').call(run_input={
'storeUrls': ['https://gymshark.com'],
'maxProductsPerStore': 20,
})
print(client.dataset(run['defaultDatasetId']).list_items().items)

FAQ

Is it legal to scrape product data? This Actor only reads public product JSON that Shopify and WooCommerce expose for storefronts. It collects no customer or personal data. Always check the store's terms and your local rules for your use case.

Why did a store return 0 products? It may not be Shopify/Woo, the Store API may be disabled, your filters removed everything, or the site blocked the request. Check RUN_STATS and the uncharged error row.

Do I need proxies? Usually no. If a store blocks datacenter IPs and you didn't pick a proxy group, the Actor can fall back to RESIDENTIAL automatically.

Shopify vs Woo detection? We probe Shopify products.json / collections/…/products.json first, then the WooCommerce Store API (/wp-json/wc/store/v1/products and the rest_route fallback).

One row per variant? Set variantRows: true.