# Outdoorsy Scraper (`crawlerbros/outdoorsy-scraper`) Actor

Scrape Outdoorsy (outdoorsy.com) - the world's largest RV rental marketplace. Search rentals by location and dates, browse by RV type, fetch listings by URL, or scrape owner profiles. Get nightly/weekly/monthly prices, RV specs, sleeps, amenities, photos, ratings, and policies.

- **URL**: https://apify.com/crawlerbros/outdoorsy-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, E-commerce, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Outdoorsy Scraper

Scrape **Outdoorsy** — the world's largest RV rental marketplace, with 100,000+ RVs, motorhomes, camper vans, travel trailers, fifth wheels, and toy haulers across the **USA, Canada, UK, Australia, and Europe**. Search rentals by location and dates, browse by RV type, fetch listings by URL, or scrape owner profiles. Get nightly/weekly/monthly prices, full vehicle specs, sleeping capacity, amenities, photo URLs, owner response rates, ratings, and delivery and mileage policies.

### What this actor does

- **Four modes:** `search`, `browseByRvType`, `byUrl`, `ownerProfile`
- **Full listing detail:** nightly/weekly/monthly prices, RV class, year, make/model, length and weight specs, sleeps, beds, amenities, fuel type, tags
- **Pricing policies:** security deposit, prep fee, weekly/monthly discounts, minimum days, mileage policy (included miles + extra-mile price), delivery radius and price
- **Owner data:** name, response rate, owner score, dealer/pro status, profile photo, and the owner's other listings
- **Photos:** every photo URL from the listing gallery plus the primary image
- **Filters:** RV type, country, nightly price range, minimum rating, keyword, delivery, instant book, pet friendly, date availability window
- **Reliable access:** uses a modern Chrome fingerprint for direct access; optional proxy is engaged automatically only if a request gets blocked
- **Empty fields are omitted**

### Data source

The actor reads **outdoorsy.com** — the RV rental marketplace — through its public search, listing-detail, user-profile, and reviews endpoints. No login, cookies, or API keys are required.

### Limitations

- **Search results cap:** the marketplace caps a single query's result set near 1000 listings; `maxItems` is the hard output cap (max 1000).
- **Pricing:** all price fields are nightly/weekly/monthly base rates in USD as shown by the marketplace, excluding taxes and booking fees. Some listings use custom pricing; `minBundleDayPrice` reflects the cheapest configured rate.
- **Price/rating filters** are applied against the data Outdoorsy returns (a listing without a published rate or rating passes the corresponding filter rather than being dropped).
- **Availability window:** `startDate`/`endDate` filter to listings bookable in that window; listings without published availability pass through.
- **Reviews:** fetched on demand in `byUrl` mode (`includeReviews`) — up to 10 reviews per listing.
- **Camper vans** are grouped under Class B on Outdoorsy; the `camperVan` RV type maps to the same bucket.
- **`rvType` accepts display spellings** too (`Class C`, `travel trailer`, `fifth wheel`, `pop-up`, …) — they are normalized to the canonical enum keys before querying.
- **Inverted ranges are rejected up front:** if `minPrice` > `maxPrice` (or `minRating` > 5, etc.) the run exits with a clear status message instead of burning API calls.
- **Owner profiles** carry both `ownerProfileUrl` and the project-standard `sourceUrl`.
- **Not affiliated:** this actor is a third-party tool and is not affiliated with or endorsed by Outdoorsy.

### Output per listing

- `listingId`, `name`, `slug`, `sourceUrl`
- `vehicleType` (Class A / Class B / Travel trailer / …), `type`, `rentalCategory`
- `vehicleClass`, `vehicleBodyClass`, `vehicleMake`, `vehicleModel`, `vehicleYear`, `vehicleTitle`, `vehicleLicensePlateState`
- `vehicleLength`, `vehicleLengthWithHitch`, `vehicleWidth`, `vehicleHeight`, `vehicleDryWeight`, `vehicleGvwr`, `vehicleAmps`, `vehicleBoxLength`
- `sleeps`, `sleepsAdults`, `sleepsKids`, `seatbelts`, `beds[]` (e.g. `Queen x1`)
- `pricePerDay`, `pricePerWeek`, `pricePerMonth` (USD), plus `lowPricePerDay`, `minBundleDayPrice`
- `weeklyDiscount`, `monthlyDiscount`, `minimumDays`, `securityDeposit`, `prepFee`, `currency`
- `city`, `state`, `county`, `country`, `zip`, `latitude`, `longitude`, `distanceMiles`
- `rating`, `reviewCount`, `communicationScore`, `cleanlinessScore`, `mechanicalScore`, `valueScore`, `groupReviewScore`
- `amenities[]` (pet friendly, generator, Wi-Fi, air conditioner, solar panels, …)
- `ownerUserId`, `ownerName`, `ownerResponseRate`, `ownerScore`, `ownerIsDealer`, `ownerIsPro`, `ownerAvatarUrl`, `ownerProfileUrl`
- `deliveryAvailable`, `deliveryRadiusMiles`, `deliveryPricePerMile`
- `mileageIncludedPerDay`, `mileageUnlimited`, `mileageUnit`, `extraMilePrice`
- `instantBook`, `allowsLongTerm`, `cancelPolicy`, `cancelText`, `checkIn`, `checkOut`
- `summary`, `description`, `houseRules`, `hostNotes`, `tags[]`
- `primaryImageUrl`, `photoUrls[]` — all listing photo URLs
- `reviews[]` — up to 10 reviews with scores and dates (mode=byUrl with `includeReviews`)
- `completedTripsCount`, `requestCount90d`, `favoriteCount`, `rentalViewsLast30Days`, `created`, `updated`
- `recordType: "listing"`, `scrapedAt`

