# Shopify Product Scraper — Any Store (`sleek_waveform/universal-shopify-scraper`) Actor

Lightning-fast scraper exploiting Shopify's internal JSON APIs to extract entire product catalogs in seconds. Extracts SKUs, prices, variants, and stock levels without a browser.

- **URL**: https://apify.com/sleek\_waveform/universal-shopify-scraper.md
- **Developed by:** [Daniel Dimitrov](https://apify.com/sleek_waveform) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 3 total users, 1 monthly users, 96.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 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.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Universal Shopify Product & Lead Scraper

Extract thousands of products from any Shopify-powered online store in seconds. Universal Shopify Scraper bypasses standard HTML rendering entirely by tapping into Shopify's built-in `/products.json` API endpoint — no headless browser needed, making it one of the fastest and most cost-efficient e-commerce scrapers available.

### What does Universal Shopify Scraper do?

Universal Shopify Scraper is an Apify Actor that extracts structured product data from any [Shopify](https://www.shopify.com/) store. Universal Shopify Scraper can extract:

- **Product details** — title, vendor, price, compare-at price, tags, and product URL
- **Variant data** — individual sizes, colors, SKUs, and variant-specific pricing as flat, CSV-ready rows
- **Images** — main product image URL for each product or variant
- **Multi-store support** — scrape multiple Shopify stores in a single run
- **Hybrid fallback** — automatically switches to HTML/JSON-LD extraction if the JSON API is disabled

### Why scrape Shopify stores?

Shopify powers over 4.4 million online stores worldwide, making it the largest e-commerce platform by store count. The product data on these stores is a goldmine for business intelligence.

Here are just some of the ways you could use that data:

- **Dropshipping research** — discover trending products, compare supplier pricing, and identify profitable niches
- **Competitor price monitoring** — track competitor pricing changes in real-time to optimize your own pricing strategy
- **Market research** — analyze product catalogs, brand positioning, and assortment strategies across any market segment
- **Inventory tracking** — monitor stock levels, new product launches, and catalog changes at scale
- **Lead generation** — build lists of Shopify store owners and vendors for B2B outreach

If you would like more inspiration on how scraping Shopify stores could help your business, check out our [industry pages](https://apify.com/industries).

### How to scrape Shopify stores

1. Click on **Try for free**.
2. Enter one or more Shopify store URLs in the `storeUrls` field (e.g., `https://gymshark.com`).
3. Set `maxProductsPerStore` (0 = scrape entire catalog) and enable `includeVariants` if you need size/color-level data.
4. Click on **Run**.
5. When Universal Shopify Scraper has finished, preview or download your data from the **Dataset** tab.

### How much will it cost to scrape Shopify stores?

Apify gives you $5 free usage credits every month on the [Apify Free plan](https://apify.com/pricing). Because this Actor uses direct JSON API calls with no browser overhead, you can extract approximately **50,000 products per month** for that, so those 50,000 products will be completely free!

But if you need to get more data regularly from Shopify stores, you should grab an Apify subscription. We recommend our [$49/month Personal plan](https://apify.com/pricing) — you can get up to **500,000 products every month** with the $49 monthly plan!

Or get **5,000,000+ products** for $499 with the [Team plan](https://apify.com/pricing) — wow!

### Input parameters for Shopify Scraper

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `storeUrls` | Array | ✅ | — | Base domains of Shopify stores to scrape (e.g., `https://gymshark.com`) |
| `maxProductsPerStore` | Integer | ❌ | 0 | Maximum products to extract per store. Set to 0 to scrape the entire catalog |
| `includeVariants` | Boolean | ❌ | `false` | If true, creates a separate row for every variant (size, color, SKU) |
| `webhookUrl` | String | ❌ | — | URL to receive a POST notification when the run finishes |

### Output from Shopify Scraper

Each scraped product is stored as a JSON record in the Actor's dataset:

```json
{
  "storeUrl": "https://gymshark.com",
  "productTitle": "Crest Oversized T-Shirt",
  "vendor": "Gymshark",
  "price": "30.00",
  "compareAtPrice": "40.00",
  "sku": "GS-CREST-BLK-M",
  "productUrl": "https://gymshark.com/products/crest-oversized-t-shirt",
  "imageUrl": "https://cdn.shopify.com/s/files/gymshark/crest-tee-black.jpg",
  "tags": ["t-shirts", "oversized", "mens", "new-arrivals"]
}
````

| Field | Type | Description |
|-------|------|-------------|
| `storeUrl` | String | The originating Shopify store domain |
| `productTitle` | String | The main product name |
| `vendor` | String | Brand or vendor listed on Shopify |
| `price` | String | Current product price |
| `compareAtPrice` | String | Original/compare-at price (for sale items) |
| `sku` | String | Stock Keeping Unit (variant-specific when variants enabled) |
| `productUrl` | String | Direct link to the product page |
| `imageUrl` | String | Main product image URL |
| `tags` | Array | Shopify categorization tags assigned to the product |

### Shopify Scraper webhook integration

You can automatically send scraped data to your favorite tools (Google Sheets, CRM, Slack) as soon as the Actor finishes running.

1. Generate a webhook URL in your automation platform (Make.com, Zapier, or n8n).
2. Paste that URL into the `webhookUrl` input field.
3. When the Actor finishes, it sends a POST request with the `resultsUrl` so your automation can fetch the data.

```json
{
  "actorName": "universal-shopify-scraper",
  "runId": "abc123def456",
  "datasetId": "xyz789",
  "resultsUrl": "https://api.apify.com/v2/datasets/xyz789/items?format=json&clean=true",
  "status": "SUCCESS",
  "timestamp": "2026-03-09T10:00:00.000Z"
}
```

### Tips for scraping Shopify stores

- **Start with one store** to verify data quality before running multi-store scrapes
- **Enable variants** only when you need SKU-level data — it multiplies the row count significantly
- **Set `maxProductsPerStore`** to a small number (e.g., 10) for testing, then set to 0 for full catalog extraction
- **Use the webhook** to automate downstream workflows — pipe data directly into Google Sheets or your CRM

### Is it legal to scrape Shopify stores?

This Actor uses Shopify's publicly accessible `/products.json` endpoint, which every Shopify store serves without authentication. This is equivalent to viewing a page in a browser — no login bypass, no terms violation. Scraping publicly available product catalog data for research, competitive analysis, and market intelligence is widely practiced and generally lawful.

Note that personal data is protected by GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers. We also recommend that you read our blog post: [is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### FAQ about Shopify Product Scraper

**Does it work on all Shopify stores?**
It works on all publicly accessible Shopify stores (stores not behind a password). A small number of stores disable the `/products.json` API; the Actor automatically falls back to HTML/JSON-LD extraction in those cases.

**How fast is it?**
Extremely fast. A 1,000-product Shopify catalog typically completes in under 60 seconds — far faster than browser-based scrapers because it uses direct JSON API calls with no page rendering.

**Does it get all variants (sizes, colors)?**
Yes, when `includeVariants: true` is set. Each size/color/SKU combination becomes a separate row, making it easy to build a flat spreadsheet with one row per buyable item.

**Can I scrape multiple Shopify stores at once?**
Yes. Add multiple store domains to `storeUrls`. All results land in the same dataset with `storeUrl` as a filter column.

**Does it get the product description?**
The current version extracts title, vendor, price, compare-at price, SKU, image URL, and tags. Full HTML product descriptions are not extracted by default.

**What's the difference between `price` and `compareAtPrice`?**
`price` is the current selling price. `compareAtPrice` is the original/MSRP price shown when an item is marked as on sale. Items with `compareAtPrice > price` are on sale.

**How many products can I get on the free plan?**
With Apify's $5 monthly free credit, approximately **50,000 products** at no cost.

### Popular Shopify stores for competitive research

| Category | Example stores |
|----------|---------------|
| Fitness apparel | Gymshark, Lululemon (check), Alphalete |
| DTC beauty | Glossier, Fenty Beauty |
| Streetwear | Supreme (check), Palace, Kith |
| Pet supplies | BarkBox, Wild One |
| Home goods | Parachute, Brightland |
| Supplements | Momentous, AG1 (check) |

### Other sleek\_waveform Actors you might like

- **[eBay Arbitrage Scraper](https://apify.com/sleek_waveform/resale-arbitrage-monitor)** — compare Shopify retail prices with eBay resale prices to identify arbitrage opportunities. Pair with Shopify data to find items selling below market.
- **[Yelp Business Scraper](https://apify.com/sleek_waveform/yelp-scraper)** — extract Yelp business listings and reviews. Pair with Shopify supplier data to build lead lists for B2B supplier outreach.
- **[Google Maps B2B Lead Scraper](https://apify.com/sleek_waveform/us-b2b-leads-google-maps)** — find US businesses by niche. Use to identify Shopify stores with a local retail presence for competitor research.

***

*Found this Actor useful? Leave a review on the Apify Store — it takes 30 seconds and helps other developers discover it.*

# Actor input Schema

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

List of base URLs for the Shopify stores (e.g., https://gymshark.com).

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

Maximum number of products to scrape from each store. Set to 0 for unlimited.

## `includeVariants` (type: `boolean`):

Whether to extract product variants (sizes, colors) as separate rows, useful for dropshippers.

## `webhookUrl` (type: `string`):

Optional: A URL that will receive a POST request when the crawl finishes. Useful for Make.com, Zapier, or custom APIs.

## Actor input object example

```json
{
  "storeUrls": [
    {
      "url": "https://gymshark.com"
    }
  ],
  "maxProductsPerStore": 0,
  "includeVariants": false,
  "webhookUrl": "https://your-api.com/webhook"
}
```

# Actor output Schema

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

No description

# 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": [
        {
            "url": "https://gymshark.com"
        }
    ],
    "webhookUrl": "https://your-api.com/webhook"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sleek_waveform/universal-shopify-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 = {
    "storeUrls": [{ "url": "https://gymshark.com" }],
    "webhookUrl": "https://your-api.com/webhook",
}

# Run the Actor and wait for it to finish
run = client.actor("sleek_waveform/universal-shopify-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    {
      "url": "https://gymshark.com"
    }
  ],
  "webhookUrl": "https://your-api.com/webhook"
}' |
apify call sleek_waveform/universal-shopify-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sleek_waveform/universal-shopify-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify Product Scraper — Any Store",
        "description": "Lightning-fast scraper exploiting Shopify's internal JSON APIs to extract entire product catalogs in seconds. Extracts SKUs, prices, variants, and stock levels without a browser.",
        "version": "1.0",
        "x-build-id": "EWFoTRxa10UTeL1SS"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sleek_waveform~universal-shopify-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sleek_waveform-universal-shopify-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sleek_waveform~universal-shopify-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sleek_waveform-universal-shopify-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sleek_waveform~universal-shopify-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sleek_waveform-universal-shopify-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "storeUrls"
                ],
                "properties": {
                    "storeUrls": {
                        "title": "Store URLs",
                        "type": "array",
                        "description": "List of base URLs for the Shopify stores (e.g., https://gymshark.com).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxProductsPerStore": {
                        "title": "Max Products Per Store",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of products to scrape from each store. Set to 0 for unlimited.",
                        "default": 0
                    },
                    "includeVariants": {
                        "title": "Include Variants",
                        "type": "boolean",
                        "description": "Whether to extract product variants (sizes, colors) as separate rows, useful for dropshippers.",
                        "default": false
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "Optional: A URL that will receive a POST request when the crawl finishes. Useful for Make.com, Zapier, or custom APIs."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
