# Cross-Store Product Radar (`rikayushi/cross-store-product-radar`) Actor

- **URL**: https://apify.com/rikayushi/cross-store-product-radar.md
- **Developed by:** [Diego Andrés Macedo](https://apify.com/rikayushi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 product results

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

## Cross-Store Product Radar

Turn public product pages into useful competitor intelligence. The Actor extracts normalized product data, identifies the same item across stores, compares prices by currency, and detects price or availability changes between runs.

### Input

```json
{
  "urls": [
    "https://store-a.example/products/headphones",
    "https://store-b.example/products/headphones"
  ],
  "monitorName": "weekly-headphones",
  "alertOnNew": false,
  "fullSnapshot": false
}
```

Each run accepts 1–50 public HTTP/HTTPS product URLs. Local, private-network and credential-bearing URLs are rejected.

- `monitorName`: reuse the same name to compare the current run with its previous successful run.
- `alertOnNew`: also emit an alert for newly seen URLs.
- `fullSnapshot`: report missing URLs as removed. Enable it only when every monitored URL is included in every run.

### Output

The default dataset contains four simple record types:

- `product`: normalized product data from each URL.
- `comparison`: matched offers, confidence, matching reasons, lowest price and price spread per currency.
- `alert`: price, availability, new-product or removed-product changes.
- `run_summary`: totals for the run.

Failed URLs become `error` rows so one bad page does not lose the batch. A failed run does not overwrite a saved monitor, and removals are not reported if any URL failed.

### Matching rules

The matcher favors evidence that can be explained:

1. Exact GTIN/UPC/EAN.
2. Same brand and MPN.
3. Same brand and SKU.
4. Same brand plus a highly similar title.
5. The same distinctive product name and compatible size/dosage, even when one store omits identifiers.

Conflicting GTINs, brands, sizes or dosages prevent a fuzzy match. Prices in different currencies are never compared as if they were equivalent. The input validator also catches two URLs accidentally pasted into a single line.

### Pricing event

Only a valid extracted product emits the `product-result` event. Comparisons, alerts, summaries, errors, and pages without recognizable product data are included without another event charge. Recommended launch price: `$0.00075` per `product-result` after cloud cost tests confirm the margin.

The Actor stops before the next URL when the run reaches the customer's maximum charge. A charge-limited run is treated as partial, so it cannot erase unseen monitor state or create false removal alerts.

### Limits

- Version 0.3 reads public server-rendered HTML; JavaScript-only product data may not be visible yet.
- No login, CAPTCHA solving, residential proxy or retailer-specific bypasses.
- Input is currently a list of product pages, not automatic whole-store discovery.
- Extraction does not verify whether a merchant's claims are accurate or current.

### Local check

```sh
npm install
npm test
```

To run locally, create `storage/key_value_stores/default/INPUT.json`, then run `npm start`.

# Changelog

This Actor's version history is a separate document: https://apify.com/rikayushi/cross-store-product-radar/changelog.md

# Actor input Schema

## `urls` (type: `array`):

Public HTTP or HTTPS product pages. Paste each product URL as a separate item.

## `monitorName` (type: `string`):

Reuse the same name in future runs to detect price and availability changes.

## `alertOnNew` (type: `boolean`):

Only applies when a monitor name is provided.

## `fullSnapshot` (type: `boolean`):

Enable only when every monitored URL is included. Missing products will be reported as removed.

## Actor input object example

```json
{
  "urls": [
    "https://schema.org/Product"
  ],
  "monitorName": "",
  "alertOnNew": false,
  "fullSnapshot": false
}
```

# Actor output Schema

## `results` (type: `string`):

All normalized product, comparison, alert, error, and summary records from this run.

# 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 = {
    "urls": [
        "https://schema.org/Product"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rikayushi/cross-store-product-radar").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 = { "urls": ["https://schema.org/Product"] }

# Run the Actor and wait for it to finish
run = client.actor("rikayushi/cross-store-product-radar").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 '{
  "urls": [
    "https://schema.org/Product"
  ]
}' |
apify call rikayushi/cross-store-product-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rikayushi/cross-store-product-radar"
        }
    }
}
```

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/ONZM7sjFRDIr8drel/builds/01fsHAV9cZb23ZyQ6/openapi.json