### Output per owner profile (mode = `ownerProfile`)

- `ownerUserId`, `ownerName`, `firstName`, `lastName`, `avatarUrl`, `ownerProfileUrl`, `sourceUrl`
- `isDealer`, `isPro`, `isGuest`, `isOwner`
- `responseRate` (%), `averageResponseTime`, `medianResponseTime`, `ownerScore`
- `ownerReviewsCount`, `reviewsCount`, `yearsOwned`, `yearsRVing`
- `businessName`, `businessDescription`, `businessWebsite`, `description`, `experience`
- `cancelPolicy`, `localeLanguage`, `localeBaseCurrency`, `created`, `social[]`
- `listings[]` — the owner's other rentals: `{listingId, name, vehicleType, pricePerDay, rating, reviewCount, city, state, primaryImageUrl, sourceUrl}`
- `recordType: "ownerProfile"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `browseByRvType` / `byUrl` / `ownerProfile` |
| `searchQuery` | string | `United States` | City, region, or destination (mode=search) |
| `rvType` | string | – | 9-value RV type enum (required for browseByRvType, filter for search) |
| `searchAddress` | string | `United States` | Search area (mode=browseByRvType) |
| `listingUrls` | array | – | Listing URLs or IDs (mode=byUrl) |
| `ownerRefs` | array | – | Owner URLs or IDs (mode=ownerProfile) |
| `country` | string | – | US / CA / UK / AU / EU filter |
| `minPrice` | number | `0` | Minimum nightly price in USD |
| `maxPrice` | number | `0` | Maximum nightly price in USD |
| `minRating` | number | `0` | Minimum average rating (0–5) |
| `containsKeyword` | string | – | Keyword filter on title/make/model/city/owner |
| `sortBy` | string | – | `price_asc` / `price_desc` / `distance_asc` / `distance_desc` / `rating_desc` / `rating_asc` (verified against the search API) |
| `deliveryOnly` | boolean | `false` | Delivery-available listings only |
| `instantBookOnly` | boolean | `false` | Instant-book listings only |
| `petFriendlyOnly` | boolean | `false` | Pet-friendly listings only |
| `startDate` | string | – | Availability start (YYYY-MM-DD) |
| `endDate` | string | – | Availability end (YYYY-MM-DD) |
| `includeReviews` | boolean | `false` | Fetch reviews in byUrl mode |
| `maxItems` | int | `50` | Hard cap (1–1000) |
| `proxyConfiguration` | object | – | Optional proxy, engaged automatically on block |

#### Example: search near Austin, Texas

```json
{
  "mode": "search",
  "searchQuery": "Austin, Texas",
  "minPrice": 100,
  "maxPrice": 300,
  "minRating": 4,
  "maxItems": 20
}
```

#### Example: browse all Class C motorhomes in Canada

```json
{
  "mode": "browseByRvType",
  "rvType": "classC",
  "searchAddress": "Canada",
  "country": "CA",
  "maxItems": 50
}
```

#### Example: pet-friendly travel trailers with delivery

```json
{
  "mode": "search",
  "searchQuery": "United States",
  "rvType": "travelTrailer",
  "petFriendlyOnly": true,
  "deliveryOnly": true,
  "maxItems": 30
}
```

#### Example: fetch a listing by URL (with reviews)

```json
{
  "mode": "byUrl",
  "listingUrls": [
    "https://www.outdoorsy.com/rv-rental/oceanside_ca/2025_overland_tacoma-sr5_464795-listing"
  ],
  "includeReviews": true
}
```

#### Example: scrape an owner profile and their fleet

```json
{
  "mode": "ownerProfile",
  "ownerRefs": ["https://www.outdoorsy.com/users/4589700"]
}
```

### Use cases

- **Travel marketplaces** — build complete RV rental catalogs with pricing and vehicle specs
- **Price intelligence** — track nightly/weekly/monthly rates, discounts, and deposits by region
- **Supply analysis** — study the RV rental fleet: make/model distribution, RV classes, capacities
- **Competitor research** — analyze top-rated owners, response rates, and fleet sizes
- **Trip planning apps** — surface available rentals with photos, amenities, and owner trust signals

### FAQ

**What is the data source?**
Outdoorsy's public website (outdoorsy.com) and its public search API. This actor is not affiliated with or endorsed by Outdoorsy.

**Do I need a proxy?**
No. The actor works without one and only engages a proxy automatically if a request is blocked.

**Are prices in USD?**
Yes — all price fields are in USD (Outdoorsy's default currency for the US site). Set `country` to focus on other markets; prices reflect what the marketplace shows.

**How does the availability window work?**
Set `startDate` and `endDate` (YYYY-MM-DD) to only get listings bookable for that period. Listings without published availability pass through the filter.

**What does `rvType` mean?**
Class A, B, and C motorhomes; camper vans; travel trailers; fifth wheels; toy haulers; pop-up (folding) trailers; and truck campers. On Outdoorsy, camper vans are grouped under Class B.

**Why are some fields missing on some listings?**
Owners publish different amounts of data (some hide mileage policy, some have no reviews yet). Fields that are unavailable are omitted rather than filled with placeholders.

**How fresh is the data?**
Everything is scraped live on every run. Prices, availability, and ratings reflect Outdoorsy at scrape time.

**Why did my run return 0 records?**
The filters may be too restrictive (e.g. a narrow price range plus a high minimum rating in a small city). Try widening the price range or using a larger search area.

**How many listings can one run return?**
Up to `maxItems` (max 1000). The marketplace caps search results near 1000 for a given query, so very broad runs may not cover every listing.

# Actor input Schema

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

What to fetch.

## `searchQuery` (type: `string`):

City, region, or destination — e.g. `Austin, Texas`, `Los Angeles, CA`, `Yosemite National Park`, `United States`. Also accepts a country name.

## `rvType` (type: `string`):

Only emit rentals of this RV type (mode=browseByRvType requires it; mode=search uses it as a filter).

## `searchAddress` (type: `string`):

Geographic area to search within (city, region, or country). Defaults to `United States`.

## `listingUrls` (type: `array`):

Outdoorsy listing page URLs, e.g. `https://www.outdoorsy.com/rv-rental/austin_tx/2021_winnebago_12345-listing` (bare listing IDs also accepted).

