# Turo Scraper - Vehicle Search, Trip Quotes and Hosts (`abotapi/turo-scraper`) Actor

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.

- **URL**: https://apify.com/abotapi/turo-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 vehicle results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Turo vehicle search

Collect Turo vehicle listings for selected locations and trip dates, or supply vehicle listing URLs. Results include make, model, year, rating, public location, photos and dated estimated prices. Optional full details add specifications, delivery options, owner information and the public host profile.

### Quick start

```json
{
  "mode": "search",
  "locations": ["Los Angeles, California"],
  "maxItems": 20,
  "fetchDetails": true
}
```

Without dates, the actor searches a three-day trip starting at 10:00 seven days from the run date. Set both `startDateTime` and `endDateTime`, for example `2026-10-13T10:00:00` and `2026-10-16T10:00:00`, to collect a specific trip. Times are local at the vehicle location; omit a time zone. Fixed dates are recommended for recurring comparisons.

For individual vehicles, choose `mode: "url"` and supply one or more HTTPS Turo vehicle listing links in `urls`. Links must end with the numeric vehicle ID. Search fields are ignored in URL mode. The actor uses the explicitly selected trip dates, not dates in a pasted URL.

### Inputs

| Input | Behavior |
| --- | --- |
| `mode` | `search` or `url`. |
| `locations` | City, airport or place names. Multiple locations share the output budget. |
| `makes` | Search-only make names, such as `Tesla`. |
| `minYear`, `maxYear`, `minRating` | Search-only filters applied to returned vehicles before the output limit. Unrated vehicles do not match a rating filter. |
| `urls` | Individual vehicle listing URLs, not search links or host profiles. |
| `startDateTime`, `endDateTime` | Paired local ISO trip dates used for availability and quotes. |
| `fetchDetails` | Return full vehicle details and fetch the public host profile. Default true. A detail-enrichment event applies only after a record with a successfully fetched host profile is returned. |
| `maxItems` | Maximum returned records, default 20. Zero removes this output limit but cannot remove Turo's source limit. |
| `proxy` | Standard Apify proxy configuration. The default uses Apify datacenter. |
| `resumeFromRunId` | Skip vehicle IDs already returned by a prior run with the same query, dates and detail settings. Unlike `incrementalMode`, this continues one interrupted run. |
| `incrementalMode` | Remember a baseline for recurring comparisons. Default false. Unlike `resumeFromRunId`, no prior run ID is required. |
| `stateKey` | Optional name for a baseline. Use separate keys for separate searches and avoid overlapping runs sharing a key. |
| `emitUnchanged` | Return and bill unchanged rows too. Default false. |
| `emitExpired` | Return and bill absent rows only after a complete, nonempty scan. Default false. |
| `mcpConnectors` | Optional output connector IDs. |
| `notionParentPageUrl` | Parent page for a Notion export. |
| `maxNotifyListings` | Maximum summaries exported per connector, default 50. |

### Output and coverage

Each row includes `id`, the canonical `url` when available, `title`, `make`, `model`, `year`, `vehicleType`, `rating`, `completedTrips`, `hostId`, city/state/country, coordinates, images and requested dates. Coordinates may be approximate; the original `location` retains any supplied precision information.

`tripTotal`, `quotedDailyPrice`, `currency` and `quote` come from a dated estimated quote joined by vehicle ID. The source's estimate is before taxes and may exclude protection and other checkout options; consult `quote.nonIncludedLineItems` and `quote.pricingDisplay`. This is not a final booking price. `averageDailyPrice` is the separate search-card estimate and is never substituted for a dated quote. `quoteStatus` reports unavailable quotes explicitly.

`searchVehicle` retains the public search card. With details enabled, `detail` retains the full public vehicle response, `owner` preserves the owner block, `basicCarDetails` holds specifications, and `host` contains the separate public profile. Fields absent at the source remain null or absent; the actor does not infer contact details. Public text reviews are not collected. Rating counts and trip counts are different measures.

Turo may return at most 200 vehicles for a location even when `totalHits` is larger. There is no page/offset continuation in this actor. Search-only year/rating filters narrow that returned selection, so a filtered run can return fewer than `maxItems` while other matching vehicles remain outside it. Narrow your locations or make filter for broader targeted coverage. `maxItems: 0` does not imply an exhaustive catalogue.

