# Shopify Store Product Scraper (`exuberant_volley/shopify-store-scraper`) Actor

For agencies, catalog ops, and SaaS builders who just got a Shopify URL and need the full product dump now. Pulls title, price, variants, SKUs, stock, images via public products.json. No login, no personal data. Free to run.

- **URL**: https://apify.com/exuberant\_volley/shopify-store-scraper.md
- **Developed by:** [ScrapeForge](https://apify.com/exuberant_volley) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

## Shopify Product Scraper — Full Store Catalogs as Clean JSON

**Launch pricing: this actor currently adds no fee — run it on your Apify free-plan credits. Try it, bookmark it, wire it into your stack.**

A **Shopify product scraper** and **Shopify store scraper** in one: **scrape Shopify products** — full catalogs with variants, SKUs, prices, compare-at prices and availability — from any store. It's a **Shopify products.json scraper**, so it reads the store's own public JSON instead of fragile HTML, which makes it ideal for reliable **Shopify price monitoring** at daily-schedule quality.

> One run, whole catalog: every product, every variant, every price — and multi-store runs skip dead stores instead of failing.

### Who uses this

- **Merchants & competitor watchers** — diff a rival's prices and stock daily; `compareAtPrice` vs `price` exposes live discounts.
- **Dropshipping & product researchers** — analyze catalogs, price points and assortment depth across niches.
- **Agencies & consultants** — audit a client's (or prospect's) catalog structure, tags and image coverage in minutes.
- **Data & AI teams** — stable JSON for pipelines, LLM agents and enrichment jobs.

