# Airbnb Vrbo Revenue Estimator (`mrdoe/airbnb-vrbo-revenue-estimator`) Actor

Get estimated monthly revenue and occupancy for Airbnb and Vrbo listings, benchmarked against comparable rentals in the same city and bedroom class. One clean row per listing - price, beds, rating, host - plus a per-market price summary. Built for short-term-rental investors.

- **URL**: https://apify.com/mrdoe/airbnb-vrbo-revenue-estimator.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 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

## Airbnb & Vrbo Revenue and Occupancy Estimator

Scrape **Airbnb and Vrbo short-term-rental listings** and get an **estimated monthly revenue** and **estimated occupancy rate** for every one — benchmarked against comparable listings in the same city and bedroom class. No Airbnb or Vrbo account, login, or official API. Built for short-term-rental investors, property managers, and analysts who need a fast read on what a market or a specific property is likely earning.

![Airbnb & Vrbo Revenue and Occupancy Estimator input configuration panel](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/airbnb-vrbo-revenue-estimator--input.png)

### What is the Airbnb & Vrbo Revenue and Occupancy Estimator?

This is an Apify Actor that collects short-term-rental listings from Airbnb and Vrbo and, for each listing, adds an estimated monthly revenue and an estimated occupancy percentage plus a plain-English `occupancyBasis` explaining how each number was reached. Enter a city (e.g. `Austin, TX`) or paste search URLs, and it returns one clean JSON row per listing — normalized price, bedrooms, bathrooms, guest capacity, rating, review count, host type, coordinates, images — along with a per-market summary of median price, revenue, and occupancy. The occupancy figure is a review-volume proxy ranked against same-market comparables, not booked-night data.

### How to estimate Airbnb revenue for a market

1. Open the Actor and enter a **`location`** (e.g. `Nashville, TN`) or add **`startUrls`** (Airbnb or Vrbo search / listing URLs).
2. Optionally set **`checkIn`** / **`checkOut`**, **`guests`**, **`propertyType`**, **`minBedrooms`**, or **`maxPrice`**.
3. Set **`maxItems`** — a higher number gives more comparable listings per market and sharper estimates.
4. Leave **`proxyConfiguration`** on the default (Vrbo runs are upgraded automatically).
5. Click **Start**. Export as JSON, CSV, Excel, or via the dataset API.

### What data can I extract?

| Field | Type | Description |
| --- | --- | --- |
| `site` | string | `airbnb` or `vrbo` |
| `id` | string | Listing ID on its platform |
| `title` | string | Listing headline |
| `propertyType` | string | House, Apartment, Condo, Guesthouse, Villa, etc. |
| `bedrooms` / `bathrooms` / `beds` | number | Room configuration (`0` for studio, `null` if not shown) |
| `maxGuests` | integer | Maximum guest capacity |
| `pricePerNight` | number | Nightly price, normalized from any trip total shown |
| `currency` | string | ISO currency code |
| `priceQualifier` | string | Price context, e.g. `night`, `for 3 nights` |
| `location` / `city` | string | Full location label and the city used for comparison |
| `latitude` / `longitude` | number | Coordinates when published |
| `rating` | number | Overall guest rating |
| `reviewCount` | integer | Total number of reviews |
| `estimatedMonthlyRevenue` | number | `pricePerNight × 30.4 × (estimatedOccupancyPct ÷ 100)` |
| `estimatedOccupancyPct` | number | Estimated occupancy, 20–90, from the comparable-market model |
| `reviewCountVsMarket` | string | `above average` / `about average` / `below average` vs same-market comparables |
| `marketComparableCount` | integer | How many comparable listings the estimate is based on |
| `marketMedianPricePerNight` | number | Median nightly price of the comparable set |
| `occupancyBasis` | string | Plain-English explanation of how the occupancy figure was derived |
| `hostType` | string | `Superhost` / `Host` (Airbnb); `null` where not published |
| `categoryRatings` | object | Sub-ratings (cleanliness, accuracy, check-in, communication, location, value) when available |
| `imageUrls` | array | Public image URLs for the listing |
| `listingUrl` | string | Canonical listing URL |
| `scrapedAt` | string | ISO timestamp of collection |

<details><summary>How the revenue and occupancy estimate works</summary>

