Chrono24 Scraper - Luxury Watches, Prices, Specs & Reviews avatar

Chrono24 Scraper - Luxury Watches, Prices, Specs & Reviews

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Chrono24 Scraper - Luxury Watches, Prices, Specs & Reviews

Chrono24 Scraper - Luxury Watches, Prices, Specs & Reviews

Scrape Chrono24 luxury watch listings by keyword, filters or URL. Extract 50+ fields including brand, model, reference number, price, year, condition, movement, case specifications, seller details, location, images and more.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

0

Monthly active users

a day ago

Last modified

Share

Chrono24 Scraper: Watch Listings, Specs, Seller & Review Data

Chrono24 Scraper turns Chrono24, the global marketplace for new and pre-owned watches, into structured JSON. Search by keyword and filters, or paste any mix of detail, brand, model, and search URLs. Each listing comes back with brand, model, reference number, price, year, condition, the full movement and case spec sheet, seller and location, images, and the seller's rating and recent buyer reviews. Export to JSON, CSV, or Excel, or pull results straight into your app through the API.

Why This Scraper?

  • 50+ fields per watch on the full record: the complete spec sheet (movement, caliber, case, dial, bracelet, clasp) plus seller, certification, listing code, and reference details.
  • Seller rating and recent buyer reviews (date, stars, watch, reviewer, text) attached to every fully-enriched listing at no extra fetch.
  • Two modes: keyword + filter search, or direct URLs, with detail, brand, model, and search links mixed freely in one run.
  • Card mode for cheap, fast harvesting of search and list pages, or full-detail mode for the complete spec sheet, chosen per run.
  • Rich filters: price, year, condition, case material, dial color, bracelet material, seller type, country, reference number, and more, with six sort orders.
  • Chrono24's own curated Top Deals collection with one toggle, complete with the site's own per-listing savings percentage in card mode.
  • Automatic pagination, de-duplication, and per-record output, with optional flattening to specs_* columns for spreadsheet export.

Use Cases

  • Dealers and resellers: track competitor pricing and stock across brands and reference numbers to price your own inventory.
  • Collectors: monitor a specific reference or model for new listings, price drops, or newly reappeared stock.
  • Market analysts: build historical pricing datasets by brand, condition, and case material for valuation models.
  • Deal hunters: pull Chrono24's curated Top Deals collection sorted by savings to spot the steepest discounts first.
  • Marketplace researchers: compare seller ratings, review samples, and seller type (dealer vs. private) across a search.

Data You Get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
listingId"00000001"
title"Rolex Submariner Date"
brand"Rolex"
model"Submariner Date"
referenceNumber"126610LN"
price12500
currency"USD"
availability"InStock"
condition"Used (Very good)"
year"2022"
location"Germany, Bavaria, Munich"
sellerCountry"DE"
sellerUsername"sample_dealer"
certificationStatus"Basic"
isDealfalse
specs_movement"Automatic"
specs_caseMaterial"Steel"
specs_caseDiameter"41 mm"
specs_dialColor"Black"
specs_functions"Date"
sellerRating4.8
reviewCount12
images["https://img.chrono24.com/images/uhren/00000001-Square480.jpg"]
listingUrl"https://www.chrono24.com/rolex/submariner--id00000001.htm"

