# Competitor Price Monitor - Product Matching & Stock Alerts (`ntriqpro/retail-price-monitor`) Actor

Monitor public retail offers with variant-aware product matching, price changes and stock evidence.

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

## Pricing

from $30.00 / 1,000 product offer observeds

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

## Competitor Price Monitor - Product Matching & Stock Alerts

Monitor public Shopify catalogs and product-page Schema.org JSON-LD for price, promotion, and stock-availability changes. The Actor emits one dataset row per deduplicated offer or variant and keeps run notices and summaries in the default key-value store.

### Why this monitor is different

- Identifier-first matching: exact GTIN, or exact brand plus MPN/model.
- Explicit variant and pack conflicts abstain instead of forcing a false match.
- ProductGroup pages emit their real size, color, pattern, and material variants without an extra group-summary offer.
- Price, currency, availability, and structured unit evidence remain separate so an inferred unit price is never presented as observed data.
- Partial collection is disclosed and never used to infer removals.

Product titles and merchant-local SKUs do not establish identity. Unknown or unsupported currency is `null`; do not compare prices across observations unless both rows have the same explicit currency. Unit and pack matching is used only when structured source data and reference fields make it explicit.

### Inputs

Use either `stores` for public Shopify roots or `productUrls` for public HTTPS product pages. The two modes cannot target the same host in one run. Tracking parameters, fragments, duplicate URLs, and store path variations are normalized before monitoring. `referenceProducts` accepts GTIN or brand plus MPN/model, with optional `variant`, `packSize`, and `packUnit` conflict guards. `monitoringKey` gives a monitor a stable customer-defined baseline scope.

The default input monitors `https://www.allbirds.com/products/mens-strider-explore` with `monitoringKey: "default"` and returns at most 25 observations. Collection supports up to 20 stores, 100 product URLs, 1,000 reference products, 10,000 catalog products per store, and 20,000 delivered observations.

### Output and history

Dataset rows are offer observations. `STATUS`, `SUMMARY`, and `OUTPUT` in the default key-value store describe completion, partial sources, first-seen/changed/unchanged counts, and nonbillable notices. A partial run preserves prior unobserved offers and does not infer removals.

History assumes the same actor, user, normalized input configuration, and `monitoringKey`. Changing that scope starts a different baseline. Source data can change between requests, and public catalogs do not provide inventory counts. Shopify availability is an availability signal only.

### Billing

A valid run start costs $0.03 and each delivered offer observation costs $0.03. The default maximum is $0.78: one $0.03 start plus up to 25 observations at $0.03 each. Free and paid Apify users receive the same inputs, collection limits, and result fields. Invalid input and KVS notices are not observation events.

Dataset storage and event charging are separate Apify operations, so exactly-once delivery is not guaranteed if storage, charging, or the run fails between those operations. A billing limit or delivery failure stops further observations and prevents an unsafe baseline replacement.

### Support limits

Only public HTTPS Shopify catalog JSON and server-visible Schema.org product JSON-LD are supported. JavaScript-rendered content, logins, CAPTCHA or anti-bot bypass, private APIs, exact inventory counts, and universal merchant coverage are outside scope. The network client rejects credentials, custom ports, IP literals, private/link-local/metadata addresses, and unsafe redirects.

This Actor is unofficial and is not affiliated with Shopify, Allbirds, or any monitored merchant.

# Actor input Schema

## `stores` (type: `array`):

Up to 20 public HTTPS Shopify roots. Do not combine a store with product URLs on the same host.

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

Up to 100 public HTTPS product pages. Tracking parameters and fragments are removed.

## `referenceProducts` (type: `array`):

Up to 1,000 products identified by GTIN or brand plus MPN/model. Enter IDs, GTINs, MPNs and models as strings to preserve leading zeros. Optional variant, numeric packSize and string packUnit are explicit conflict guards.

## `includeVendors` (type: `array`):

Optional exact public-catalog vendor allowlist, up to 100 names.

## `monitoringKey` (type: `string`):

Stable customer-defined key for a monitor baseline.

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

Maximum source products read from each Shopify catalog before marking it partial.

## `maxResults` (type: `integer`):

Maximum offer observations delivered and charged in this run.

## `concurrency` (type: `integer`):

Maximum number of public source requests processed concurrently.

## `maxPages` (type: `integer`):

Maximum number of catalog pages requested from each configured source.

## `maxBodyBytes` (type: `integer`):

Maximum accepted response size in bytes for each source request.

## `requestTimeoutMs` (type: `integer`):

Maximum time in milliseconds allowed for each source request.

## `maxRunSeconds` (type: `integer`):

Internal runtime cap only. It does not change the platform timeout in Run options, which must be larger. The 240-second default leaves 60 seconds below the 300-second platform default. Larger inputs may require more memory.

## Actor input object example

```json
{
  "stores": [],
  "productUrls": [
    "https://www.allbirds.com/products/mens-strider-explore"
  ],
  "referenceProducts": [],
  "includeVendors": [],
  "monitoringKey": "default",
  "maxProductsPerStore": 100,
  "maxResults": 25,
  "concurrency": 4,
  "maxPages": 120,
  "maxBodyBytes": 2097152,
  "requestTimeoutMs": 15000,
  "maxRunSeconds": 240
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `status` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `output` (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-strider-explore"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ntriqpro/retail-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 = { "productUrls": ["https://www.allbirds.com/products/mens-strider-explore"] }

# Run the Actor and wait for it to finish
run = client.actor("ntriqpro/retail-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 '{
  "productUrls": [
    "https://www.allbirds.com/products/mens-strider-explore"
  ]
}' |
apify call ntriqpro/retail-price-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ntriqpro/retail-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/uWw9SloecQkSPb6hX/builds/676D4l9tfn0SZJwWu/openapi.json
