# Chrono24 Luxury Watch Scraper (`sian.agency/chrono24-watch-scraper`) Actor

Scrape luxury watches from Chrono24 — Rolex, Omega, Patek Philippe & more. Fast price/spec overview or full detail: reference, movement, case, dial, bracelet, year, condition, box & papers, seller. Dual-currency EUR/USD, clean JSON/CSV, no code.

- **URL**: https://apify.com/sian.agency/chrono24-watch-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** E-commerce, Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 overview listings

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

## Chrono24 Scraper & API — Luxury Watch Data (Rolex, Omega, Patek) ⌚

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian)
[![Taobao Tmall Product Scraper](https://img.shields.io/badge/Store-Taobao%20Tmall%20Product%20Scraper-FF4F00)](https://apify.com/sian.agency/taobao-tmall-product-scraper?fpr=sian)
[![1688 Wholesale Scraper](https://img.shields.io/badge/Store-1688%20Wholesale%20Scraper-FF6A00)](https://apify.com/sian.agency/alibaba-1688-wholesale-scraper?fpr=sian)
[![Amazon ASIN Lookup](https://img.shields.io/badge/Store-Amazon%20ASIN%20Lookup-FF9900)](https://apify.com/sian.agency/amazon-asin-lookup?fpr=sian)

#### 🎉 The fastest way to pull Chrono24 data — a Chrono24 API in everything but name. Clean, analytics-ready luxury watch data in EUR **and** USD, with box & papers as true/false fields.
##### Built for watch dealers, flippers, market analysts and investors who need normalized watch data they can drop straight into a spreadsheet or model — not raw scraped text.

### 📋 Overview

**Turn Chrono24 into structured data.** This **Chrono24 scraper** pulls luxury watch listings from the world's largest pre-owned and new watch marketplace — Rolex, Omega, Patek Philippe, Audemars Piguet, Cartier, Tudor, Breitling and every other brand — and hands you clean JSON or CSV. Pick the depth that fits the job: a fast, cheap price + spec sweep, or the full per-watch spec sheet.

**Why dealers and analysts choose us:**
- 🧼 **Normalized, analytics-ready data**: condition, availability and seller type come back as clean values — not buried in localized free text
- 📦 **Box & papers as true/false**: `has_box` and `has_papers` are discrete booleans you can filter and pivot on instantly
- 💱 **Dual currency built in**: every watch carries its price in EUR **and** USD from one live FX rate per run
- 📏 **Real numbers, not strings**: case diameter as a numeric value in mm, separate `bracelet_material` and `bracelet_color`, `thumbnail` split out from the full image gallery
- ⚡ **Two depths, one actor**: a fast market-wide Overview scan, or deep per-watch Detail spec sheets
- 🎯 **Three ways to search**: by brand, by free-text query, or by pasting any filtered Chrono24 URL — all your filters preserved
- 🆓 **Free to try**: up to 25 watches per run, no credit card

### ✨ Features

- 🧭 **Overview mode**: fast price + spec scan straight from search cards (~60–120 listings per fetch) — ideal for sizing a market cheaply
- 🔍 **Detail mode**: the full per-watch spec sheet — reference number, movement, case material & diameter, dial, bracelet, water resistance, year, condition, scope of delivery, gender, seller and more
- 🏷️ **By brand / by query / by search URL**: pick brand slugs (`rolex`, `omega`, `tudor`…), free-text search any model (`submariner`, `daytona`), or paste a refined Chrono24 search/brand link
- 🎚️ **Filters**: price range in EUR on brand/query searches, plus every filter you bake into a pasted search URL (case material, condition, dial color, year, seller type, sort order…)
- 💱 **Dual-currency pricing**: EUR + USD on every row from one live FX rate per run
- 📦 **Box & papers booleans**: discrete `has_box` / `has_papers` flags, ready to filter on
- 🖼️ **Full image gallery + thumbnail**: every listing photo, with a separate thumbnail field for quick previews
- 🧾 **Self-documenting datasets**: every row carries a `metadata` object recording the exact search settings that produced it
- 📑 **HTML run report**: a clean summary of every run alongside your data
- 📤 **Clean exports**: JSON, CSV, Excel, or the full REST API

### 🎬 Quick Start

Choose a scrape depth + a search mode, set your filters, and run.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~chrono24-watch-scraper/runs?token=[YOUR_TOKEN] \
-H 'Content-Type: application/json' \
-d '{
  "scrapeMode": "overview",
  "searchMode": "byBrand",
  "brands": ["rolex", "omega"],
  "maxResults": 50
}'
````

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Pick your scrape depth

- **Overview** — fast price + spec scan straight from search cards (~60–120 listings/fetch).
- **Detail** — the full per-watch spec sheet (reference, movement, case, dial, bracelet, condition, box & papers, seller…).

#### Step 2: Choose how to search

- **By brand** — pick brand slugs like `rolex`, `omega`, `tudor`, `breitling`, `cartier`.
- **By query** — free-text search any model or keyword, e.g. `submariner`, `daytona`, `speedmaster`.
- **By search URL** — paste one or more Chrono24 search/brand URLs; every filter in the URL is kept and pagination is automatic.

#### Step 3: Filter, set Max results & run

Narrow a brand or query search by price (EUR), or carry any filter you like inside a pasted search URL, then download as JSON / CSV / Excel.

**That's it! In seconds you'll have:**

- Clean watch data (price in EUR **and** USD, brand, year, condition, availability)
- Box & papers as true/false flags, ready to filter
- Numeric case diameter in mm, separate bracelet material & color
- Full spec sheet in Detail (reference, movement, dial, scope of delivery, seller, gallery)

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast scan) or `detail` (full spec sheet). Default `overview` |
| searchMode | string | No | `byBrand`, `byQuery`, or `bySearchUrl`. Default `byBrand` |
| maxResults | integer | No | Max watches to return (FREE tier caps at 25). Default 100 |
| brands | array | By brand | Brand slugs, e.g. `["rolex","omega","tudor"]` |
| query | string | By query | Free-text search, e.g. `submariner` |
| searchUrls | array | By search URL | One or more Chrono24 search/brand URLs (paged & merged) |
| priceFrom | integer | No | Minimum price in EUR (by brand / by query) |
| priceTo | integer | No | Maximum price in EUR (by brand / by query) |

> ℹ️ **A few brand slugs differ from the obvious form** and may not resolve directly (e.g. `patek-philippe`, `audemars-piguet`). For those, use **By query** (search `patek philippe`) or **By search URL** (paste the brand page link). By search URL ignores `priceFrom`/`priceTo` — the URL's own filters win.

**Example (Detail, by brand):**

```json
{
  "scrapeMode": "detail",
  "searchMode": "byBrand",
  "brands": ["rolex"],
  "priceFrom": 5000,
  "priceTo": 25000,
  "maxResults": 100
}
```

**Example (by search URL):**

```json
{
  "scrapeMode": "detail",
  "searchMode": "bySearchUrl",
  "searchUrls": ["https://www.chrono24.de/omega/index.htm"],
  "maxResults": 50
}
```

### 📊 Overview vs Detail — what you get

| Field | ⚡ Overview | 🔍 Detail |
|---|:---:|:---:|
| Brand, title | ✅ | ✅ |
| Price (EUR & USD), currency | ✅ | ✅ |
| Availability | ✅ | ✅ |
| Image gallery + thumbnail | ✅ | ✅ |
| Live FX rate (`fx_eur_usd`, `fx_source`) | ✅ | ✅ |
| Self-documenting `metadata` | ✅ | ✅ |
| **Model** | — | ✅ |
| **Reference number, listing code** | — | ✅ |
| **Movement** | — | ✅ |
| **Case material, case diameter (mm)** | — | ✅ |
| **Dial** | — | ✅ |
| **Bracelet material & color** | — | ✅ |
| **Water resistance** | — | ✅ |
| **Year, condition** | — | ✅ |
| **Scope of delivery + box & papers booleans** | — | ✅ |
| **Gender** | — | ✅ |
| **Seller type, location, shipping cost** | — | ✅ |
| **Full description** | — | ✅ |

**Detail is the deep mode** — everything in the per-watch spec sheet is read straight from the listing page, so you get the reference number, movement, case, dial, bracelet and box/papers that the fast Overview scan can't see.

### 📤 Output

Results are saved to the Apify dataset. Detail rows carry the full spec sheet including:

| Field | Type | Description |
|-------|------|-------------|
| id | string | Chrono24 listing ID |
| url | string | Canonical listing URL |
| brand | string | Watch brand (e.g. Rolex, Omega) |
| model | string | Model name (Detail) |
| reference\_number | string | Manufacturer reference number (Detail) |
| listing\_code | string | Chrono24 listing code (Detail) |
| title | string | Listing title |
| description | string | Full listing description (Detail) |
| price | integer | Listed price in EUR |
| price\_usd | integer | Price converted to USD |
| currency | string | Listed currency (EUR) |
| price\_on\_request | boolean | `true` when the seller lists "price on request" |
| price\_negotiable | boolean | `true` when the seller is open to offers (Detail) |
| movement | string | Movement type, e.g. Automatic (Detail) |
| case\_material | string | Case material, e.g. Steel, Gold (Detail) |
| case\_diameter\_mm | number | Case diameter in millimetres (Detail) |
| dial | string | Dial color / description (Detail) |
| bracelet\_material | string | Bracelet/strap material (Detail) |
| bracelet\_color | string | Bracelet/strap color (Detail) |
| water\_resistance | string | Water resistance rating (Detail) |
| year | integer | Year of production (Detail) |
| condition | string | Condition value, e.g. New, Used (Detail) |
| scope\_of\_delivery | string | What's included with the watch (Detail) |
| has\_box | boolean | Original box included — true/false (Detail) |
| has\_papers | boolean | Papers/certificate included — true/false (Detail) |
| gender | string | Men's / Women's / Unisex (Detail) |
| availability | string | Listing availability status |
| location | string | Seller location (Detail) |
| seller\_type | string | `dealer` or private seller (Detail) |
| shipping\_cost | number | Shipping cost in EUR (Detail) |
| images | array | Full gallery of listing image URLs |
| thumbnail | string | First gallery image, for quick previews |
| fx\_eur\_usd | number | EUR→USD rate used this run |
| fx\_source | string | Source of the FX rate |
| metadata | object | The exact search settings that produced the row |

**Example (Detail):**

```json
{
  "id": "12345678",
  "url": "https://www.chrono24.de/rolex/...--id12345678.htm",
  "brand": "Rolex",
  "model": "Submariner Date",
  "reference_number": "126610LN",
  "listing_code": "ABCDEF",
  "title": "Rolex Submariner Date 126610LN",
  "price": 13500,
  "price_usd": 14580,
  "currency": "EUR",
  "movement": "Automatic",
  "case_material": "Steel",
  "case_diameter_mm": 41,
  "dial": "Black",
  "bracelet_material": "Steel",
  "bracelet_color": "Steel",
  "water_resistance": "30 ATM",
  "year": 2021,
  "condition": "Used",
  "scope_of_delivery": "Original box, original papers",
  "has_box": true,
  "has_papers": true,
  "gender": "Men's watch/Unisex",
  "availability": "InStock",
  "location": "Germany",
  "seller_type": "dealer",
  "shipping_cost": 0,
  "thumbnail": "https://img.chrono24.com/.../0.jpg",
  "images": ["https://img.chrono24.com/.../0.jpg"],
  "fx_eur_usd": 1.08,
  "fx_source": "ecb"
}
```

### 💼 Use Cases & Examples

#### Watch Dealer Pricing & Comps

Pull every live listing for a reference and price your own stock against the market.

**Input:** By brand or by search URL + price filters
**Output:** Clean rows with price (EUR & USD), condition, box & papers, year
**Use:** Set asking prices, build comp sets, spot under-priced inventory

#### Arbitrage & Flipping Signals

Sweep a model across the market and surface the cheapest clean examples.

**Input:** By query (e.g. `daytona`) + price range
**Output:** Price, condition, box/papers booleans, seller type
**Use:** Find buy-low / sell-high opportunities without opening each listing

#### Market Analysis & Trend Research

Track asking prices, condition mix and supply across brands over time.

**Input:** By brand + Max results, run on a schedule
**Output:** Normalized price, condition, availability per listing
**Use:** Market reports, price-trend dashboards, supply tracking

#### Building a Watch Price Database

Feed a clean, normalized watch dataset into your own tools.

**Input:** Any mode + Max results
**Output:** Structured JSON/CSV with numeric diameter, dual currency, booleans
**Use:** Internal price databases, CRMs, valuation models

#### Investment Sourcing

Screen blue-chip references by year, condition and full-set status.

**Input:** Detail mode + by brand/query + price filters
**Output:** Full spec sheets with year, condition, box & papers
**Use:** Shortlist investment-grade pieces with box & papers

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/chrono24-watch-scraper').call({
  scrapeMode: 'detail',
  searchMode: 'byBrand',
  brands: ['rolex'],
  priceFrom: 5000,
  maxResults: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Found ${items.length} watches`);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/chrono24-watch-scraper').call(
    run_input={
        'scrapeMode': 'overview',
        'searchMode': 'byQuery',
        'query': 'submariner',
        'maxResults': 100,
    }
)

items = client.dataset(run['defaultDatasetId']).list_items().items
print(f"Found {len(items)} watches")
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~chrono24-watch-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
  "scrapeMode": "detail",
  "searchMode": "bySearchUrl",
  "searchUrls": ["https://www.chrono24.de/rolex/index.htm"],
  "maxResults": 30
}'
```

#### Automation Tool Workflows (n8n, Zapier, Make, etc.)

1. **Trigger**: Manual / schedule / webhook
2. **HTTP Request**: Call this actor's API
3. **Process**: Filter and analyze watch listings
4. **Action**: Save to a database, send price alerts, or build reports

### 📊 Performance & Pricing

**View current pricing in the [Apify Console](https://apify.com/sian.agency/chrono24-watch-scraper?fpr=sian).**

- **Pay-per-result**: you're charged per watch returned — Overview rows (fast scan) are priced for high-volume market sweeps; Detail rows carry the full spec sheet.
- **FREE tier**: up to 25 watches per run — full feature access, no credit card.
- **PAID tier**: unlimited watches per run.

💡 **Tip:** Start with **Overview** to size a market cheaply, then re-run the interesting references in **Detail** for the full spec sheet, box & papers, and seller info.

### ❓ Frequently Asked Questions

**Q: Is this a Chrono24 API?**
A: It's the practical equivalent — a hosted **Chrono24 scraper** with a REST API. Call it from any language or no-code tool and get back clean, structured **luxury watch data** as JSON or CSV, no API key from Chrono24 required.

**Q: What's the difference between Overview and Detail?**
A: Overview is a fast scan of search cards (~60–120 listings/fetch) with brand, title, price (EUR & USD), availability and images. Detail visits each listing page for the full spec sheet — reference number, movement, case material & diameter, dial, bracelet, year, condition, box & papers, gender and seller.

**Q: Which brands are covered?**
A: Every brand on Chrono24 — Rolex, Omega, Patek Philippe, Audemars Piguet, Cartier, Tudor, Breitling, TAG Heuer and more. A few brand slugs differ (e.g. Patek Philippe, Audemars Piguet) — for those, use **By query** or paste the brand page URL under **By search URL**.

**Q: What currency are prices in?**
A: Listings are priced in EUR; every row also includes a USD conversion from one live FX rate per run, so you can compare prices internationally.

**Q: Are box & papers really separate fields?**
A: Yes — `has_box` and `has_papers` are discrete true/false flags, so you can filter for full-set watches instantly instead of parsing free text.

**Q: Can I reuse a search I built on the site?**
A: Yes — paste the Chrono24 search or brand URL under **By search URL** and every filter in it (condition, case material, dial color, year, seller type, sort order…) is preserved.

**Q: Can I export to Excel?**
A: Yes — download as CSV/Excel, or pull JSON via the REST API.

**Q: How many watches can I get?**
A: FREE tier: up to 25 per run. PAID tier: unlimited.

### 🐛 Troubleshooting

**No results returned**

- Check your brand slug — a few differ from the obvious form (e.g. `patek-philippe`, `audemars-piguet`). Use **By query** or **By search URL** for those.
- Broaden your price filter (`priceFrom` / `priceTo`)
- Confirm the pasted search URL actually returns listings on the site

**Fewer fields than expected on a listing**

- Most spec fields (reference, movement, case, dial, bracelet, box & papers, seller) are **Detail**-only — switch `scrapeMode` to `detail`
- Some spec rows (e.g. water resistance) only appear on watches that publish them

**Price filter seems ignored**

- `priceFrom` / `priceTo` apply to **By brand** and **By query** only. **By search URL** carries its own filters — bake the price range into the URL instead.

**Price on request**

- Some listings hide their price; those rows come back with `price_on_request: true` and no price.

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data. They only extract what has been published publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers. You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### 💬 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

- 🐛 Found a bug? File an issue in the Apify Console Issues tab
- ⭐ Loving the tool? Leave a 5-star review — it helps us build more
- 📧 <apify@sian-agency.online>
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more marketplace & product price data

### 🛍️ You might also like

More marketplace & product price data from SIÁN Agency:

- [Taobao Tmall Product Scraper](https://apify.com/sian.agency/taobao-tmall-product-scraper?fpr=sian) — product data & prices from China's biggest marketplace
- [1688 Wholesale Scraper](https://apify.com/sian.agency/alibaba-1688-wholesale-scraper?fpr=sian) — wholesale pricing & supplier data
- [Amazon ASIN Lookup](https://apify.com/sian.agency/amazon-asin-lookup?fpr=sian) — product details & pricing by ASIN

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

**🎯 Not sure which tier you need?** Start with FREE — no credit card required. Upgrade when you're ready to scale!

*Chrono24™ is a trademark of its respective owner. This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Chrono24. Brand names (Rolex, Omega, Patek Philippe, Audemars Piguet and others) are trademarks of their respective owners and are referenced for identification only. Use this actor responsibly and in line with applicable terms and laws.*

# Actor input Schema

## `scrapeMode` (type: `string`):

How deep to scrape each watch.

- **Overview** = fast price/spec scan straight from the search-result cards (no detail-page visits, ~60–120 listings per fetch). Best for sizing a market cheaply.
- **Detail** = the full per-watch record — reference number, movement, case material & diameter, dial, bracelet, year, condition, scope of delivery (box & papers), gender, seller — one fetch per listing.

## `searchMode` (type: `string`):

How to choose which watches to scrape. Fill in the matching section below.

- **By brand** — pick brand slugs like `rolex`, `omega` (the default).
- **By query** — free-text search, e.g. `submariner`.
- **By search URL** — paste filtered Chrono24 search/brand URLs.

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

Maximum watches to return this run. The free tier is capped at 25.

## `brands` (type: `array`):

Brand slugs to scrape when Search mode = **By brand** (e.g. `rolex`, `omega`, `tudor`, `breitling`, `cartier`, `tag-heuer`). Add as many as you like.

**Note:** some brands' slugs differ from the obvious form and may 404 (e.g. `patek-philippe`, `audemars-piguet`). For those, use **By query** (search `patek philippe`) or **By search URL** (paste the brand page URL) instead.

## `query` (type: `string`):

Free-text search used when Search mode = **By query** — e.g. `submariner`, `speedmaster`, `daytona`. Searches across all brands and models.

## `searchUrls` (type: `array`):

Paste one or more Chrono24 **search** or **brand** URLs (used when Search mode = **By search URL**). Any filters baked into each URL are kept; pagination is automatic. Use this for brands whose slug 404s, or to reuse a refined search you built on the site.

**Example:** `https://www.chrono24.de/rolex/index.htm`

## `priceFrom` (type: `integer`):

Minimum price in EUR. Applies to **By brand** and **By query** (By search URL carries its own filters). Leave empty for no minimum.

## `priceTo` (type: `integer`):

Maximum price in EUR. Applies to **By brand** and **By query** (By search URL carries its own filters). Leave empty for no maximum.

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byBrand",
  "maxResults": 100,
  "brands": [
    "rolex"
  ],
  "query": "submariner",
  "searchUrls": [
    "https://www.chrono24.de/rolex/index.htm",
    "https://www.chrono24.de/omega/index.htm"
  ]
}
```

# Actor output Schema

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

Scraped Chrono24 watch listings.

## `htmlReport` (type: `string`):

Human-readable HTML run summary.

# 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 = {
    "brands": [
        "rolex"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/chrono24-watch-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 = { "brands": ["rolex"] }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/chrono24-watch-scraper").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 '{
  "brands": [
    "rolex"
  ]
}' |
apify call sian.agency/chrono24-watch-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Chrono24 Luxury Watch Scraper",
        "description": "Scrape luxury watches from Chrono24 — Rolex, Omega, Patek Philippe & more. Fast price/spec overview or full detail: reference, movement, case, dial, bracelet, year, condition, box & papers, seller. Dual-currency EUR/USD, clean JSON/CSV, no code.",
        "version": "1.0",
        "x-build-id": "1GxMcaGb6qfdku7gE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~chrono24-watch-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-chrono24-watch-scraper",
                "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/sian.agency~chrono24-watch-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-chrono24-watch-scraper",
                "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/sian.agency~chrono24-watch-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-chrono24-watch-scraper",
                "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",
                "properties": {
                    "scrapeMode": {
                        "title": "🧭 Scrape mode",
                        "enum": [
                            "overview",
                            "detail"
                        ],
                        "type": "string",
                        "description": "How deep to scrape each watch.\n\n- **Overview** = fast price/spec scan straight from the search-result cards (no detail-page visits, ~60–120 listings per fetch). Best for sizing a market cheaply.\n- **Detail** = the full per-watch record — reference number, movement, case material & diameter, dial, bracelet, year, condition, scope of delivery (box & papers), gender, seller — one fetch per listing.",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🔎 Search mode",
                        "enum": [
                            "byBrand",
                            "byQuery",
                            "bySearchUrl"
                        ],
                        "type": "string",
                        "description": "How to choose which watches to scrape. Fill in the matching section below.\n\n- **By brand** — pick brand slugs like `rolex`, `omega` (the default).\n- **By query** — free-text search, e.g. `submariner`.\n- **By search URL** — paste filtered Chrono24 search/brand URLs.",
                        "default": "byBrand"
                    },
                    "maxResults": {
                        "title": "🔢 Max results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum watches to return this run. The free tier is capped at 25.",
                        "default": 100
                    },
                    "brands": {
                        "title": "🏷️ Brands",
                        "type": "array",
                        "description": "Brand slugs to scrape when Search mode = **By brand** (e.g. `rolex`, `omega`, `tudor`, `breitling`, `cartier`, `tag-heuer`). Add as many as you like.\n\n**Note:** some brands' slugs differ from the obvious form and may 404 (e.g. `patek-philippe`, `audemars-piguet`). For those, use **By query** (search `patek philippe`) or **By search URL** (paste the brand page URL) instead.",
                        "default": [
                            "rolex"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "query": {
                        "title": "🔍 Search query",
                        "type": "string",
                        "description": "Free-text search used when Search mode = **By query** — e.g. `submariner`, `speedmaster`, `daytona`. Searches across all brands and models."
                    },
                    "searchUrls": {
                        "title": "🔗 Search URLs",
                        "type": "array",
                        "description": "Paste one or more Chrono24 **search** or **brand** URLs (used when Search mode = **By search URL**). Any filters baked into each URL are kept; pagination is automatic. Use this for brands whose slug 404s, or to reuse a refined search you built on the site.\n\n**Example:** `https://www.chrono24.de/rolex/index.htm`",
                        "items": {
                            "type": "string"
                        }
                    },
                    "priceFrom": {
                        "title": "💰 Min price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum price in EUR. Applies to **By brand** and **By query** (By search URL carries its own filters). Leave empty for no minimum."
                    },
                    "priceTo": {
                        "title": "💰 Max price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum price in EUR. Applies to **By brand** and **By query** (By search URL carries its own filters). Leave empty for no maximum."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