A full-detail record also carries description, priceDisplay, availabilityText, conditionText, scopeOfDelivery, gender, Chrono24's internal productType/marketingType/collectionId/modelId/modelVariantId/refId, the remaining spec columns (specs_baseCaliber, specs_powerReserve, specs_jewels, specs_waterResistance, specs_bezelMaterial, specs_crystal, specs_dialNumerals, specs_braceletMaterial, specs_braceletColor, specs_clasp, specs_claspMaterial, specs_productSafety), a reviews array, a sample of the seller's recent reviews shown on the listing page (not the seller's full review history; date, rating, watch, reviewer name and country, received/shipped-from, text), and reviewCount, the number of reviews in that sample, thumbnail, rowType, and scrapedAt. buyingAgent (name, office, region) appears only on the minority of listings handled through Chrono24's own buying-agent/concierge program. rawHtmlBytes is a diagnostic byte count, only added when Include raw size marker is on. Chrono24 does not publish a structured was-price, original-price, or MSRP field on any listing, curated collections included, so this scraper does not fabricate one; the one real savings figure it does publish, a rendered "-N%" badge on the curated Top Deals collection, is picked up as discountPercent on lightweight cards (see below), while the full detail page carries only the boolean isDeal. Lightweight cards from a search, brand, model, or search-URL results page (fetch full details off) carry a narrower shape instead: rowType, listingId, watchId, title, price, currency, discountPercent (Top Deals collection only, null otherwise), sellerType, countryCode, thumbnail, images, mainImage, imageUrls, badge, listingUrl, sourceUrl, and scrapedAt, without any of the spec, seller-review, or Chrono24-internal fields above. A pasted single-listing URL (--id...htm) never returns this card shape: it always returns the full-detail record described above, regardless of the Fetch full details toggle (see "How to Use"). Incremental mode adds changeType, changedFields, firstSeenAt, and lastSeenAt to every record; these are absent when incremental mode is off.

How to Use

  1. Pick a mode: search (keyword + filters) or url (paste any mix of detail, brand, model, and search links).
  2. In search mode, set a keyword and filters, or turn on Top Deals collection only to browse Chrono24's own curated deals instead. In URL mode, paste your links.
  3. Switch Fetch full details on for the full spec sheet, or off for fast, cheap cards from results pages. Set Max listings (and optionally Max pages) to control run size and cost.
  4. Click Start, then download the dataset as JSON, CSV, or Excel, or read it through the API.

Search by keyword with filters (full detail):

{
"mode": "search",
"searchQuery": "Rolex Submariner",
"searchParams": { "priceFrom": 8000, "priceTo": 15000, "usedOrNew": "used", "caseMaterials": "steel" },
"sortBy": "price-asc",
"fetchDetails": true,
"maxListings": 50
}

Fast card harvesting (no per-listing fetch):

{
"mode": "search",
"searchQuery": "Omega Speedmaster",
"fetchDetails": false,
"maxListings": 200
}

Chrono24's curated Top Deals collection, sorted by the site's own savings percentage (card mode, needed to see discountPercent):

{
"mode": "search",
"dealsOnly": true,
"sortBy": "savings-desc",
"fetchDetails": false,
"maxListings": 50
}

Direct URLs, detail + model + search mixed, with Fetch full details off:

{
"mode": "url",
"urls": [
"https://www.chrono24.com/rolex/submariner--mod4.htm",
"https://www.chrono24.com/patek-philippe/nautilus--id00000001.htm",
"https://www.chrono24.com/search/index.htm?query=Daytona&dosearch=true"
],
"fetchDetails": false,
"maxListings": 0
}

This last example returns two different row shapes in one run: the model and search URLs return lightweight cards (Fetch full details is off), but the pasted detail URL still returns a full-detail record and is still billed the detail-enrichment charge, within whatever Max listings budget remains after the model and search URLs are walked. A single-listing URL has no lightweight card equivalent on Chrono24, so whenever it's read it is always fetched and enriched in full; Fetch full details only decides the row shape for brand, model, and search URLs (and for search mode). Set Max listings to 0 (unlimited) as shown here, or make sure the other URLs' budget doesn't consume the whole cap, or the pasted detail URL may never be reached in card mode, since list URLs are walked first.

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/chrono24-scraper").call(run_input={"mode": "search", "searchQuery": "Rolex Submariner", "maxListings": 20})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing["title"], listing["price"], listing["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/chrono24-scraper').call({ mode: 'search', searchQuery: 'Rolex Submariner', maxListings: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets, or webhooks from the Integrations tab.

How Max listings and Max pages cap a run

Max listings (maxListings) is the single cap on total output; set it to 0 for the hard maximum of 100000 listings. Max pages (maxPages) is a safety bound on how many result pages (120 listings each) the actor walks per search, brand, model, or search URL; set it to 0 for unlimited too. Either way, a walk also stops on its own the moment a page adds no new listings, so a run never loops on a search that has run out of fresh results.

Resume and recurring updates

Two distinct features:

  • Resume from a previous run (resumeFromRunId) continues one specific interrupted crawl: paste a previous run ID or dataset ID and this run skips every listing that run already collected, so a large pull finishes without paying for or re-returning what you already have. A run ID or dataset ID that cannot be read stops the run before anything is scraped.
  • Incremental mode (incrementalMode) is for scheduling this actor against the same search or URL set again and again (daily, for example) and getting back only what changed. State is kept automatically per search/URL and detail-mode setup, or name it yourself with stateKey to control sharing across runs. Every listing then carries changeType: NEW on first sight, UPDATED (with changedFields) when a tracked field genuinely changes (every scraped field is compared except scrapedAt, the seller-review list, reviewCount, sellerRating, their copies inside seller (seller.rating, seller.reviewCount), trackingId and anything you list in ignoreFieldsForChanges; ignored fields are still returned), or UNCHANGED when nothing did (suppressed and not billed unless emitUnchanged is on). EXPIRED and REAPPEARED are opt-in and gated: EXPIRED only fires with emitExpired on, and only after a run that scanned the entire tracked search without being capped by Max listings or Max pages, resumed, or missing a page it could not read. REAPPEARED can then only happen afterward, for a listing an earlier emitExpired run had marked gone; without ever turning emitExpired on, a schedule will only ever see NEW, UPDATED, and (if emitUnchanged is on) UNCHANGED. Combine incrementalMode with emitExpired and set maxListings/maxPages to 0 if you need a complete scan every run.

Send results into your apps (MCP connectors)

Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in the input. Notion receives a page per item; other connectors get a best-effort write or digest. The connector receives a condensed, human-readable summary per item (a title plus key fields), not the full JSON; the complete record always stays in the Apify dataset. Leave the field empty to skip. Supported: Notion, Linear, Airtable, Apify.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (keyword + filters) or url (paste links).
searchQuerystringno default (prefill: Rolex Submariner)Keyword for search mode. Empty browses everything matching the filters.
searchParamsobjectno default (prefill: {})Filters: priceFrom, priceTo (USD), year, usedOrNew, caseMaterials, dialColor, braceletMaterial, sellerType, countryIds, referenceNumber, caseDiameter, man, certified, inStock. Friendly words or raw Chrono24 ids.
manufacturerIdsstringno defaultTyped filter: Brand ids, comma-separated; each id is applied as its own filter. Overrides the same key in searchParams.
catalogCollectionIdstringno defaultTyped filter: Catalog collection id. Overrides the same key in searchParams.
catalogModelIdstringno defaultTyped filter: Catalog model id. Overrides the same key in searchParams.
watchTypesstringno defaultTyped filter: N for new, U for used. Overrides the same key in searchParams.
conditionstringno defaultTyped filter: Condition code. Overrides the same key in searchParams.
specialsarrayno defaultTyped filter: Delivery contents. Overrides the same key in searchParams.
movementTypesstringno defaultTyped filter: Movement type. Overrides the same key in searchParams.
genderstringno defaultTyped filter: Gender. Overrides the same key in searchParams.
waterproofstringno defaultTyped filter: Water resistance code. Overrides the same key in searchParams.
functionsarrayno defaultTyped filter: Functions. Overrides the same key in searchParams.
stylesarrayno defaultTyped filter: Styles. Overrides the same key in searchParams.
braceletColorarrayno defaultTyped filter: Bracelet colors. Overrides the same key in searchParams.
stockInfostringno defaultTyped filter: Stock. Overrides the same key in searchParams.
trackingIdstringno defaultTag copied onto every output row.
priceFromintegerno defaultTyped filter: Min price. Overrides the same key in searchParams.
priceTointegerno defaultTyped filter: Max price. Overrides the same key in searchParams.
yearstringno defaultTyped filter: Year. Overrides the same key in searchParams.
certifiedbooleanno defaultTyped filter: Certified only. Overrides the same key in searchParams.
caseDiameterstringno defaultTyped filter: Case diameter (mm). Overrides the same key in searchParams.
caseMaterialsarrayno defaultTyped filter: Case materials. Overrides the same key in searchParams.
dialColorarrayno defaultTyped filter: Dial colors. Overrides the same key in searchParams.
braceletMaterialarrayno defaultTyped filter: Bracelet materials. Overrides the same key in searchParams.
sellerTypestringno defaultTyped filter: Seller type. Overrides the same key in searchParams.
countryIdsstringno defaultTyped filter: Seller countries, comma-separated ISO-2 codes such as DE,NL; each code is applied as its own filter. Overrides the same key in searchParams.
sortBystringrelevancerelevance, price-asc, price-desc, newest, popularity, savings-desc (Top Deals collection only; falls back to relevance elsewhere).
dealsOnlybooleanfalseBrowse Chrono24's curated Top Deals collection instead of a regular search. Ignores searchQuery and searchParams (not supported by that page); sortBy still applies, including savings-desc.
urlsarraya model page, the Top Deals page and a brand pageDetail (--id), brand (/rolex/index.htm), model (--mod), search (/search/index.htm?dosearch=true&query=...) or Top Deals URLs (URL mode). In URL mode, leaving urls out scrapes the three default examples instead of finding nothing. URLs of any other shape are skipped with a warning in the run log, and a URL that returns no listings is logged as such.
fetchDetailsbooleantrueOn: full spec sheet per listing. Off: lightweight cards from results pages for search/brand/model/search URLs; pasted detail URLs are always fully fetched regardless.
maxReviewsPerListinginteger20Caps the seller reviews attached to each listing (1 to 1000). Reviews are read from the same page, so no extra billing applies.
fetchSellerReviewsbooleantrueAttach seller rating + recent buyer reviews to each fully-enriched listing. Read in the same pass as the details, so it adds no extra fetch. Only applies when Fetch full details is on (or on a pasted detail URL, which is always fully fetched).
flattenbooleantrueAlso expose nested specs as flat specs_* columns.
includeRawbooleanfalseAttach a rawHtmlBytes diagnostic field.
maxListingsinteger20The single cap on output (maximum 100000). 0 means the maximum, 100000.
maxPagesinteger0Safety bound on pages per search URL (120 listings per page). 0 means unlimited: the run stops at Max listings, or when a page stops returning new listings.
resumeFromRunIdstringno defaultContinue one specific interrupted run: paste its run ID or dataset ID and this run skips listings already collected there.
incrementalModebooleanfalseRecurring/scheduled monitoring of the same search or URL set; see "Resume and recurring updates".
stateKeystringno defaultName a monitoring campaign (incremental mode) to keep its state stable, or leave empty for an automatic key derived from the search/URL and detail settings.
emitUnchangedbooleanfalseIncremental mode: also return (and bill) listings unchanged since the last run, marked UNCHANGED.
emitExpiredbooleanfalseIncremental mode: also return (and bill) listings from a previous run no longer found, marked EXPIRED. Only produced after a complete scan; see "Resume and recurring updates".
ignoreFieldsForChangesarray[]Incremental mode: extra field names (any depth) or dotted paths such as specs.movement to leave out of change detection. They are still returned in the output.
proxyobjectno default (prefill: Apify Proxy enabled)Connection settings; see "Plan Requirement".
mcpConnectorsarrayno defaultOptional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstringno defaultNotion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Supported URL shapes (URL mode)

URL shapeExampleWhat you get
Detail/rolex/submariner--id00000001.htmOne full-detail record, always, regardless of Fetch full details (detail enrichment applies).
Brand/rolex/index.htmCards, or full details when Fetch full details is on; paginated.
Model/rolex/submariner--mod4.htm (also --imod)Cards or full details; paginated.
Search/search/index.htm?query=Daytona&dosearch=trueCards or full details; paginated.
Top DealsChrono24's curated Top Deals pageCards with discountPercent, or full details.

If you leave urls out in URL mode, the three default examples (a model page, the Top Deals page and a brand page) are scraped. A search URL pasted without dosearch=true gets that flag added, because Chrono24 shows an empty search page without it. Any other URL shape is skipped with a warning in the run log naming the URL and the reason, and a URL that returns no listings is logged as such. If every URL is skipped, the run says no usable query or URLs were provided.

Typed filters and tracking id

Search mode accepts each filter as its own input (brand ids, price range, new or used, condition code, certified, delivery contents, movement, gender, case diameter, year, water resistance, functions, styles, materials, colors, seller type, stock, seller countries). They override the same key in the Filters JSON, which keeps working. Sort order "Savings" only applies with the Top Deals collection. Set Tracking id to copy a tag onto every output row. Rows also carry additive fields where the page exposes them. Cards: mainImage, imageUrls and badge (the Top Deals savings badge). Full-detail records: mainImage, imageUrls, certifiedStatus, listingStatus, watchStockInfo, subModel, conditionNew (Chrono24's own new or used split), shippingCost (the seller's published shipping amount), sellerLocation (countryName, region, countryCode) and seller (merchantLogin, rating, reviewCount). The price currency is the one Chrono24 serves to the connection; it is not selectable.

Seller review limit

maxReviewsPerListing (default 20, 1 to 1000) caps how many seller reviews are attached to each fully fetched listing. reviewCount is the number of reviews found on the listing page and sellerRating is the published rating; both stay the same whatever the cap is, only the attached reviews list is shortened. The cap does not add any charge.

Output views

The dataset has these views in the Console: Overview (listings and cards), Specifications, Listing details, Seller reviews (one row per review) and Incremental changes (changeType, changedFields, first and last seen).

Pricing events

This actor is pay per event: a charge when a run starts, a charge for each listing pushed to the dataset ("Listing result"), and a "Detail enrichment" charge for each listing fully fetched (Fetch full details on, or any pasted single-listing URL). Seller reviews and views add nothing. In incremental mode, unchanged listings are not pushed and so are not billed unless Emit unchanged is on. The Pricing tab shows the current rates.

Output Example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"rowType": "detail",
"listingId": "00000001",
"watchId": "00000001",
"listingUrl": "https://www.chrono24.com/rolex/submariner--id00000001.htm",
"title": "Rolex Submariner Date",
"brand": "Rolex",
"model": "Submariner Date",
"referenceNumber": "126610LN",
"listingCode": "AAA000",
"price": 12500,
"currency": "USD",
"availability": "InStock",
"condition": "Used (Very good)",
"year": "2022",
"location": "Germany, Bavaria, Munich",
"sellerCountry": "DE",
"sellerUsername": "sample_dealer",
"certificationStatus": "Basic",
"isDeal": false,
"scopeOfDelivery": "Original box, original papers",
"gender": "Men's watch/Unisex",
"specs": {
"movement": "Automatic",
"caliber": "3235",
"baseCaliber": "3235",
"powerReserve": "70 h",
"jewels": "31",
"caseMaterial": "Steel",
"caseDiameter": "41 mm",
"waterResistance": "30 ATM",
"bezelMaterial": "Ceramic",
"crystal": "Sapphire crystal",
"dialColor": "Black",
"braceletMaterial": "Steel",
"clasp": "Fold clasp",
"functions": "Date"
},
"sellerRating": 4.8,
"reviewCount": 12,
"reviews": [
{
"date": "2026-01-01",
"rating": 5,
"watch": "Rolex Submariner",
"received": "2026-01-01",
"shippedFrom": "United States of America",
"reviewerName": "Jane D.",
"reviewerCountry": "United States of America",
"text": "Sample review text appears here."
}
],
"images": ["https://img.chrono24.com/images/uhren/00000001-Square480.jpg"],
"scrapedAt": "2026-01-01T00:00:00.000Z"
}

