Car Rental API & Scraper
The Car Rental API aggregates rental offers as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary cars/search endpoint returns offers with the vehicle (name, category, ACRISS code, transmission, seats, bags, fuel) and price, and you can autocomplete a location and pull reviews. It is built for travel apps and rental price monitoring that need aggregated car-rental data without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.
What the numbers on an offer actually mean
The most expensive mistake with this engine is reading price.amount as a nightly rate. It is not. Every row below was measured on 2026-08-27 from the same pickup point (Madrid Airport) over the same 10-13 October window, changing one parameter at a time so each effect is attributable.
| Field or parameter | What it holds | Measured |
|---|---|---|
| price.amount | The TOTAL for the whole rental, in `currency` | Fiat 500, 10-13 Oct = 44.19 EUR. Same car, 10-16 Oct = 65.17 EUR. Six days is not double three days. |
| price.daily | amount divided by price.rental_days, computed for you | 44.19 over 3 days = 14.73. On the six-day search the same car is 10.86 a day. |
| driver_age | Changes the quote, it does not just annotate it | Age 35 = 44.19 EUR. Age 20, identical car and dates = 90.52 EUR. |
| drop_query | One-way. The drop fee sits inside price.amount, never itemized | MAD to MAD = 44.19 EUR. MAD to Barcelona Airport = 234.19 EUR, and one_way flips to true. |
| vehicle.acriss | Four-letter ACRISS class code | EXAE (Fiat 500), EDAR (Peugeot 208), CDMR (Hyundai i30) |
| Location ids | place_id + city_id + country_id from cars/autocomplete, not IATA codes | Madrid Airport = place_id 1875, city_id 473, country_id 26 |
| max_offers | Truncates offers[]. total_available is the real result size | max_offers 3 returned count 3 with total_available 585 |
| currency | Requotes, it does not just relabel | Same Fiat 500: 44.19 EUR, 51.49 USD |
| deposit.amount | A formatted display string with symbol and separators, not a number | A 1,200.00 euro hold, returned as text, alongside deposit.key 'average' |
| coverage.total | Optional damage cover, priced separately from price.amount | 26.96 EUR on the 44.19 EUR Fiat 500 offer |
offer_id is scoped to one search, not to a car. The Fiat 500 that came back as offer_id ZECZ on one call was HQWE on the next call with identical parameters, and the top-level guid changed with it. Treat supplier.name plus vehicle.acriss plus price.amount as an offer's identity across runs, and follow book_url while the search is still fresh.
Real request and response JSON
Captured from the indexed primary action, cars/search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/car-rental/v1/cars/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "Madrid Airport",
"currency": "EUR",
"pickup_date": "2026-09-01",
"dropoff_date": "2026-09-04",
"max_offers": 40
}
}{
"ok": true,
"meta": {
"api": "car-rental",
"endpoint": "cars/search",
"mode": "live",
"latency_ms": 9657.3,
"record_count": 40,
"bytes": 4338436,
"cache_hit": false,
"completeness_pct": 100,
"polls": 2,
"currency": "EUR",
"driver_age": "35",
"residence_country": "US",
"completeness_basis": {
"offers": 40,
"supplier_count": 4,
"field_slots": 520,
"field_slots_filled": 520
}
},
"data": {
"count": 40,
"supplier_count": 4,
"currency": "EUR",
"offers": [
{
"offer_id": "24MG",
"vehicle": {
"name": "[redacted-name]",
"category": "Mini",
"acriss": "MBAE",
"transmission": "automatic",
"seats": 4,
"doors": 3,
"bags": 1,
"air_conditioning": true,
"fuel_type": "Electric",
"guaranteed_model": false,
"image": "https://www.discovercars.com/images/car/8625/220.png"
},
"price": {
"amount": 68.76,
"currency": "EUR",
"formatted": "€68.76",
"rental_days": 3,
"daily": 22.92
},
"supplier": {
"name": "Click&Rent",
"key": "click-rent",
"logo": "https://www.discovercars.com/PartnerFiles/1041/logo_140x70.png?v=6918",
"rating": {
"score": "[trimmed-depth]",
"label": "[trimmed-depth]",
"review_count": "[trimmed-depth]"
},
"rating_detailed": {
"valueForMoney": "[trimmed-depth]",
"valueForMoneyColor": "[trimmed-depth]",
"valueForMoneyLabel": "[trimmed-depth]",
"findPickup": "[trimmed-depth]",
"findPickupColor": "[trimmed-depth]",
"findPickupLabel": "[trimmed-depth]",
"workEfficiency": "[trimmed-depth]",
"workEfficiencyColor": "[trimmed-depth]",
"workEfficiencyLabel": "[trimmed-depth]",
"timeSpentPickingUp": "[trimmed-depth]",
"timeSpentPickingUpColor": "[trimmed-depth]",
"timeSpentPickingUpLabel": "[trimmed-depth]",
"timeSpentDroppingOff": "[trimmed-depth]",
"timeSpentDroppingOffColor": "[trimmed-depth]",
"timeSpentDroppingOffLabel": "[trimmed-depth]",
"carCleanliness": "[trimmed-depth]",
"carCleanlinessColor": "[trimmed-depth]",
"carCleanlinessLabel": "[trimmed-depth]",
"carCondition": "[trimmed-depth]",
"carConditionColor": "[trimmed-depth]",
"carConditionLabel": "[trimmed-depth]",
"avgValue": "[trimmed-depth]",
"locationReviewCount": "[trimmed-depth]",
"countryReviewCount": "[trimmed-depth]",
"worldReviewCount": "[trimmed-depth]"
},
"pickup_address": "Hotel Madrid Airport Suites Affiliated By Meliá, Calle De Lola Flores 20",
"coords": {
"key": "[trimmed-depth]",
"lat": "[trimmed-depth]",
"lng": "[trimmed-depth]"
}
},
"pickup": {
"location": "Madrid Airport (MAD)",
"is_airport": true,
"type": "Free shuttle service",
"type_icon": "bus"
},
"mileage": {
"unlimited": false,
"label": "Limited",
"unspecified": false,
"day_limit": "200 km/day included mileage"
},
"fuel_policy": "Full to full",
"payment_type": "Pay now",
"deposit": {
"key": "average",
"title": "Average deposit",
"amount": "€1,200.00"
},
"coverage": {
"total": 28.49,
"currency": "EUR"
},
"extras": null,
"free_cancellation": true,
"instant_confirmation": true,
"badges": [
"online_check_in",
"zero_emission"
],
"book_url": "https://www.discovercars.com/en/offer/699ed965-aec[redacted-phone]a6-68c7145865cd-24MG?sq=eyJQaWNrdXBMb2NhdGlvbklkIjoxODc1LCJEcm9wT2ZmTG9jYXRpb25JZCI6MTg3NSwiUGlja3VwRGF0ZVRpbWUiOiIyMDI2LTA5LTAxVDEwOjAwOjAwIiwiRHJvcE9mZkRhdGVUaW1lIjoiMjAyNi0wOS0wNFQxMDowMDowMCIsIlJlc2lkZW5jZUNvdW50cnkiOiJVUyIsIkRyaXZlckFnZSI6MzUsIkhhc2giOiIzMmFmN2UyM2I3ZDE1OTVlNDI2ZDQ5ZWFlYWJjMzE4ZCJ9"
},
{
"offer_id": "9PTP",
"vehicle": {
"name": "[redacted-name]",
"category": "Mini",
"acriss": "MCMR",
"transmission": "manual",
"seats": 4,
"doors": 4,
"bags": 1,
"air_conditioning": true,
"fuel_type": null,
"guaranteed_model": false,
"image": "https://www.discovercars.com/images/car/7189/220.png"
},
"price": {
"amount": 68.76,
"currency": "EUR",
"formatted": "€68.76",
"rental_days": 3,
"daily": 22.92
},
"supplier": {
"name": "Click&Rent",
"key": "click-rent",
"logo": "https://www.discovercars.com/PartnerFiles/1041/logo_140x70.png?v=6918",
"rating": {
"score": "[trimmed-depth]",
"label": "[trimmed-depth]",
"review_count": "[trimmed-depth]"
},
"rating_detailed": {
"valueForMoney": "[trimmed-depth]",
"valueForMoneyColor": "[trimmed-depth]",
"valueForMoneyLabel": "[trimmed-depth]",
"findPickup": "[trimmed-depth]",
"findPickupColor": "[trimmed-depth]",
"findPickupLabel": "[trimmed-depth]",
"workEfficiency": "[trimmed-depth]",
"workEfficiencyColor": "[trimmed-depth]",
"workEfficiencyLabel": "[trimmed-depth]",
"timeSpentPickingUp": "[trimmed-depth]",
"timeSpentPickingUpColor": "[trimmed-depth]",
"timeSpentPickingUpLabel": "[trimmed-depth]",
"timeSpentDroppingOff": "[trimmed-depth]",
"timeSpentDroppingOffColor": "[trimmed-depth]",
"timeSpentDroppingOffLabel": "[trimmed-depth]",
"carCleanliness": "[trimmed-depth]",
"carCleanlinessColor": "[trimmed-depth]",
"carCleanlinessLabel": "[trimmed-depth]",
"carCondition": "[trimmed-depth]",
"carConditionColor": "[trimmed-depth]",
"carConditionLabel": "[trimmed-depth]",
"avgValue": "[trimmed-depth]",
"locationReviewCount": "[trimmed-depth]",
"countryReviewCount": "[trimmed-depth]",
"worldReviewCount": "[trimmed-depth]"
},
"pickup_address": "Hotel Madrid Airport Suites Affiliated By Meliá, Calle De Lola Flores 20",
"coords": {
"key": "[trimmed-depth]",
"lat": "[trimmed-depth]",
"lng": "[trimmed-depth]"
}
},
"pickup": {
"location": "Madrid Airport (MAD)",
"is_airport": true,
"type": "Free shuttle service",
"type_icon": "bus"
},
"mileage": {
"unlimited": false,
"label": "Limited",
"unspecified": false,
"day_limit": "200 km/day included mileage"
},
"fuel_policy": "Full to full",
"payment_type": "Pay now",
"deposit": {
"key": "average",
"title": "Average deposit",
"amount": "€1,000.00"
},
"coverage": {
"total": 28.49,
"currency": "EUR"
},
"extras": null,
"free_cancellation": true,
"instant_confirmation": true,
"badges": [
"online_check_in"
],
"book_url": "https://www.discovercars.com/en/offer/699ed965-aec[redacted-phone]a6-68c7145865cd-9PTP?sq=eyJQaWNrdXBMb2NhdGlvbklkIjoxODc1LCJEcm9wT2ZmTG9jYXRpb25JZCI6MTg3NSwiUGlja3VwRGF0ZVRpbWUiOiIyMDI2LTA5LTAxVDEwOjAwOjAwIiwiRHJvcE9mZkRhdGVUaW1lIjoiMjAyNi0wOS0wNFQxMDowMDowMCIsIlJlc2lkZW5jZUNvdW50cnkiOiJVUyIsIkRyaXZlckFnZSI6MzUsIkhhc2giOiIxODU3MzE2ZWZjODc0MWZhOGQ3NGJhMzg1ODUxZDVlZiJ9"
},
{
"offer_id": "M8QC",
"vehicle": {
"name": "[redacted-name]",
"category": "Economy",
"acriss": "ECMR",
"transmission": "manual",
"seats": 4,
"doors": 3,
"bags": 1,
"air_conditioning": true,
"fuel_type": null,
"guaranteed_model": false,
"image": "https://www.discovercars.com/images/car/110/220.png"
},
"price": {
"amount": 68.76,
"currency": "EUR",
"formatted": "€68.76",
"rental_days": 3,
"daily": 22.92
},
"supplier": {
"name": "Click&Rent",
"key": "click-rent",
"logo": "https://www.discovercars.com/PartnerFiles/1041/logo_140x70.png?v=6918",
"rating": {
"score": "[trimmed-depth]",
"label": "[trimmed-depth]",
"review_count": "[trimmed-depth]"
},
"rating_detailed": {
"valueForMoney": "[trimmed-depth]",
"valueForMoneyColor": "[trimmed-depth]",
"valueForMoneyLabel": "[trimmed-depth]",
"findPickup": "[trimmed-depth]",
"findPickupColor": "[trimmed-depth]",
"findPickupLabel": "[trimmed-depth]",
"workEfficiency": "[trimmed-depth]",
"workEfficiencyColor": "[trimmed-depth]",
"workEfficiencyLabel": "[trimmed-depth]",
"timeSpentPickingUp": "[trimmed-depth]",
"timeSpentPickingUpColor": "[trimmed-depth]",
"timeSpentPickingUpLabel": "[trimmed-depth]",
"timeSpentDroppingOff": "[trimmed-depth]",
"timeSpentDroppingOffColor": "[trimmed-depth]",
"timeSpentDroppingOffLabel": "[trimmed-depth]",
"carCleanliness": "[trimmed-depth]",
"carCleanlinessColor": "[trimmed-depth]",
"carCleanlinessLabel": "[trimmed-depth]",
"carCondition": "[trimmed-depth]",
"carConditionColor": "[trimmed-depth]",
"carConditionLabel": "[trimmed-depth]",
"avgValue": "[trimmed-depth]",
"locationReviewCount": "[trimmed-depth]",
"countryReviewCount": "[trimmed-depth]",
"worldReviewCount": "[trimmed-depth]"
},
"pickup_address": "Hotel Madrid Airport Suites Affiliated By Meliá, Calle De Lola Flores 20",
"coords": {
"key": "[trimmed-depth]",
"lat": "[trimmed-depth]",
"lng": "[trimmed-depth]"
}
},
"pickup": {
"location": "Madrid Airport (MAD)",
"is_airport": true,
"type": "Free shuttle service",
"type_icon": "bus"
},
"mileage": {
"unlimited": false,
"label": "Limited",
"unspecified": false,
"day_limit": "200 km/day included mileage"
},
"fuel_policy": "Full to full",
"payment_type": "Pay now",
"deposit": {
"key": "average",
"title": "Average deposit",
"amount": "€1,000.00"
},
"coverage": {
"total": 28.49,
"currency": "EUR"
},
"extras": null,
"free_cancellation": true,
"instant_confirmation": true,
"badges": [
"online_check_in"
],
"book_url": "https://www.discovercars.com/en/offer/699ed965-aec[redacted-phone]a6-68c7145865cd-M8QC?sq=eyJQaWNrdXBMb2NhdGlvbklkIjoxODc1LCJEcm9wT2ZmTG9jYXRpb25JZCI6MTg3NSwiUGlja3VwRGF0ZVRpbWUiOiIyMDI2LTA5LTAxVDEwOjAwOjAwIiwiRHJvcE9mZkRhdGVUaW1lIjoiMjAyNi0wOS0wNFQxMDowMDowMCIsIlJlc2lkZW5jZUNvdW50cnkiOiJVUyIsIkRyaXZlckFnZSI6MzUsIkhhc2giOiIxN2Y4OGQ3YTM1N2JmN2Q3MzM0NDM1ZjQ2Y2Q1ZDMzNyJ9"
}
],
"__trimmed": "response capped for page display"
}
}What the Car Rental API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| cars/search | aggregated rental-car offers for a location + dates → offers[]{vehicle(name/category/ACRISS/transmission/seats/bags/fuel), price{amount,currency}, supplier(name/rating/pickup_address/coords), pickup.type, mileage, fuel_policy, free_cancellation, book_url} + facets. Location via `query` OR explicit place_id/city_id/country_id. One-way via drop_query. Dates pickup_date/dropoff_date (YYYY-MM-DD). Narrow with category/supplier/transmission/max_price/min_supplier_rating/free_cancellation_only filters + sort. | Travel apps call cars/search to get aggregated rental-car offers for a location + dates → offers[]{vehicle(name/category/ACRISS/t…. | query, place_id, city_id, country_id, pickup_date, ... |
| cars/autocomplete | resolve a location string (`query`) → place/city/country IDs (for cars/search) | Pricing monitors call cars/autocomplete to resolve a location string (`query`) → place/city/country IDs (for cars/search). | query |
| cars/reviews | DiscoverCars customer reviews for a location → reviews[]{rating(0-10), text, author, author_country, car_name, date, photos} + average_rating + count. Location via `query` (city/country name; resolved automatically) OR explicit location_url. Filter with min_rating / with_text_only; country_only widens city→country scope. | Itinerary products call cars/reviews to get discoverCars customer reviews for a location → reviews[]{rating(0-10), text, author, author_c…. | query, location_url, country_only, min_rating, with_text_only, ... |
Call cars/search from your stack
curl -X POST https://api.reefapi.com/car-rental/v1/cars/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"Madrid Airport","currency":"EUR","pickup_date":"2026-09-01","dropoff_date":"2026-09-04","max_offers":40}'import requests
r = requests.post(
"https://api.reefapi.com/car-rental/v1/cars/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "Madrid Airport",
"currency": "EUR",
"pickup_date": "2026-09-01",
"dropoff_date": "2026-09-04",
"max_offers": 40
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/car-rental/v1/cars/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "Madrid Airport",
"currency": "EUR",
"pickup_date": "2026-09-01",
"dropoff_date": "2026-09-04",
"max_offers": 40
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.car-rental.cars/search with {"query":"Madrid Airport","currency":"EUR","pickup_date":"2026-09-01","dropoff_date":"2026-09-04","max_offers":40}.Who uses this API and why
- Travel apps call cars/search to compare rental prices by vehicle class.
- Price monitors track daily rates across suppliers.
- Apps use cars/reviews to surface supplier quality.
Questions developers ask before integrating
Is price.amount per day or for the whole rental?
For the whole rental. A Madrid Airport search for 10-13 October returned a Fiat 500 at 44.19 EUR; the same car for 10-16 October came back at 65.17 EUR. If the number were nightly, six days would have cost the same per night as three. The per-night figure is supplied separately as price.daily (14.73 and 10.86 in those two searches), and price.rental_days tells you what it was divided by.
Do I pass an IATA airport code like MAD or LHR?
No. Locations are aggregator place ids, resolved by cars/autocomplete. Asking it for London returned ten rows: Gatwick (place_id 1600), Heathrow (1712), London all-locations (570), Stansted (1603), London City (1785), St Pancras station (6946), then East London in South Africa. Each row carries place_id, city_id, country_id, an is_airport flag and a type of airport, downtown or railway. You can also pass free-text `query` and let the engine resolve it, in which case prefer_airport decides between airport and downtown, and the row it picked comes back as pickup_location.
I passed a transmission value that is not in the enum and got zero offers with ok:true. Why?
transmission, category and supplier are applied as filters against the offer set after it is fetched, so an unrecognized value matches nothing rather than being ignored. Sending transmission 'hovercraft' on a Madrid search returned ok:true, count 0, supplier_count 0 and price_range null, while total_available still read 587. Compare total_available against count: a healthy total_available with a zero count means a filter, not a lack of cars.
Why does the suppliers rollup report more offers than I received?
The per-supplier rollup is computed over the full result set, not over the rows you kept. A search with max_offers 3 returned three offers but a rollup entry for Centauro reading offer_count 9. Drop max_offers to see the real spread: the uncapped Madrid Airport search for 10-13 October returned 585 offers across 17 suppliers, with the cheapest per supplier ranging from 44.19 EUR up to 198.60 EUR.
Are insurance and extras included in the price?
No. extras came back null on every offer measured. coverage.total is a separate figure for optional damage cover (26.96 EUR on the 44.19 EUR Fiat 500), and deposit is the card hold the supplier will place, returned as a formatted display string plus a deposit.key such as 'average'. fuel_policy (measured 'Full to full') and mileage (unlimited true or false, with a label) are the two terms that most often explain a gap between two otherwise identical prices.
How stable is offer_id, and can I cache a quote?
Not stable at all. Two identical searches minutes apart returned the same Fiat 500 as ZECZ and then HQWE, each with a fresh top-level guid. book_url embeds that search's guid, so a cached quote expires with the search rather than with the price. Re-run the search when you need a live number, and match rows across runs on supplier.name plus vehicle.acriss.
What is in facets, and do I need it?
facets is the site's own filter sidebar, returned when include_facets is true: carGroups, supplier, rating, mileage, fuelPolicy, seats, carSpecifications, paymentType, deposit, priceRange, carBrand and locationType. Each bucket carries its cheapest price, so on one Madrid search carGroups showed small cars from 44.19 EUR and SUVs from 54.95 EUR, and mileage split into Unlimited from 44.19 EUR versus Limited from 57.62 EUR. It is the cheap way to size a market before pulling all 585 offers.
What rating scale do suppliers use, and can I filter on it?
A 0-10 score with a word label and a review count: one Madrid supplier came back at 8.6, labelled Very Good, over 6,443 reviews. min_supplier_rating filters on that scale. A rating_detailed block splits the same score into valueForMoney, findPickup, workEfficiency, timeSpentPickingUp, timeSpentDroppingOff, carCleanliness and carCondition, and separates locationReviewCount (698 for that Madrid desk) from countryReviewCount (6,443). Worth checking, because a strong national score can sit on a thin local sample.
What is the Car Rental API?
Car Rental API is a ReefAPI endpoint group for compare rental cars, prices and availability worldwide. It returns live JSON through POST requests under /car-rental/v1.
Is the Car Rental API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Car Rental calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Car Rental login or account?
No login to Car Rental 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 Car Rental data?
The page example is captured from a live cars/search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Car Rental API use?
Car Rental actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Car Rental from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call car-rental actions with the same key, credit pool and JSON envelope used by normal REST requests.