# Shopify Products, Price & Stock Monitor (`luminar/shopify-products-price-stock-monitor`) Actor

Export public Shopify products with detailed variants, prices and availability. Compare previous runs to track verified price, stock and catalog changes.

- **URL**: https://apify.com/luminar/shopify-products-price-stock-monitor.md
- **Developed by:** [Luka](https://apify.com/luminar) (community)
- **Categories:** E-commerce
- **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 with variants

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?

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

Export products from the Shopify stores you already follow, with variant prices, currency and availability together in each product row.

- Collect known store, collection or product URLs in one run.
- Keep public variant IDs, options and SKUs alongside prices and availability.
- Compare a previous run to see verified price, availability and catalog changes.

![Actual product variants](https://api.apify.com/v2/key-value-stores/DJgPR6wwS2tIaLDQW/records/shopify_products_price_stock_monitor--bb7ae81b66b58245-productVisual.png)

### 🚀 Start in 60 seconds

Keep the example product URL and click **Start**. Open **Products and changes** when the run finishes. One verified product costs **$0.0058**: a $0.005 check plus $0.0008 for the product and its variants.

### 🎯 Choose the right workflow

| Workflow | Use it for | Previous run |
|---|---|---|
| Get current products | A current catalog export | Not required |
| Track price and stock changes | Compare current products with an earlier snapshot | Provide the previous successful run ID with the same target URLs |

The first monitoring run marks verified products NEW. For each subsequent comparison, use the successful run ID returned as `snapshotRunId`. Each subsequent run checks current products again and has the same product charge even when nothing changed.

### 📦 What you get

One row per verified product, including all verified public variants. JSON preserves the structured `variants` array. CSV includes the same array as a JSON cell, keeping product billing independent of the number of variants.

Product fields include stable IDs, public URL, title, description, vendor, type, tags, images, source dates, currency, lowest price and availability. Each variant includes its ID, title, options, SKU, price, compare-at price, currency and availability.

Monitoring adds `changeTypes` and `previous` values. Confirmed removals appear as `recordType=change` rows at no additional product charge. Availability is a public buyability flag; it does not measure stock quantity or sales.

### 🎛️ Input guide

| Input | Meaning |
|---|---|
| `startUrls` | 1–20 clean HTTPS store, collection or product URLs |
| `workflow` | `snapshot` or `monitor` |
| `previousRunId` | Successful run of this Actor for the same targets; monitoring only |
| `maxProducts` | Combined product limit, 1–10,000; default 1,000 |
| `maxBuyerChargeUsd` | Buyer spending limit; default $1 |

Use a locale-specific URL when needed. Prices and currency describe that public storefront context, not every international market. Set the spending limit high enough for the requested maximum products, even when a smaller result is expected.

### 💰 Pricing

**$0.005 per verified catalog check + $0.80 per 1,000 verified products.** Variants and change comparisons are included. A verified empty check costs $0.005. A failed, unverified check is free. Verified products in an incomplete run may still be charged; unverified products are excluded.

| Verified products | Complete charge |
|---:|---:|
| 1 | $0.0058 |
| 100 | $0.085 |
| 1,000 | $0.805 |
| 10,000 | $8.005 |

These are Actor charges. Review the active pricing shown above before starting.

### ✅ Coverage you can trust

- **COMPLETE:** all catalog pages in the requested scope were read, and each included product has verified variant details and currency.
- **CAPPED:** the requested product limit prevented completion.
- **PARTIAL:** some requested products or targets could not be verified.
- **FAILED:** no requested scope could be verified; no product snapshot is committed.

A missing product becomes REMOVED only when both the previous and current scans of its target are complete. Output safeguards allow up to 25 MB of normalized products per run and 256 KB per product; larger results finish incomplete and do not imply removals. Catalogs can change while a run is in progress; observations are not a transactionally consistent merchant export.

### 🔌 API and automation

```json
{
  "startUrls": ["https://www.deathwishcoffee.com/products/power-surge-coffee"],
  "workflow": "snapshot",
  "maxProducts": 1000,
  "maxBuyerChargeUsd": 1
}
```

Download JSON or CSV from the Dataset. For a repeat comparison, select `monitor` and supply the last successful `previousRunId`. Keep the target URLs unchanged so the snapshots describe the same scope.

### ⚠️ Not yet supported

Global store discovery, merchant accounts, private or password-protected catalogs, wholesale prices, cart mutations, inventory quantity probing, sales estimates and source access challenges are not supported. Headless storefronts may not expose a usable public catalog.

Products whose public detail reaches the source limit of 250 variants are excluded as unverified; a partial response is never advertised as a complete product. This Actor does not promise every variant of every Shopify product. Gymshark did not pass the current public catalog test. The current public route was observed on Death Wish Coffee and Allbirds; support for other stores is verified per run.

### ❓ FAQ and support

**Why does an unchanged scan cost money?** It performs a fresh catalog and product check. The comparison is included in the product charge.

**Does unavailable mean a sale occurred?** No. It only means the public availability flag changed.

**Can I compare different target lists?** Start a new baseline instead. A comparison requires the same target scope.

For support, share the run ID and expected public target, without account credentials. This independent Luminar product is not affiliated with or endorsed by Shopify or the monitored stores.

# Actor input Schema

## `workflow` (type: `string`):

Get current products, or compare current products with a previous run.

## `startUrls` (type: `array`):

Use 1–20 clean HTTPS URLs from known Shopify stores. Query strings, account pages and password-protected stores are not supported.

## `previousRunId` (type: `string`):

For Track changes, copy the ID of a successful run of this Actor with the same target URLs. Leave empty for the first snapshot. Each run returns snapshotRunId for the next comparison.

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

Includes all requested stores combined. Variants are included in each product. Reaching a limit produces CAPPED coverage; missing products are not treated as removed.

## `maxBuyerChargeUsd` (type: `number`):

Must cover $0.005 per verified check plus $0.0008 × the requested maximum products. An unchanged scan costs the same as a current export of the same products.

## Actor input object example

```json
{
  "workflow": "snapshot",
  "startUrls": [
    "https://www.deathwishcoffee.com/products/power-surge-coffee"
  ],
  "maxProducts": 1000,
  "maxBuyerChargeUsd": 1
}
```

# Actor output Schema

## `products` (type: `string`):

Download current products and confirmed catalog changes.

# 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 = {
    "workflow": "snapshot",
    "startUrls": [
        "https://www.deathwishcoffee.com/products/power-surge-coffee"
    ],
    "maxProducts": 1000,
    "maxBuyerChargeUsd": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("luminar/shopify-products-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 = {
    "workflow": "snapshot",
    "startUrls": ["https://www.deathwishcoffee.com/products/power-surge-coffee"],
    "maxProducts": 1000,
    "maxBuyerChargeUsd": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("luminar/shopify-products-price-stock-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 '{
  "workflow": "snapshot",
  "startUrls": [
    "https://www.deathwishcoffee.com/products/power-surge-coffee"
  ],
  "maxProducts": 1000,
  "maxBuyerChargeUsd": 1
}' |
apify call luminar/shopify-products-price-stock-monitor --silent --output-dataset

```

## MCP server setup

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