1. Listings from the run are grouped by **city + bedroom class** (studio, 1, 2, 3, 4, 5+).
2. For any group with at least **5** listings, each listing's `reviewCount` is ranked against the rest of the group.
3. That percentile is mapped to an occupancy rate along a fixed curve anchored to widely cited short-term-rental norms (roughly: bottom of market ≈ 30%, median ≈ 52%, top performers ≈ 75–85%), clamped to 20–90%.
4. `estimatedMonthlyRevenue = pricePerNight × 30.4 × (estimatedOccupancyPct ÷ 100)`.
5. Groups with fewer than 5 comparables get `null` for both estimates, and `occupancyBasis` explains why — raise `maxItems` or search a broader area to fix it.

This is an **estimate from a demand proxy**, not booking data. Use it to compare listings and markets, not as a guaranteed earnings figure.

</details>

### Input example

```json
{
    "location": "Austin, TX",
    "checkIn": "2026-10-15",
    "checkOut": "2026-10-18",
    "guests": 2,
    "maxItems": 40,
    "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output example

```json
[
    {
        "site": "airbnb",
        "id": "8355807",
        "title": "Guesthouse in Austin",
        "propertyType": "Guesthouse",
        "bedrooms": 1,
        "bathrooms": 1,
        "beds": 1,
        "maxGuests": 2,
        "pricePerNight": 218,
        "currency": "USD",
        "priceQualifier": "for 3 nights",
        "location": "Austin, Texas, United States",
        "city": "Austin",
        "latitude": 30.2521,
        "longitude": -97.75625,
        "rating": 4.9,
        "reviewCount": 221,
        "estimatedMonthlyRevenue": 4440,
        "estimatedOccupancyPct": 67,
        "reviewCountVsMarket": "about average",
        "marketComparableCount": 10,
        "marketMedianPricePerNight": 204.5,
        "occupancyBasis": "Review-volume proxy: this listing's 221 reviews rank at the 78th percentile among 10 comparable 1-bed listings in Austin (market median 183 reviews). Estimate, not booking data.",
        "hostType": "Superhost",
        "categoryRatings": { "cleanliness": 5, "accuracy": 5, "check-in": 5, "communication": 5, "location": 5, "value": 4.9 },
        "imageUrls": ["https://a0.muscache.com/im/pictures/hosting/Hosting-8355807/original/84cbd088-cdc9-408e-8d3f-ac46b4f36f00.jpeg"],
        "listingUrl": "https://www.airbnb.com/rooms/8355807",
        "scrapedAt": "2026-09-04T01:58:47.819Z"
    }
]
```

A `MARKET-SUMMARY` record is also written to the key-value store with median nightly price, median estimated revenue, and median estimated occupancy for each city and bedroom class in the run.

![Airbnb & Vrbo Revenue and Occupancy Estimator sample output dataset](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/airbnb-vrbo-revenue-estimator--output.png)

### What you get vs. a market-data subscription or manual research

| Task | Manually / with a paid subscription | With this Actor |
| --- | --- | --- |
| Read a market's earning potential | Pay for a full market-data platform | One run, one dataset with per-listing estimates |
| Compare Airbnb and Vrbo supply | Two tools, two exports | Both sites in one normalized dataset |
| Benchmark a listing against its competition | Build the comp set by hand | `reviewCountVsMarket` + `marketComparableCount` on every row |
| Track a market's median revenue over time | Manual spreadsheet | Schedule the Actor, diff the `MARKET-SUMMARY` |
| Get the data into Excel / a database | Manual copy-paste | Built-in JSON / CSV / Excel + dataset API |

### How to use it (step by step)

1. **Enter a location or start URLs.** A single, well-known city name groups comparables better than a tiny neighbourhood string.
2. **Set filters** (dates, guests, property type, bedrooms, max price) if you want a narrower scan.
3. **Set `maxItems` to 30–60** for a city scan — more comparables mean tighter estimates.
4. **Run and export** — dataset tab, `MARKET-SUMMARY` from the key-value store, or `GET /v2/datasets/{id}/items`.
5. **Schedule it** weekly or monthly to track how a market moves.

### Pricing

Pay-per-event: a small run-start charge, then a per-listing charge for each row saved (including its estimates). Use **`maxItems`** to scope run size. Exact rates are on the Actor's **Pricing** tab. **\[PRICING TBD]**

### FAQ

**What is the Airbnb & Vrbo Revenue and Occupancy Estimator?** An Apify Actor that collects Airbnb and Vrbo listings and adds a modelled monthly revenue and occupancy estimate for each, benchmarked against comparable listings from the same run.

**How accurate is the revenue estimate?** It is a modelled projection from nightly price and a comparable-benchmarked occupancy proxy, not measured bookings. It is most useful for comparing listings and markets against each other.

**Why is `estimatedOccupancyPct` sometimes `null`?** Neither site publishes a booking calendar, and the estimate needs at least 5 same-city, same-bedroom comparables in the run. Increase `maxItems` or broaden the location.

**Why are some fields `null`?** The Actor never guesses. Shared rooms and hotel-style listings may have no bedroom count or nightly price.

**Do I need an Airbnb or Vrbo account or API key?** No.

**Can I use my own search or a specific listing?** Yes — put Airbnb search / room URLs or Vrbo search / property URLs in `startUrls`. They override `location`.

**Is Vrbo as reliable as Airbnb?** Airbnb is the primary source. Vrbo runs are slower and some come back empty when the site is uncooperative — re-run or use Airbnb.

**Does it download photos?** No — it collects image URLs into `imageUrls`.

**Is scraping Airbnb and Vrbo legal?** The Actor accesses only publicly visible listing data. Listings can include personal data such as host names and photos; you are responsible for handling any personal data in line with applicable privacy law and the sites' terms. Not affiliated with Airbnb or Vrbo.

<details><summary>Advanced input options</summary>

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `location` | string | `Austin, TX` | City, region, or address to search on Airbnb. One of `location` / `startUrls` is needed. |
| `checkIn` / `checkOut` | string (date) | `2026-10-15` / `2026-10-18` | `YYYY-MM-DD`. Narrows to available listings and dates the price. |
| `guests` | integer | `2` | Filter by guest count. |
| `startUrls` | array | — | Airbnb search / room URLs or Vrbo search / property URLs. Overrides `location`. |
| `propertyType` | string | — | Restrict to one type (house, apartment, condo, townhouse, cabin, villa, cottage, loft, guesthouse). |
| `minBedrooms` | integer | — | Keep only listings with at least this many bedrooms. |
| `maxPrice` | integer | — | Keep only listings at or below this nightly price. |
| `maxItems` | integer | `15` | Listings to collect per start URL. |
| `enrichVrboDetails` | boolean | `false` | Also open the first few Vrbo property pages for extra detail. Slower; no effect on Airbnb. |
| `useCache` | boolean | `false` | Reuse an identical search run from the last 12 hours instead of collecting again. |
| `proxyConfiguration` | object (required) | Apify Proxy | Vrbo runs are upgraded to residential automatically. |

**Notes.** Prices are the amounts the sites display — cleaning fees, taxes, and platform service fees are not itemised. The Actor scans up to 8 result pages per start URL. The run log ends with a short self-check (listings collected, how many have price / bedrooms / a revenue estimate).

</details>

### My other travel scrapers on Apify

| Actor | What it does |
| --- | --- |
| [Airbnb Search Scraper](https://apify.com/mrdoe/airbnb) | Listings, prices, and hosts from Airbnb search |
| [Airbnb Room Reviews Scraper](https://apify.com/mrdoe/airbnb-reviews-scraper) | Reviews, ratings, and host replies from Airbnb listings |
| [Booking.com Listings Scraper](https://apify.com/mrdoe/booking-scraper) | Hotel prices, ratings, and room types from Booking.com |
| [Booking.com Review Scraper](https://apify.com/mrdoe/booking-review-scraper) | Guest review text and scores from Booking.com |
| [Expedia Hotel Scraper](https://apify.com/mrdoe/expedia-hotel-scraper) | Hotel listings and per-room rates from Expedia |
| [Expedia Review Scraper](https://apify.com/mrdoe/expedia-review-scraper) | Traveler reviews and sentiment from Expedia |
| [Agoda Hotel Scraper](https://apify.com/mrdoe/agoda-hotel-scraper) | Hotel details and live city pricing from Agoda |
| [Agoda Review Scraper](https://apify.com/mrdoe/agoda-review-scraper) | Guest reviews and stay details from Agoda |
| [Trip.com Hotel Scraper](https://apify.com/mrdoe/trip-com-hotel-scraper) | Hotel prices, ratings, and best room rate from Trip.com |
| [Trip.com Review Scraper](https://apify.com/mrdoe/trip-com-review-scraper) | Guest reviews and stay details from Trip.com |
| [Google Hotels Scraper](https://apify.com/mrdoe/google-hotels-scraper) | Hotel prices, ratings, and coordinates from Google Hotels |
| [TripAdvisor Hotel Scraper](https://apify.com/mrdoe/tripadvisor-hotel-scraper) | Hotel details plus per-OTA room rates from TripAdvisor |
| [TripAdvisor Review Scraper](https://apify.com/mrdoe/tripadvisor-review-scraper) | Full guest reviews and sub-ratings from TripAdvisor |

![Airbnb & Vrbo Revenue and Occupancy Estimator logo](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/airbnb-vrbo-revenue-estimator--logo.png)

***

*Independent tool, not affiliated with or endorsed by Airbnb or Vrbo. Accesses only publicly available data. Report bugs or request features on the Issues tab.*

# Actor input Schema

## `location` (type: `string`):

A city, region or address to search on Airbnb, e.g. "Austin, TX" or "Lisbon, Portugal". Used when no start URLs are provided. For Vrbo, provide a vrbo.com search URL in Start URLs instead.

## `checkIn` (type: `string`):

Optional check-in date (YYYY-MM-DD). Narrows results to listings available for these dates and makes the nightly price reflect that stay.

## `checkOut` (type: `string`):

Optional check-out date (YYYY-MM-DD).

## `guests` (type: `integer`):

Optional number of guests to filter by.

## `startUrls` (type: `array`):

Airbnb search URLs (https://www.airbnb.com/s/...), Airbnb room URLs, or Vrbo search/property URLs (https://www.vrbo.com/search?... or https://www.vrbo.com/1234567). Overrides the Location field. Vrbo runs use a browser and a residential proxy and are slower.

## `propertyType` (type: `string`):

Optional. Restrict to one property type.

## `minBedrooms` (type: `integer`):

Optional. Only keep listings with at least this many bedrooms.

## `maxPrice` (type: `integer`):

Optional. Only keep listings at or below this nightly price (in the site's currency).

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

How many listings to collect per start URL. A larger number gives more comparable listings per market, which sharpens the revenue and occupancy estimates.

## `enrichVrboDetails` (type: `boolean`):

Vrbo runs read each listing from the search results by default (fast). Turn this on to also open the first few property pages for extra detail - slower, and the pages are often rate-limited. No effect on Airbnb.

## `useCache` (type: `boolean`):

Reuse results from an identical search run in the last 12 hours instead of collecting again. Speeds up repeated runs. Disabled by default so each run returns fresh numbers.

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

Proxy settings. Apify Proxy is enabled by default and is enough for Airbnb. Vrbo runs are automatically upgraded to residential proxies.

## Actor input object example

```json
{
  "location": "Austin, TX",
  "checkIn": "2026-10-15",
  "checkOut": "2026-10-18",
  "guests": 2,
  "startUrls": [],
  "maxItems": 15,
  "enrichVrboDetails": false,
  "useCache": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `marketSummary` (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 = {
    "location": "Austin, TX",
    "checkIn": "2026-10-15",
    "checkOut": "2026-10-18",
    "guests": 2,
    "startUrls": [],
    "maxItems": 15,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/airbnb-vrbo-revenue-estimator").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 = {
    "location": "Austin, TX",
    "checkIn": "2026-10-15",
    "checkOut": "2026-10-18",
    "guests": 2,
    "startUrls": [],
    "maxItems": 15,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/airbnb-vrbo-revenue-estimator").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 '{
  "location": "Austin, TX",
  "checkIn": "2026-10-15",
  "checkOut": "2026-10-18",
  "guests": 2,
  "startUrls": [],
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call mrdoe/airbnb-vrbo-revenue-estimator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/airbnb-vrbo-revenue-estimator"
        }
    }
}

```

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/yujdSvCZulEhf3tYI/builds/OdhwLPkSw08WfFOvg/openapi.json
