Turo Scraper - Vehicle Search, Trip Quotes and Hosts avatar

Turo Scraper - Vehicle Search, Trip Quotes and Hosts

Pricing

from $1.20 / 1,000 vehicle results

Go to Apify Store
Turo Scraper - Vehicle Search, Trip Quotes and Hosts

Turo Scraper - Vehicle Search, Trip Quotes and Hosts

Collect Turo vehicles by location and trip dates or listing URLs. Get make, model, year, ratings, photos, dated price estimates, vehicle details and public host profiles, with resume and recurring change detection.

Pricing

from $1.20 / 1,000 vehicle results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

10

Total users

6

Monthly active users

11 days ago

Last modified

Categories

Share

Turo Scraper: Vehicle Listings, Trip Quotes & Host Profiles

Turo Scraper turns Turo into structured vehicle data. Search by location and trip dates, or paste direct vehicle listing links, to collect make, model, year, rating, public location, photos and a dated price estimate for your exact trip. Turn on full details to add specifications, delivery options, owner information and the public host profile. Export to JSON, CSV or Excel, or pull results straight into your app through the API.

Why This Scraper?

  • Two ways in. Search by location, make and trip dates with filters and sorting, or paste direct links (vehicle, city, make, type or search pages).
  • Dated trip quotes. Each vehicle is joined to a Turo-estimated quote for your exact trip dates, not just the generic search-card daily average, so tripTotal and quotedDailyPrice reflect the dates you asked for.
  • Reviews, filters and sorting. Each row can carry its newest guest reviews (up to maxReviews), and you can narrow by make, year, rating, fuel type, vehicle type and price window, then sort by price or distance (Turo applies the sort across its whole result set).
  • Full details on demand. Switch on specifications, delivery options, owner information and the public host profile per run, and pay the detail surcharge only for records where a host profile was actually fetched.
  • Resume without repaying. Continue one interrupted run by its run ID and skip vehicles it already returned, instead of recollecting from scratch.
  • Built for recurring monitoring. Incremental mode returns only new and updated vehicles on repeat runs against the same search (and, with Emit expired listings on, vehicles that disappear or return), so scheduled comparisons don't reprocess everything each time.
  • Fails loudly when blocked. If a location search or a pasted listing link can't be read, the run stops with an error instead of quietly returning an empty dataset that looks like "no vehicles found."

Use Cases

  • Car-sharing market research: compare vehicle types, ratings and pricing by city or make to benchmark host supply against your own fleet.
  • Dynamic pricing analysis: pull dated quotes across many vehicles to build a competitor pricing baseline for a specific trip window.
  • Fleet and demand monitoring: schedule Incremental mode runs to catch new listings, price changes, or vehicles that disappear from a market.
  • Host outreach and lead lists: collect public host profiles and completed-trip counts to identify active hosts worth contacting.
  • Travel and rental comparison tools: feed live vehicle availability and dated pricing into your own booking or comparison app.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
id"101"
urlTuro link to the vehicle listing
title"2020 Tesla Model 3"
make / model"Tesla" / "Model 3"
year2020
vehicleType"CAR"
rating4.8
completedTrips126
hostId1101
city / state / country"Los Angeles" / "CA" / "US"
latitude / longitude34.0522 / -118.2437
averageDailyPrice{ "amount": 35, "currency": "USD" } (search-card estimate)
tripTotal / currency117 / "USD" (dated quote for the requested trip)
quotedDailyPrice39 (dated quote, before taxes and checkout add-ons)
quoteStatus"complete" or "unavailable"
startDateTime / endDateTimerequested trip window used for the quote
detailStatus / hostStatus"complete", "not_requested", or "unavailable"
imagesarray of photo URLs
locationstructured place object; precision noted when known
reviews / reviewsReturned / reviewsStatusnewest guest reviews on the row, how many, and "complete", "not_requested" or "unavailable"
scopeId / scrapedAtbaseline scope hash and collection timestamp

