# Shopify Store Scraper & Price Monitor (`pantomath/shopify-store-scraper-price-monitor`) Actor

Scrape all products from any Shopify store or collection: prices, sale prices, variants, SKUs, stock, images, tags & store info. Monitoring mode returns only price & stock changes since the last run. $0.80 per 1,000 products.

- **URL**: https://apify.com/pantomath/shopify-store-scraper-price-monitor.md
- **Developed by:** [abdallah alramahi](https://apify.com/pantomath) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 product scrapeds

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 Store Scraper & Price Monitor

**Get every product from any Shopify store — prices, sale prices, variants, SKUs, stock, images and tags — and track price & stock changes over time. $0.80 per 1,000 products.**

Enter store domains or collection URLs. The Actor reads the store's public catalog (fast, no browser) and returns clean, analysis-ready data.

### Features

- **Full catalog** of any Shopify store, or just one **collection**
- **Prices**: min/max price, compare-at price, `onSale` flag — per product and per variant
- **Stock**: available flag, available variants count
- **Variants**: SKU, options (size/color…), weight, price, availability
- **Content**: description (clean text), images, vendor, product type, tags, created/updated/published dates
- **Store info**: name, country, city, currency, product & collection counts, ships-to countries
- **Two output modes**: one row per product, or **one row per variant** (perfect for spreadsheets)
- **Price & stock monitoring**: after the first (baseline) run, returns **only new products and products whose price, sale price or stock changed**, with `previousPrice` and `change` type
- **Filters**: keyword, in-stock only

### Use cases

- **Competitor price monitoring** for DTC and e-commerce brands
- **Dropshipping & product research** — find winning products, prices, launches
- **Market research** — catalogs, assortment, discount depth across stores
- **Agencies** — audit client and competitor stores in minutes
- **Retail arbitrage & deal alerts** — get notified when products go on sale or back in stock

### Pricing (pay per event)

| Event | Price |
|---|---|
| Product (or variant row) | $0.0008 |
| Store info | $0.001 |

1,000 products ≈ **$0.80**. In monitoring mode you only pay for changed products after the baseline run.

### Example output (product)

```json
{
  "type": "product",
  "store": "https://www.allbirds.com",
  "title": "Women's Allbirds Flip Flop - Dusty Pink",
  "url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
  "vendor": "Allbirds",
  "productType": "Shoes",
  "currency": "USD",
  "price": 25.0,
  "compareAtPrice": 50.0,
  "onSale": true,
  "available": false,
  "variantsCount": 9,
  "variants": [{ "variantId": 42146889039952, "title": "5", "sku": "A12513W050", "price": 25.0, "compareAtPrice": 50.0, "available": false }],
  "images": ["https://cdn.shopify.com/..."],
  "change": "price_changed",
  "previousPrice": 50.0
}
```

### How to monitor competitor prices

1. Add competitor store URLs, enable **Price & stock monitoring mode**.
2. Run once (baseline).
3. Create a daily **Schedule** and connect **Slack, email or Google Sheets** — you'll receive only the changes.

### FAQ

**Does it work on every Shopify store?** On the vast majority. A few stores are password-protected or block bots — the Actor logs a clear message and continues.

**Is stock quantity included?** Shopify's public catalog exposes availability (in/out of stock), not exact quantities.

**Is this legal?** The Actor reads the public product catalog that Shopify stores serve to every visitor. Use the data responsibly.

**Need a feature?** Open an issue — I usually respond within 24 hours.

# Actor input Schema

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

One per line: a domain (allbirds.com), a store URL, or a collection URL (https://gymshark.com/collections/womens).

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

Maximum number of products to read from each store or collection.

## `outputMode` (type: `string`):

One row per product (variants nested) or one row per variant (best for price tracking & spreadsheets).

## `keyword` (type: `string`):

Only products whose title, vendor, type or tags contain this text.

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

Skip products where no variant is available.

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

First run saves a baseline. Every next run returns only new products and products whose price, sale price or stock changed — with the previous values. Schedule it daily.

## `includeStoreInfo` (type: `boolean`):

Adds one record per store: name, country, city, currency, product & collection counts, ships-to countries.

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

Usually not needed. Use Apify Proxy if a store rate-limits you.

## Actor input object example

```json
{
  "storeUrls": [
    "allbirds.com"
  ],
  "maxProductsPerStore": 1000,
  "outputMode": "products",
  "onlyAvailable": false,
  "monitorChanges": false,
  "includeStoreInfo": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

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

// Run the Actor and wait for it to finish
const run = await client.actor("pantomath/shopify-store-scraper-price-monitor").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": ["allbirds.com"] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pantomath/shopify-store-scraper-price-monitor"
        }
    }
}
```

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/BedRNsewyqxCFOGV5/builds/dQGx5mqBKbLnoss04/openapi.json
