← Blog

Watches

Chrono24 Scraper: Watch Price Data, Tracking and Alerts

Scrape Chrono24 watch listings, prices and seller data with 50+ filters, and get Telegram, Discord or webhook alerts on new listings and price drops.

Epic Scrapers

Chrono24 is the largest marketplace for pre-owned and grey-market luxury watches, with more than 500,000 listings from dealers and private sellers worldwide. It has no public API. If you price inventory, source deals or study the watch market, the only way to get that data in bulk is to scrape it.

The Chrono24 Scraper gives you that data as structured JSON: prices in your currency, seller country and type, certification, stock status, shipping cost and, optionally, full spec sheets. Its sibling, Chrono24 Alerts, runs the same search and pings you on Telegram, Discord or a webhook when something new appears. This guide covers both.

What Chrono24 data you can scrape

Basic mode (fast, for monitoring)

Every listing includes listingId, title, subtitle (often the reference), price, currency, listingUrl, imageUrls, mainImage, location (city, countryCode, countryName), sellerType, certifiedStatus, listingStatus, watchStockInfo, badge and shippingCost.

Enriched mode (full spec sheet)

Set enrichDetails: true and each record also gets a detail object with referenceNumber, manufacturer, model, subModel, condition, yearOfProduction, caseDiameter, scopeOfDelivery (box and papers), description, sold, reserved, fullImageUrls and a seller block with name, rating and reviewCount. Enriched mode makes one extra request per listing, so it is slower and costs more. Use basic mode for high-volume price tracking and enriched mode when you need to evaluate individual watches.

How to scrape Chrono24 in five minutes

  1. Open the Chrono24 Scraper and click Try for free.
  2. Enter a Search Query: a brand, model or reference number such as Rolex Submariner 126610LN. You can also leave it blank and search on filters alone.
  3. Pick a Currency (35 are supported, from USD, EUR, GBP and CHF to JPY, HKD and AED) and a Sort Order.
  4. Add filters as needed and set Max Listings (maxResults, up to 10,000 per run).
  5. Click Start, then export from the Output tab to JSON, CSV, Excel or Google Sheets.

Example: cheapest certified Daytonas with box and papers

{
    "searchQuery": "Rolex Daytona 116500LN",
    "currency": "USD",
    "sortOrder": "1",
    "certified": true,
    "specials": ["102"],
    "condition": "1302",
    "countryIds": "US,CH,DE,JP",
    "maxResults": 100,
    "enrichDetails": true
}

sortOrder: "1" is price low to high, specials: ["102"] means box and papers, and condition: "1302" is “Very good”. Sort codes are 0 relevance, 1 price ascending, 5 newest first (the default), 11 price descending, 15 popularity and 42 biggest savings.

Example: filter-only search for vintage divers

You don’t need a keyword. This pulls automatic Omega and Tudor dive watches from 1960 to 1985 under EUR 8,000, sold by private sellers:

{
    "manufacturerIds": "187,245",
    "styles": ["1804", "1802"],
    "movementTypes": "1",
    "year": "1960,1985",
    "priceTo": 8000,
    "currency": "EUR",
    "sellerType": "PrivateSeller",
    "maxResults": 300
}

Common brand IDs: 221 Rolex, 187 Omega, 43 Cartier, 32 Breitling, 115 IWC, 194 Patek Philippe, 18 Audemars Piguet, 245 Tudor. Other filters include caseDiameter ("36,42"), caseMaterials, dialColor, braceletMaterial, functions (chronograph, GMT, moon phase and more), waterproof, gender, watchTypes (new or used) and stockInfo.

Sample output

A trimmed enriched record:

{
    "listingId": 47189364,
    "title": "Rolex Daytona",
    "subtitle": "Ref. 6263 - BIG RED - Year 1978",
    "price": 99314,
    "currency": "USD",
    "listingUrl": "https://www.chrono24.com/rolex/rolex-daytona--id47189364.htm",
    "location": { "city": "ROMA", "countryCode": "IT", "countryName": "Italy" },
    "sellerType": "Dealer",
    "certifiedStatus": false,
    "listingStatus": "Available",
    "watchStockInfo": "InStock",
    "shippingCost": { "amount": 234, "currency": "USD" },
    "detail": {
        "referenceNumber": "6263",
        "manufacturer": "Rolex",
        "model": "Daytona",
        "condition": "Used (good)",
        "yearOfProduction": "1978",
        "caseDiameter": "37 mm",
        "scopeOfDelivery": "No original box, no original papers",
        "sold": false,
        "reserved": false,
        "seller": { "name": "Blu Time", "rating": null, "reviewCount": null }
    }
}

Incremental scraping with a tracking ID

A one-off scrape is a snapshot. Most watch use cases need the next question answered: what’s new since yesterday? That’s what trackingId is for.

Give your search a tracking ID, for example "trackingId": "sub-126610ln-daily". On later runs with the same ID, listings already seen are skipped, so you only receive and only pay for new listings. Combine it with sortOrder: "5" (newest first) and a schedule:

  1. Run the actor once with your input, including the trackingId.
  2. Click Save as a new task.
  3. In Schedules, create a schedule (for example 0 7 * * * for every morning at 7am) and add the task.

