Chrono24 Watch Listings Scraper
Pricing
Pay per event
Chrono24 Watch Listings Scraper
⌚ Export public Chrono24 watch listings with typed prices, references, seller locations, images, pagination, and optional detail enrichment for comps, sourcing, and inventory monitoring.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Extract public Chrono24 watch listings into a clean dataset for inventory monitoring, price research, valuation, and marketplace analysis.
The actor accepts Chrono24 search, brand, and model result pages, follows pagination, and saves one record per unique listing. It captures prices, references, seller locations, images, and source metadata without requiring a Chrono24 login.
- ⌚ Monitor Rolex, Omega, Patek Philippe, and other brand inventory
- 💵 Build current asking-price and comparable-listing datasets
- 🌍 Compare dealer and private-seller supply across locations
- 🔁 Schedule recurring exports for inventory and price changes
- 🔎 Optionally enrich cards with structured detail-page data
What does Chrono24 Watch Listings Scraper do?
Chrono24 Watch Listings Scraper opens the public result pages you provide and exports their watch cards as JSON, CSV, Excel, XML, or RSS through Apify datasets.
For each listing it can collect:
- stable Chrono24 listing ID and canonical URL;
- watch title, recognized brand, and model;
- public reference or card detail text;
- numeric price, currency, and displayed price;
- shipping text and numeric shipping price when shown;
- condition and production year when exposed on the card;
- dealer or private-seller classification;
- seller location and watch image URL;
- promotion badge, source page, source URL, and scrape time;
- optional JSON-LD description, exact reference, and availability.
The actor follows the visible Next link and deduplicates listings by their numeric Chrono24 ID.
Who should use this Chrono24 scraper?
Watch dealers and resellers
Track competing inventory, asking prices, reference numbers, and seller locations. Run the same URLs daily to identify newly listed or removed watches.
Collectors and buyers
Build a shortlist of comparable watches before a purchase. Export records to a spreadsheet and compare price, shipping, year, condition, and seller geography.
Valuation analysts
Create repeatable snapshots for reference-level price research. Use sourceUrl, sourcePage, and scrapedAt to audit where and when each comparable was observed.
Marketplaces and data teams
Feed structured public listing records into dashboards, warehouses, alerts, or internal valuation tools without maintaining a browser scraper.
Why use this actor?
Chrono24 is protected by browser checks, and basic HTTP requests can return a challenge instead of listing data. This actor uses a full browser under Xvfb, a realistic context, bounded session rotation, and Apify Proxy support.
You also get:
- ✅ typed, export-ready dataset fields;
- ✅ strict Chrono24 URL validation;
- ✅ global
maxItemscost control; - ✅ per-URL pagination limits;
- ✅ stable ID deduplication;
- ✅ non-zero failure on total extraction failure;
- ✅ optional detail enrichment rather than mandatory slow requests;
- ✅ integrations with the Apify API, schedules, webhooks, MCP, and storage.
What Chrono24 data can you extract?
| Field | Type | Description |
|---|---|---|
listingId | string | Stable numeric Chrono24 listing ID |
url | string | Canonical public listing URL |
title | string | Watch title from the result card |
brand | string | Recognized manufacturer when available |
model | string | Model text derived from the card title |
referenceNumber | string | Card detail/reference text or enriched reference |
price | number | Numeric asking price when public |
currency | string | Price currency, such as USD |
priceText | string | Original displayed price or “Price on request” |
shippingPrice | number | Numeric shipping amount when shown |
shippingText | string | Original shipping label |
condition | string | Condition hint when exposed |
year | number | Production year found on the card |
sellerType | string | dealer or private |
sellerLocation | string | Public seller country/location |
imageUrl | string | Watch image URL |
badge | string | Public card badge such as “Popular” |
isPromoted | boolean | Whether a badge indicates promotion |
detailsEnriched | boolean | Whether detail JSON-LD was added |
description | string | Optional structured detail description |
availability | string | Optional detail availability |
sourceUrl | string | Input or pagination URL that produced the row |
sourcePage | number | Page number within that input |
scrapedAt | string | UTC ISO timestamp |
Optional values are omitted when Chrono24 does not expose them; the actor does not invent missing data.
How to scrape Chrono24 watch listings
- Open the actor input page.
- Add one or more public Chrono24 search, brand, or model result URLs.
- Set Maximum watch listings to control total output.
- Set Maximum pages per URL to bound pagination.
- Leave detail enrichment off for fast monitoring, or enable it for richer records.
- Keep direct browser access for the tested low-cost default; enable a proxy only if your environment is challenged.
- Click Start.
- Export the resulting dataset as JSON, CSV, Excel, XML, or RSS.
A low-cost first run uses one URL, one page, and five listings.
Input parameters
| Parameter | Type | Default | Purpose |
|---|---|---|---|
startUrls | array | Rolex result page | Chrono24 search, brand, or model pages |
maxItems | integer | 20 | Global unique-listing limit |
maxPagesPerUrl | integer | 3 | Pagination limit for every seed URL |
includeDetails | boolean | false | Visit details for JSON-LD enrichment |
navigationTimeoutSecs | integer | 60 | Per-page browser timeout |
maxSessionRetries | integer | 2 | Browser/proxy rotations after challenges |
proxyConfiguration | object | Direct access | Optional proxy settings for challenged environments |
Individual listing-detail URLs are intentionally rejected as start URLs. This keeps every output row within the same listing-search product contract.
Example input
{"startUrls": [{ "url": "https://www.chrono24.com/rolex/index.htm" },{ "url": "https://www.chrono24.com/omega/index.htm" }],"maxItems": 40,"maxPagesPerUrl": 2,"includeDetails": false,"proxyConfiguration": {"useApifyProxy": false}}
For a detail-enriched valuation sample, set includeDetails to true and start with a low maxItems value.
Example output
{"listingId": "47173309","url": "https://www.chrono24.com/rolex/yacht-master-16622-platinum-grey-dial-stainless-steel-40--id47173309.htm","title": "Rolex Yacht-Master 40","brand": "Rolex","model": "Yacht-Master 40","referenceNumber": "16622 PLATINUM Grey Dial Stainless Steel 40","price": 10000,"currency": "USD","priceText": "$10,000","shippingPrice": 99,"sellerType": "dealer","sellerLocation": "United States of America","isPromoted": true,"detailsEnriched": false,"sourcePage": 1,"scrapedAt": "2026-07-22T07:55:03.920Z"}
Values change as the marketplace changes. The example illustrates the schema rather than guaranteeing a specific live offer.
How much does it cost to scrape Chrono24 listings?
This actor uses pay-per-event pricing:
- one small Start charge per run;
- one Watch listing charge for each unique dataset row.
The Console always shows the current exact event prices before a run. You control spend with maxItems and maxPagesPerUrl; detail enrichment also increases browser and proxy usage, so test that mode with a small limit first.
The free Apify plan can be used for small evaluations subject to your available platform credits. For recurring production monitoring, estimate cost from the item limit and the current tier price shown in Console.
Inventory and price-monitoring workflow
Run a stable set of result URLs on a schedule and store each dataset snapshot.
A typical workflow is:
- schedule the actor daily or hourly;
- export
listingId,price,sellerLocation, andscrapedAt; - join the new snapshot to the previous snapshot by
listingId; - flag new IDs, removed IDs, and changed prices;
- send changes to Slack, email, a webhook, or a database.
Because listings are deduplicated by stable ID, multiple overlapping result URLs can be supplied in one run.
Tips for reliable Chrono24 extraction
- 🎯 Start with exact brand, model, or filtered search URLs.
- 📉 Keep
maxItemslow while validating a new workflow. - 📄 Use one or two pages unless deeper inventory coverage is required.
- 🔎 Enable detail enrichment only when descriptions or availability are needed.
- 🌐 Use the tested direct default first; enable Apify Proxy only when needed.
- 🔁 Let the actor rotate sessions rather than adding aggressive concurrency.
- 🧾 Use the displayed
priceTextwhen a numeric price is unavailable. - 🕒 Compare
scrapedAtvalues when building historical snapshots.
Chrono24 can change its page structure or challenge behavior. If a run fails, retry once with the default settings and inspect the log before increasing limits.
Apify integrations
Google Sheets and Excel
Export CSV or Excel from the dataset, or connect the dataset to a spreadsheet automation for recurring comparable-price reports.
Webhooks and alerts
Trigger a webhook when a run succeeds. Compare the new dataset against the previous run and alert on new listings or price reductions.
Data warehouses
Pull dataset items through the API into BigQuery, Snowflake, PostgreSQL, or your preferred lakehouse. Use listingId as the marketplace key and scrapedAt as the snapshot timestamp.
Zapier and Make
Start runs from a workflow, wait for completion, then route new listing records to a CRM, notification channel, or review queue.
Use the actor through the JavaScript API
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/chrono24-watch-listings-scraper').call({startUrls: [{ url: 'https://www.chrono24.com/rolex/index.htm' }],maxItems: 20,maxPagesPerUrl: 1,includeDetails: false,proxyConfiguration: { useApifyProxy: false }});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Use the actor through the Python API
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/chrono24-watch-listings-scraper').call(run_input={'startUrls': [{'url': 'https://www.chrono24.com/omega/index.htm'}],'maxItems': 20,'maxPagesPerUrl': 1,'includeDetails': False,'proxyConfiguration': {'useApifyProxy': False},})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item)
Use the actor with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~chrono24-watch-listings-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls": [{"url":"https://www.chrono24.com/rolex/index.htm"}],"maxItems": 20,"maxPagesPerUrl": 1,"proxyConfiguration": {"useApifyProxy": false}}'
Fetch dataset items after the run finishes using the defaultDatasetId returned by the run API.
Use Chrono24 data with MCP and AI agents
Connect the actor to Claude Code:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/chrono24-watch-listings-scraper"
For Claude Desktop, Cursor, or VS Code, add this HTTP MCP server configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/chrono24-watch-listings-scraper"}}}
Example prompts for your agent:
- “Scrape the first 20 Rolex listings from Chrono24 and summarize asking prices.”
- “Export current Omega listings and group them by seller location.”
- “Create a comparable set for these Chrono24 result URLs and flag prices below the median.”
- “Run an enriched five-item sample and summarize references and availability.”
Limitations
- Only public
chrono24.comresult pages are supported. - Login-only data, saved searches, messaging, and account data are not accessed.
- Fields absent from public cards are omitted rather than inferred.
- Detail enrichment is slower and may fail for individual listings; useful card records are preserved.
- Marketplace changes can affect selectors, availability, or challenge behavior.
- Asking prices are not completed transaction prices and should not be treated as appraisals.
- Currency reflects the public page presentation; no currency conversion is performed.
Is it legal to scrape Chrono24?
This actor extracts public marketplace information. Web scraping laws and contractual requirements vary by country and use case.
Use the actor responsibly:
- collect only data you have a lawful purpose to process;
- respect applicable terms, database rights, copyright, and privacy rules;
- avoid excessive request volume;
- do not use output for spam, harassment, or discriminatory decisions;
- consult qualified counsel for regulated or high-risk uses.
The actor does not bypass login, access private account information, or send messages to sellers.
Troubleshooting
Why did the run report a Chrono24 challenge?
Use the tested direct default and the standard retry settings first. If direct access is challenged in your environment, enable Apify Proxy or provide a custom proxy. Avoid high limits until a small run succeeds.
Why is price missing?
Chrono24 may display “Price on request.” The original priceText remains available, but the actor does not invent a numeric price.
Why is detailsEnriched false when enrichment was enabled?
The detail page may not expose parseable Product JSON-LD or may have failed independently. The actor preserves the valid result-card record instead of discarding it.
Why was my URL rejected?
The URL must use chrono24.com, end in a public result-page .htm route, and not be an individual --id123.htm listing. Open the desired public result page in Chrono24 and copy that URL.
FAQ
Does this scraper require a Chrono24 account?
No. It reads public listing result pages and optional public detail metadata anonymously.
Can it scrape multiple brands in one run?
Yes. Add multiple brand or search URLs. maxItems applies globally, and duplicate listing IDs are emitted once.
Does it support pagination?
Yes. Set maxPagesPerUrl; the actor follows Chrono24's visible Next link.
Can I monitor prices over time?
Yes. Schedule repeated runs and compare datasets by listingId. Keep each snapshot's price, priceText, and scrapedAt.
Are prices guaranteed to be accurate appraisals?
No. They are public asking prices at scrape time. Validate any valuation decision with appropriate market and professional context.
Related watch and marketplace scrapers
- Bob's Watches Listings Scraper — compare dealer-owned Rolex inventory.
- Jomashop Luxury Watch Listings Scraper — extract retail luxury-watch listings.
- Bring a Trailer Auctions Scraper — monitor collectible auction inventory.
- eBay Scraper — broaden marketplace price research.
Use related actors only when their source fits your workflow; each marketplace has a different pricing and seller context.