# Watch Deal Aggregator (`gaurangghinaiya/watch-deal-aggregator`) Actor

Cross-marketplace luxury watch aggregator with a computed deal score. v1 sources Chrono24; built on a pluggable source interface for future marketplaces. Unofficial, not affiliated with Chrono24.

- **URL**: https://apify.com/gaurangghinaiya/watch-deal-aggregator.md
- **Developed by:** [Gaurang Ghinaiya](https://apify.com/gaurangghinaiya) (community)
- **Categories:** Automation, E-commerce, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## 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

Search any watch brand, model, or reference and get back listings **ranked by how good a deal each one actually is**, not just a raw price dump. Point it at [Chrono24](https://www.chrono24.com) today, more marketplaces are coming, and every listing is scored against a live, outlier-resistant market price computed from the other listings of the same reference. Runs on the Apify platform: proxy rotation, scheduling, an API, and CSV/JSON/Excel export included, no scraping code of your own.

### What does Watch Deal Aggregator do?

This Actor takes a brand, model, or reference number (for example "Rolex 126710BLRO") and searches for matching listings. For every reference it finds more than one listing of, it computes a **reference market price** (the trimmed median of that reference's current prices, so a couple of unusually cheap or expensive outliers do not distort it), then scores every listing by how far below or above that price it sits. The result is a ranked list, from the best deal to the worst, for every reference in your search. v1 sources Chrono24; the source layer is pluggable, so additional marketplaces can be added without changing how you use the Actor or how deal scores are computed.

### Why use Watch Deal Aggregator?

- **Dealers and flippers** can scan a reference across many listings in one run and jump straight to the ones priced meaningfully below market instead of manually comparing dozens of tabs.
- **Buyers** can sanity-check whether an asking price is actually a good deal or simply average, before making an offer.
- **Analysts** get a normalized market price per reference alongside the raw data, useful for tracking how a reference's market moves over time.
- **Builders** can call this through the Apify API on a schedule to power an alert ("notify me when a 116610LV lists more than 10% under market"), with a per-run spend cap so cost never surprises you.

### How to use Watch Deal Aggregator

1. Click **Try for free** (or **Run**) on this Actor's page.
2. Enter one or more **Query** values: a brand, a model, or a specific reference number. Each query is searched independently.
3. Leave **Sources** as `chrono24` (the only source available in v1).
4. Optionally set **Max results per source** to cap how many listings are pulled per query, and **Condition filter** to restrict to new or used only.
5. Click **Start**. Results appear in the **Dataset** tab as they are scored.
6. Sort or filter the dataset by `dealScore` to find the best deals first, or export as JSON, CSV, or Excel.

### Input

| Field | Type | Description |
|---|---|---|
| `query` | array of strings | Brand, model, or reference to search for, e.g. `"Rolex 126710BLRO"`. Each query is searched independently. |
| `sources` | array | Which marketplaces to include. Only `chrono24` is available in v1. |
| `maxResults` | integer | Upper bound on listings returned per source, across all queries. Default 100. |
| `conditionFilter` | string | `new`, `used`, or `any` (default). Filters on the listing's stated condition. |
| `proxyConfiguration` | object | Proxy settings. Apify Proxy (datacenter) is enabled by default and is sufficient for this target. |

See the **Input** tab for the full schema with validation and defaults.

### Output

Every item is one listing, enriched with its computed deal score:

```json
{
  "brand": "Rolex",
  "model": "Submariner Date",
  "reference": "116610LV",
  "price": 18900,
  "currency": "USD",
  "condition": "Used (Very good) The item shows minor signs of wear, such as small, intangible scratches.",
  "year": "2014",
  "sellerCountry": "United States of America",
  "source": "chrono24",
  "listingUrl": "https://www.chrono24.com/rolex/submariner-date--id46779547.htm",
  "scrapedAt": "2026-07-06T05:49:57.472Z",
  "referenceMarketPrice": 20949.5,
  "dealScore": -9.78,
  "rank": 1
}
````

This example is a real item captured from a live run. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel from the **Dataset** tab.

### Data fields

| Field | Description |
|---|---|
| brand, model, reference | Watch identification. |
| price, currency | Listed price and its currency. |
| condition, year | Condition grade and production year. |
| sellerCountry | Country the listing ships from. |
| source | Which marketplace this listing came from (`chrono24` in v1). |
| listingUrl | Link to the original listing. |
| referenceMarketPrice | Trimmed-median price across this reference's current listings (top and bottom 10% dropped before the median, so outliers do not skew it). Null if this listing's reference did not have enough comparable listings to score. |
| dealScore | Percent this listing's price sits below (negative) or above (positive) `referenceMarketPrice`. A listing at -15 is priced 15% under the reference market price. Null when unscored. |
| rank | This listing's rank within its reference group, 1 is the best deal. Null when unscored. |
| scrapedAt | Timestamp this record was scraped. |

### Pricing: how much does it cost to use Watch Deal Aggregator?

This Actor uses Apify's pay-per-event pricing: you pay only for what you use, and platform and proxy usage are billed to you directly, separately from the event price below, so the Actor's own running cost stays near zero for the builder and stays at Apify's actual cost for you.

- Actor start: $0.01 (charged once per run)
- Result: $0.00999 per scored listing

**Worked example.** In a small cloud test, scoring 6 real listings of the same reference took under 10 seconds of compute and about 135 KB of datacenter proxy transfer, an actual measured platform cost of roughly $0.0003 per listing. At the pricing above, a run of 1,000 listings costs:

- 1 run start: $0.01
- 1,000 results at $0.00999 each: $9.99
- **Total: about $10.00 per 1,000 listings**, plus a small amount of platform/proxy usage (well under a dollar per 1,000 based on measured test runs)

That price sits above commodity Chrono24 listing scrapers (roughly $3 per 1,000 at the low end of the market), reflecting that this Actor does not just return raw listings: it computes and ranks a market price for you, work you would otherwise have to do yourself after buying raw data from a cheaper scraper.

Set **Max results per source** and your run's spend cap to control cost precisely, and the Actor stops cleanly once your limit is reached so you are never surprised by a bill.

### Tips and advanced options

- A query that matches very few listings of a reference produces a less meaningful market price; the trimmed median needs a reasonable sample to be useful. Broader queries (a full model line rather than one exact reference) tend to return more comparable listings.
- If a query returns zero results, try running it again. Chrono24's anti-bot layer occasionally blocks the very first search request in a run; Apify Proxy session rotation recovers from this most of the time, but a run that lands on the one that does not can return no listings even though the target site is normal.
- `conditionFilter` matches on the listing's stated condition text ("New", "Unworn", "Used ..."), not a marketplace-specific search parameter, so it behaves consistently as more sources are added.

### FAQ, disclaimer, and support

**Is this affiliated with Chrono24?** No. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Chrono24 GmbH. "Chrono24" and its logo are trademarks of Chrono24 GmbH.

**How is the reference market price calculated?** It is the trimmed median of that reference's current listing prices in your result set: sort the prices, drop the top and bottom 10%, then take the median of what is left. This is computed fresh from your own run's results, not a stored price book, so it reflects live market conditions rather than historical averages.

**What data does this collect?** Only publicly visible listing data shown on the source marketplace's own pages: price, specification, condition, and the public-facing seller country. No private, account, or contact information is collected.

**Is scraping Chrono24 allowed?** Use of this Actor must comply with Chrono24 GmbH's Terms of Service and all applicable laws, including data protection regulations such as GDPR and CCPA. This Actor is intended for legitimate research, market analysis, and personal buying or selling decisions. Please respect rate limits and avoid overloading the source marketplace's infrastructure; you are responsible for how you use the data you collect.

**Will more marketplaces be added?** The source layer is built to support additional marketplaces without changing the input, output shape, or deal-score logic. If you would like a specific marketplace added, let us know through the Issues tab.

**Need something custom?** If you need additional fields, your own reference price book instead of the computed market price, or a related scraper, reach out through the Issues tab or the Actor's contact option in Apify Store.

# Actor input Schema

## `query` (type: `array`):

Brand, model, or reference to search for, e.g. "Rolex 126710BLRO". Provide one or more queries; each is searched independently.

## `sources` (type: `array`):

Which marketplaces to include. Only Chrono24 is available in v1.

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

Upper bound on listings returned per source, across all queries. Each result now costs a real bypass fetch (roughly 10-20 seconds each), so keep this modest for quick test runs and raise it deliberately for large jobs.

## `conditionFilter` (type: `string`):

Keep only new, only used, or all listings regardless of condition.

## `proxyConfiguration` (type: `object`):

Proxy settings. Datacenter is cheapest and usually sufficient for an efficient data source.

## Actor input object example

```json
{
  "query": [
    "Rolex Submariner"
  ],
  "sources": [
    "chrono24"
  ],
  "maxResults": 10,
  "conditionFilter": "any",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "query": [
        "Rolex Submariner"
    ],
    "sources": [
        "chrono24"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("gaurangghinaiya/watch-deal-aggregator").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 = {
    "query": ["Rolex Submariner"],
    "sources": ["chrono24"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("gaurangghinaiya/watch-deal-aggregator").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 '{
  "query": [
    "Rolex Submariner"
  ],
  "sources": [
    "chrono24"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call gaurangghinaiya/watch-deal-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=gaurangghinaiya/watch-deal-aggregator",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Watch Deal Aggregator",
        "description": "Cross-marketplace luxury watch aggregator with a computed deal score. v1 sources Chrono24; built on a pluggable source interface for future marketplaces. Unofficial, not affiliated with Chrono24.",
        "version": "0.1",
        "x-build-id": "nYGFCOauRpJZzxTMT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/gaurangghinaiya~watch-deal-aggregator/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-gaurangghinaiya-watch-deal-aggregator",
                "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/gaurangghinaiya~watch-deal-aggregator/runs": {
            "post": {
                "operationId": "runs-sync-gaurangghinaiya-watch-deal-aggregator",
                "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/gaurangghinaiya~watch-deal-aggregator/run-sync": {
            "post": {
                "operationId": "run-sync-gaurangghinaiya-watch-deal-aggregator",
                "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": [
                    "query"
                ],
                "properties": {
                    "query": {
                        "title": "Query",
                        "type": "array",
                        "description": "Brand, model, or reference to search for, e.g. \"Rolex 126710BLRO\". Provide one or more queries; each is searched independently.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sources": {
                        "title": "Sources",
                        "type": "array",
                        "description": "Which marketplaces to include. Only Chrono24 is available in v1.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "chrono24"
                            ],
                            "enumTitles": [
                                "Chrono24"
                            ]
                        },
                        "default": [
                            "chrono24"
                        ]
                    },
                    "maxResults": {
                        "title": "Max results per source",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Upper bound on listings returned per source, across all queries. Each result now costs a real bypass fetch (roughly 10-20 seconds each), so keep this modest for quick test runs and raise it deliberately for large jobs.",
                        "default": 10
                    },
                    "conditionFilter": {
                        "title": "Condition filter",
                        "enum": [
                            "new",
                            "used",
                            "any"
                        ],
                        "type": "string",
                        "description": "Keep only new, only used, or all listings regardless of condition.",
                        "default": "any"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Proxy settings. Datacenter is cheapest and usually sufficient for an efficient data source.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
