# Structured Product Price & Stock Delta Monitor (`stellar_ballet_0bu/schema-product-delta-monitor`) Actor

Monitor product pages with Schema.org Product JSON-LD for price drops, sale starts, availability changes, and clean stateful deltas across non-Shopify and non-WooCommerce stores.

- **URL**: https://apify.com/stellar\_ballet\_0bu/schema-product-delta-monitor.md
- **Developed by:** [Nikita S](https://apify.com/stellar_ballet_0bu) (community)
- **Categories:** E-commerce, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## Structured Product Price & Stock Delta Monitor

Monitor **any public product page** that exposes Schema.org `Product` JSON-LD and emit clean deltas for price, currency, and availability changes.

This is the third Actor in the e-commerce monitoring line: Shopify catalog deltas, WooCommerce Store API deltas, and now product-page Schema.org deltas for Magento, BigCommerce, custom stores, and long-tail product pages.


<!-- store-visuals:start -->

### Visual demo: Schema Product Delta Monitor

<a href="https://api.apify.com/v2/key-value-stores/yjcSu1xOwpsFPXeto/records/schema-product-delta-monitor-hero.svg" target="_blank"><img src="https://api.apify.com/v2/key-value-stores/yjcSu1xOwpsFPXeto/records/schema-product-delta-monitor-hero.svg" alt="Schema Product Delta Monitor visual overview" width="780"></a>

<a href="https://api.apify.com/v2/key-value-stores/yjcSu1xOwpsFPXeto/records/schema-product-delta-monitor-workflow.svg" target="_blank"><img src="https://api.apify.com/v2/key-value-stores/yjcSu1xOwpsFPXeto/records/schema-product-delta-monitor-workflow.svg" alt="Schema Product Delta Monitor workflow diagram" width="780"></a>

<a href="https://api.apify.com/v2/key-value-stores/yjcSu1xOwpsFPXeto/records/schema-product-delta-monitor-sample-output.svg" target="_blank"><img src="https://api.apify.com/v2/key-value-stores/yjcSu1xOwpsFPXeto/records/schema-product-delta-monitor-sample-output.svg" alt="Schema Product Delta Monitor sample output dataset row" width="620"></a>

These images are hosted in a persistent Apify key-value store so the Store README has stable, clickable visual previews.

<!-- store-visuals:end -->

### Jobs this Actor does

1. **Any-store competitor price monitoring** — track direct product URLs when there is no Shopify/WooCommerce catalog endpoint.
2. **Structured data extraction** — read Schema.org Product JSON-LD instead of brittle CSS selectors.
3. **Stateful delta feed** — first run creates a baseline; later scheduled runs emit only changed products.

### Input example

```json
{
  "productUrls": ["https://example.com/product/demo-boot"],
  "onlyChanged": true,
  "persistState": true,
  "minPriceChangePct": 0,
  "priceDropAlertPct": 20
}
````

### Output example

```json
{
  "pageUrl": "https://example.com/product/demo-boot",
  "productUrl": "https://example.com/product/demo-boot",
  "productId": "BOOT-42",
  "name": "Demo Boot",
  "sku": "BOOT-42",
  "brand": "DemoBrand",
  "price": 70,
  "currency": "USD",
  "availability": "out_of_stock",
  "available": false,
  "checkedAt": "2026-07-07T08:00:00.000Z",
  "status": "changed",
  "event": "price_change",
  "events": ["price_change", "sold_out"],
  "event_severity": "high",
  "changes": [
    { "field": "price", "before": 100, "after": 70 },
    { "field": "available", "before": true, "after": false }
  ]
}
```

### Limitations

- Requires public HTML with Schema.org `Product` JSON-LD.
- Does not bypass login, paywalls, CAPTCHA, Cloudflare, or anti-bot systems.
- Some sites expose incomplete structured data; if price/availability is absent, the row will reflect the missing fields.
- Designed for monitoring known URLs, not crawling a full catalog.

### Monetization-ready events

The Actor emits `Actor.charge()` hooks for:

- `delta_result` — one emitted non-unchanged product delta row;
- `price_drop_alert` — one high-severity price drop above `priceDropAlertPct`;
- `apify-actor-start` — one run start.

Pricing must be present in Apify `pricingInfos` before these become billable.

### Run it from Claude / Cursor / VS Code via MCP

The Actor is available through the Apify MCP server, so you can ask your AI assistant to "extract product prices and stock from these pages" without writing scraper code.

Add this to your MCP client config (for example `claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": ["-y", "@apify/mcp-server"],
      "env": {
        "APIFY_TOKEN": "your-apify-api-token"
      }
    }
  }
}
```

Once connected, the assistant can discover this Actor and trigger runs with a plain prompt like *"Run Schema.org Product Delta Monitor on these 5 product page URLs and show me which ones changed price since yesterday."* The remote MCP server at `https://mcp.apify.com` works the same way without a local install.