The `RUN_SUMMARY` key-value record and each row's `coverage` object report returned counts and source coverage. A cap, source failure, missing quote, partial enrichment or resumed run prevents expiry. Failed entry requests fail the run rather than producing a billable error row. Repeated enrichment failures disable further enrichment for that run; base records retain explicit status fields. Incremental comparison preserves previously collected enrichment when a later request fails.

Incremental rows carry `changeType` (`NEW`, `UPDATED`, `REAPPEARED`, optionally `UNCHANGED` or `EXPIRED`), `changedFields`, `firstSeenAt` and `lastSeenAt`. Baselines are scoped to mode, locations or URLs, dates, filters and detail settings. An existing baseline cannot be combined with resume. State is saved only after collection completes normally, with a best-effort revision check; do not schedule overlapping runs against the same baseline.

### Send results into your apps (MCP connectors)

Authorize a connector under Apify Settings, API & Integrations, then select it in `mcpConnectors`. Set `notionParentPageUrl` for Notion and use `maxNotifyListings` to limit the export. Connectors receive condensed titles, key fields and readable summaries, not the complete nested JSON. Full records stay in the dataset. No connector means no export; export failures leave the dataset available.

### Pricing

Each returned dataset row uses the standard result event. Optional full details add one `detail-enrichment` event per returned row with a successfully fetched public host profile. Suppressed unchanged rows and failed enrichment do not incur that extra event. Refer to the actor's current Pricing tab for rates. CSV, JSON and Excel exports are available from the dataset.

# Actor input Schema

## `mode` (type: `string`):

Search locations or load individual vehicle links.

## `locations` (type: `array`):

Search mode only. City, airport or place names.

## `makes` (type: `array`):

Search mode only. Vehicle make names, such as Tesla.

## `minYear` (type: `integer`):

Search mode only. Applied to returned vehicles before the output limit.

## `maxYear` (type: `integer`):

Search mode only. Applied to returned vehicles before the output limit.

## `minRating` (type: `number`):

Search mode only. Excludes unrated vehicles and applies before the output limit.

## `urls` (type: `array`):

Turo vehicle or search URLs to scrape. Each URL is one source; vehicle pages are read directly, search pages are forward-paged.

## `startDateTime` (type: `string`):

Both modes. Local ISO date and time without a time zone. Set both dates, or omit both for a three-day trip beginning in seven days.

## `endDateTime` (type: `string`):

Both modes. Local ISO date and time after the start. Must be supplied with the trip start.

## `fetchDetails` (type: `boolean`):

Return full specifications and public host profile. One detail-enrichment event is charged after each returned record with a successfully fetched host profile.

## `maxItems` (type: `integer`):

Default 20. Zero removes the output limit. Turo can still cap each location at 200 vehicles; this does not imply exhaustive coverage.

## `proxy` (type: `object`):

Turo blocks datacenter IPs. Use the Residential proxy (default) or bring your own.

## `resumeFromRunId` (type: `string`):

Continue an interrupted run with the same query, dates and detail settings. For recurring comparisons, use incrementalMode instead.

## `incrementalMode` (type: `boolean`):

Remember a baseline and return changes. Unlike resumeFromRunId, no prior run ID is required. Do not combine with resume when a baseline exists.

## `stateKey` (type: `string`):

Optional baseline name. Use different keys for separate scopes and avoid overlapping runs with the same key.

## `emitUnchanged` (type: `boolean`):

Return and bill unchanged rows in incremental mode.

## `emitExpired` (type: `boolean`):

Return and bill absent rows only after a complete nonempty scan in incremental mode. Capped and partial searches do not expire records.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "locations": [
    "Los Angeles, California"
  ],
  "urls": [
    "https://turo.com/us/en/car-rental/united-states/los-angeles-ca/chevrolet/sonic/3864730"
  ],
  "fetchDetails": true,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Los Angeles, California"
    ],
    "urls": [
        "https://turo.com/us/en/car-rental/united-states/los-angeles-ca/chevrolet/sonic/3864730"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/turo-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Los Angeles, California"],
    "urls": ["https://turo.com/us/en/car-rental/united-states/los-angeles-ca/chevrolet/sonic/3864730"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/turo-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Los Angeles, California"
  ],
  "urls": [
    "https://turo.com/us/en/car-rental/united-states/los-angeles-ca/chevrolet/sonic/3864730"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call abotapi/turo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/turo-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/efU6JYaK40m4nVtGo/builds/OCxgAs21lng8L6GXj/openapi.json