## `ownerRefs` (type: `array`):

Outdoorsy owner profile URLs, e.g. `https://www.outdoorsy.com/users/4589700` (bare numeric owner IDs also accepted).

## `country` (type: `string`):

Only emit listings located in this country or region.

## `minPrice` (type: `number`):

Only emit listings with a nightly price at or above this amount in USD.

## `maxPrice` (type: `number`):

Only emit listings with a nightly price at or below this amount in USD.

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

Only emit listings with an average rating at or above this value (0-5).

## `containsKeyword` (type: `string`):

Only emit listings whose title, make, model, city, state, or owner name contains this text (case-insensitive).

## `sortBy` (type: `string`):

Result ordering (mode=search / browseByRvType).

## `deliveryOnly` (type: `boolean`):

Only emit listings whose owner offers delivery.

## `instantBookOnly` (type: `boolean`):

Only emit listings that can be booked instantly.

## `petFriendlyOnly` (type: `boolean`):

Only emit listings that allow pets.

## `startDate` (type: `string`):

Only emit listings available for these dates (YYYY-MM-DD). Requires `endDate`.

## `endDate` (type: `string`):

Only emit listings available for these dates (YYYY-MM-DD). Requires `startDate`.

## `includeReviews` (type: `boolean`):

Fetch recent reviews for each listing fetched by URL (adds up to 10 review records per listing).

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

Hard cap on emitted records.

## `proxyConfiguration` (type: `object`):

Optional proxy. Outdoorsy generally does not require a proxy; if a request is blocked (403/429), the actor automatically retries it through this proxy.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "United States",
  "searchAddress": "United States",
  "listingUrls": [],
  "ownerRefs": [],
  "minRating": 0,
  "sortBy": "",
  "deliveryOnly": false,
  "instantBookOnly": false,
  "petFriendlyOnly": false,
  "includeReviews": false,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `rentals` (type: `string`):

Dataset containing all scraped Outdoorsy RV rentals and owner profiles.

# 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 = {
    "mode": "search",
    "searchQuery": "United States",
    "searchAddress": "United States",
    "listingUrls": [],
    "ownerRefs": [],
    "sortBy": "",
    "deliveryOnly": false,
    "instantBookOnly": false,
    "petFriendlyOnly": false,
    "includeReviews": false,
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/outdoorsy-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 = {
    "mode": "search",
    "searchQuery": "United States",
    "searchAddress": "United States",
    "listingUrls": [],
    "ownerRefs": [],
    "sortBy": "",
    "deliveryOnly": False,
    "instantBookOnly": False,
    "petFriendlyOnly": False,
    "includeReviews": False,
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/outdoorsy-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 '{
  "mode": "search",
  "searchQuery": "United States",
  "searchAddress": "United States",
  "listingUrls": [],
  "ownerRefs": [],
  "sortBy": "",
  "deliveryOnly": false,
  "instantBookOnly": false,
  "petFriendlyOnly": false,
  "includeReviews": false,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call crawlerbros/outdoorsy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/outdoorsy-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/sC1IyOvKAAMtosSpS/builds/sPI7OcMDU1LMJCnc4/openapi.json
