Ferrari APIpreowned.ferrari.com ↗
Search and retrieve preowned Ferrari listings worldwide. Get specs, pricing, dealer info, and inventory data via 5 structured API endpoints.
What is the Ferrari API?
The preowned.ferrari.com API provides access to Ferrari's official certified preowned marketplace through 5 endpoints covering inventory search, vehicle details, model catalogs, country coverage, and authorized dealer directories. The search_listings endpoint accepts filters for model, price range, production year, and country, returning VINs, ad IDs, pagination metadata, and available filter facets. The get_vehicle_details endpoint expands any ad ID into full specification sheets, option lists, images, and dealer contact data.
curl -X POST 'https://api.parse.bot/scraper/2acfe330-1a3e-4d34-806b-ecdd95525bd7/search_listings' \
-H 'X-API-Key: $PARSE_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"page": "0",
"sort": "price-asc",
"limit": "3",
"locale": "en-US",
"models": "F171",
"year_to": "2026",
"price_to": "1000000",
"countries": "AU",
"year_from": "2020",
"price_from": "100000"
}'Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace preowned-ferrari-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.ferrari_preowned_catalog_api import Ferrari, Sort, Country
ferrari = Ferrari()
# Search for recent Ferraris sorted by price
for listing in ferrari.listings.search(sort=Sort.PRICE_ASC, year_from=2022, countries="US", limit=5):
print(listing.car_name, listing.year, listing.price, listing.vin)
# List all available models
for model in ferrari.models.list():
print(model.name, model.slug, model.count)
# List countries and get dealers for a specific one
for country in ferrari.countries.list(limit=3):
print(country.name, country.slug, country.region)
# Get dealers for a specific country using constructible resource
us = ferrari.country("US")
for dealer in us.dealers.list():
print(dealer.name, dealer.url, dealer.options.showroom)
Search preowned Ferrari listings with optional filters for country, model, price range, year range, and sort order. Returns vehicle summaries with VINs, pricing, dealer info, and pagination. Also returns available filter options (models, countries, price/year ranges). Results are paginated with a 0-indexed page parameter.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (0-indexed) |
| sort | string | Sort order for results. |
| limit | integer | Number of results per page (max 24) |
| locale | string | Locale for results (e.g., 'en-US', 'en-EN') |
| models | string | Comma-separated model slugs to filter by (e.g., 'F8 CP,F171'). Slugs available from list_models endpoint. |
| year_to | integer | Maximum production year filter |
| price_to | integer | Maximum price filter (in local currency) |
| countries | string | Comma-separated country slugs to filter by (e.g., 'US,IT,DE'). Slugs available from list_countries endpoint. |
| year_from | integer | Minimum production year filter |
| price_from | integer | Minimum price filter (in local currency) |
{
"type": "object",
"fields": {
"ads": "array of vehicle listing summaries with id, carName, year, price, vin, model, country, dealer, odometer, images",
"filters": "object with available filter options including models, countries, year, price ranges",
"pagination": "object with total, pages, limit"
},
"sample": {
"data": {
"ads": [
{
"id": "IljixbcgVnJGsKsQfDGsrnOSbXS9811FIz1VbtZdQTh5aOy0FeoHkLy5aKXAzu%2BauIYTHC%2FX4hVH2kH%2Ft%2F3xCRa37ulnLX0XazGAE79KGQ%3D%3D",
"vin": "ZFF09RPA3R0308139",
"year": 2024,
"model": {
"name": "Ferrari Roma Spider",
"slug": "F169S"
},
"power": "620",
"price": 335900,
"dealer": {
"city": "Lake Bluff",
"name": "Ferrari Lake Forest",
"slug": "007007",
"country": "US"
},
"engine": "V8 – 90° – twin turbo",
"carName": "Ferrari Roma Spider",
"country": {
"name": "USA",
"slug": "US",
"region": "NA"
},
"odometer": 682,
"priceUnit": "USD",
"trimColor": "Crema",
"odometerUnit": "mi",
"exteriorColor": "Blu Corsa",
"ferrariApproved": true
}
],
"filters": {
"models": {
"options": [
{
"name": "296 GTB",
"slug": "F171",
"count": 351
}
]
}
},
"pagination": {
"limit": 24,
"pages": 120,
"total": 2879
}
},
"status": "success"
}
}About the Ferrari API
Inventory Search and Filtering
The search_listings endpoint accepts a POST body with parameters including models (comma-separated model slugs), countries (country slugs), price_to, year_to, sort (price-asc, price-desc, or year-asc), limit, and page. Results include an ads array of vehicle summaries with VINs and ad IDs, a pagination object containing total, pages, and limit, and a filters object reflecting available facets for the current result set. Model slugs and country slugs required for filtering come from the list_models and list_countries endpoints respectively.
Vehicle Detail Records
The get_vehicle_details endpoint accepts one or more comma-separated ad IDs from search results and returns a detailed record per vehicle. Each record includes the full specification sheet, a list of factory-fitted optional features, an image gallery, and dealer contact information — significantly more data than the search summary. Pass a locale parameter (e.g., en-US) to control language and regional formatting of returned content.
Reference Data: Models, Countries, and Dealers
Three supporting GET endpoints provide the reference data needed to build well-formed queries. list_models returns an array of model objects each with slug, name, count, and slugSeo, reflecting only models that have active listings. list_countries returns country objects with slug, name, region, count, and slugSeo. list_dealers requires a country slug and returns authorized Ferrari dealers for that country, including name, url, image, and a boolean options object indicating whether the dealer offers service, showroom, bodyshop, and classiche capabilities.
The Ferrari API is a managed, monitored endpoint for preowned.ferrari.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when preowned.ferrari.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official preowned.ferrari.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a cross-country price comparison tool for specific Ferrari models using
search_listingswithmodelsandcountriesfilters - Track preowned inventory levels per model over time by polling
list_modelsand monitoring thecountfield - Aggregate full specification sheets and option lists for a given model by batch-fetching ad IDs through
get_vehicle_details - Map authorized Ferrari dealers by country and filter by
showroomorclassicheflags fromlist_dealers - Feed a custom vehicle alert system that monitors new listings in a specific country and year range using
search_listingswithyear_toandcountries - Power a research dashboard comparing option configurations across preowned listings using the
optionalsfields fromget_vehicle_details
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does preowned.ferrari.com have an official public developer API?+
What does `get_vehicle_details` return beyond what `search_listings` provides?+
search_listings returns lightweight summaries — VINs, ad IDs, and pagination info — suitable for browsing. get_vehicle_details expands each ad ID into a full specification sheet, a list of factory-fitted optional features, a multi-image gallery, and structured dealer contact information including URL and service capability flags. You should first retrieve ad IDs from search_listings, then pass those IDs to get_vehicle_details to get the full record.How does pagination work in `search_listings`?+
page parameter. The response pagination object returns total (total matching listings), pages (total page count), and limit (results per page). Set limit to control page size, and increment page to walk through result sets. No cursor tokens are used — standard integer offsets only.Does the API return historical sold listings or auction results?+
Are private seller listings included, or only authorized dealer inventory?+
list_dealers endpoint reflects this — it returns dealers with flags for showroom, service, bodyshop, and classiche, and search_listings results correspond to inventory held by those dealers. Private party listings are not part of the source marketplace, so they are not covered here. You can fork the API on Parse and revise it if you need to incorporate inventory from a different source.