# Shopify Catalog & Price Scraper (`seeb/shopify-catalog-price-scraper`) Actor

Scrape Shopify storefront product catalogs with titles, prices, variants, availability, vendors, product URLs, and ecommerce research fields.

- **URL**: https://apify.com/seeb/shopify-catalog-price-scraper.md
- **Developed by:** [Techionik](https://apify.com/seeb) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Catalog & Price Scraper

Scrape public Shopify product catalogs and optionally scrape stores for new products, price changes, restocks, sell-outs, and removed products.

This Actor is built for predictable output. In normal catalog mode, the number entered in **Max products per store** is the maximum number of product rows written to the dataset for each store.

### What You Get

- Product title, handle, URL, vendor, type, tags, images, and publish dates
- Variant IDs, titles, SKUs, prices, compare-at prices, and availability
- Product-level minimum and maximum prices
- Product-level availability and sale status
- Optional change change detection between runs

### Quick Start

1. Enter one or more Shopify store domains, for example `deathwishcoffee.com`.
2. Set **Max products per store** to the number of product rows you want.
3. Leave **Scraper changes since last run** off for a one-time catalog scrape.
4. Turn **Scraper changes since last run** on for scheduled tracking.
5. Keep **Output only the changes** off unless you want change events instead of product rows.

### Result Limits And Billing

Apify charges for dataset results based on rows written to the dataset. This Actor keeps that simple:

- If **Max products per store** is `20`, normal output writes up to 20 product rows per store.
- Turning on **Scraper changes since last run** does not double the normal dataset output.
- Change Detection snapshots and latest change details are saved in a named key-value store so scheduled runs can compare against previous runs.
- Change rows are written to the dataset only when **Output only the changes** is enabled.

Recommended setup for most change detection users:

- **Scraper changes since last run:** on
- **Output only the changes:** off
- **Max products per store:** the number of product rows the user wants

With that setup, the user receives the latest product catalog while the Actor quietly keeps change detection state in storage.

### Change Detection Logic

When change detection is enabled, the Actor:

1. Fetches the current Shopify catalog.
2. Applies the selected product limit.
3. Compares the current products with the previous snapshot for that store.
4. Saves the new snapshot to a named key-value store.
5. Saves latest detected changes to a key such as `changes-example.com`.
6. Outputs either product rows or change rows, depending on **Output only the changes**.

Detected change types:

- `new_product`
- `removed_product`
- `price_change`
- `restock`
- `out_of_stock`

### Input Options

#### Shopify Store Domains

One or more Shopify store domains or URLs. Both `example.com` and `https://example.com` are accepted.

#### Max Products Per Store

Maximum number of products to fetch and output per store in normal catalog mode. Use `0` to fetch the full public catalog.

#### Scraper Changes Since Last Run

Compares the current run with the previous saved snapshot for each store. This is most useful when running the Actor on a schedule.

#### Output Only The Changes

Outputs change events instead of product rows. Use this when you want the dataset to contain only detected changes.

#### Proxy Configuration

Most public Shopify stores work without a proxy. If a store blocks datacenter requests with HTTP 403 or 429, enable Apify Proxy with a residential proxy group.

### Output

Normal output rows are product rows. Each row includes product metadata, prices, availability, and variants.

When **Output only the changes** is enabled, output rows are change events. Change events include the store, change type, product ID, and the relevant price or availability information when available.

### Storage

The Actor uses the named key-value store `shopify-catalog-price-scraper-state` for change detection state:

- `snapshot-<store>` stores the latest product snapshot for comparison.
- `changes-<store>` stores the latest detected changes for that store.

### Notes

- The Actor uses Shopify public catalog endpoints where available.
- Password-protected, custom headless, Hydrogen, or heavily protected storefronts may not expose a public catalog endpoint.
- For scheduled change detection, keep the same store domain format between runs so snapshots match cleanly.

# Actor input Schema

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

One or more Shopify store domains or URLs. Examples: deathwishcoffee.com, https://www.gymshark.com

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

Maximum product rows to write per store in normal output mode. 0 = the full public catalog.

## `monitorChanges` (type: `boolean`):

Compare against the previous snapshot in a named key-value store and save new products, price changes, restocks, sell-outs, and removed products there. Normal product output still respects Max products per store.

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

When change detection is on, output change events instead of product rows. Leave off for normal catalog output.

## `proxyConfiguration` (type: `object`):

Most small/mid stores need NO proxy. Only enable Apify Proxy → Residential if a large store returns HTTP 403.

## Actor input object example

```json
{
  "storeUrls": [
    "deathwishcoffee.com",
    "gymshark.com"
  ],
  "maxProductsPerStore": 0,
  "monitorChanges": false,
  "onlyChanges": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Normal runs contain product rows. When Output only the changes is enabled, rows contain change events.

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

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

# Run the Actor and wait for it to finish
run = client.actor("seeb/shopify-catalog-price-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": [
    "deathwishcoffee.com"
  ]
}' |
apify call seeb/shopify-catalog-price-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/M8MGkLTLMOtNu95MX/builds/8OU2c1WDo6HqRT5P2/openapi.json
