Get Chrono24 data with one API
The Chrono24 API returns luxury-watch marketplace data as clean JSON.
3 active endpoints. Every call is 1 credit.
- POST/chrono24/v1/search
- POST/chrono24/v1/browse
- POST/chrono24/v1/detail
What Chrono24 endpoints does ReefAPI ship?
3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Chrono24 API
3 of 3 endpoints, ready to run
Search Chrono24 by free-text keyword (brand + model + reference, e.g.
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Chrono24 API works
Chrono24 is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Chrono24 fields: reference_number vs listing_id, and the numbers that mislead
Watch buyers search by reference number and developers page by listing id, and confusing the two is the most common Chrono24 integration bug. The second trap is the aggregate block, which looks like a summary of your query and is not. Every value below came from live search, browse and detail calls on 2026-08-27.
| Field | What it is | Measured example |
|---|---|---|
| listing_id | One seller's offer. A relisted watch gets a new one | 46892665, taken from the URL suffix --id46892665.htm |
| reference_number | The manufacturer's model reference. Many listings share it, and only detail returns it | "16800" for a Rolex Submariner Date |
| listing_code | An internal Chrono24 model code returned by detail but absent from the documented field list | "RX2M16" |
| price / currency (detail) | Numeric price and its currency | 7732.0 / "USD" |
| listings[].currency (search, browse) | null on every card measured, 60 of 60 | use aggregate.currency instead, which returned "USD" |
| aggregate.total_results | Site-wide listing count, not the size of your result set | 671,486 / 671,485 / 671,497 across three unrelated queries |
| aggregate.low_price / high_price | Strings from the page's aggregate offer that did not match the page's own listings | a price_asc Submariner page whose cheapest card was 5,500 reported low_price "8283" |
| condition / condition_detail | The filterable token, then the seller's own wording | "used" / "Used (Fair) The item shows major, visible signs of wear like scratches and dents." |
| year | Free text rather than an integer, and it can carry a qualifier | "1986 (Approximation)" |
| scope_of_delivery | Box and papers status; the leading sentence is clean and the tail leaks page markup | "No original box, no original papers" followed by escaped HTML |
| seller_location | A postal-address object with country and city only | {"addressCountry": "JP", "addressLocality": "Tokyo"} |
| availability | A schema.org availability string | "InStock" on all 60 cards measured |
search takes free text combining brand, model and reference ("omega 3861") while browse takes a brand slug plus an optional model slug (brand=omega, model=speedmaster). Both return roughly 60 cards per page across pages 1 to 100, and meta.pagination.has_more is the only paging signal worth trusting.
What people build with Chrono24
The jobs this data is most often used for.
endpoints
credit per call
Watch-price tools call search to track the market range for a reference across dealers.
Resale and investment products use the aggregate low/high to value a specific model.
Luxury-market analysts use browse to monitor supply and pricing for a brand or collection.
What Chrono24 data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/chrono24/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"rolex submariner"}'import requests
r = requests.post(
"https://api.reefapi.com/chrono24/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "rolex submariner"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Chrono24.
Get a free key →What is the difference between a Chrono24 listing_id and a reference number?▾
listing_id identifies one seller's offer; reference_number identifies the watch model itself. The measured record shows it clearly: listing_id 46892665 sits at chrono24.com/rolex/rolex-submariner-date--id46892665.htm and carries reference_number "16800", the Rolex reference that hundreds of other listings also carry. Track a specific watch for sale by listing_id, and build a price history for a model by grouping on reference_number. Note that only detail returns reference_number: search and browse cards do not include it, so grouping costs one detail call per listing.
Why is currency null on Chrono24 search and browse results?▾
It sits at the aggregate level rather than on each card. Measured across 60 cards on 2026-08-27, listings[].currency was null on all 60 while data.aggregate.currency was "USD" for the whole page. The prices themselves are real numbers in that currency. detail does return currency per watch, "USD" alongside price 7732.0, so if you cache cards, take the currency from aggregate and stamp it onto the rows yourself.
Is aggregate.total_results the number of matches for my query?▾
No, and this is worth knowing before you build a market-size report on it. Three unrelated queries measured on 2026-08-27 returned total_results 671,486 ("rolex submariner" filtered to used at 2,000 to 15,000), 671,485 (browse omega speedmaster) and 671,497 (browse rolex, condition new). That is the site-wide listing count drifting with the marketplace, not your result set. Page with page and meta.pagination.has_more instead, and if you need a count for a query, count what you actually fetch.
Can I trust aggregate.low_price and high_price as the price range of my results?▾
Not as the range of the cards you received. They are strings lifted from the page's aggregate offer block, and on a price_asc-sorted Submariner search whose cheapest card was 5,500 the aggregate reported low_price "8283" and high_price "15700". A browse of Omega Speedmaster reported "1674" to "587700". They are directionally useful for the model family but they do not describe your page. Compute min and max from listings[].price when the number matters.
How do I tell whether a watch comes with its box and papers?▾
Through scope_of_delivery on the detail action, and you have to trim it. The measured record began "No original box, no original papers" and then trailed off into escaped page markup from the tooltip that explains the field. Take the text up to the first "Original box" or the first escaped angle bracket and treat the remainder as noise. There is no separate boolean for box or papers, so a text match on "no original box" and "no original papers" is the honest way to derive one.
Does the API say whether the seller is a dealer or a private seller?▾
Not on the record measured on 2026-08-27. detail returned seller_location as a postal-address object with addressCountry "JP" and addressLocality "Tokyo" and nothing else about the seller: no name, no dealer or private flag, no trust badge, no years-active figure. The closest shipping signal is delivery_estimate, which came back as free text ("Anticipated delivery: 8/28 - 9/8"). If seller type matters to your product, treat it as data this API does not currently expose rather than assuming a field you have not seen in a response.
Why did detail return TARGET_BLOCKED when search worked fine?▾
Individual listing pages are guarded more tightly than result pages. Measured on 2026-08-27, four detail attempts on listing 46892665 produced two full records in 1.7 and 2.1 seconds and two TARGET_BLOCKED errors with error.retryable: true, while search and browse against the same engine succeeded every time. Treat a retryable TARGET_BLOCKED as an instruction to repeat the call, not as evidence that the listing is gone. Returning a clean error beats returning a half-parsed record that looks real.
What format is the year field, and how does it relate to the year filter?▾
They are not the same type. The year parameter on search and browse is an integer between 1900 and 2030. The year field returned by detail is free text and can carry a qualifier: the measured record returned "1986 (Approximation)", not 1986. Parse it as a string, pull the leading four digits, and keep the qualifier if you display the value, since "Approximation" is a meaningful caveat on a vintage watch.
What is the Chrono24 API?▾
Chrono24 API is a ReefAPI endpoint group for chrono24 It returns live JSON through POST requests under /chrono24/v1.
Is the Chrono24 API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Chrono24 calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Chrono24 login or account?▾
No login to Chrono24 is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Chrono24 data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Chrono24 API use?▾
Chrono24 actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Chrono24 from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call chrono24 actions with the same key, credit pool and JSON envelope used by normal REST requests.
37 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Chrono24, you are one call away from the rest of the category — no second contract, no second integration.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts.