Chrono24 Scraper at a glance
Chrono24 Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes id, title, change type (incremental mode), brand and model, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce, Automation, Developer Tools
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 46 options
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.
What Chrono24 Scraper can do
- 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.
Choose what to collect
These inputs let you configure Chrono24 Scraper - Luxury Watches, Prices, Specs & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to find watches: build a search from a keyword + filters, or paste your own URLs. |
searchQuerystring | Keyword to search, e.g. 'Submariner', 'Omega Speedmaster', 'Patek Nautilus'. Leave empty to browse everything matching the filters below. |
searchParamsobject | Filter the search. Accepts friendly words or raw Chrono24 ids. Keys: priceFrom, priceTo (USD), year, usedOrNew ('new' | 'used'), caseMaterials (steel | yellow gold | rose gold | white gold | platinum | titanium | ceramic), dialColor (black | blue | green | white | silver | grey | meteorite), braceletMaterial (steel | leather | rubber | yellow gold), sellerType ('chrono24 direct' | 'professional dealer' | 'private sellers'), countryIds (ISO code, e.g. DE), referenceNumber, caseDiameter (mm), man (brand slug, e.g. rolex), certified (true), inStock (true). |
manufacturerIdsstring | Comma-separated Chrono24 brand ids (search mode); each id is sent as its own filter. |
catalogCollectionIdstring | Chrono24 catalog collection id (search mode). |
catalogModelIdstring | Chrono24 catalog model id (search mode). |
priceFrominteger | Minimum price (USD). |
Show 39 more inputs
| Input | What it controls |
|---|---|
priceTointeger | Maximum price (USD). |
watchTypesstring | U = used, N = new. |
conditionstring | Chrono24 condition code. |
certifiedboolean | Only certified listings. |
specialsarray | Codes: 102 box and papers, 103 box only, 104 papers only. |
movementTypesstring | Chrono24 movement type id 1-5. |
genderstring | 1401 or 1402. |
caseDiameterstring | Single value or range in mm. |
yearstring | Single year or range. |
waterproofstring | Chrono24 water resistance code (901-923, 1350, 1351). |
functionsarray | Complication ids. |
stylesarray | Watch style ids. |
caseMaterialsarray | Case material words or ids. |
dialColorarray | Dial color words or ids. |
braceletMaterialarray | Bracelet material words or ids. |
braceletColorarray | Bracelet color ids. |
sellerTypestring | Dealer, PrivateSeller or C24Direct. |
stockInfostring | InStock, OnOrder or OnRequest. |
countryIdsstring | Comma-separated ISO-2 seller countries, for example DE,NL (search mode); each code is sent as its own filter. |
trackingIdstring | Optional tag copied onto every output row. |
sortBystring | Result order (search mode). 'Savings' only has an effect when Top Deals collection only is on; elsewhere it falls back to Relevance. |
dealsOnlyboolean | Browse Chrono24's own curated 'Top Deals' collection instead of a regular search. When on, Search keyword and Filters are ignored (that combination is not supported by Chrono24's Top Deals page); only Sort by still applies (including the 'Savings, highest first' order, only available here). Chrono24 does not publish a structured was-price/original-price/MSRP field on any listing, but the Top Deals collection does show a rendered '-N%' savings badge per listing, which card mode (Fetch full details off) extracts as discountPercent. That badge is not present on the full detail page; use isDeal there as the deal signal instead. |
urlsarray | Any mix of Chrono24 detail (--id), brand (/rolex/index.htm), model (--mod) or search URLs. Detail URLs return one watch each; brand / model / search URLs paginate automatically. |
fetchDetailsboolean | On (default): fetch each listing's detail page for the full 50+ field spec sheet. Off: emit lightweight cards straight from the results page (faster, fewer fields, no per-listing fetch). |
fetchSellerReviewsboolean | Attach the seller's rating and recent buyer reviews (date, stars, watch, reviewer, text) to each listing. Read from the listing page in the same pass, so it adds no extra cost. Only applies when Fetch full details is on. |
maxReviewsPerListinginteger | Upper limit on seller reviews attached to each listing. Only applies when Include seller reviews is on. |
flattenboolean | Also expose nested specs as flat specs_ columns for easy CSV / spreadsheet export. |
includeRawboolean | Attach a rawHtmlBytes field per record (diagnostics). Does not change other fields. |
maxListingsinteger | The one cap on output. Stops the run once this many listings are collected. Set 0 for the maximum of 100000. |
maxPagesinteger | Safety bound on pages walked per search / brand / model URL (120 listings per page). Set 0 for unlimited: the run then stops at Max listings, or when a page stops returning new listings, whichever comes first. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl of listings without returning or charging for listings already collected there. Use this after an interrupted run, or when continuing a listing pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. A listing counts as UPDATED when any scraped field changes (price, availability, condition, specs, description, images, seller details and so on); changedFields names what moved. Never compared: scrapedAt, the seller-review list, the review count and the seller rating, including the copies inside the seller block (these move on their own), plus anything you add under Ignore fields below. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each search/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and detail settings -- different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search -- not when Max listings capped it or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (the seller-review list, review count and seller rating never trigger UPDATED). A plain name such as images ignores that field at any depth; a dotted path such as specs.movement ignores exactly that nested field. Ignored fields are still returned in the output. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
listingIdID (text)titleTitle (text)changeTypeChange type (incremental mode) (text)brandBrand (text)modelModel (text)referenceNumberReference (text)pricePrice (number)currencyCurrency (text)yearYear (text)conditionCondition (text)sellerCountrySeller Country (text)sellerRatingSeller Rating (number)Show 19 more fields
reviewCountReviews (number)listingUrlURL (link)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)specs_movementMovement (text)specs_caliberCaliber (text)specs_caseMaterialCase (text)specs_caseDiameterDiameter (text)specs_dialColorDial (text)specs_braceletMaterialBracelet (text)specs_waterResistanceWater Resist. (text)specs_functionsFunctions (text)sellerSeller (object)sellerLocationSeller location (object)shippingCostShipping cost (object)specsSpecifications (object)imagesImages (array)reviewsReview (object)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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"
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Chrono24 Scraper return?
The documented output for Chrono24 Scraper includes id, title, change type (incremental mode), brand, model, reference, price and currency. Availability of each field depends on the source page and the selected mode.
How much does Chrono24 Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
