# Chrono24 API — luxury watch marketplace scraper: search pre-owned and new watches by brand, model or keyword with price, condition, year, movement and sort filters, plus full watch detail (reference number, movement, case material, case diameter, year, condition, dial, seller location, price and images) and brand/model browse from chrono24.com — no API key required

> Search Chrono24 by free-text keyword (brand + model + reference, e.g. 'rolex submariner', 'omega speedmaster 3861'). Optional filters: price_min/price_max, condition (new/used), movement, year, sort. Paginated (~60/page). Returns listing cards with title, price, currency, condition availability, image and url.
> ReefAPI engine `chrono24` · 3 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/chrono24/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed or blocked calls are free.
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /chrono24/v1/search — 1 credit
Search Chrono24 by free-text keyword (brand + model + reference, e.g. 'rolex submariner', 'omega speedmaster 3861'). Optional filters: price_min/price_max, condition (new/used), movement, year, sort. Paginated (~60/page). Returns listing cards with title, price, currency, condition availability, image and url.

**Parameters:**
- `query` (string, required) — What to search for — brand, model and/or reference number ('rolex submariner', 'patek nautilus 5711', 'omega 3861').
- `page` (integer, optional, default 1) — Result page (~60 listings per page). Page until meta.pagination.has_more is false.
- `price_min` (integer, optional) — Minimum price filter (in the listing currency, USD).
- `price_max` (integer, optional) — Maximum price filter (in the listing currency, USD).
- `condition` (enum, optional) — Filter by watch condition. [one of: new, used, incomplete]
- `movement` (enum, optional) — Filter by movement type. [one of: automatic, manual, quartz]
- `year` (integer, optional) — Filter to watches produced in this year.
- `sort` (enum, optional, default "relevance") — Result ordering. [one of: relevance, price_asc, price_desc, newest]

**Returns:** listings[]{listing_id, title, price, currency, url, image, availability} + aggregate{low_price, high_price, total_results} (meta.pagination for paging)

**Example request body:**
```json
{
  "query": "rolex submariner"
}
```

### POST /chrono24/v1/browse — 1 credit
Browse all listings for a brand (e.g. brand='rolex') or a brand+model (brand='omega', model='speedmaster'). Same filters and paginated card shape as search — the catalog-discovery surface for a whole brand or model family.

**Parameters:**
- `brand` (string, required) — Watch brand to browse (rolex, omega, patek-philippe, audemars-piguet, tudor, cartier, ...).
- `model` (string, optional) — Optional model/family within the brand (submariner, speedmaster, nautilus, ...).
- `page` (integer, optional, default 1) — Result page (~60 listings per page). Page until meta.pagination.has_more is false.
- `price_min` (integer, optional) — Minimum price filter (in the listing currency, USD).
- `price_max` (integer, optional) — Maximum price filter (in the listing currency, USD).
- `condition` (enum, optional) — Filter by watch condition. [one of: new, used, incomplete]
- `movement` (enum, optional) — Filter by movement type. [one of: automatic, manual, quartz]
- `year` (integer, optional) — Filter to watches produced in this year.
- `sort` (enum, optional, default "relevance") — Result ordering. [one of: relevance, price_asc, price_desc, newest]

**Returns:** listings[]{listing_id, title, price, currency, url, image, availability} + aggregate{low_price, high_price, total_results}

**Example request body:**
```json
{
  "brand": "omega"
}
```

### POST /chrono24/v1/detail — 1 credit
Full watch listing by `url` OR `listing_id`: brand, model, reference number, price, currency, condition (+ condition text), year, movement, case material, case diameter, crystal, strap material, dial, gender, jewels, power reserve, scope of delivery, seller location, delivery estimate, description and all images.

**Parameters:**
- `url` (string, optional) — Full Chrono24 listing URL (from a search/browse result).
- `listing_id` (string, optional) — Chrono24 listing id (the number in --id<N>.htm). Provide url OR listing_id.

**Returns:** watch{listing_id, title, brand, model, reference_number, price, currency, condition, year, movement, case_material, case_diameter, crystal, strap_material, dial, gender, jewels, power_reserve, scope_of_delivery, seller_location, delivery_estimate, description, images[], url}

**Example request body:**
```json
{
  "url": "https://www.chrono24.com/omega/seamaster--id46529181.htm"
}
```

## More
- Try it live, no code: https://reefapi.com/playground?engine=chrono24
- Human docs page: https://reefapi.com/docs/chrono24
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
