# ⌚ Luxury Watch Price & Arbitrage Scraper \[From 💰$0.85/1K] (`misterkhan/luxury-watch-marketplace-scraper`) Actor

\[From $0.85/1K] Scrape and compare luxury watch listings across Chrono24, eBay, WatchCharts, Bob's Watches & Watchfinder. Filter by Reference, Dial, Bezel, Bracelet, Condition & Year with FMV arbitrage discount %.

- **URL**: https://apify.com/misterkhan/luxury-watch-marketplace-scraper.md
- **Developed by:** [Khan](https://apify.com/misterkhan) (community)
- **Categories:** E-commerce, AI, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## ⌚ Luxury Watch Price & Arbitrage Scraper (Chrono24, eBay, WatchCharts)

Scrape, normalize, and compare live luxury watch listings across **Chrono24**, **eBay (Active & Sold/Completed Comps)**, **WatchCharts**, **Bob's Watches**, and **Watchfinder** in a single run.

Built for **watch dealers, wholesale traders, family offices, and collectors**, this Actor solves the biggest problem in secondary watch market data: **sub-variant price contamination**. Standard keyword scrapers lump a **$11,200 Rolex Datejust 41 Silver Smooth Oyster** together with a **$15,800 Datejust 41 Wimbledon Fluted Jubilee** because both share base reference `126334`. Our built-in **Horological Spec Normalizer & 128D Sub-Variant Matcher** separates and verifies every listing by **Dial**, **Bezel**, **Bracelet**, **Condition**, **Box & Papers**, and **Production Year**, and calculates the exact **Arbitrage Discount % (`discountVsMedianPct`)** against the cross-market Fair Market Value (FMV) median.

***

### 🚀 Key Capabilities

- **Multi-Platform Selection (`includePlatforms` & `excludePlatforms`)**:
  - Choose any combination of `chrono24`, `ebay`, `ebay_sold`, `bobswatches`, `watchfinder`, and `watchcharts`.
  - Easily exclude specific dealer portals (e.g., `"excludePlatforms": ["bobswatches", "watchfinder", "watchcharts"]`) to focus purely on peer-to-peer / dealer marketplaces like **Chrono24 + eBay**.
- **Horological Sub-Variant Normalization**:
  - Automatically parses unstructured dealer titles into canonical horological attributes:
    - `dialColor`: *Wimbledon Slate*, *Mint Green*, *Blue Index*, *Blue Roman*, *Panda White*, *Slate Grey*, *Tiffany Blue*, *Mother of Pearl*, *Meteorite*, etc.
    - `bezelType`: *Fluted*, *Smooth*, *Ceramic*, *Diamond*
    - `braceletType`: *Jubilee*, *Oyster*, *President*, *Oysterflex*, *Leather Strap*
    - `condition`: `UNWORN`, `MINT`, `PRE_OWNED`
    - `completeness`: `FULL_SET` (Box & Papers), `BOX_ONLY`, `PAPERS_ONLY`, `WATCH_ONLY`
- **Strict Reference Number Guard & Spare-Part Blocker**:
  - Automatically rejects sibling reference pollution (e.g., rejects Smooth Bezel `126300` when you request Fluted Bezel `126334`) and strips spare links, bezel inserts, dials, straps, and empty watch boxes.
- **Cross-Market Arbitrage Scoring**:
  - Computes `medianMarketPriceUsd` and `discountVsMedianPct` for every returned listing so underpriced arbitrage deals float to the top automatically (`sortBy: "deal_score"`).

***

### 📥 Input Example

#### Example 1: Chrono24 + eBay Arbitrage Scan (Excluding Bob's Watches, Watchfinder & WatchCharts)

```json
{
  "brand": "Rolex",
  "collection": "Datejust 41",
  "reference": "126334",
  "includePlatforms": ["chrono24", "ebay"],
  "excludePlatforms": ["bobswatches", "watchfinder", "watchcharts"],
  "dial": "Wimbledon",
  "bracelet": "Jubilee",
  "bezel": "Fluted",
  "condition": "UNWORN",
  "completeness": "FULL_SET",
  "yearMin": 2022,
  "sortBy": "deal_score",
  "maxItems": 40
}
```

#### Example 2: Broad Reference Scan Across All Venues (Base Tier)

```json
{
  "brand": "Omega",
  "collection": "Speedmaster Professional",
  "model": "Moonwatch",
  "reference": "310.30.42.50.01.002",
  "includePlatforms": ["chrono24", "ebay", "watchfinder"],
  "maxItems": 50
}
```

***

### 📊 Output Example

Each dataset item is normalized into a unified cross-marketplace schema:

```json
{
  "platform": "chrono24",
  "brand": "Rolex",
  "collection": "Datejust 41",
  "model": "",
  "reference": "126334",
  "subvariantKey": "126334-wimbledon-slate-fluted-jubilee",
  "subvariantLabel": "Wimbledon Slate · Fluted · Jubilee",
  "title": "2023 Rolex Datejust 41 Ref 126334 Wimbledon Slate Dial Fluted Bezel Jubilee Unworn Full Set",
  "price": 13450.0,
  "currency": "USD",
  "medianMarketPriceUsd": 14600.0,
  "discountVsMedianPct": 7.9,
  "dialColor": "Wimbledon Slate",
  "bezelType": "Fluted",
  "braceletType": "Jubilee",
  "condition": "UNWORN",
  "completeness": "FULL_SET",
  "productionYear": 2023,
  "sellerName": "47th St Timepieces",
  "sellerCountry": "US",
  "matchScore": 0.98,
  "deepFilterApplied": true,
  "listingUrl": "https://www.chrono24.com/rolex/datejust-41-126334--id29841120.htm",
  "imageUrl": "https://img.chrono24.com/images/uhren/29841120-abc.jpg",
  "scrapedAt": "2026-10-16T17:15:00Z"
}
```

***

### 💰 Transparent Pay-Per-Event Pricing

This Actor runs in an ultra-light **128 MB container** so your platform compute cost is near zero, and uses transparent **Two-Tier Pay-Per-Event (PPE)** billing:

1. **Base Marketplace Listing (`apify-default-dataset-item`)** — charged per returned watch listing when using Base Search (`brand`, `collection`, `model`, `reference`, `includePlatforms`, `excludePlatforms`, `priceMinUsd`, `priceMaxUsd`).
2. **Deep Horological Spec Filter Add-On (`deep-spec-filter-match`)** — only charged when you activate one or more **Tier 2 Deep Horological Filters** (`dial`, `bracelet`, `bezel`, `condition`, `completeness`, `yearMin`, `yearMax`, `sellerCountry`, or `enrichChrono24Details`).

| Apify Plan | Base Listing (`apify-default-dataset-item`) | Deep Spec Filter Add-On (`deep-spec-filter-match`) | Total w/ Deep Filters |
| :--- | :--- | :--- | :--- |
| **Free Plan** *(25 items/run cap)* | `$5.00 / 1K` (`$0.005/item`) | `+$7.50 / 1K` (`$0.0075/item`) | `$12.50 / 1K` |
| **Bronze Plan** | `$1.60 / 1K` (`$0.0016/item`) | `+$2.40 / 1K` (`$0.0024/item`) | `$4.00 / 1K` |
| **Silver Plan** | `$1.20 / 1K` (`$0.0012/item`) | `+$1.80 / 1K` (`$0.0018/item`) | `$3.00 / 1K` |
| **Gold / Platinum / Diamond** | **`$0.85 / 1K`** (`$0.00085/item`) | **`+$1.25 / 1K`** (`$0.00125/item`) | **`$2.10 / 1K`** |

***

### 🔗 Related Actors from Our Store

Combine this Actor with our other **`128 MB` Pay-Per-Event (PPE)** tools in the same workflow (`$0.00` start fee):

| Related Actor | Best For | Starting Price |
| :--- | :--- | :--- |
| **[🕰️ Chrono24 Listings Scraper](https://apify.com/misterkhan/chrono24-search-scraper)** | Global luxury watch marketplace listings — brand, reference number, price & dealer | **From 💰`$0.80 / 1K`** |
| **[⌚ Bob's Watches Rolex Scraper](https://apify.com/misterkhan/bobswatches-listing-scraper)** | Certified pre-owned Rolex inventory — reference numbers, condition, year & USD prices | **From 💰`$0.60 / 1K`** |
| **[⌚ Watchfinder Luxury Watch Scraper](https://apify.com/misterkhan/watchfinder-listing-scraper)** | Pre-owned luxury watch inventory across global Watchfinder domains — box/papers & year | **From 💰`$0.60 / 1K`** |

👉 **[See all Actors by `misterkhan` on Apify Store →](https://apify.com/misterkhan)**

# Actor input Schema

## `brand` (type: `string`):

Primary watch brand (e.g. 'Rolex', 'Omega', 'Audemars Piguet', 'Patek Philippe', 'Cartier', 'Tudor').

## `collection` (type: `string`):

Watch collection or model line (e.g. 'Datejust 41', 'Submariner Date', 'GMT-Master II', 'Cosmograph Daytona', 'Speedmaster Professional', 'Royal Oak').

## `model` (type: `string`):

Optional collector nickname or variant keyword (e.g. 'Wimbledon', 'Pepsi', 'Batgirl', 'Starbucks', 'Panda', 'Moonwatch').

## `reference` (type: `string`):

Exact manufacturer reference number (e.g. '126334', '126610LN', '126710BLRO', '116500LN', '310.30.42.50.01.002', '15500ST').

## `includePlatforms` (type: `array`):

Select which luxury watch marketplaces to scrape fresh on every run.

## `excludePlatforms` (type: `array`):

Select any marketplaces to explicitly exclude from the run.

## `dial` (type: `string`):

Filter by normalized dial color or style (e.g. 'Wimbledon', 'Mint Green', 'Blue Index', 'Blue Roman', 'White Index', 'Panda', 'Slate Grey', 'Black Index', 'Mother of Pearl', 'Meteorite'). Activates Deep Horological Spec Filtering.

## `bracelet` (type: `string`):

Filter by bracelet or strap configuration (e.g. 'Jubilee', 'Oyster', 'President', 'Oysterflex', 'Leather Strap').

## `bezel` (type: `string`):

Filter by bezel style (e.g. 'Fluted', 'Smooth', 'Ceramic', 'Diamond').

## `condition` (type: `string`):

Filter by normalized condition grade across all platforms.

## `completeness` (type: `string`):

Filter by delivery scope (Full Set with Box & Papers vs Watch Only).

## `yearMin` (type: `integer`):

Minimum production or warranty card year (e.g. 2021).

## `yearMax` (type: `integer`):

Maximum production or warranty card year (e.g. 2026).

## `sellerCountry` (type: `string`):

Filter by 2-letter seller country code or name (e.g. 'US', 'JP', 'GB', 'DE', 'CH', 'HK').

## `priceMinUsd` (type: `integer`):

Minimum asking price in USD (automatically filters out low-cost spare links/straps).

## `priceMaxUsd` (type: `integer`):

Optional maximum asking price ceiling in USD.

## `strictReferenceMatch` (type: `boolean`):

When enabled (default), rejects sibling references that marketplaces inject into search results (e.g. rejects Smooth Bezel 126300 when searching Fluted Bezel 126334).

## `enrichChrono24Details` (type: `boolean`):

When enabled, visits individual Chrono24 '--id\*.htm' watch detail pages to extract full specification tables when card titles omit production year or dial details.

## `sortBy` (type: `string`):

Order of returned marketplace listings.

## `maxItems` (type: `integer`):

Maximum number of unified watch listings to return across all selected platforms (Free tier cap: 25 listings/run).

## Actor input object example

```json
{
  "brand": "Rolex",
  "collection": "Datejust 41",
  "reference": "126334",
  "includePlatforms": [
    "chrono24",
    "ebay"
  ],
  "excludePlatforms": [
    "bobswatches",
    "watchfinder",
    "watchcharts"
  ],
  "condition": "ALL",
  "completeness": "ALL",
  "priceMinUsd": 1000,
  "strictReferenceMatch": true,
  "enrichChrono24Details": false,
  "sortBy": "deal_score",
  "maxItems": 25
}
```

# Actor output Schema

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

All normalized luxury watch listings across Chrono24, eBay, WatchCharts, Bob's Watches, and Watchfinder with cross-market FMV median and arbitrage discount %.

## `usage_summary` (type: `string`):

Execution telemetry and extraction summary stored in the default key-value store.

# 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 = {
    "brand": "Rolex",
    "collection": "Datejust 41",
    "reference": "126334",
    "includePlatforms": [
        "chrono24",
        "ebay"
    ],
    "excludePlatforms": [
        "bobswatches",
        "watchfinder",
        "watchcharts"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("misterkhan/luxury-watch-marketplace-scraper").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 = {
    "brand": "Rolex",
    "collection": "Datejust 41",
    "reference": "126334",
    "includePlatforms": [
        "chrono24",
        "ebay",
    ],
    "excludePlatforms": [
        "bobswatches",
        "watchfinder",
        "watchcharts",
    ],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("misterkhan/luxury-watch-marketplace-scraper").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 '{
  "brand": "Rolex",
  "collection": "Datejust 41",
  "reference": "126334",
  "includePlatforms": [
    "chrono24",
    "ebay"
  ],
  "excludePlatforms": [
    "bobswatches",
    "watchfinder",
    "watchcharts"
  ],
  "maxItems": 25
}' |
apify call misterkhan/luxury-watch-marketplace-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,misterkhan/luxury-watch-marketplace-scraper"
        }
    }
}
```

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/PdEbxCQCISF9Qd2bA/builds/lUhm0LMhjdlqubt69/openapi.json
