# Chrono24 Scraper - Watch Prices, References & Dealers (`scrapewise/chrono24-scraper`) Actor

Scrape Chrono24 watch listings by keyword, brand, model or reference: price, currency, shipping, year, condition, box and papers, movement, case, dial, full spec sheet and the dealer's name, rating and reviews. Six currencies, onlyNew for daily price alerts. Error rows are free.

- **URL**: https://apify.com/scrapewise/chrono24-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.19 / 1,000 watch listing delivereds

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

## Chrono24 Scraper: watch prices, references, condition and dealers from Chrono24

Chrono24 Scraper collects **watch listings from Chrono24**, the largest marketplace for luxury and pre-owned watches,
without an account or cookies. Give it a keyword (brand, model or reference number) or paste any Chrono24
link, and each listing comes back as one clean row: title, brand, collection, model, reference number, price and
currency, shipping cost, year of production, condition, box and papers, movement and caliber, case size and material,
dial, bracelet, functions, the seller's description, all photos, and the professional dealer behind the offer with
its rating, number of reviews, badges and the year it joined Chrono24.

It is used to track the market price of a reference over time, to build price guides and valuation models, to find
under-priced watches for resale, to watch a competitor dealer's stock, and to feed alerts when a new listing appears.

### At a glance

| What | Price |
|---|---|
| Watch listing delivered (with the full spec sheet) | **US$ 1.40 per 1,000 listings** (US$ 0.0014 each) |
| Run start | US$ 0.005 per run |

- 500 Seiko Presage listings with every detail = **US$ 0.71**.
- The full spec sheet, description and dealer rating are included in the same price. Turn `includeDetails` off only
  when you want the run to go faster.
- Error rows and duplicates are never charged. `maxItems` is a hard cap, and a spending limit set on the run stops it
  cleanly with everything delivered so far.
- Six currencies, converted by Chrono24 itself: USD, GBP, CAD, AUD, SGD and INR.

### Quick start

One reference, 50 listings, cheapest first:

```json
{
  "searchQueries": ["SSA459J1"],
  "sortBy": "price_asc",
  "maxItems": 50
}
```

Several models, pre-owned only, between 3,000 and 8,000 pounds, sellers in the UK and Germany:

```json
{
  "searchQueries": ["omega speedmaster", "tudor black bay 58"],
  "condition": "used",
  "currency": "GBP",
  "minPrice": 3000,
  "maxPrice": 8000,
  "sellerCountries": ["UK", "DE"],
  "maxItems": 200
}
```

Links copied from the browser (a brand page, a model page, a reference page or a single listing):

```json
{
  "startUrls": [
    { "url": "https://www.chrono24.com/seiko/presage--mod2477.htm" },
    { "url": "https://www.chrono24.com/seiko/ref-ssa459j1.htm" },
    { "url": "https://www.chrono24.com/seiko/seiko-presage-cocktail-time-405mm-ssa459--id29943193.htm" }
  ],
  "maxItems": 100
}
```

Daily alert of new listings for a model (put it on a schedule):

```json
{
  "searchQueries": ["patek philippe nautilus"],
  "sortBy": "newest",
  "onlyNew": true,
  "maxItems": 100
}
```

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Brand, model or reference number, one per line (`seiko presage`, `tudor black bay`, `SSA459J1`). Each one is a Chrono24 search. |
| `startUrls` | Chrono24 links: search results, brand, model or reference pages, or single listings. Filters already in the link are kept. Links from chrono24.de, .fr, .it and the other country sites work too. |
| `currency` | USD (default), GBP, CAD, AUD, SGD or INR. Prices and shipping come in this currency. |
| `sortBy` | `relevance` (default), `price_asc`, `price_desc`, `newest` or `popularity`. |
| `condition` | `any` (default), `new` (new and unworn) or `used` (pre-owned). |
| `minPrice` / `maxPrice` | Price range in the chosen currency. |
| `sellerCountries` | Only sellers in these countries, as 2-letter codes (`US`, `DE`, `JP`, `UK`, `CH`...). |
| `includeDetails` | On by default: opens each listing for the full spec sheet, description, shipping and dealer rating. Off = search card fields only, faster, same price. |
| `maxItems` | Cap for the whole run, across all searches and links (default 50; 0 = no cap). |
| `onlyNew` | Remembers what earlier runs of the same search delivered (in your account) and returns only listings not seen before. Skipped listings are free. |
| `proxyConfiguration` | Apify datacenter proxy by default. |

A search for a known model is redirected by Chrono24 to that model's page, and the Actor follows it page by page
(120 listings per page) until `maxItems` or the end of the results.

### Output

One row per listing. Fields marked "details" come from the listing page (`includeDetails` on); the others come from
the search card and are always there.