A lightweight card (Fetch full details off, on a search, brand, model, or search-URL page) instead returns just rowType: "card", listingId, watchId, title, price, currency, discountPercent (Top Deals collection only, null otherwise), sellerType, countryCode, thumbnail, images, mainImage, imageUrls, badge, listingUrl, sourceUrl, and scrapedAt, with none of the spec, seller, or review fields above.

Plan Requirement

Chrono24 protects its pages with an anti-bot challenge on every connection type, datacenter and residential alike, so no proxy setting alone gets through. The actor handles this itself: it probes exits, obtains a clearance for a chosen exit and retries on a different connection when one is refused. Expect some runs to be slower during busy challenge periods. Keep the default Apify Proxy setting under Proxy & connection; a residential group is optional and gives the widest rotation for large or frequent runs. Apify free plans do not include residential proxies, and on those plans the actor continues on a backup connection that may be slower or return fewer results. When the requested pages cannot be loaded at all, the run fails with one of these messages instead of finishing empty:

  • "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later."
  • "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested Chrono24 pages. Upgrade at https://apify.com/pricing or supply your own proxy URLs, then try again."

FAQ

How much does it cost?

You pay per run start, per listing returned, and an extra detail-enrichment charge for each listing that is fully fetched (Fetch full details on, or any pasted single-listing URL, which is always fully fetched regardless of that toggle). The Pricing tab shows the current rates. Use Max listings to cap the cost of any run.

