Chrono24 Scraper · All-in-One Watch Listings · $3/1k
Pricing
from $3.00 / 1,000 results
Chrono24 Scraper · All-in-One Watch Listings · $3/1k
Chrono24 all-in-one scraper — auto-classifies detail, brand-index, model-index, and search URLs in one run. 35+ fields per listing: reference, year, movement, caliber, materials, dealer country, shipping policy, full image array. JSON-LD product data. Pure HTTP, no browser
Pricing
from $3.00 / 1,000 results
Rating
5.0
(1)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
Chrono24 Scraper — Watch Listings, Brand & Model Search, Full Detail Specs
Paste any chrono24.com URL — a single listing, a brand page, a model page, or a search — and get a clean structured dataset with 40+ fields per watch: reference number, year, movement, caliber, power reserve, jewels, case diameter, materials, dial, bracelet, seller, country, shipping, and the full image gallery. Talks to Chrono24's own mobile JSON API. No Cloudflare wall, no headless browser, works on any proxy.
Why use this scraper
- All Chrono24 URL kinds in one input — paste a brand page, a model page, a search query, and individual listing URLs in the same array. Each is auto-classified and routed to the right API call. No separate actors per URL shape.
- 40+ fields per listing — far beyond price + condition. Every detail row carries: brand, model, reference number, production year, condition, movement type, caliber name, power reserve, jewel count, case diameter + thickness + material, bezel material, crystal/glass, dial color + markers, bracelet material + color + length, clasp, lug width, gender, water resistance, functions, scope of delivery, seller type + country + member-since, plus the full description and image gallery.
- Official mobile JSON API, not HTML scraping — the actor speaks the same signed JSON API the Chrono24 iOS/Android apps use. That means structured, type-stable data (no brittle HTML parsing) and resilience to website redesigns.
- No Cloudflare, no browser — the mobile API endpoint isn't behind Cloudflare's challenge wall, so there's no CAPTCHA solver, no headless Chromium, and no need for premium residential proxies — datacenter or any residential pool works. Memory footprint ~512 MB.
- Full filter control — narrow by price, year, condition, movement, case material, dial color, bracelet, gender, seller type, country and sort order. Paste a filtered chrono24.com URL or set
searchParamsin plain words ("steel","automatic","price descending") — they're resolved to Chrono24's ids for you. - Fast card mode — set
fetchListingDetails: falseto emit ~15 fields per listing straight from the search response (id, title, subtitle, price, shipping, country, seller type, image gallery) at 50 listings per request — ideal for price-tracking dashboards. - CSV-friendly flatten — every watch spec is flattened to a
specs_*column (specs_caliber,specs_casediameter,specs_year…) for instant spreadsheet use.
Overview
Chrono24 is the world's largest luxury watch marketplace — 500,000+ active listings (114,000+ Rolex alone), ~3 million users, ~10,000 watch brands. Whether you're a dealer monitoring inventory, an analyst tracking model price drifts, an arbitrage operator hunting cross-market spreads, or a collector building a database, you eventually need this data structured.
The actor authenticates to Chrono24's mobile API (chrono24.app) exactly like the official app — a one-time session handshake plus a per-request HMAC signature — then pages through search results and pulls full detail JSON per listing. Four URL shapes are auto-classified, so you don't tell the actor "what kind of URL this is"; you just paste URLs.
Supported inputs
| Input | Pattern | What you get |
|---|---|---|
| Detail page — single listing | /{brand}/{slug}--id{LISTING_ID}.htm | 1 row with the full 40+ field spec sheet |
| Brand page — all of a brand | /{brand}/index.htm | every listing of the brand (e.g. 114k+ Rolex), 50/page, paginated |
| Model page — one model | /{brand}/{model-slug}--mod{MODEL_ID}.htm | every listing of one model (Daytona, Speedmaster, Nautilus…) |
| Search — keyword query | /search/index.htm?query=… | every match for the query (e.g. patek nautilus), paginated |
Mix any of these in the same startUrls[] array. JSON or CSV output.
Filters are fully supported — either paste a filtered/sorted chrono24.com URL (price, year, condition, movement, materials, location, sort are read straight from the query string), or set them once in searchParams using plain words ("steel", "automatic", "new", "price descending"). See Filters below.
Speaks Chrono24's mobile JSON API. No Cloudflare challenge, no browser, no CAPTCHA solver.
Use cases
| Audience | Use it to… |
|---|---|
| Watch dealers | Monitor competitor inventory + price changes across brands daily. Alert when a target reference (116610LN, 5711/1A, 15510ST) appears under a threshold. |
| Investment analysts | Track average ask for blue-chip references over time. The referenceNumber + specs_year + price triple builds a per-cohort index. |
| Arbitrage operators | Cross-market spread mining — pull Chrono24 + other marketplaces in parallel, find >15% deltas after shipping normalisation. |
| Insurance / appraisal | Replacement-value lookups by reference + condition + year, with a defensible full spec sheet. |
| Collectors | Build a private database of every Submariner / Speedmaster / Royal Oak with movement, caliber, year, condition, seller country, photos. |
How it works
Three stages, all pure HTTP JSON:
- Classify & authenticate — each input URL is matched against a deterministic regex set (detail / brand / model / search). The actor performs the mobile app's one-time session handshake to obtain a session cookie, and resolves brand slugs to their numeric manufacturer IDs from the API's brand catalogue.
- Signed API calls — every request carries the mobile app's
app-tagHMAC signature (computed per request over the URL, method, timestamp, nonce, and session), so the API returns clean JSON. A fresh proxy IP rotates in per request. - Map & emit — search responses page 50 listings at a time; in detail mode each listing's full spec JSON is fetched (concurrency-capped) and every attribute is flattened into
specs_*columns. One row per listing, deduped bylistingIdacross all inputs.
End-to-end live smoke test: a patek nautilus search (3,904 matches) returned 6 full detail rows in ~4 s through a datacenter proxy, 0 failures; an Omega brand page (55,770 listings) streamed 50 cards per request.
Input configuration
| Field | Type | Required | Notes |
|---|---|---|---|
startUrls | string[] | yes | Any mix of detail / brand / model / search chrono24.com URLs. Auto-classified. Filters embedded in the URL (e.g. ?priceFrom=5000&sortorder=1) are honoured. |
searchParams | object | no | Filter passthrough merged into every brand/model/search call (price, year, condition, movement, materials, country, sort…). Accepts plain words (resolved to Chrono24 ids) or raw ids. See Filters. |
fetchListingDetails | boolean | no | Default true. After each search card, fetch the full detail JSON (40+ fields incl. caliber, materials, seller). Disable for fast card mode (~15 fields, 50/request, no per-listing fetch). |
maxIndexPages | integer | no | Default 10. Max pages of search pagination per brand/model/search URL (50 listings per page). |
flatten | boolean | no | Default true. Flatten the nested specs object to specs_* top-level columns for CSV. Disable to keep nested JSON. |
includeRaw | boolean | no | Default false. Attach the raw detail API payload as rawJson on each detail row. |
maxItems | integer | no | Hard cap on rows emitted. Default 1000. Free-tier users capped at 100. |
maxConcurrency | integer | no | Parallel detail fetches. Default 6. |
proxy | object | no | Any proxy works — the mobile API isn't behind Cloudflare. Datacenter is cheapest; residential is the safe default. You can also supply your own proxy URLs. |
Example input
{"startUrls": ["https://www.chrono24.com/rolex/daytona--mod2.htm","https://www.chrono24.com/omega/index.htm","https://www.chrono24.com/rolex/rolex-lady-datejust--id45070783.htm","https://www.chrono24.com/search/index.htm?query=patek+nautilus"],"fetchListingDetails": true,"maxIndexPages": 5,"maxItems": 500,"proxy": { "useApifyProxy": true }}
Filters
Two ways to filter — they stack (URL filters + searchParams, with searchParams winning on conflict):
1. Paste a filtered browser URL. Filter and sort on chrono24.com, copy the URL, drop it in startUrls. Price, year, condition, movement, materials, location and sort are read straight from the query string:
https://www.chrono24.com/rolex/index.htm?priceFrom=5000&priceTo=15000&sortorder=1
2. Set searchParams once — applied to every brand/model/search URL. Attribute filters accept plain words (resolved to Chrono24 ids automatically); price/year take raw numbers:
{"startUrls": ["https://www.chrono24.com/omega/index.htm"],"searchParams": {"priceFrom": 2000,"priceTo": 8000,"caseMaterials": "steel","movementTypes": "automatic","condition": "new","sortorder": "price descending"}}
Common filters (friendly values shown):
| Param | Accepts |
|---|---|
priceFrom, priceTo | numbers (in SETCURR, default USD) |
year | production year, e.g. 2020 |
usedOrNew | "new", "used" |
condition | "new", "like new & unworn", "very good", "good", … |
movementTypes | "automatic", "manual winding", "quartz" |
caseMaterials | "steel", "yellow gold", "rose gold", "platinum", "titanium", "ceramic", … |
dialColor | "black", "blue", "green", "meteorite", … |
braceletMaterial | "steel", "leather", "rubber", … |
gender | "men", "women" |
sellerType | "professional dealer", "private sellers", "chrono24 direct" |
countryIds | "Germany", "United States of America", … (or ISO codes DE, US) |
sortorder | "relevance", "price ascending", "price descending", "newest", "popularity" |
Unrecognised labels are passed through unchanged and logged, so you can always use a raw Chrono24 id directly.
Output overview
Two row shapes, set by the rowType field:
detail— emitted for detail URLs and (whenfetchListingDetails: true) for every listing found via brand/model/search. Carries the full spec sheet.card— emitted for listings on brand/model/search pages whenfetchListingDetails: false. ~15 fields straight from the search response.
All rows include listingId, listingUrl, price, currency, images[], and scrapedAt.
Output samples
rowType: "detail" (real sample, abridged)
{"rowType": "detail","listingId": "45070783","productId": 1122,"listingUrl": "https://www.chrono24.com/rolex/rolex-lady-datejust--id45070783.htm","title": "Rolex Lady-Datejust","subtitle": "26 mm Bronze Diamond Dial Oyster Watch 6916 circa 1981","brand": "Rolex","brandId": 221,"model": "Lady-Datejust","modelId": 53,"referenceNumber": "6916","price": 3299,"currency": "USD","priceNegotiable": false,"conditionNew": false,"availabilityText": "Item is in stock","country": "United States of America","sellerType": "Dealer","sellerCountry": "United States of America","sellerMemberSince": 2018,"specs": {"referencenumber": "6916","casediameter": "26 mm","year": "1981","condition": "Used (very good)","movementtype": "Automatic","caliber": "2030","powerreserve": "42 h","jewelnumber": "26","casematerial": "Steel","bezelmaterial": "Steel","glass": "Plexiglass","dialcolor": "Bronze","braceletmaterial":"Steel","clasp": "Fold clasp","gender": "Women's watch"// …20+ more spec_* fields, flattened when flatten=true},"images": ["https://img.chrono24.com/images/uhren/45070783-…-ExtraLarge.jpg", "…"],"thumbnail": "https://img.chrono24.com/images/uhren/45070783-…-ExtraLarge.jpg","sourceUrl": "https://www.chrono24.com/rolex/rolex-lady-datejust--id45070783.htm","scrapedAt": "2026-06-02T…"}
rowType: "card" (real sample — fetchListingDetails: false)
{"rowType": "card","listingId": "46108138","listingUrl": "https://www.chrono24.com/omega/seamaster-diver--id46108138.htm","title": "Omega Seamaster Diver 300 M","subtitle": "Blue No Wave Dial Complete Set","price": 4250,"currency": "USD","shippingCost": 300,"countryCode": "US","countryName": "United States of America","sellerType": "Dealer","stockInfo": "InStock","thumbnail": "https://img.chrono24.com/images/uhren/46108138-…-Square420.jpg","images": ["…", "…"],"sourceUrl": "https://www.chrono24.com/omega/index.htm","scrapedAt": "2026-06-02T…"}
Key output fields
Identity — listingId (primary key), referenceNumber (best join key vs external watch DBs), brand + model, productId.
Price — price (numeric), currency (ISO 4217), priceNegotiable, shippingCost.
Watch specs (specs_* when flattened) — year, condition, movementtype, caliber, powerreserve, jewelnumber, casediameter, casematerial, bezelmaterial, glass, dialcolor, braceletmaterial, clasp, lugwidth, gender, functions, waterresistance, scopeofdelivery.
Commerce — availabilityText, country, conditionNew, sellerType, sellerCountry, sellerMemberSince.
Media — images[] (full resolution), thumbnail.
FAQ
Does this need a Cloudflare-bypass service or premium residential proxy?
No. The actor uses Chrono24's mobile JSON API (chrono24.app), which is not behind Cloudflare's challenge. Any proxy works — datacenter (cheapest), any residential pool, or none for light use. This is the key difference from website scrapers, which hit Cloudflare on every request.
How does it authenticate? It replicates the Chrono24 mobile app's request signing: a one-time session handshake plus a per-request HMAC signature header. You don't configure anything — it's automatic.
Detail mode vs card mode?
Detail mode (fetchListingDetails: true, default) costs one extra API call per listing but returns 40+ fields including caliber, materials, seller, and full description. Card mode skips the per-listing call and returns ~15 fields straight from the search response — 50 listings per request, much faster and cheaper.
How do I scrape multiple brands or models in one run?
Paste them all in startUrls[]. Mix brand pages, model pages, search queries, and individual listing URLs freely.
Can I get the full image gallery?
Yes. Detail rows return every photo at full (ExtraLarge) resolution; card rows return the gallery at Square420.
Is currency normalised?
No, by design. price is in the listing's native currency (currency). Normalise downstream against your own reference date.
What about pagination?
Brand/model/search URLs auto-paginate (50 listings/page) up to maxIndexPages or until maxItems is reached. A single Rolex brand page exposes 114,000+ listings across ~2,290 pages.
How fresh is the data? Real-time — every run hits the live API.
Support
- Bug reports & feature requests — open an issue on the actor's Apify page or email below.
- Custom scraper builds — see Additional Services.
- Email —
info@apifyscraper.com
Additional services
Need a custom watch-marketplace scraper (Bezel, WatchCharts, Hodinkee Shop, eBay watches), or this one extended with price-history reconstruction, seller-reputation enrichment, or image OCR for serial numbers? Reach out — most custom builds ship in 3-5 business days at fixed scope.
Explore more scrapers
- SoundCloud Scraper — Tracks, Artists, Playlists, Search & Bio Emails
- TrustRadius Software Reviews Scraper
- Capterra Software & Reviews Scraper
- TotalJobs UK Jobs Scraper
- Pinterest Pins & Boards Scraper
⚠️ Disclaimer
This Actor accesses publicly available data on Chrono24 for legitimate research, market intelligence, dealer-side competitive analysis, valuation, and personal-collection management purposes. Use of this Actor must comply with Chrono24 GmbH's Terms of Service and all applicable laws including data protection regulations (GDPR, CCPA, etc.). The Actor's authors are not affiliated with, endorsed by, or sponsored by Chrono24 GmbH. The "Chrono24" name and logo are trademarks of Chrono24 GmbH. Users must:
- Respect rate limits and avoid overloading Chrono24's infrastructure (the default concurrency with per-request proxy rotation is calibrated to stay well below any reasonable threshold).
- Not use scraped data to impersonate or defraud Chrono24 dealers or buyers.
- Use the data in compliance with applicable jurisdictions, especially around resale of personal data from seller pages.
- Not republish scraped images or copyrighted listing copy without permission from the original seller.
We do not store any scraped data; the Actor returns it directly to your Apify dataset for your authorized use.
SEO Keywords
chrono24 scraper, chrono24 watch scraper, chrono24 listings scraper, chrono24 api, chrono24 api alternative, chrono24 data extraction, chrono24 bulk export, luxury watch scraper, rolex price scraper, omega listings scraper, patek philippe price tracker, watch marketplace scraper, watch arbitrage scraper, watch dealer inventory scraper, watch price tracker, watch market intelligence, reference number lookup, watch specs api, mobile api scraper, no-browser scraper, chrono24 json export, chrono24 csv export, web scraping, apify scraper