Watching big-box furniture prices too? The [IKEA Product Scraper](https://apify.com/exuberant_volley/ikea-product-scraper) does the same for any IKEA country store.

### How it works

For each store, the actor pages through the public `/products.json` endpoint (250 products per page) that Shopify exposes on virtually every storefront. No HTML parsing, no selectors to break. In multi-store runs, a store that fails or hides `products.json` is **skipped with a warning** — the run only fails if **no store at all** yields products.

### Output

One record per product (variants array included):

```json
{
  "store": "https://www.allbirds.com",
  "productId": 7292464955472,
  "title": "Men's Cruiser - Shadow Blue (Natural White Sole)",
  "handle": "mens-cruiser-shadow-blue-natural-white-sole",
  "url": "https://www.allbirds.com/products/mens-cruiser-shadow-blue-natural-white-sole",
  "vendor": "Allbirds",
  "productType": "Shoes",
  "tags": ["DNAM BRANDS", "EC STOCK"],
  "priceMin": 105,
  "priceMax": 105,
  "variantsCount": 13,
  "variants": [
    { "variantId": 41990816759888, "title": "8", "sku": "A12856M080", "price": 105, "compareAtPrice": null, "available": true }
  ],
  "image": "https://cdn.shopify.com/s/files/1/1104/4168/products/...",
  "imagesCount": 6,
  "createdAt": "2023-01-11T10:20:11-05:00",
  "updatedAt": "2026-07-14T22:03:41-04:00",
  "scrapedAt": "2026-07-15T09:34:24.539Z"
}
````

*(variants truncated here for brevity — the dataset contains all 13, each with SKU, price, compare-at price and availability)*

### Input

| Field | Default | Description |
|---|---|---|
| `storeUrl` | `https://www.allbirds.com` | A Shopify store homepage |
| `storeUrls` | — | Additional stores — scrape many in one run |
| `maxProducts` | `1000` | Stop after this many products across all stores |

**The default run needs no configuration** — an empty input scrapes the demo store.

### Reliability & limits

- **Depends on the store's public `products.json`**: the vast majority of Shopify stores expose it, but a store can disable it or sit behind a password page. Such stores are skipped (logged), and the run fails only when zero products came from all stores together.
- Prices are per-variant; `priceMin`/`priceMax` summarize the spread. Currency is the store's own currency (not converted).
- Very large catalogs paginate at 250 products/page; raise `maxProducts` accordingly.

### Paste this output into…

- **Google Sheets** — `=IMPORTDATA("https://api.apify.com/v2/acts/exuberant_volley~shopify-store-scraper/runs/last/dataset/items?format=csv&clean=1&token=YOUR_TOKEN&fields=store,title,vendor,productType,priceMin,priceMax,url,updatedAt")` for a live catalog sheet.
- **Make / n8n** — schedule daily, pull `.../runs/last/dataset/items`, and route price changes to Slack or email.
- **Discount detector (merchants)** — filter records where any variant has `compareAtPrice > price`; that's the store's live sale list — pipe it to a Slack channel every morning.

### ScrapeForge free data suite

One publisher, ten plug-and-play datasets — all currently free to run:

| Actor | What it delivers | |
|---|---|---|
| [Executive Changes Tracker](https://apify.com/exuberant_volley/executive-changes-scraper) | New CEO/CFO/board moves from SEC 8-Ks + official newswires — source-cited B2B trigger leads | [run it next →](https://apify.com/exuberant_volley/executive-changes-scraper) |
| [IKEA Product Scraper](https://apify.com/exuberant_volley/ikea-product-scraper) | Names, prices, ratings and images from any IKEA search or category page | [run it next →](https://apify.com/exuberant_volley/ikea-product-scraper) |
| [Shopify Store Scraper](https://apify.com/exuberant_volley/shopify-store-scraper) | Any Shopify store's full catalog — variants, SKUs, prices — via products.json | [run it next →](https://apify.com/exuberant_volley/shopify-store-scraper) |
| [App Store Apps Scraper](https://apify.com/exuberant_volley/app-store-apps-scraper) | App rankings, ratings, prices and metadata by keyword, any country | [run it next →](https://apify.com/exuberant_volley/app-store-apps-scraper) |
| [Remote Jobs Scraper](https://apify.com/exuberant_volley/remote-jobs-scraper) | Live remote listings from RemoteOK + Remotive, keyword-filtered | [run it next →](https://apify.com/exuberant_volley/remote-jobs-scraper) |
| [CoinGecko Market Scraper](https://apify.com/exuberant_volley/coingecko-market-scraper) | Top-coin prices, market caps and 24h moves — keyless | [run it next →](https://apify.com/exuberant_volley/coingecko-market-scraper) |
| [GitHub Repositories Scraper](https://apify.com/exuberant_volley/github-repos-scraper) | Repo search with stars, forks, topics and licenses | [run it next →](https://apify.com/exuberant_volley/github-repos-scraper) |
| [Hacker News Scraper](https://apify.com/exuberant_volley/hackernews-scraper) | Top/New/Best HN stories with scores and comment counts | [run it next →](https://apify.com/exuberant_volley/hackernews-scraper) |
| [Wikipedia Scraper](https://apify.com/exuberant_volley/wikipedia-scraper) | Article summaries, images and URLs in any language — RAG-ready | [run it next →](https://apify.com/exuberant_volley/wikipedia-scraper) |
| [SEC EDGAR Filings Scraper](https://apify.com/exuberant_volley/sec-edgar-filings-scraper) | Any US public company's filing history by ticker | [run it next →](https://apify.com/exuberant_volley/sec-edgar-filings-scraper) |

### Compliance

- **No personal data** — product catalog only (titles, prices, variants, images), GDPR-safe.
- Reads only the store's own public `products.json` endpoint — no logins, no cookies, no customer data.
- Records live only in your run's dataset; the actor keeps nothing beyond it.

# Actor input Schema

## `storeUrl` (type: `string`):

A Shopify store homepage, e.g. https://www.allbirds.com

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

Scrape multiple Shopify stores in one run.

## `maxProducts` (type: `integer`):

Stop after this many products (across all stores).

## Actor input object example

```json
{
  "storeUrl": "https://www.allbirds.com",
  "maxProducts": 1000
}
```

# 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 = {
    "storeUrl": "https://www.allbirds.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("exuberant_volley/shopify-store-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 = { "storeUrl": "https://www.allbirds.com" }

# Run the Actor and wait for it to finish
run = client.actor("exuberant_volley/shopify-store-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 '{
  "storeUrl": "https://www.allbirds.com"
}' |
apify call exuberant_volley/shopify-store-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify Store Product Scraper",
        "description": "For agencies, catalog ops, and SaaS builders who just got a Shopify URL and need the full product dump now. Pulls title, price, variants, SKUs, stock, images via public products.json. No login, no personal data. Free to run.",
        "version": "0.1",
        "x-build-id": "m5f7H5Y2eCUEaHc61"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/exuberant_volley~shopify-store-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-exuberant_volley-shopify-store-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/exuberant_volley~shopify-store-scraper/runs": {
            "post": {
                "operationId": "runs-sync-exuberant_volley-shopify-store-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/exuberant_volley~shopify-store-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-exuberant_volley-shopify-store-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",
                "properties": {
                    "storeUrl": {
                        "title": "Store URL",
                        "type": "string",
                        "description": "A Shopify store homepage, e.g. https://www.allbirds.com",
                        "default": "https://www.allbirds.com"
                    },
                    "storeUrls": {
                        "title": "Additional store URLs",
                        "type": "array",
                        "description": "Scrape multiple Shopify stores in one run.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxProducts": {
                        "title": "Max products",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Stop after this many products (across all stores).",
                        "default": 1000
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