This actor collects only publicly available marketplace listing data. You are responsible for how you use it: follow Chrono24's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listings can include a seller's username, general location, and reviews from other users; handle that data responsibly and avoid republishing it in ways that identify individuals.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated listings by default, and unchanged ones are not billed. Turning on emitExpired also surfaces listings that disappeared, but only after a run that scans the whole tracked search; see "Resume and recurring updates" for the exact gating.

Does "Fetch full details" apply to a pasted single-listing URL?

No. A pasted detail URL (--id...htm) has no lightweight card equivalent on Chrono24, so it is always fetched and enriched in full, and always billed the detail-enrichment charge, whether Fetch full details is on or off. The toggle only changes the row shape for search results and for pasted brand, model, and search URLs.

Why did my run fail instead of returning an empty dataset?

If Chrono24 refuses every request this run makes, or a pasted resumeFromRunId cannot be resolved, the run stops with a clear failed status instead of quietly finishing with zero items, so "nothing could be read" is never confused with "nothing matches". A search or URL set that genuinely matches nothing, or an incremental run where every listing was unchanged, still finishes normally with zero new items and a status message explaining why.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear, or Airtable.

πŸ”— Want more classifieds data?

Pair this actor with these related scrapers from the same team:

🏷️ bol.com Scraper
Scrape bol.com products: title, price, list price and discount, EAN, brand, images...
🏷️ Vinted.fr
Scrape Vinted.fr, France's C2C second-hand fashion marketplace: search with...
🏷️ Marktplaats.nl Scraper
Scrape Marktplaats.nl listings by keyword or URL. Extract title, price, condition...
🏷️ ThredUp Scraper
Scrape ThredUp resale listings by keyword, department, brand, size, condition, price or...
🏷️ Gumtree.com Scraper
Scrape Gumtree.com classifieds across motors, property, jobs, services, pets and goods...
🏷️ Daangn Scraper
Scrape Daangn (λ‹Ήκ·Ό) marketplace listings by keyword and region. Returns 35+ fields per...

πŸ‘‰ Browse all abotapi scrapers

πŸ’¬ Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • πŸ› οΈ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.