| Field | Example | Notes |
|---|---|---|
| `listingId` | `29943193` | Chrono24 listing id |
| `url` | `https://www.chrono24.com/seiko/...--id29943193.htm` | Listing link |
| `title` | `Seiko Presage Cocktail Time 40.5MM SSA459` | As written by the seller |
| `modelLine` / `subtitle` | `Seiko Presage` / `Cocktail Time 40.5MM SSA459` | The two lines of the search card |
| `brand`, `collection`, `model` | `Seiko`, `Presage`, `Presage` | details |
| `referenceNumber` | `SSA459J1` | details |
| `listingCode` | `HTSBD9` | Chrono24 listing code, details |
| `price`, `currency`, `priceText` | `595`, `USD`, `$595` | Price on request comes as `null` with the text |
| `isNegotiable` | `false` | details |
| `shippingCost`, `shippingText` | `79`, `+ $79 for shipping` | |
| `transitDaysMin` / `transitDaysMax`, `deliveryEstimate` | `3`, `20`, `Anticipated delivery: 10/26 - 11/17` | details |
| `availability`, `availabilityText` | `InStock`, `Item is in stock` | |
| `condition`, `conditionDetails`, `itemCondition` | `New`, `The item is new and shows no signs of wear...`, `NewCondition` | details |
| `yearOfProduction`, `yearText` | `2026`, `2026` (`Unknown` when not stated) | details |
| `scopeOfDelivery` | `Original box, original papers` | details |
| `gender` | `Men's watch/Unisex` | details |
| `movement`, `caliber`, `powerReserve`, `numberOfJewels` | `Automatic`, `null`, `41 h`, `29` | details, when the seller fills them |
| `caseMaterial`, `caseDiameter`, `caseThickness`, `waterResistance`, `bezelMaterial`, `crystal` | `Steel`, `40.5 mm`, `null`, `5 ATM`, `null`, `Mineral Glass` | details |
| `dial`, `dialNumerals` | `Green`, `No numerals` | details |
| `braceletMaterial`, `braceletColor`, `lugWidth`, `clasp` | `Leather`, `Brown`, `null`, `null` | details |
| `functions` | `[]` (for example `["Chronograph", "Date"]` on a chronograph) | details |
| `specs` | `{ "basicInfo": {...}, "caliber": {...}, "case": {...} }` | Every row of every spec table, grouped as on the page |
| `description` | Seller's text | details; e-mails and phone numbers are removed |
| `images`, `imageUrl` | Photo links (large size) | |
| `badges`, `isPromoted` | `["Popular"]`, `false` | Search card badges |
| `sellerType` | `dealer` or `private` | |
| `sellerName`, `sellerKind` | `Fantastic times`, `Professional dealer` | Dealers only |
| `sellerRating`, `sellerReviewCount`, `sellerSince`, `sellerBadges` | `4.9`, `2465`, `2017`, `["Trusted Seller", "Fast Shipper"]` | Dealers only |
| `sellerCountry`, `sellerCountryCode`, `sellerLocation` | `United States of America`, `US`, `New York, United States of America` | City only for dealers |
| `location` | `United States of America, New York, New York` | details |
| `searchPosition`, `sourceUrl`, `detailsScraped`, `scrapedAt` | `1`, `seiko presage`, `true` | Where the row came from |

Private sellers are never named: the row says `sellerType: "private"` and the country only.

#### Real output (shortened)

```json
{
  "type": "listing",
  "listingId": "29943193",
  "url": "https://www.chrono24.com/seiko/seiko-presage-cocktail-time-405mm-ssa459--id29943193.htm",
  "title": "Seiko Presage Cocktail Time 40.5MM SSA459",
  "brand": "Seiko",
  "collection": "Presage",
  "model": "Presage",
  "referenceNumber": "SSA459J1",
  "price": 595.0,
  "currency": "USD",
  "priceText": "$595",
  "isNegotiable": false,
  "shippingCost": 79.0,
  "shippingText": "+ $79 for shipping",
  "condition": "New",
  "scopeOfDelivery": "Original box, original papers",
  "movement": "Automatic",
  "caliber": null,
  "powerReserve": "41 h",
  "caseMaterial": "Steel",
  "caseDiameter": "40.5 mm",
  "waterResistance": "5 ATM",
  "crystal": "Mineral Glass",
  "dial": "Green",
  "braceletMaterial": "Leather",
  "clasp": null,
  "functions": [],
  "sellerType": "dealer",
  "sellerName": "Fantastic times",
  "sellerKind": "Professional dealer",
  "sellerRating": 4.9,
  "sellerReviewCount": 2465,
  "sellerSince": 2017,
  "sellerBadges": ["Trusted Seller", "Fast Shipper", "Punctuality", "Sales"],
  "sellerCountryCode": "US",
  "badges": ["Popular"],
  "transitDaysMin": 3,
  "transitDaysMax": 20,
  "searchPosition": 1,
  "sourceUrl": "seiko presage",
  "detailsScraped": true,
  "scrapedAt": "2026-10-21T20:06:26Z",
  "errorCode": null,
  "error": null
}
```

### Errors you may see

