Turo API

Turo car prices that came back identical when we asked twice

The Turo API returns peer-to-peer car-rental listings and pricing as clean JSON.

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Turo endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
T
/turo/v1

10 active endpoints, on 0 and 1 credit tiers.

  • POST/turo/v1/search
  • POST/turo/v1/vehicle.detail
  • POST/turo/v1/vehicle.features
  • POST/turo/v1/vehicle.pricing
  • POST/turo/v1/vehicle.similar
  • POST/turo/v1/host.profile
  • POST/turo/v1/host.cars
  • +3 more

What Turo endpoints does ReefAPI ship?

10 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

10 endpoints

search

1 cr

Search Turo for rentable cars at a location and date range.

required
location
optional
start_date, end_date, start_time, end_time, country, make, model, vehicle_type, max_price, sort, page

vehicle.detail

1 cr

Full detail for one Turo car.

required
vehicle_id
optional
start_date, end_date, start_time, end_time

vehicle.features

1 cr

Specs + the full categorized feature list for one car (transmission, seats, doors, luggage ca…

required
vehicle_id
optional

vehicle.pricing

1 cr

Daily price calendar for one car across a date window.

required
vehicle_id
optional
start_date, end_date

vehicle.similar

1 cr

Cars similar to a given make/model near a location and dates.

required
make, location
optional
model, vehicle_id, start_date, end_date, start_time, end_time, country, max_results

host.profile

1 cr

Full Turo host (driver) profile.

required
host_id
optional

host.cars

1 cr

Every car a Turo host has listed, paginated.

required
host_id
optional
page

host.reviews

1 cr

Reviews left for a Turo host by their guests, paginated.

required
host_id
optional
page, per_page

location.autocomplete

0 cr

Resolve a free-text place into Turo search locations (cities and airports) with id, type and…

required
location
optional

makes

0 cr

The full list of car makes Turo supports in a market (e.g.

required
optional
country

Every parameter, every allowed value →

Turo API

3 of 10 endpoints, ready to run

View docs ↗

Rentable cars near a location, sixty a page, each with make, model, year, body type, the average daily price, the rating and review count, and where the car actually sits. Leave the dates out and it quietly searches about two weeks ahead.

1 credit1 required · 9 optional
POST/turo/v1/search
ok2756 ms · 60 records · sample
{
  "ok": true,
  "meta": {
    "api": "turo",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 2756,
    "record_count": 60,
    "cache_hit": false
  },
  "data": {
    "cars": [
      {
        "vehicle_id": 3546651,
        "make": "Toyota",
        "model": "Mirai",
        "year": 2017,
        "trim": null,
        "type": "CAR",
        "fuel_type": null,
        "transmission": null,
        "price_per_day": {
          "amount": 20.48,
          "currency": "USD"
        },
        "rating": 4.33,
        "review_count": 23,
        "trip_count": null,
        "is_all_star_host": false,
        "is_new_listing": null,
        "image": "https://images.turo.com/media/vehicle/images/Hv1zJupATe6edOgj1eSiGQ.heic",
        "location": {
          "city": "Costa Mesa",
          "state": "CA",
          "country": "US",
          "latitude": 33.678576721733094,
          "longitude": -117.87903429908812
        },
        "url": null
      },
      {
        "vehicle_id": 3843730,
        "make": "Toyota",
        "model": "Mirai",
        "year": 2016,
        "trim": null,
        "type": "CAR",
        "fuel_type": null,
        "transmission": null,
        "price_per_day": {
          "amount": 20.48,
          "currency": "USD"
        },
        "rating": 5,
        "review_count": 4,
        "trip_count": null,
        "is_all_star_host": false,
        "is_new_listing": null,
        "image": "https://images.turo.com/media/vehicle/images/0d3597D4RN29zSLHpEBZIg.heic",
        "location": {
          "city": "Costa Mesa",
          "state": "CA",
          "country": "US",
          "latitude": 33.67291136251438,
          "longitude": -117.88272532677907
        },
        "url": null
      },
      {
        "vehicle_id": 3381724,
        "make": "Toyota",
        "model": "Mirai",
        "year": 2016,
        "trim": null,
        "type": "CAR",
        "fuel_type": null,
        "transmission": null,
        "price_per_day": {
          "amount": 21.29,
          "currency": "USD"
        },
        "rating": 4.17,
        "review_count": 44,
        "trip_count": null,
        "is_all_star_host": false,
        "is_new_listing": null,
        "image": "https://images.turo.com/media/vehicle/images/suEZNr6TQ66O4gyraEkd3w.heic",
        "location": {
          "city": "Costa Mesa",
          "state": "CA",
          "country": "US",
          "latitude": 33.674787832953164,
          "longitude": -117.87979081684566
        },
        "url": null
      }
    ]
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Turo API works

Turo is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /turo/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
0 or 1 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Find the car, then find out which day to rent it

The search gives you an average daily price for a trip; the calendar gives you the list price of every individual day. They are different numbers, on purpose. Measured against Los Angeles while writing this.

01search
POST/turo/v1/search
{"location": "Los Angeles, CA, USA", "start_date": "2026-09-18", "end_date": "2026-09-21"}

Sixty cars in 2.8 seconds out of 7,626 the source reports for that window, each with make, model, year, body type, daily price, rating, review count and coordinates. Keep the vehicle_id.

02vehicle.pricing
POST/turo/v1/vehicle.pricing
{"vehicle_id": "2759791", "start_date": "2026-09-15", "end_date": "2026-10-15"}

Thirty-one days in under a second, each with its day of the week: Tuesday $47, Thursday $52, Friday $68, Saturday $73. That is the whole weekend premium, in numbers, for one car.

03vehicle.features
POST/turo/v1/vehicle.features
{"vehicle_id": "2759791"}

Transmission, seats, doors, luggage, fuel type and economy, plus the categorised feature list — safety, connectivity, convenience — which is what you filter a fleet on.

A shortlist of real cars with real prices, and the calendar that tells you whether moving the trip by one day is worth fifteen dollars.

request
curl -X POST https://api.reefapi.com/turo/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"location":"Miami, FL, USA"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "turo",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

Which Turo action fills which field

The search card and the vehicle.similar card share a field list but not the same populated fields, and picking the wrong action is why a Turo integration ends up with a column full of nulls. Measured on 2026-08-27 across three searches (Los Angeles, Miami, Austin: 180 rows) and one vehicle.similar call for a Tesla Model 3 in Miami. Every cell below is what actually came back, not what the schema allows.

Fieldsearchvehicle.similarMeasured value
vehicle_idpopulatedpopulated3875502, 1780934 (a JSON number, not a string)
price_per_day.amount / .currencypopulatedpopulated51.3 / "USD"
ratingpopulatedpopulated5.0 in search, 4.82 in similar
review_countpopulatednull24 in search
trip_countnull (180 of 180)populated255 in similar
transmissionnullpopulated"AUTOMATIC"
host{host_id, first_name, url}null (180 of 180)populateda numeric host_id and the owner's given name
urlnull (180 of 180)populatedturo.com/us/en/car-rental/united-states/miami-fl/tesla/model-3/1780934
location{city, state, latitude, longitude}populatednullLos Angeles / CA / 33.9412 / -118.3709
is_all_star_hostpopulatednulltrue

Neither action is a superset of the other. If you need host attribution and a listing URL, seed with search for coverage and then call vehicle.similar (or vehicle.detail plus host.profile keyed by host.host_id) for the fields search leaves empty. vehicle_id and host_id come back as plain integers in the payload, but every parameter accepts them as strings.

How stable the prices are, what the two price numbers mean, and the two actions that came back empty

Measured on 2026-08-28 against Los Angeles, two date windows and one vehicle followed through three actions. Four of these lines go against us.

Ask the same question twice and every single price repeats

Two identical searches minutes apart returned the SAME sixty cars at the SAME sixty prices — sixty of sixty ids in common, zero price differences. That makes this the most reproducible engine in the travel category, and it is the property you want if you are diffing a market day over day: any change you see is a real change, not the source reshuffling under you.

Dates decide the fleet as well as the price, in both directions

September against December from the same location: fifteen of sixty cars appeared in both windows, and their prices moved BOTH ways — $52.92 up to $55.62 and $123.98 up to $131.96, but $68.97 down to $59.28 and $48.89 down to $45.40. The size of the market moved too, from 7,626 cars available in the September window to 9,906 in the December one.

🔴 Leave the dates out and you get a real price for the wrong week

Against us. A search with no start_date does not fail — it silently searches about two weeks ahead. Compared against our explicit September window it returned thirty-six of the same sixty cars, and only twenty-two of those thirty-six carried the same price. So a dateless call gives you two-thirds of the right fleet at a mix of right and wrong prices, with nothing in the response to warn you. Send the dates.

🔴 Two price numbers that are both correct and never equal

Against us, and worth understanding before you reconcile them. For one car and one three-day trip the search reported an average daily price of $57.62; the price calendar for those same three days reported $68, $73 and $57, an average of $66.00. The search number is what a trip of that length costs per day; the calendar number is each day's own list price. Neither is wrong and they will not match, so pick one and use it consistently.

The price calendar is the weekend premium in plain numbers

Thirty-one consecutive days for one car came back with the day of the week attached to each: $47 on a Tuesday, $52 on a Thursday, $68 on the Friday and $73 on the Saturday. That is a fifty-five percent swing inside a single week on one vehicle, and it is the answer to almost every 'when is it cheapest' question about this source.

The currency is the market's, not a parameter

There is no currency field. Prices come back in the market currency for the country you searched — USD for the United States, which is where the fleet is — and the country parameter selects the market rather than the money. If you need another currency you convert it yourself, and you should say which rate you used.

Sixty a page, and the pages do not overlap

Page one and page two of the same search shared not one car out of sixty each, against a reported 7,626 available. Paging is a plain page number and the response carries has_more and next_page, so the walk is ordinary — the only thing to remember is to re-send the same dates on every page.

🔴 The detail action returns specs, and it says so itself

Against us. vehicle.detail answered ok on three separate cars and every response carried card_blocked set to true, with the transmission, seats, doors, luggage, fuel type and the full categorised feature list present — and no price and no owner card. Read it as a specification endpoint, take the price from search or from the pricing calendar, and do not wait for the card to appear.

🔴 The host fleet action came back empty on every id we tried

Against us. host.cars answered ok:true with an empty list and a total of zero pages on three different host ids, one of them a host with 202 completed rentals. host.reviews on that same id worked normally and returned twenty rows across five pages, so the id was valid and the account was live. Whatever host.cars is reading, it is not returning a fleet today.

What comes back, and what does not

The rentable car is the product here. Search rows carry the vehicle, its price, its rating and where it sits — and no owner at all: the host field was null on all sixty rows, as was the listing URL. The host endpoints exist and return an owner's public Turo profile page, but they are not what the search feed is for and not what these prices depend on. There is no Turo account in the path, so there is no account of yours to suspend.

What people build with Turo

The jobs this data is most often used for.

10

endpoints

0/1

credits per call

01

Travel and pricing apps call search to compare daily car-rental rates by city and vehicle type.

02

Market analysts use host.cars and host.reviews to study top hosts' fleets and ratings.

03

Fleet and pricing tools pull vehicle.pricing to benchmark dynamic daily rates for a specific car.

What Turo data costs

The cheapest call here is 0 credits, 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 →
$0.67–$1.50 / 1,000 credits
  • 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
curl -X POST https://api.reefapi.com/turo/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"location":"Miami, FL, USA"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/turo/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "location": "Miami, FL, USA"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Turo.

Get a free key →
Why are host, url and trip_count null in Turo search results?

The search surface returns a compact card: vehicle_id, make, model, year, type, price_per_day, rating, review_count, location and image. Across 180 rows measured on 2026-08-27 in Los Angeles, Miami and Austin, host, url, trip_count and transmission came back null on every one. They are not missing on Turo's side, they are simply not on that card. vehicle.similar returns host{host_id, first_name, url}, transmission and trip_count for the same kind of listing, and host.profile plus vehicle.detail fill in the rest once you have an id.

Is price_per_day what a renter would actually pay?

No, it is a daily rate and nothing else. For vehicle 3875502 over 2026-09-09 to 2026-09-12, search returned price_per_day.amount 51.30 USD while vehicle.pricing for the same car and the same window listed 58, 62, 70 and 73 USD per day with average_price 65.08 and price_range 58 to 74. Those are two different views of one listing, so pick one and stay consistent. Nothing in the response carries a trip fee, protection plan, delivery charge, young-driver fee or tax line, so you cannot reconstruct a checkout total from this API.

What does card_blocked: true mean on vehicle.detail?

vehicle.detail assembles its answer from more than one surface. The specs (transmission, seats, doors, luggage, fuel_type, fuel_economy) and the categorized feature list always come back. The listing card carrying the host block and the sub-ratings is best-effort. When it cannot be read, the response still returns ok: true with card_blocked: true, meta.stop_reason "card_blocked" and a reduced meta.completeness_pct, 60.0 on the call measured on 2026-08-27. The specs and features in that response are complete and correct. Retry for the card, or fetch the host separately with host.profile.

Why did host.cars return an empty list for a host with hundreds of trips?

host.cars lists the cars a host has live right now, not the cars they have ever rented out. Measured on 2026-08-27, host 33962137 reported rentals_from_renters 202 and ratings_from_renters_count 193 through host.profile, while host.cars returned zero cars with total_pages 0 and has_more false. That is a real answer rather than an error: ok stays true and meta.record_count is 0. A host who has paused or delisted every vehicle looks exactly like this.

How does the Turo location parameter get resolved, and can it land somewhere unexpected?

Free text is resolved to a Turo place, and it can snap to an airport instead of the city you typed. "Los Angeles, CA, USA" came back as meta.search_location "LAX - Los Angeles International Airport", while "Miami, FL" came back as "Miami, FL, USA". Read meta.search_location before trusting a result set. To resolve first, call location.autocomplete: its id is a Google Place ID such as "ChIJEcHIDqKw2YgRZU-t3XHylv8", type is "city" or "airport", and in the measured response city rows had null latitude and longitude while airport rows carried real coordinates.

Do the Turo search filters really narrow the result set?

Yes, they are applied on Turo's side rather than after the fact. A Miami search with vehicle_type SUV, max_price 150 and sort PRICE_LOW returned 60 of 60 rows typed SUV, priced 24.44 to 32.01 USD per day, with meta.total_hits 3,187. The vehicle_type vocabulary is CAR, SUV, MINIVAN, TRUCK, VAN, CARGO_VAN and BOX_TRUCK. Watch for typos: an unrecognized filter value is ignored rather than rejected, so a misspelled vehicle_type quietly hands you the unfiltered market. Page with page until meta.has_more is false; a page is roughly 60 cars.

What is the difference between rating, review_count and trip_count?

rating is the star average, review_count is how many written reviews the car has, and trip_count is how many trips it has completed. They rarely line up, and they do not all appear on the same action. Measured on 2026-08-27, a search row showed rating 5.0 with review_count 24 and trip_count null, while a vehicle.similar row showed rating 4.82 with trip_count 255 and review_count null. host.profile separates them further: rentals_from_renters 202 against ratings_from_renters_count 193, plus rating_from_renters 5.0 rounded and rating_to_hundredth 4.97 for the precise figure.

Where do I get a Turo vehicle_id and host_id if all I have is a URL?

Both are the trailing number in the URL. A car sits at turo.com/us/en/car-rental/united-states/<city>/<make>/<model>/<vehicle_id>, which is how 1780934 was read off the measured Miami Model 3. A host sits at turo.com/us/en/drivers/<host_id>, which is where 33962137 came from. The payload returns both as JSON numbers, but vehicle_id, host_id and their aliases (vehicleId, id, driverId, driver_id) all accept strings, which is the safer choice for large ids in JavaScript.

What is the Turo API?

Turo API is a ReefAPI endpoint group for turo It returns live JSON through POST requests under /turo/v1.

Is the Turo API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Turo calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Turo login or account?

No login to Turo 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 Turo 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 Turo API use?

Turo 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 Turo from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call turo actions with the same key, credit pool and JSON envelope used by normal REST requests.

8 Travel & Lodging APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Turo, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

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. Field notes were captured on 2026-08-28.