Each morning’s dataset then contains just the fresh listings. Use a different tracking ID for each saved search so they don’t share history. If you’d rather keep full daily snapshots for price history, leave trackingId blank and deduplicate on listingId yourself.

Chrono24 alerts on Telegram, Discord or a webhook

Chrono24 Alerts takes the same search filters as the scraper and remembers what it saw last time. Each scheduled run compares the current results with that memory and messages you about two things:

  • New listings that match your search (alertOnNewListing, on by default).
  • Price drops on listings it has already seen (alertOnPriceDrop). A drop must reach priceDropThreshold percent (default 5) and, optionally, priceDropMinAmount in your currency. Drops are measured from the price when the listing was first seen or last alerted, so a watch that’s cut in several small steps still triggers exactly one alert once the total crosses your threshold.

The first run only records a baseline, so you don’t get a flood of existing listings. Set notifyOnFirstRun if you want them anyway. Delivery goes to any mix of these channels:

Input What it’s for
telegramBotToken + telegramChatId Bot token from @BotFather and the chat, group or channel to message
discordWebhookUrl A channel webhook from Discord’s Integrations settings
webhookUrl Any HTTPS endpoint that accepts a JSON POST (Slack via Zapier or Make, your own backend)
{
    "searchQuery": "Patek Philippe 5711",
    "currency": "EUR",
    "certified": true,
    "specials": ["102"],
    "priceTo": 120000,
    "alertOnNewListing": true,
    "alertOnPriceDrop": true,
    "priceDropThreshold": 3,
    "maxListings": 100,
    "trackingId": "nautilus-5711",
    "telegramBotToken": "<your bot token>",
    "telegramChatId": "<your chat id>"
}

Telegram messages include the watch photo, price and a link to the listing. Discord gets a rich embed. The webhook gets one JSON POST per run with every alert. If a run finds more than maxNotificationsPerRun alerts (default 20), the rest are summed up in a single message. Every alert is also saved as a row in the run’s dataset.

Alerts only cover listings within the newest maxListings results (default 60), so keep each search narrow, or raise the limit for broad ones. Save the input as a task and schedule it: hourly for hot references, daily for broader searches. If you also watch other resale marketplaces, the same idea is covered in our Vinted new-listing alerts guide.

Get Chrono24 price data through the API

Python with apify-client, pulling the cheapest listings for a reference and printing the landed cost:

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])

run = client.actor("epicscrapers/chrono24-scraper").call(run_input={
    "searchQuery": "Omega Speedmaster 310.30.42.50.01.001",
    "currency": "USD",
    "sortOrder": "1",
    "watchTypes": "U",
    "maxResults": 90,
})

for w in client.dataset(run["defaultDatasetId"]).iterate_items():
    ship = (w.get("shippingCost") or {}).get("amount") or 0
    print(w["price"] + ship, w["currency"], w["location"]["countryCode"], w["sellerType"], w["listingUrl"])

Or with cURL:

curl -X POST "https://api.apify.com/v2/acts/epicscrapers~chrono24-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQuery": "Tudor Black Bay 58", "currency": "GBP", "sortOrder": "1", "maxResults": 60}'

Use cases

Dealers. Track competitor asking prices for the references you stock, every morning, in your own currency. Filter sellerType: "Dealer" and countryIds to see your direct competition, and add shippingCost to compare landed prices.

Resellers and sourcers. Private sellers often price below dealers. Run newest-first searches with sellerType: "PrivateSeller" and enriched mode, then scan description and scopeOfDelivery for full sets or “service due” watches worth flipping. Cross-check what similar pieces actually sell for using eBay sold listings data.

Pricing and valuation. Pull every listing for a reference, then build a price distribution by detail.condition, yearOfProduction and box-and-papers status. That gives you a defensible asking price or offer.

Market research. Schedule weekly runs across a basket of references (Daytona, Nautilus, Royal Oak, Speedmaster) and compare prices by location.countryCode to see regional spreads, or count listings over time to watch supply build or dry up.

Collectors. Put your watchlist on Chrono24 Alerts with certified: true and box and papers, and stop checking the site by hand.

FAQ

Does Chrono24 have an API?

No public one. Chrono24 doesn’t offer an API to buyers or third parties. The scraper reads publicly visible listing data with no login or API key.

How many listings can I scrape?

Up to 10,000 per run on paid Apify plans. Free accounts are limited to 10 listings per run, enough to check the output. See the Pricing tab for current costs.

Can I scrape Chrono24 sold prices?

Chrono24 listings are asking prices. Enriched mode includes sold and reserved flags, and scheduled runs with a tracking ID show when listings appear. For realized sale prices on watches, eBay’s completed listings are the most accessible public source.

How quickly do Chrono24 alerts fire?

As fast as your schedule. Hourly runs mean you hear about a new listing within the hour.

The actors only access publicly available listing data. You’re responsible for following Chrono24’s terms and laws such as GDPR, and for not misusing seller information. This isn’t legal advice.

Start tracking watch prices

Run the Chrono24 Scraper on one reference you care about with sortOrder: "1" and 50 results. When the data looks right, add a trackingId and a schedule, or switch to Chrono24 Alerts to get new listings on your phone. Details are on the actor page.