With full details enabled (the default), each record also carries description (the host's listing text), owner (the public owner block), basicCarDetails (specifications such as seat count), host (the separate public host profile: bio and verification badges), quote (the full dated quote object, including nonIncludedLineItems and pricingDisplay), searchVehicle (the raw public search card) and detail (the raw public vehicle response), so nothing public is lost. Every row also carries a coverage object reporting how the search behind it went (returned count, source total, whether it was a complete scan). In Incremental mode, rows also carry changeType (NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED), changedFields, firstSeenAt and lastSeenAt.

How to Use

  1. Pick a mode: search (locations and trip dates) or url (paste direct vehicle listing links).
  2. For search mode, set locations, and optionally makes, vehicleType, fuelType and minTotalPrice/maxTotalPrice to narrow the search, plus minYear, maxYear and minRating to filter what comes back before the output limit. Pick an order with sortBy.
  3. Set trip dates with startDateTime and endDateTime, or leave both empty for the default three-day trip starting seven days out. Turn fetchDetails on or off, set maxReviews (0 skips reviews) and maxItems, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Filtered search with a fixed trip window:

{
"mode": "search",
"locations": ["Chicago, Illinois"],
"makes": ["Tesla"],
"minYear": 2020,
"minRating": 4.5,
"startDateTime": "2026-11-10T10:00:00",
"endDateTime": "2026-11-13T10:00:00",
"maxItems": 15
}

Electric SUVs under a price, cheapest first:

{
"mode": "search",
"locations": ["Denver, Colorado"],
"vehicleType": ["SUV"],
"fuelType": ["ELECTRIC"],
"maxTotalPrice": 400,
"sortBy": "daily_price_low_to_high",
"maxReviews": 0,
"maxItems": 30
}

Paste specific vehicle links:

{
"mode": "url",
"urls": [
"https://turo.com/us/en/car-rental/united-states/los-angeles-ca/tesla/model-3/101"
],
"maxReviews": 20,
"fetchDetails": true
}

Recurring monitoring of one market:

{
"mode": "search",
"locations": ["Miami, Florida"],
"startDateTime": "2026-11-10T10:00:00",
"endDateTime": "2026-11-13T10:00:00",
"maxItems": 0,
"incrementalMode": true,
"stateKey": "miami-monitor",
"emitExpired": true,
"ignoreFieldsForChanges": ["rating", "completedTrips"]
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/turo-scraper").call(run_input={"mode": "search", "locations": ["Los Angeles, California"], "maxItems": 20})
for vehicle in client.dataset(run["defaultDatasetId"]).iterate_items():
print(vehicle["title"], vehicle["tripTotal"], vehicle["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/turo-scraper').call({ mode: 'search', locations: ['Los Angeles, California'], maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

URL mode shapes

URL mode accepts these Turo links (United States pages only), each tried live:

Link shapeExample
City pagehttps://turo.com/us/en/car-rental/united-states/los-angeles-ca
City + make pagehttps://turo.com/us/en/car-rental/united-states/los-angeles-ca/tesla
Vehicle-type pagehttps://turo.com/us/en/suv-rental/united-states/los-angeles-ca
Country + make pagehttps://turo.com/us/en/car-rental/united-states/tesla
Vehicle pagehttps://turo.com/us/en/car-rental/united-states/los-angeles-ca/chevrolet/sonic/3864730
Search linkhttps://turo.com/us/en/search?location=Los%20Angeles%2C%20CA (optionally with makes, types, startDate, endDate)

Listing pages return Turo's first result page for your trip dates, at most 200 vehicles each (URL mode does not run the per-vehicle-type searches); a country-wide page is capped there (the run reports the cap as incomplete, so no vehicle is ever marked expired from it). The make in a link must be one Turo lists (for example mercedes-benz becomes Mercedes-Benz and land-rover becomes Land Rover) and the city must carry its two-letter state (los-angeles-ca). Pages for other countries, unknown makes or unrecognisable slugs are skipped with a warning in the log, never guessed. Search-mode inputs (makes, vehicleType, fuelType, price window, minYear/maxYear/minRating, startDateTime/endDateTime) apply to search mode only. In URL mode a link's own query is read for exactly these parameters: location, makes (names or slugs, comma separated or repeated), types (CAR, SUV, MINIVAN, TRUCK, VAN, CARGO_MINIVAN, BOX_TRUCK) and startDate/endDate with optional startTime/endTime (MM/DD/YYYY or YYYY-MM-DD, HH:MM). They are applied to that link only: the search is filtered to those makes and types and quoted for the link's trip dates, which replace your run-level dates for that link (a vehicle link's dates apply to its quote the same way). A make or type in the link combined with a make or type page path must overlap. Location-only view parameters (country, region, latitude, longitude, placeId, locationType, deliveryLocationType, defaultZoomLevel, isMapSearch, itemsPerPage, useDefaultMaximumDistance, pickupType, age) are ignored. Tracking parameters (utm_*, gclid, fbclid, ref) are ignored too. A link that carries any other query parameter (for example sortType, fuelTypes, minYear, maxYear, features, transmission, a price limit), an unknown make or type, or only one of the two dates is skipped with a warning in the log rather than answered with unfiltered rows; use search mode for those filters. Behaviour change: the urls field now has a default, so a URL-mode run with the field untouched scrapes one example of each shape (up to maxItems) instead of failing on an empty list.

Turo's own limits and maxItems

Turo caps a single search at around 200 vehicles, even when its reported total is larger, and cannot be paged past that. Searches without a vehicleType filter work around this with the per-vehicle-type searches described under vehicleType, which can still leave a very large city incomplete. makes narrows the search itself at the source; minYear, maxYear and minRating are applied locally to what Turo returned, before maxItems is enforced, so a narrow filter can return fewer records than maxItems while other matching vehicles remain outside what was fetched. Narrow your locations or add a make filter for more targeted coverage. maxItems: 0 removes this actor's own limit but does not make a run exhaustive.

Filters, sort and reviews

  • vehicleType, fuelType, makes: narrow the search at the source, so Turo's 200-vehicle single-search cap applies to the narrowed set. When a search with no vehicleType hits that cap and maxItems is larger than the 200 rows it returned (or a local filter such as minYear, maxYear, minRating or a total-price window is set), the actor runs one extra search per vehicle type (car, SUV, minivan, truck, van, cargo minivan, box truck) and merges them by vehicle ID. The first search keeps its order at the top. When maxItems is already covered by the first 200 rows, the extra searches are skipped. If one of the extra searches fails, the rows gathered so far are kept and the location is reported as incomplete.
  • age: accepted for compatibility only. Turo's search does not take a renter age, so it does not change the results.
  • minTotalPrice / maxTotalPrice: keep vehicles whose dated trip total (before taxes) falls in the window.
  • sortBy: sent to Turo, which orders its whole result set: relevance (default), daily_price_low_to_high, daily_price_high_to_low and distance_away (nearest first to the search point). The cheapest or priciest vehicles in a city are therefore returned first even when the city has more than 200 matches.
  • Reviews: maxReviews (default 20, at most 1000 per vehicle, 0 skips) returns each vehicle's newest guest reviews on the same row, with the host reply when there is one. reviewsStatus tells you whether they were fetched.

Resume and Incremental mode

  • Resume (resumeFromRunId) continues one interrupted run with the same query, dates and detail settings: it skips vehicle IDs already returned there, so you don't pay twice. The trip dates are part of that scope, so a Resume with startDateTime/endDateTime left empty (which roll forward to seven days out from whenever the run starts) can fail the scope check on a later day; set explicit dates for a Resume you expect to run more than once.
  • Incremental mode (incrementalMode) is for recurring runs over the same scope (mode, locations or URLs, trip dates, filters, fetchDetails and maxReviews; a different maxReviews gets its own baseline instead of re-billing the old one). Choose fields to ignore with ignoreFieldsForChanges (dotted paths such as host.name): they stay in the output but never trigger UPDATED or appear in changedFields, and changing the list never causes a one-time wave of UPDATED rows. Each vehicle is classified NEW, UPDATED (with changedFields), or UNCHANGED (suppressed and not billed unless emitUnchanged is on); with emitExpired on and a clean complete scan, a vehicle can also classify EXPIRED or, on a later such run, REAPPEARED. An existing baseline cannot be combined with resumeFromRunId. Trip dates are part of the scope too, so leaving startDateTime/endDateTime empty (they roll forward daily) starts a fresh baseline on every run and prevents EXPIRED/REAPPEARED from ever firing; set explicit dates for recurring monitoring.
  • EXPIRED rows, and the REAPPEARED classification that can follow them, only ever come from a run that scanned its whole scope without hitting maxItems, without a resume, and without any quote, detail or host lookup failing along the way, and only when emitExpired was turned on for that scan. A capped, resumed, partial or degraded run never marks anything expired, so one bad run can't wipe out your baseline; the next clean run re-evaluates those vehicles instead.
  • Baselines are always kept separate per search scope; stateKey only gives a baseline a memorable name so you can track several searches independently. Avoid scheduling overlapping runs against the same key, since state is committed only after a run finishes normally.

Output views

The dataset has four ready-made views, also linked from the run's output tab: Vehicles (core fields, price quote and change type), Details and hosts (description, specifications, owner, host profile, images, coverage), Reviews (rating, text, date, reviewer, host reply) and Changes (incremental) (change type, changed fields, first and last seen).

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each vehicle becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (locations and trip dates) or url (paste vehicle listing links).
locationsarrayno default (prefill: ["Los Angeles, California"])Search mode only. City, airport, or place names.
makesarrayno defaultSearch mode only. Vehicle make names, such as Tesla.
minYearintegerno defaultSearch mode only. Applied to returned vehicles before the output limit.
maxYearintegerno defaultSearch mode only. Applied to returned vehicles before the output limit.
minRatingnumberno defaultSearch mode only. Excludes unrated vehicles; applied before the output limit.
fuelTypearrayno defaultSearch mode only. GAS, HYBRID, ELECTRIC or DIESEL.
vehicleTypearrayno defaultSearch mode only. CAR, SUV, MINIVAN, TRUCK, VAN, CARGO_MINIVAN or BOX_TRUCK.
minTotalPriceintegerno defaultSearch mode only. Drop vehicles whose quoted trip total (before taxes) is lower.
maxTotalPriceintegerno defaultSearch mode only. Drop vehicles whose quoted trip total (before taxes) is higher.
ageinteger30Renter age, 18 to 55. Accepted for compatibility; Turo's search does not use it, so it does not change results.
sortBystringrelevancerelevance, daily_price_low_to_high, daily_price_high_to_low or distance_away.
urlsarrayone example per supported shape (5 links)URL mode only. Vehicle pages, city pages, city + make pages, vehicle-type pages (suv-rental), country + make pages and /search?location= links.
startDateTimestringno defaultLocal ISO trip start, both modes. Omit together with endDateTime for a three-day trip starting in seven days.
endDateTimestringno defaultLocal ISO trip end, after startDateTime. Must be supplied together with the start.
maxReviewsinteger20Guest reviews returned on each vehicle row (rating, text, date, reviewer, host reply), newest first. 0 skips reviews; at most 1000 per vehicle. Charges one detail-enrichment event per 10 reviews delivered (rounded up).
fetchDetailsbooleantrueReturn full specifications and the public host profile. Charges one detail-enrichment event per returned record with a successfully fetched host profile.
maxItemsinteger20Maximum returned records. 0 removes this actor's output limit; Turo's own per-location cap still applies.
proxyobjectResidential (Apify Proxy)Connection settings. The default is Apify's Residential proxy group; keep it, or supply your own proxy URLs. If the chosen connection cannot be used, the run continues on a backup connection.
resumeFromRunIdstringno defaultContinue one interrupted run with the same query, dates and detail settings.
incrementalModebooleanfalseRemember a baseline and return only new and changed vehicles on repeat runs. A vehicle is UPDATED when any scraped vehicle field changes (price, rating, trips, location, images, details, host); scrape timestamps, status flags and the duplicate search-card copies of images and daily price are never compared.
ignoreFieldsForChangesarray[]Incremental mode only. Field names (dotted paths like host.name for nested keys) that never trigger UPDATED or appear in changedFields; they stay in the output. Changing this list never causes a one-time wave of UPDATED rows.
stateKeystringno defaultOptional name for a baseline. Use different keys for different searches.
emitUnchangedbooleanfalseAlso return (and bill) unchanged vehicles in Incremental mode.
emitExpiredbooleanfalseAlso return (and bill) vehicles no longer found, only after a complete scan in Incremental mode.
mcpConnectorsarrayno defaultOptional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstringno defaultNotion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"id": "101",
"url": "https://turo.com/us/en/car-rental/united-states/los-angeles-ca/tesla/model-3/101",
"title": "2020 Tesla Model 3",
"make": "Tesla",
"model": "Model 3",
"year": 2020,
"vehicleType": "CAR",
"rating": 4.8,
"completedTrips": 126,
"hostId": 1101,
"city": "Los Angeles",
"state": "CA",
"country": "US",
"latitude": 34.0522,
"longitude": -118.2437,
"location": {
"city": "Los Angeles",
"country": "US",
"latitude": 34.0522,
"longitude": -118.2437,
"precision": { "level": "APPROXIMATE" }
},
"images": ["https://images.turo.com/media/vehicle/images/sample1.jpg"],
"averageDailyPrice": { "amount": 35, "currency": "USD" },
"tripTotal": 117,
"currency": "USD",
"quotedDailyPrice": 39,
"quote": {
"totalTripPrice": { "amount": 117, "currencyCode": "USD" },
"vehicleDailyPriceAfterDiscount": { "amount": 39, "currencyCode": "USD" },
"nonIncludedLineItems": [{ "type": "PROTECTION" }]
},
"quoteStatus": "complete",
"startDateTime": "2026-11-10T10:00:00",
"endDateTime": "2026-11-13T10:00:00",
"detailStatus": "complete",
"hostStatus": "complete",
"basicCarDetails": { "numberOfSeats": 5 },
"owner": { "id": 1101, "name": "Public Host" },
"host": { "driver": { "id": 1101 }, "bio": "Public biography", "verifications": { "emailVerified": true } },
"coverage": { "query": "Los Angeles, California", "returned": 18, "totalHits": 18, "complete": true, "reason": "source_end" },
"scopeId": "8f2a1c4d9b3e7f60a1c2d3e4",
"scrapedAt": "2026-11-05T02:00:00+00:00"
}

Plan Requirement

Connection. The default Connection setting uses Apify's Residential proxy group, so paid Apify plans need no setup. In our checks Turo's data endpoints also answered over datacenter addresses, so when the residential connection is unavailable the run falls back to a backup connection and continues. Apify free plans do not include residential proxies; on a free plan the run uses the backup connection, or you can supply your own proxy URLs in the Connection field or upgrade at https://apify.com/pricing.

What you will see in the run log when the default connection is not available:

  • "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable." The run continues on a backup connection, and logs "Served over the backup connection (the default connection was unavailable)."
  • If nothing could be read, the run fails with one of: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required"; "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested Turo pages"; or "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later." The last one means a connection problem, not an empty search.

Vehicle results, optional detail enrichment and reviews are billed as pay-per-event usage; see the actor's Pricing tab for current rates before running at scale.

FAQ

How much does it cost?

You pay per vehicle record returned, plus one optional detail-enrichment event for each record where full details were requested and a public host profile was actually fetched. Reviews add one detail-enrichment event per 10 reviews delivered on a returned record (rounded up; a record with 11 reviews is 2 events), charged after that record is saved; this reuses the existing detail-enrichment event, listed on the Pricing tab. The default maxReviews of 20 means up to 2 such events per vehicle. Set maxReviews to 0 to avoid it. Suppressed unchanged rows in Incremental mode and failed enrichment attempts are not billed. The Pricing tab shows current rates; use Maximum vehicles (maxItems) to cap the cost of any run.

This actor collects only publicly available vehicle listing data. You are responsible for how you use it: follow Turo's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts such as make, model and year are generally not protected, but photos and host-written text may carry separate rights.

Can I track new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated vehicles for the same search scope, and unchanged vehicles are not billed unless you opt in; with Emit expired listings also on and a clean complete scan, expired and reappeared vehicles are included too. Keep the trip dates fixed (don't leave them empty) so the scope stays the same run to run.

Why did my run return fewer vehicles than maxItems?

Turo caps each single search around 200 vehicles regardless of how many it reports in total; search mode adds per-vehicle-type searches when needed (see vehicleType) but a very large city can still be incomplete. makes, vehicleType and fuelType narrow the search at the source; minYear, maxYear and minRating are applied locally before maxItems, so a narrow filter can leave matching vehicles outside what was returned. Widen the filters or add more locations for broader coverage.

Why did my run fail instead of returning an empty dataset?

A run fails when any location search or pasted listing link can't be read, such as a removed vehicle link, or when the input itself is invalid (for example an unreadable Resume ID, or Resume combined with an existing Incremental baseline). A location with no matching address returns zero vehicles for that location normally, without failing the run. If only some per-vehicle detail or quote lookups fail partway through, you still get the base records that were found, with their status fields marked accordingly.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

🔗 Want more car data?

Pair this actor with these related scrapers from the same team:

🚗 EasyAuto123 Scraper
Scrape EasyAuto123 vehicle listings into clean structured data. Extract prices, VINs...
🚗 Cars.com Scraper
Scrape cars.com listings by make, ZIP and radius. 90+ fields per car: price, MSRP...
🚗 mobile.de Scraper
Scrape mobile.de vehicle listings with 30+ fields including price, mileage, registration...
🚗 Autotrader US
Scrape US car listings from Autotrader by make, model, ZIP, price, year, body style...
🚗 AutoTrader UK Scraper
Pull structured vehicle listings from autotrader.co.uk at scale. Search by filters or use...
🏷️ Tutti.ch Scraper
Scrape listings from tutti.ch across all 23 categories, including vehicles, property...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.