# Shopify Price & Stock Monitor (`xtech/shopify-price-stock-monitor`) Actor

𝗧𝗿𝗮𝗰𝗸 𝗦𝗵𝗼𝗽𝗶𝗳𝘆 𝗽𝗿𝗶𝗰𝗲𝘀, 𝗱𝗶𝘀𝗰𝗼𝘂𝗻𝘁𝘀 & 𝘀𝘁𝗼𝗰𝗸 by variant. Detect price changes, restocks, sell-outs, and added or removed variants across scheduled runs. Export a clean change feed with no Shopify account or API key needed.

- **URL**: https://apify.com/xtech/shopify-price-stock-monitor.md
- **Developed by:** [Xtech](https://apify.com/xtech) (community)
- **Categories:** E-commerce, Automation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 product checks

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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Price & Stock Monitor tracks prices, compare-at sale prices, and public variant availability for the exact Shopify product URLs you provide. Schedule repeated checks to detect price changes, restocks, sell-outs, and new or removed variants without a Shopify login or API key.

**Unofficial tool. Not affiliated with, endorsed by, or sponsored by Shopify or any monitored store.**

### Track Shopify prices and stock

Add up to 50 public Shopify product-page URLs. The first tracked run creates a baseline for every variant found on those pages. Later runs compare the current product data with that baseline and return a focused change feed by default.

This Actor monitors explicit product URLs only. It does not discover or scrape a store's full catalog.

### Shopify product monitor input

- **Product URLs:** Public Shopify `/products/` pages or their `.js` product URLs.
- **Track changes:** Save a baseline for future comparisons.
- **Include unchanged variants:** Return a complete current snapshot instead of changes only.
- **Snapshot store name:** Keep one watchlist's history separate from another.
- **Concurrent checks:** Check between 1 and 10 products at once.
- **Proxy configuration:** Useful when a storefront restricts cloud traffic.

```json
{
  "productUrls": [
    "https://www.allbirds.com/products/mens-tree-runner-go"
  ],
  "trackChanges": true,
  "includeUnchanged": false,
  "snapshotStoreName": "competitor-running-shoes"
}
````

### Shopify price and availability data

Each result represents one product variant. Available fields include product and variant titles, vendor, SKU, options, current price, compare-at price, currency, sale status, public availability, product image, check time, and source product URL.

Change fields show whether a variant is new, changed, unchanged, removed, not found, or not checked. When a price or availability value changes, the result can also include its previous value.

### Shopify competitor monitoring use cases

- Watch selected competitor products for discounts or price increases.
- Detect public restock and sell-out signals.
- Track new or removed sizes, colours, and other variants.
- Feed a spreadsheet, dashboard, or alerting workflow with scheduled checks.

### Pricing

Pricing is based on successfully checked product URLs, not the number of variants returned. Failed or unavailable product checks are not successful product checks. Use the run spending limit to control the maximum cost of a watchlist.

### Shopify monitor FAQ and limitations

**Can it monitor a whole Shopify store?** No. Provide every product page you want to monitor.

**Is availability an inventory quantity?** No. It is the storefront's public availability signal, not a guaranteed stock count or fulfilment promise.

**Are changes detected in real time?** No. Changes are detected between runs, so schedule checks at the frequency your use case needs.

Password-protected products, non-Shopify pages, removed products, or storefronts that block access may not return usable data. Prices can also vary by market, currency, or shopper context.

# Actor input Schema

## `productUrls` (type: `array`):

Public Shopify product-page URLs. Product JSON URLs ending in .js are also accepted. Add up to 50 products per run.

## `trackChanges` (type: `boolean`):

Save a compact baseline in Key-Value Store and label price, sale-price, availability, new-variant, and removed-variant changes on future runs.

## `includeUnchanged` (type: `boolean`):

Turn this on to receive a complete current snapshot on every run. Leave it off for a lean change feed after the first run.

## `snapshotStoreName` (type: `string`):

Use the same name on recurring runs to preserve one watchlist's baseline. Choose another name to keep watchlists separate.

## `maxConcurrency` (type: `integer`):

How many product pages to check at once. A modest setting is friendlier to monitored stores.

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

Use Apify Proxy when a storefront blocks cloud IP addresses. Automatic proxy works for many stores; choose Residential only when you need stronger access.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.allbirds.com/products/mens-tree-runner-go"
  ],
  "trackChanges": true,
  "includeUnchanged": false,
  "snapshotStoreName": "shopify-price-stock-monitor-snapshots",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `priceAndStockChanges` (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 = {
    "productUrls": [
        "https://www.allbirds.com/products/mens-tree-runner-go"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtech/shopify-price-stock-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 = {
    "productUrls": ["https://www.allbirds.com/products/mens-tree-runner-go"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("xtech/shopify-price-stock-monitor").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 '{
  "productUrls": [
    "https://www.allbirds.com/products/mens-tree-runner-go"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call xtech/shopify-price-stock-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify Price & Stock Monitor",
        "description": "𝗧𝗿𝗮𝗰𝗸 𝗦𝗵𝗼𝗽𝗶𝗳𝘆 𝗽𝗿𝗶𝗰𝗲𝘀, 𝗱𝗶𝘀𝗰𝗼𝘂𝗻𝘁𝘀 & 𝘀𝘁𝗼𝗰𝗸 by variant. Detect price changes, restocks, sell-outs, and added or removed variants across scheduled runs. Export a clean change feed with no Shopify account or API key needed.",
        "version": "0.2",
        "x-build-id": "QjJcLBRF8c2JGdfqN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/xtech~shopify-price-stock-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-xtech-shopify-price-stock-monitor",
                "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/xtech~shopify-price-stock-monitor/runs": {
            "post": {
                "operationId": "runs-sync-xtech-shopify-price-stock-monitor",
                "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/xtech~shopify-price-stock-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-xtech-shopify-price-stock-monitor",
                "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": [
                    "productUrls"
                ],
                "properties": {
                    "productUrls": {
                        "title": "Shopify product URLs",
                        "minItems": 1,
                        "maxItems": 50,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Public Shopify product-page URLs. Product JSON URLs ending in .js are also accepted. Add up to 50 products per run.",
                        "items": {
                            "type": "string",
                            "pattern": "^https?://.+/products/.+"
                        }
                    },
                    "trackChanges": {
                        "title": "Track changes between runs",
                        "type": "boolean",
                        "description": "Save a compact baseline in Key-Value Store and label price, sale-price, availability, new-variant, and removed-variant changes on future runs.",
                        "default": true
                    },
                    "includeUnchanged": {
                        "title": "Include unchanged variants",
                        "type": "boolean",
                        "description": "Turn this on to receive a complete current snapshot on every run. Leave it off for a lean change feed after the first run.",
                        "default": false
                    },
                    "snapshotStoreName": {
                        "title": "Snapshot store name",
                        "pattern": "^[A-Za-z0-9_-]+$",
                        "minLength": 1,
                        "maxLength": 100,
                        "type": "string",
                        "description": "Use the same name on recurring runs to preserve one watchlist's baseline. Choose another name to keep watchlists separate.",
                        "default": "shopify-price-stock-monitor-snapshots"
                    },
                    "maxConcurrency": {
                        "title": "Maximum concurrent checks",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many product pages to check at once. A modest setting is friendlier to monitored stores.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Use Apify Proxy when a storefront blocks cloud IP addresses. Automatic proxy works for many stores; choose Residential only when you need stronger access."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