### Quick start

1. Open this Actor in Apify Console.
2. Paste one or more Schema.org Product page URLs into the input.
3. Keep `persistState` enabled for scheduled monitoring.
4. Run once to create the baseline snapshot.
5. Run again on a schedule to receive only delta rows.
6. Export the dataset to CSV/JSON, or send it to Google Sheets, n8n, Make, Slack, Discord, or a webhook.

### Sample output

Use this sample dataset to see the output shape before running it yourself:

- Sample dataset: https://console.apify.com/storage/datasets/zPzkBueEvcY7JX6oC

The important fields for automation are `event`, `events`, `event_severity`, `status`, and `changes`. Filter for `event_severity = high` when you only want alerts that deserve immediate attention.

### Pricing and cost expectations

This Actor is designed for scheduled monitoring and delta-only outputs. It avoids charging or processing unchanged rows where possible. Pay-Per-Event pricing is scheduled/used for meaningful emitted deltas such as new items, removed items, price changes, stock changes, URL changes, or pricing-plan changes depending on the Actor.

Start with a small input list first. Once the baseline looks correct, schedule recurring runs and set a reasonable max charge limit in Apify.

### FAQ

#### Is this a one-time scraper or a monitor?

It is a monitor. The first run creates a baseline. Later runs compare the current data against the stored baseline and emit only the changes.

#### Can I send alerts to Slack, Discord, Google Sheets, n8n, or Make?

Yes. Use Apify integrations, webhooks, dataset export, or API polling. The `event`, `events`, `event_severity`, and `changes` fields are meant for automation routing.

#### Does it bypass CAPTCHA, login walls, or anti-bot systems?

No. This portfolio is intentionally focused on public, low-risk sources such as public APIs, feeds, sitemaps, product pages, or storefront endpoints.

#### Which rows should trigger alerts?

Use `event_severity`. High-severity rows are the best candidates for Slack/Discord/email alerts. Low-severity rows are usually better for reports or spreadsheets.

### Support and custom monitoring

If a public source does not fit this Actor, check the related monitors below. Open an issue on the Actor page with a sample URL and the output you need.

### Which monitor should I use?

This Actor is part of a focused monitoring portfolio. Pick the narrowest Actor that matches your source:

