# Shopify Scraper (`automly/shopify-products-scraper`) Actor

Scrape any public Shopify store's products: title, price range, variants, SKUs, images, availability and dates. Just add store links. For price monitoring and catalog research. Export to CSV, JSON or Excel, schedule runs or use the API.

- **URL**: https://apify.com/automly/shopify-products-scraper.md
- **Developed by:** [Automly](https://apify.com/automly) (community)
- **Categories:** E-commerce
- **Features:** Limited permissions
- **Stats:** 5 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.55 / 1,000 results

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

## Shopify Scraper - Products, Prices, Variants & Stock

### What is Shopify Scraper?

**Shopify Scraper** is a tool that lets you **scrape products from any public Shopify store**: titles, prices, sale prices, variants, SKUs, stock, images, tags and timestamps, as one clean row per product. Add one or more store URLs, click **Start**, and download the catalog as Excel, CSV or JSON.

- 🛍️ **Whole catalogs:** every product of a store, or just the collections you choose
- 💲 **Clean prices:** real decimal prices (`19.99`), not cents you have to divide by 100
- 🏬 **Many stores at once:** scrape a whole list of competitors in one run
- 🔓 **No login:** no Shopify API key, app, account or store permission needed
- 💸 **Free to try:** the $5 of free usage every Apify account gets each month covers about 3,200 products

### What can Shopify Scraper do?

- Scrape **all products from a Shopify store**
- Scrape a **Shopify collection** (for example `mens-shoes`)
- Get **Shopify product prices** and **compare-at (sale) prices**
- Get **every variant** with SKU, options, price and stock
- Download **all product image URLs**
- Keep only products in a **price range** or **in stock**
- Scrape **many Shopify stores** in one run
- **Monitor competitor prices** on a schedule
- Export to Excel, CSV, JSON, HTML or XML, or send the products to Google Sheets, Make, Zapier and more

### How to scrape Shopify products without the API

Shopify's official API needs a custom app, OAuth and the store owner's permission, which you don't have for stores you don't own. With Shopify Scraper you skip all of that and get each store's **public** product catalog, the same data the storefront shows to anyone. **No API key, no login, no app install.**

It also works on many stores with a custom-built storefront, where simpler scrapers return nothing. If a store can't be read at all, the run tells you which one.

### What data can you extract from a Shopify store?

| | | |
|---|---|---|
| 🏷️ Product title and handle | 🔗 Product URL | 🆔 Shopify product ID |
| 🏭 Vendor (brand) | 📦 Product type | 🔖 Tags |
| 💲 Lowest and highest price | 💸 Compare-at (original) price | 💱 Currency |
| ✅ In stock or not | 🎨 Variants with SKU, options and stock | 🖼️ All image URLs |
| ⚖️ Weight, shipping and tax flags per variant | 📅 Created and updated dates | 🕒 Scrape time |

### How to scrape a Shopify store

1. [Create a free Apify account](https://console.apify.com/sign-up) (no credit card needed).
2. Open **Shopify Scraper**.
3. Add one or more **Store URLs** (a bare domain like `allbirds.com`, the home page, or any product or collection URL), and optionally some **Collections**.
4. Set **Max products per store** and any price or in-stock filter, then click **Start**.
5. When the run finishes, download the products as Excel, CSV, JSON, HTML or XML.

### Why use this Shopify scraper?

- **Clean prices:** real decimal values (`98.00`), not raw integers multiplied by 100 that you have to divide yourself.
- **Works on custom storefronts:** many stores with a custom-built front end work where lighter scrapers come back empty.
- **Built-in filters:** price range and in-stock filters, so your dataset only contains the products you asked for.
- **Multi-store:** scrape a whole list of competitors in a single run.
- **No API key, no login:** just URLs in, structured data out.

### How much does it cost to scrape Shopify products?

You pay **$1.55 per 1,000 products**, plus a start fee of **$0.05 per run** at the default settings. Apify platform usage is included in that price, so there is nothing else to pay.

For example, a run that scrapes 1,000 products costs $1.55 for the products plus $0.05 to start, $1.60 in total.

Every Apify account gets **$5 of free usage each month**, enough for about 3,200 products. See the **Pricing** tab for details.

### ⬇️ Input

| Setting | What it does |
|---|---|
| Store URLs | The Shopify stores to scrape. A bare domain, the home page, or any product or collection URL; only the store address is used |
| Collections (optional) | Collection handles or URLs to scrape instead of the whole catalog, applied to every store |
| Max products per store | How many products to keep from each store, after the filters (default 1,000) |
| Include variants | Add the full list of variants to each product (on by default) |
| Include images | Add the list of image URLs to each product (on by default) |
| Only available products | Skip products with no variant in stock |
| Minimum price / Maximum price | Keep products whose lowest variant price is in this range, in the store's currency |

Connection settings: the default works for most runs.

Example: two stores, in-stock products priced 20 or more in the store's currency.

```json
{
  "storeUrls": ["https://www.allbirds.com", "https://www.kith.com"],
  "collections": [],
  "maxProductsPerStore": 500,
  "includeVariants": true,
  "includeImages": true,
  "onlyAvailable": true,
  "minPrice": 20
}
```

Example: one collection only.

```json
{
  "storeUrls": ["allbirds.com"],
  "collections": ["mens-shoes"],
  "maxProductsPerStore": 100
}
```

### ⬆️ Output

You get one row per product. You can view them as a table in Apify Console or download them as Excel, CSV, JSON, HTML or XML. Here is a real row, shortened to two variants, two tags and two images:

```json
{
  "storeUrl": "https://www.allbirds.com",
  "productId": 7340901859408,
  "title": "Women's Allbirds Flip Flop - Dusty Pink",
  "handle": "womens-allbirds-flip-flop-dusty-pink",
  "productUrl": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
  "vendor": "Allbirds",
  "productType": "Shoes",
  "tags": [
    "allbirds::carbon-score => undefined",
    "allbirds::cfId => color-a4d5d0f6620dc304306f503bf67bc5f9"
  ],
  "priceMin": 25,
  "priceMax": 25,
  "compareAtPriceMin": 50,
  "currency": "USD",
  "available": true,
  "variantCount": 7,
  "variants": [
    {
      "variantId": 42146889039952,
      "title": "5",
      "sku": "A12513W050",
      "price": 25,
      "compareAtPrice": 50,
      "available": false,
      "options": ["5"],
      "requiresShipping": true,
      "taxable": true,
      "grams": 455,
      "position": 1
    },
    {
      "variantId": 42146889072720,
      "title": "6",
      "sku": "A12513W060",
      "price": 25,
      "compareAtPrice": 50,
      "available": false,
      "options": ["6"],
      "requiresShipping": true,
      "taxable": true,
      "grams": 492,
      "position": 2
    }
  ],
  "imageUrls": [
    "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345",
    "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_BACK.png?v=1774646345"
  ],
  "createdAt": "2026-03-27T14:03:50-07:00",
  "updatedAt": "2026-10-01T15:22:00-07:00",
  "scrapedAt": "2026-10-01T22:22:02Z"
}
```

| Field | Description |
|-------|-------------|
| `title`, `handle`, `productUrl` | Product name, slug and canonical URL |
| `productId` | Shopify numeric product ID |
| `vendor`, `productType`, `tags` | Brand, type and tags |
| `priceMin` / `priceMax` | Lowest and highest variant price (real decimals, **not** x100) |
| `compareAtPriceMin` | Original price when the product is on sale |
| `currency` | Store currency code (for example `USD`) |
| `available` | `true` when at least one variant is in stock |
| `variantCount`, `variants` | Per-variant ID, title, SKU, price, compare-at price, options, stock, shipping and tax flags, weight in grams and position |
| `imageUrls` | All product image URLs |
| `createdAt`, `updatedAt`, `scrapedAt` | When the product was created and last updated, and when it was scraped |

### How can I use Shopify product data?

- **Price monitoring:** track competitor prices and discounts across stores
- **Competitor analysis:** compare catalogs, variants, vendors and tags
- **Catalog research and enrichment:** build product datasets for your own apps
- **Inventory tracking:** watch stock status and new product launches
- **Market research:** see how brands structure products, pricing and metadata
- **AI and search:** feed clean product data into search, RAG or agents

### How to monitor Shopify prices

1. Add the competitor stores you want to watch.
2. [Schedule the actor](https://docs.apify.com/platform/schedules) to run every day or every week.
3. Compare `priceMin`, `compareAtPriceMin` and `available` between runs, or send each run to Google Sheets with an [integration](https://apify.com/integrations).

### Scrape more e-commerce data

| Actor | What it gets |
|---|---|
| [Amazon Products Scraper - Fast & Efficient (with Sales Data)](https://apify.com/automly/amazon-products-scraper---fast-efficient-with-sales-data) | Amazon product pages with price, BSR, variants, reviews and monthly sales estimates |
| [Amazon Reviews Scraper - Ratings, Verified Purchases & Images](https://apify.com/automly/amazon-reviews-scraper) | Amazon customer reviews with rating, text, date and verified purchase badge |
| [Walmart Scraper - Products, Prices, Stock & Reviews](https://apify.com/automly/walmart-scraper) | Walmart products with price, was price, stock and seller |
| [Target.com Scraper - Products, Prices & Stock](https://apify.com/automly/target-com-scraper) | Target products with prices, availability, ratings and specifications |
| [eBay Scraper](https://apify.com/automly/ebay-scraper) | eBay listings across 8 marketplaces with prices, shipping, condition and seller ratings |

### ❓FAQ

#### How much does it cost to scrape a Shopify store?

$1.55 per 1,000 products plus $0.05 per run, with platform usage included. See **How much does it cost to scrape Shopify products?** above for an example.

#### How do I know if a website is built on Shopify?

Visit `https://thestore.com/admin`. If you land on a **Shopify login page**, the store runs on Shopify and Shopify Scraper can scrape it.

#### Do I need a Shopify API key or app?

No. Shopify Scraper collects each store's public storefront data. You need no API key, OAuth, app install or Shopify account.

#### Can I scrape a single collection instead of the whole store?

Yes. Add the collection handle (`mens-shoes`) or the full collection URL to **Collections**.

#### Why are the prices "clean" and not multiplied by 100?

You get real decimal prices (`19.99`). Some scrapers return Shopify's raw integer cents (`1999`) and leave you to divide. This one doesn't.

#### What if a store can't be read?

If a store allows no public access to its catalog at all, or the site isn't a Shopify store, the run's status names the store it couldn't read. A run where no store could be read is marked as failed instead of finishing with an empty dataset.

#### Does "Max products per store" count products before or after the filters?

After. With a price or in-stock filter, Shopify Scraper keeps going until it has that many matching products or the catalog runs out.

#### Can I scrape many stores at once?

Yes. Add a list of store URLs and they are all scraped in one run.

#### What export formats are supported?

JSON, CSV, Excel, HTML and XML, from the **Storage** tab or the Apify API.

#### Can I connect Shopify Scraper to other tools or AI agents?

Yes. Start runs and download results with the Apify API or the Python and JavaScript clients, send results to Make, Zapier, n8n, Google Sheets or Slack with Apify integrations and webhooks, or let AI assistants and agents run it through the Apify MCP server at [mcp.apify.com](https://mcp.apify.com).

#### Is it legal to scrape Shopify?

Shopify Scraper only collects product information that stores show publicly to every visitor. It does not collect customer or order data. If any data you collect contains personal data, it may be protected by laws such as GDPR, so only scrape for a legitimate reason and ask a lawyer if you are unsure. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

Shopify Scraper is an independent tool. It is not affiliated with, endorsed by or sponsored by Shopify.

#### Something isn't working. What should I do?

Open the **Issues** tab and tell us the store URL and what you expected.

### ⭐ Your feedback

Have an idea or found a problem? Tell us on the **Issues** tab. If Shopify Scraper saved you time, a short review on the **Reviews** tab helps other people find it.

# Actor input Schema

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

Public Shopify store URLs to scrape (one per line). Accepts a bare domain (allbirds.com), the store home page, or any product/collection URL — only the store origin is used. The store's public product catalog is read.

## `collections` (type: `array`):

Optional. Collection handles or collection URLs to scrape instead of the whole catalog (for example: mens-shoes, or https://www.allbirds.com/collections/mens-shoes). When set, only products in these collections are fetched, applied to every store. Leave empty to scrape all products.

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

Maximum number of products to collect from each store (after filtering). Use a small number for quick tests and a larger one for a full catalog export.

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

When enabled, each product record includes the full list of variants (price, compare-at price, SKU, options, availability). Disable for a lighter record with only the aggregate price range.

## `includeImages` (type: `boolean`):

When enabled, each product record includes the list of product image URLs. Disable to omit image URLs.

## `onlyAvailable` (type: `boolean`):

When enabled, products with no purchasable (in-stock) variant are skipped.

## `minPrice` (type: `integer`):

Optional. Only keep products whose lowest variant price is at least this value (in the store's currency). Leave empty for no lower bound.

## `maxPrice` (type: `integer`):

Optional. Only keep products whose lowest variant price is at most this value (in the store's currency). Leave empty for no upper bound.

## `useApifyProxy` (type: `boolean`):

Use Apify Proxy. Recommended; the default works for most stores.

## `proxyGroups` (type: `array`):

Optional proxy groups. Leave empty for the default. If a store comes back empty, try a different proxy option. Only applies when 'Use Apify Proxy' is enabled.

## Actor input object example

```json
{
  "storeUrls": [
    "https://colourpop.com"
  ],
  "maxProductsPerStore": 1000,
  "includeVariants": true,
  "includeImages": true,
  "onlyAvailable": false,
  "useApifyProxy": true
}
```

# Actor output Schema

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

All product records produced by this run.

## `overview` (type: `string`):

Dataset presented using the overview view.

# 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://colourpop.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/shopify-products-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": ["https://colourpop.com"] }

# Run the Actor and wait for it to finish
run = client.actor("automly/shopify-products-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 '{
  "storeUrls": [
    "https://colourpop.com"
  ]
}' |
apify call automly/shopify-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automly/shopify-products-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/YPQvTfrFPH2sqxSaa/builds/byIMapxcTzh5cMfwp/openapi.json