Error rows have `type: "error"`, an `errorCode` and a plain-English `error`. They are never charged.

| errorCode | What happened | What to do |
|---|---|---|
| `INVALID_INPUT` | A field has a value the Actor does not know (currency, sort, condition, country code) | Fix the field named in the message |
| `INVALID_URL` | The link is not from Chrono24 | Paste a search, brand, model, reference or listing link |
| `NO_RESULTS` | Chrono24 has no listing for this search and filters | Use a broader keyword or fewer filters |
| `NOT_FOUND` | The listing was sold or removed | Nothing; it is no longer on the site |
| `BLOCKED` | Chrono24 refused every attempt | Run again in a few minutes |

### Integrations, scheduling and AI agents

- **Schedules:** run it every morning with `sortBy: "newest"` and `onlyNew: true` to get only the listings that
  appeared since the last run, ready for a price alert.
- **Export:** download the dataset as JSON, CSV, Excel, XML or HTML from the run page, or read it through the Apify API
  (`/datasets/{id}/items?format=csv`).
- **Make, n8n and Zapier:** use the Apify app in each one to start the Actor and send new rows to Google Sheets,
  Airtable, Slack or a database.
- **Webhooks:** call your own endpoint when a run finishes.
- **AI agents:** the Actor can be called as a tool through the Apify MCP server, so an assistant can look up the current
  asking prices of a reference on request.

### FAQ

**Do I need a Chrono24 account?** No. Everything comes from public pages.

**Why are prices in my currency different from the site I see?** Chrono24 converts prices per country site. Pick the
`currency` you need and the Actor reads the English-language Chrono24 site for that currency.

**Can I get EUR prices?** Not yet. The euro sites are in other languages; links from them work, but prices come in the
currency you choose here.

**Does it get sold prices?** No. Chrono24 shows current asking prices. Schedule the Actor with `onlyNew` and keep the
history to see how asking prices move.

**How fast is it?** About 25 listings with full details in 4 seconds, and 130 search-card rows in 1 second, measured
on 16 Oct 2026.

**What about private sellers?** Their listings are delivered with the watch data, price and country, but never a name,
user name or city.

### Limitations

- Prices are asking prices set by sellers, not transaction prices.
- Spec fields are filled by the seller; empty fields come as `null` (for example `yearOfProduction` when the year is
  "Unknown").
- Very wide searches stop at 80 pages (9,600 listings) per search; split them by reference or price range.
- Chrono24 decides which model page a keyword lands on; for exact control paste the model or reference link.

### Changelog

- **16 Oct 2026:** first version. Keyword and link search, six currencies, condition, price and seller country filters,
  five sort orders, full spec sheet, dealer rating and badges, `onlyNew` for schedules, free error rows.

# Actor input Schema

## `searchQueries` (type: `array`):

Watch brand, model or reference, one per line, for example seiko presage, tudor black bay or SSA459J1. Each keyword is one Chrono24 search. Leave empty when you paste links below.

## `startUrls` (type: `array`):

Links copied from Chrono24: a search result, a brand page (chrono24.com/seiko/index.htm), a model page (.../presage--mod2477.htm), a reference page (.../ref-ssa459j1.htm) or a single listing (...--id29943193.htm). Filters already in the link are kept.

## `currency` (type: `string`):

Prices come in this currency, converted by Chrono24 itself on its English-language site for that country.

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

Order of the search results. Use newest with onlyNew for daily alerts.

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

Keep only new (unworn) or pre-owned watches.

## `minPrice` (type: `integer`):

Lowest price in the chosen currency. Empty = no minimum.

## `maxPrice` (type: `integer`):

Highest price in the chosen currency. Empty = no maximum.

## `sellerCountries` (type: `array`):

Keep only listings from sellers in these countries, as 2-letter codes, for example US, DE, JP or UK. Empty = worldwide.

## `includeDetails` (type: `boolean`):

On: opens each listing for the full spec sheet (reference, year, condition, box and papers, movement, case, dial, bracelet, functions), shipping, description and the dealer's name, rating, reviews and badges. Off: faster, search card fields only. Same price either way.

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

Hard cap for the whole run, across all searches and links. 0 = no cap.

## `onlyNew` (type: `boolean`):

On: remembers the listings delivered in earlier runs of the same search (in your account) and delivers only listings not seen before. Skipped listings are free.

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

Apify Proxy by default. Change it only if you know you need to.

## Actor input object example

```json
{
  "searchQueries": [
    "seiko presage"
  ],
  "currency": "USD",
  "sortBy": "relevance",
  "condition": "any",
  "includeDetails": true,
  "maxItems": 50,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "searchQueries": [
        "seiko presage"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/chrono24-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 = {
    "searchQueries": ["seiko presage"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/chrono24-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 '{
  "searchQueries": [
    "seiko presage"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/chrono24-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/chrono24-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/16WrQpMJcLuYEVQla/builds/ee98FiJYt5xpm8DZC/openapi.json
