# Shopify Variant Price & Availability Monitor (`pantherjaboba/shopify-variant-monitor`) Actor

Monitor explicitly supplied public Shopify product URLs for variant price, compare-at-price, and storefront availability changes.

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

## Pricing

$10.00 / 1,000 successful 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/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 Variant Price & Availability Monitor

Monitor 1-10 explicit public Shopify product pages. Each successful check delivers one dataset item with the product title, product ID, observed presentment currency, variant count, current normalized variants, and deterministic changes to integer minor-unit `price`, `compare_at_price`, and boolean storefront `available` values.

The first check is a baseline and emits no alerts. Newly observed variants also start without an alert. A missing variant is reported only after two consecutive complete observations omit it. The Actor never infers inventory quantity from Shopify's boolean availability signal.

### Input

```json
{
  "productUrls": ["https://www.allbirds.com/products/mens-tree-runners"],
  "monitorId": "daily-shoes",
  "locale": ""
}
```

Use canonical HTTPS product URLs without credentials, custom ports, query strings, fragments, or trailing slashes. `locale` must match the optional locale path in every URL. Use a different `monitorId` for an independent baseline.

The prefilled Allbirds URL is a real public Shopify product URL verified on 2026-10-13. Its product HTML and product Ajax JSON both returned HTTP 200 and were permitted by its robots policy at verification time. The Actor checks the current policy on every run.

### Safety and data limits

- Only the explicit product HTML page and Shopify's documented read-only `GET /{locale}/products/{handle}.js` Ajax endpoint are used. The Ajax monetary fields reflect the anonymous request's presentment context; published product-page metadata must independently identify the same currency. The Actor never requests cart endpoints.
- DNS is resolved once; every answer must be public. HTTPS connects to an approved IP while preserving the original Host header and TLS SNI. Redirects are refused.
- Each request has a 15-second timeout and a 3 MB response limit. HTTP 403 stops that product check; no proxy, fingerprinting, retry bypass, cookies, access token, cart read or write, login, customer data, or order data is used.
- Robots rules must permit both the explicit product page and its product JSON path. Source terms remain the user's responsibility; the actor grants no permission or access beyond these public reads.
- Responses with 250 or more variants are rejected because completeness is unknown. Duplicate IDs, malformed booleans, non-integer prices, and ambiguous currency are rejected without replacing the prior baseline.
- Currency and locale are fixed within a monitor scope. A mismatch fails the check and preserves the old baseline.

### Pricing

Pay-per-event price: **$0.01 per successfully delivered product check**, including baseline and unchanged checks. Failed product checks are free. Configure a maximum charge to bound a run; the event charge is per product report rather than per variant or detected change.

### Scheduled monitoring and state

Keep a stable monitor ID, explicit product list and locale when scheduling the Actor in Apify. Its named state storage belongs to your own account; it cannot mix customer accounts. Overlapping runs of the same monitor are refused without charges. A baseline and an unchanged successful check each deliver a useful current report and are chargeable. No external alert is sent by this Actor: use your own Apify dataset integration or n8n/Make workflow for delivery. A resumed run never recharges an already-visible report; an uncertain interrupted charge may be waived. Storage removal or retention may reset the baseline.

Source: https://shopify.dev/docs/api/ajax/reference/product

# Actor input Schema

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

1-10 explicit canonical HTTPS product URLs. Query strings, redirects, private IPs, credentials, ports, and non-product paths are refused.

## `monitorId` (type: `string`):

Stable ID for this independent baseline (1-64 letters, numbers, dots, underscores, or hyphens).

## `locale` (type: `string`):

Optional lowercase locale prefix already present in every URL, for example en-us. Leave empty for root product URLs.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.allbirds.com/products/mens-tree-runners"
  ],
  "monitorId": "default",
  "locale": ""
}
```

# Actor output Schema

## `checks` (type: `string`):

Normalized current variants and deterministic price, compare-at-price, or availability 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 = {
    "productUrls": [
        "https://www.allbirds.com/products/mens-tree-runners"
    ],
    "monitorId": "default"
};

// Run the Actor and wait for it to finish
const run = await client.actor("pantherjaboba/shopify-variant-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-runners"],
    "monitorId": "default",
}

# Run the Actor and wait for it to finish
run = client.actor("pantherjaboba/shopify-variant-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 '{
  "productUrls": [
    "https://www.allbirds.com/products/mens-tree-runners"
  ],
  "monitorId": "default"
}' |
apify call pantherjaboba/shopify-variant-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pantherjaboba/shopify-variant-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/1iXKFoOcLa7Mad5wO/builds/mJGbgaEZg2pk14exy/openapi.json
