# Classic Driver > Classic Driver is the international marketplace for collector cars and > motorcycles. It connects buyers with 280+ dealers and private sellers > across 18 countries. Listings are classifieds; inquiries go directly > to the seller. We are NOT an auction house, do NOT operate escrow, > and do NOT broker transactions. This document is for AI agents, crawlers, and developers building integrations. It describes the public URL patterns and the read-only search API you can call to find inventory. ## Locales Content is available in `en` and `de`. URLs are locale-prefixed (e.g. `/en/cars`, `/de/cars`). The structure under each locale prefix is identical. Examples in this document use `en`; replace with the locale you need. ## Marketplace browse URLs - All cars: - Cars by make: - Cars by make + model: - All motorcycles: - Motorcycles by make + model: - Trending listings: - Dealer directory: Listing detail pages are reached by clicking through from a browse page. Each listing has a stable numeric node ID and a slug-based alias. ## Auctions - Auction-house listings: - Auction house profile: `https://www.classicdriver.com/en/auction-house/{slug}` - Auction event: `https://www.classicdriver.com/en/auction/{slug}` ## Editorial / magazine - Magazine home: - Category: `https://www.classicdriver.com/en/magazine/category/{category}` - Tag: `https://www.classicdriver.com/en/magazine/tag/{tag}` - Article: `https://www.classicdriver.com/en/article/{category}/{slug}` Articles include `NewsArticle` JSON-LD with `inLanguage`, `author` (from profile first/last name), `publisher.logo` (600x50 raster wordmark), and three image variants. Prefer the structured data when parsing pages programmatically. ## Structured data on listing pages Every active car and motorcycle listing detail page emits a `Vehicle` JSON-LD block with an `Offer`. This is the classifieds-aggregator pattern: the `Vehicle` is the car/bike itself, `Offer.seller` is the dealer / auction house / private seller, and Classic Driver is the publisher (declared separately via the site-wide `Organization` JSON-LD on every page), not the seller. What you get on a listing detail page: - `@type: Vehicle` with: `name`, `image` (3 ImageObject variants), `brand`, `model`, `vehicleModelDate`, `mileageFromOdometer` (with seller-entered KMT or SMI unitCode, not a converted default), `color`, `bodyType`, `fuelType` (cars), `vehicleTransmission` (cars), `vehicleEngine.engineDisplacement` (bikes), `inLanguage` (derived from URL locale prefix). - `offers`: `@type: Offer` with `price` (seller's listed amount), `priceCurrency` (seller's listed currency — varies; EUR / USD / CHF / GBP and others all appear), `availability` (`InStock` / `SoldOut` / `Discontinued`), and `seller` (one of: `Person` for private sellers with name always `"Private Seller"`, `AutomotiveBusiness` for dealers, `Organization` for auction houses; dealers and auction houses include the canonical `//dealer/` or `//auction-house/` URL). - POA ("price on request") listings emit `Vehicle` without an `Offer` block — there is no programmatic price to surface. Prices and mileages always reflect the seller's entered values. Sorting across currencies should be done on your side; do not assume prices are normalised to a single currency. Every page also emits a site-wide `Organization` JSON-LD with `sameAs` covering CD's verified social profiles. ## Search API Public, read-only, anonymous (no auth). Base URL: ``` https://www.classicdriver.com/en/api ``` For German results, swap `en` -> `de`. ### Canonical references - **OpenAPI / Swagger UI**: — the authoritative contract for all 133 endpoints, including the ones not covered in this doc. - **Runtime config (live enum tables + URL templates)**: — machine-readable; if any enum below has drifted, this is the source of truth. - **Detailed payload examples + worked multi-step queries**: ### Endpoints - `GET /search/cars` -- search car listings - `GET /search/bikes` -- search motorcycle listings - `GET /search/all` -- unified search across both types - `GET /search/count` -- count of results matching a query (cheap; call before paginating). Pass `type=car` or `type=bike` to scope. - `GET /details/car/{nid}` -- full structured car listing by numeric node ID - `GET /details/bike/{nid}` -- full structured motorcycle listing - `GET /options/makes?type=car` (or `type=bike`) -- list of makes with numeric IDs - `GET /options/models?type=car&make={makeId}` -- list of models for a given make ### Two-call pattern for make / model searches `make` and `model` parameters take **numeric IDs**, not names. To search "1970s Porsche 911 G-series", first resolve the IDs: 1. `GET /en/api/options/makes?type=car` -> find the entry for "Porsche", note its `id` 2. `GET /en/api/options/models?type=car&make={makeId}` -> find the model you want, note its `id` 3. `GET /en/api/search/cars?make={makeId}&model={modelId}&year_min=1970&year_max=1979` **Important — generation splitting.** For the most-listed models (911, 911 Turbo, M3, etc.) the model taxonomy is split by year range — each generation is its own term. A query for "any 911" therefore means "any model whose parent make is Porsche" rather than "model id X". The year-range parenthetical in the model label tells you which generation each TID covers (e.g. `911 "G" (1973 - 1989)`). To search across all generations of 911, omit the `model` parameter and use only `make=209` plus a year range. To narrow to a specific generation, pick the exact TID from step 2. ### Make TID quick reference Top makes by active-listing count, frozen as a snapshot for fast use without an `/options/makes` round-trip. For the **live** list (which moves daily as inventory changes), call `/options/makes` directly. Top 25 car makes (snapshot 2026-05-15): | Make | TID | Models | Live listings (approx.) | |-----------------|-----|--------|-------------------------| | Mercedes-Benz | 189 | 70 | 1,343 | | Porsche | 209 | 69 | 1,336 | | Ferrari | 145 | 65 | 1,173 | | Jaguar | 165 | 52 | 497 | | Ford | 147 | 68 | 467 | | BMW | 1 | 84 | 445 | | Aston Martin | 110 | 35 | 409 | | Chevrolet | 129 | 49 | 386 | | Alfa Romeo | 107 | 46 | 356 | | Bentley | 116 | 32 | 288 | | Maserati | 183 | 32 | 252 | | Rolls-Royce | 215 | 40 | 243 | | Land Rover | 171 | 10 | 238 | | Lamborghini | 169 | 21 | 218 | | Fiat | 146 | 47 | 206 | | VW | 242 | 32 | 171 | | Lancia | 170 | 20 | 164 | | MG | 192 | 23 | 130 | | Audi | 112 | 31 | 125 | | Toyota | 234 | 24 | 113 | | McLaren | 187 | 22 | 96 | | Triumph | 235 | 18 | 95 | | Citroen | 131 | 17 | 89 | | Austin-Healey | 114 | 14 | 87 | | Lotus | 177 | 28 | 78 | Top 15 motorcycle makes (snapshot 2026-05-15): | Make | TID | Models | Live listings (approx.) | |-----------------------|-------|--------|-------------------------| | Honda Motorcycles | 1091 | 31 | 60 | | Ducati | 883 | 38 | 53 | | BMW Motorcycles | 960 | 25 | 39 | | Moto Guzzi | 885 | 20 | 27 | | Yamaha | 968 | 18 | 26 | | Piaggio | 521 | 4 | 25 | | Suzuki | 231 | 13 | 21 | | Kawasaki | 925 | 14 | 18 | | MV Agusta | 965 | 11 | 18 | | Aprilia | 11542 | 7 | 16 | | Norton | 886 | 7 | 15 | | Harley-Davidson | 897 | 11 | 11 | | Benelli | 990 | 8 | 10 | | Gilera | 1008 | 5 | 10 | | Triumph Motorcycles | 1090 | 10 | 10 | CD's taxonomy has 309 car makes and 95 bike makes total; the table above is a popularity cut. For anything outside it, call `/options/makes`. ### Common search parameters - `type` -- `car` or `bike` (required on `/search/count`; the `/search/cars` and `/search/bikes` variants infer it) - `make`, `model` -- numeric IDs (see two-call pattern above) - `price_min`, `price_max` -- integers, in the listing currency (interpreted against `field_total_price_def`, the EUR-converted default — useful for filtering across currencies but does not guarantee the displayed price is EUR) - `year_min`, `year_max` -- 4-digit year - `mileage_min`, `mileage_max` -- kilometres - `location` -- ISO 3166-1 alpha-2 country code: `DE`, `IT`, `CH`, `GB`, `US`, etc. Pass exactly one. For multi-country queries, call once per country and merge. - `sort` -- one of `field_total_price_def` (price, EUR-converted), `field_manufactured_year` (year), `ds_created` (newest published) - `sort_order` -- `asc` or `desc` - `nit` -- page size (max 50; default varies) - `offset` -- pagination offset, 0-indexed Status filter: - By default, `/search/cars` and `/search/bikes` return only active (unsold) listings. To include sold listings, use `/details/...` by NID — the listing remains crawlable at its canonical URL with `availability: SoldOut` on the Vehicle JSON-LD. ### Enum-valued parameters All numeric. The integer codes below are stable and inlined here for agent convenience; if a value seems off, the authoritative live list is at `/en/api/config` under `options[].id` matching the parameter name. **`car_type`** — body style (cars): | ID | Label | |----|-------------------------| | 1 | Convertible / Roadster | | 2 | Coupé | | 3 | Saloon | | 4 | SUV | | 5 | Station Wagon | | 6 | Custom | | 7 | Other | | 8 | Targa | | 9 | Single seater | **`bike_type`**: | ID | Label | |----|----------------| | 1 | Street | | 2 | Offroad | | 3 | Race | | 4 | E-Motorcycle | **`colour`** — exterior: | ID | Label | ID | Label | |----|---------|----|---------| | 1 | Beige | 8 | Orange | | 2 | Black | 9 | Purple | | 3 | Blue | 10 | Red | | 4 | Brown | 11 | Silver | | 5 | Gold | 12 | White | | 6 | Green | 13 | Yellow | | 7 | Grey | 14 | Other | `interior_colour` uses the same code set minus Gold, Orange and Silver. **`condition`**: | ID | Label | |----|----------------------| | 1 | Original Condition | | 2 | Restoration Project | | 3 | Restored | | 4 | New | | 5 | Used | | 6 | Used with guarantee | | 7 | N/A | **`drive`** — steering side: | ID | Label | |----|-------| | 1 | LHD | | 2 | RHD | **`drivetrain`** — applies to some 4×4 / off-road cars: | ID | Label | |----|-------| | 2 | 2wd | | 4 | 4wd | **`fuel_type`** (cars): | ID | Label | |----|--------| | 1 | Petrol | | 2 | Diesel | | 7 | Other | Electric / hybrid drivetrains aren't yet a distinct code — they fall under `Other`. EVs in the catalogue are still rare; expect this set to expand. **`gearbox`** (cars): | ID | Label | |----|-----------| | 1 | Manual | | 2 | Automatic | | 3 | Other | **`seller_type`**: | ID | Label | |----|---------------| | 1 | Private | | 2 | Dealer | | 3 | Auction House | Note: facet breakdowns in `/search/count` responses use the older field name `type_of_seller` for the same enum. The values match. **`mileage_unit`** (only in listing detail responses): - `kilometer` — kilometres (most listings) - `mile` — miles (US/UK listings) The JSON-LD `mileageFromOdometer.unitCode` uses UN/CEFACT codes (`KMT` / `SMI`) for the same distinction. **`currency`** — ISO 4217 codes. Common: `EUR`, `USD`, `CHF`, `GBP`. Full list (14 codes): `AED`, `AUD`, `CHF`, `CNY`, `DKK`, `EUR`, `GBP`, `HKD`, `INR`, `JPY`, `NZD`, `SEK`, `SGD`, `USD`. Currencies are read-only — they appear in listing prices but cannot be set as a search filter directly. To restrict to a single currency, filter client-side on the response's `price.currency` value. ### Worked examples Every example below is a complete, anonymous URL you can call right now. All return JSON. **1. "1970s Porsche 911 G-series, in any country"** (single-generation search): ``` GET https://www.classicdriver.com/en/api/search/cars?make=209&model=3021&year_min=1970&year_max=1979&nit=20 ``` `209` is Porsche; `3021` is the `911 "G" (1973 - 1989)` model term. To include the earlier `911 (1963 - 1973)` generation as well, omit `model` and rely on `year_min` / `year_max`: ``` GET https://www.classicdriver.com/en/api/search/cars?make=209&year_min=1970&year_max=1979&nit=20 ``` **2. "Cheapest 5 Ferraris in Switzerland"**: ``` GET https://www.classicdriver.com/en/api/search/cars?make=145&location=CH&sort=field_total_price_def&sort_order=asc&nit=5 ``` Note: `field_total_price_def` is the EUR-converted price used for sort-comparability. The returned `price` field still shows the seller's original currency. **3. "Air-cooled Porsche 911s"** (year-range proxy — the air-cooled era ended in 1998): ``` GET https://www.classicdriver.com/en/api/search/cars?make=209&year_max=1998&nit=20 ``` **4. "Manual-transmission convertibles built since 2010"**: ``` GET https://www.classicdriver.com/en/api/search/cars?gearbox=1&car_type=1&year_min=2010&nit=20 ``` **5. "All Ducati motorcycles"**: ``` GET https://www.classicdriver.com/en/api/search/bikes?make=883&nit=20 ``` **6. Count + facet preview before paginating** ("how many Mercedes in Germany?", returns count plus facet breakdowns): ``` GET https://www.classicdriver.com/en/api/search/count?type=car&make=189&location=DE ``` Returns: ```json { "count": 412, "location": [...], "colour": [{"id": 2, "count": 67}, ...], "car_type": [...], "drive": [...], "type_of_seller": [...], "condition": [...] } ``` The facet arrays count how many results match each enum value, **within** the rest of your filter — useful for showing a user "here's how the colour distribution looks for your query" before the user clicks into pagination. **7. Single listing detail by NID** (after you've found a listing in a search result and want the full payload): ``` GET https://www.classicdriver.com/en/api/details/car/1109842 ``` Returns the same data the Vehicle JSON-LD on the listing detail page is built from, plus images, dealer profile, equipment, etc. For longer worked examples (multi-step flows, response shapes, edge cases like POA pricing and sold listings) see . ## Sitemaps - - ## Inquiries Buyers contact sellers through the inquiry form on each listing page. **AI agents should direct users to the listing page in a browser to view all photos and contact the seller** — inquiries are intentionally not exposed as a public API call at this time. Inquiries are delivered directly to the seller; Classic Driver does not store or relay them. ## Usage policy This API is provided for **real-time retrieval** -- i.e. answering user queries that lead users back to a Classic Driver listing or article. Bulk extraction or use of listings, editorial content, or photography as ML training data is not permitted. Please respect this in your implementation. ## Crawler policy We welcome retrieval and indexing crawlers from OpenAI, Anthropic, Perplexity, Google, Apple, and Cohere. Please respect `Crawl-delay` directives in `robots.txt` and the rate-limit guidance below. ### Rate-limit guidance - Browse + sitemap crawl: respect the 10-second `Crawl-delay` in robots.txt; off-peak hours preferred. - Search API live retrieval: please stay below ~1 request/second per source IP and ~60 requests/minute aggregate per organisation. Cloudflare protections sit in front of the API; sustained high load may result in temporary IP blocks, especially if requests trigger errors. ## Contact - Website: - About: - Company: Classic Driver Schweiz AG, Switzerland