| Source you have | Use this Actor | Best for |
|---|---|---|
| Shopify store | [Shopify Delta Monitor](https://apify.com/stellar_ballet_0bu/shopify-delta-monitor) | Shopify competitor price/stock/sale monitoring |
| WooCommerce store | [WooCommerce Delta Monitor](https://apify.com/stellar_ballet_0bu/woocommerce-delta-monitor) | WooCommerce Store API product deltas |
| Product page URLs with Schema.org JSON-LD | [Schema.org Product Delta Monitor](https://apify.com/stellar_ballet_0bu/schema-product-delta-monitor) | Magento, BigCommerce, custom stores, marketplaces |
| Product feeds / APIs / CSV / XML | [Product Feed Delta Monitor](https://apify.com/stellar_ballet_0bu/product-feed-delta-monitor) | Supplier feeds, affiliate feeds, Google Merchant exports |
| sitemap.xml | [Sitemap Delta Monitor](https://apify.com/stellar_ballet_0bu/sitemap-delta-monitor) | SEO, content ops, RAG indexing queues |
| SaaS pricing pages | SaaS Pricing Page Monitor | Plan/price/feature changes on public pricing pages |

All monitors are built for scheduled runs, stateful comparisons, delta-only outputs, and workflow automation via Google Sheets, n8n, Make, Slack, Discord, or webhooks.

# Actor input Schema

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

Public product pages that expose Schema.org Product JSON-LD or microdata in the HTML.

## `previousItems` (type: `array`):

Optional previous dataset items from an earlier run. Used to compute deltas.

## `onlyChanged` (type: `boolean`):

Skip unchanged products. New, changed, removed, and error rows are still emitted.

## `persistState` (type: `boolean`):

Store the latest snapshot in a named key-value store so scheduled runs emit deltas next time.

## `stateStoreName` (type: `string`):

Named key-value store used for snapshots when persistState is enabled.

## `stateKey` (type: `string`):

Optional snapshot key. Leave empty to use one key derived from all input URLs.

## `minPriceChangePct` (type: `number`):

Minimum absolute percentage price change needed to emit a price\_change event. Set 0 to report every price change.

## `priceDropAlertPct` (type: `number`):

Price decreases at or above this threshold also emit price\_drop\_alert charging hook.

## Actor input object example

```json
{
  "productUrls": [
    "https://woocommerce.com/products/bl-bulk-image-uploader/"
  ],
  "previousItems": [],
  "onlyChanged": true,
  "persistState": true,
  "stateStoreName": "schema-product-delta-monitor-state",
  "stateKey": "",
  "minPriceChangePct": 0,
  "priceDropAlertPct": 20
}
```

# Actor output Schema

## `deltaRows` (type: `string`):

Default dataset items with product page status, price, currency, availability, named events, event\_severity, and changes array.

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

Run summary with pages seen, emitted count, event counters, state key, and errors.

# 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://woocommerce.com/products/bl-bulk-image-uploader/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("stellar_ballet_0bu/schema-product-delta-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://woocommerce.com/products/bl-bulk-image-uploader/"] }

# Run the Actor and wait for it to finish
run = client.actor("stellar_ballet_0bu/schema-product-delta-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://woocommerce.com/products/bl-bulk-image-uploader/"
  ]
}' |
apify call stellar_ballet_0bu/schema-product-delta-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stellar_ballet_0bu/schema-product-delta-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Structured Product Price & Stock Delta Monitor",
        "description": "Monitor product pages with Schema.org Product JSON-LD for price drops, sale starts, availability changes, and clean stateful deltas across non-Shopify and non-WooCommerce stores.",
        "version": "0.1",
        "x-build-id": "AFe26F78fxFkdEg4Z"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stellar_ballet_0bu~schema-product-delta-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stellar_ballet_0bu-schema-product-delta-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/stellar_ballet_0bu~schema-product-delta-monitor/runs": {
            "post": {
                "operationId": "runs-sync-stellar_ballet_0bu-schema-product-delta-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/stellar_ballet_0bu~schema-product-delta-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-stellar_ballet_0bu-schema-product-delta-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": "Product page URLs",
                        "type": "array",
                        "description": "Public product pages that expose Schema.org Product JSON-LD or microdata in the HTML.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "previousItems": {
                        "title": "Previous items",
                        "type": "array",
                        "description": "Optional previous dataset items from an earlier run. Used to compute deltas.",
                        "default": []
                    },
                    "onlyChanged": {
                        "title": "Only output changed items",
                        "type": "boolean",
                        "description": "Skip unchanged products. New, changed, removed, and error rows are still emitted.",
                        "default": true
                    },
                    "persistState": {
                        "title": "Persist state between runs",
                        "type": "boolean",
                        "description": "Store the latest snapshot in a named key-value store so scheduled runs emit deltas next time.",
                        "default": true
                    },
                    "stateStoreName": {
                        "title": "State store name",
                        "type": "string",
                        "description": "Named key-value store used for snapshots when persistState is enabled.",
                        "default": "schema-product-delta-monitor-state"
                    },
                    "stateKey": {
                        "title": "State key override",
                        "type": "string",
                        "description": "Optional snapshot key. Leave empty to use one key derived from all input URLs.",
                        "default": ""
                    },
                    "minPriceChangePct": {
                        "title": "Minimum price change %",
                        "minimum": 0,
                        "type": "number",
                        "description": "Minimum absolute percentage price change needed to emit a price_change event. Set 0 to report every price change.",
                        "default": 0
                    },
                    "priceDropAlertPct": {
                        "title": "Price-drop alert threshold %",
                        "minimum": 1,
                        "type": "number",
                        "description": "Price decreases at or above this threshold also emit price_drop_alert charging hook.",
                        "default": 20
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
