# Airbnb Revenue, Occupancy & ROI Analyzer | $5/1K (`apivault_labs/airbnb-revenue-occupancy-roi-analyzer`) Actor

Analyze Airbnb listings or discover market comparables, then estimate weekly, monthly and annual revenue, occupancy, ADR, RevPAR, NOI, cap rate, cash-on-cash ROI and opportunity ranking.

- **URL**: https://apify.com/apivault\_labs/airbnb-revenue-occupancy-roi-analyzer.md
- **Developed by:** [Apivault Labs](https://apify.com/apivault_labs) (community)
- **Categories:** Real estate, Travel, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 property analyses

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/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 Revenue, Occupancy & ROI Analyzer

![Airbnb revenue, occupancy and ROI analytics](https://api.apify.com/v2/key-value-stores/u4YZtIlXXYEybGzl4/records/airbnb-revenue-analyzer-hero-v1.png)

Turn public Airbnb forward-calendar signals and your investment assumptions into a property-level short-term-rental underwriting report. Analyze supplied listings or discover comparable properties for a city or neighborhood, then estimate occupancy, ADR, RevPAR, revenue, expenses, NOI, cap rate, cash-on-cash return, annual cash flow, payback and break-even occupancy — without an Airbnb login.

### Two analysis modes

- **`listing`** — analyze specific Airbnb listing URLs or room IDs. Duplicate targets are removed before any network work or billing.
- **`market`** — enter `searchLocation` such as `Austin, Texas`; the Actor discovers public comparable listings, analyzes their calendars and returns market medians plus a ranked opportunity list in `SUMMARY`.

### What you get

One clean analysis row per successful Airbnb listing:

- Forward available and blocked nights for 1–12 months
- Blocked-night rate and an adjustable occupancy estimate
- Average daily rate (ADR) from published forward prices or your override
- RevPAR and estimated annual booked nights
- Low, base and high annual gross-revenue scenarios
- Week-by-week and month-by-month occupancy and revenue projections
- Conservative, base and optimistic sensitivity scenarios for ADR, occupancy, NOI and ROI
- Optional changes versus previous snapshots with monitoring alerts
- Optional separate weekly/monthly Dataset rows for CSV and spreadsheet workflows
- Portfolio and comparable-market medians in the `SUMMARY` record
- Operating expenses and net operating income (NOI)
- Cap rate, cash-on-cash return and annual cash flow
- Break-even occupancy and estimated payback period
- Confidence score, methodology and explicit warnings

### Why the occupancy adjustment matters

An unavailable Airbnb calendar date is not automatically a guest booking. It may be booked, blocked by the host, reserved for maintenance or unavailable because of another restriction.

This Actor reports the public `blockedNightRatePercent` separately and applies your `bookingShareOfBlockedPercent` assumption to estimate occupancy. The default assumes that 75% of blocked nights represent bookings. Change it to match your market knowledge and run conservative, base and optimistic scenarios.

### Example input

```json
{
  "mode": "listing",
  "listingUrls": [
    "https://www.airbnb.com/rooms/910250"
  ],
  "calendarMonths": 12,
  "currency": "USD",
  "bookingShareOfBlockedPercent": 75,
  "averageStayNights": 3,
  "platformFeePercent": 3,
  "managementFeePercent": 15,
  "maintenancePercent": 5,
  "utilitiesMonthly": 300,
  "insuranceAnnual": 1500,
  "propertyTaxAnnual": 6000,
  "mortgageMonthly": 2500,
  "purchasePrice": 500000,
  "downPaymentPercent": 20,
  "closingCosts": 10000,
  "furnishingCosts": 20000
}
```

Market example:

```json
{
  "mode": "market",
  "searchLocation": "Austin, Texas",
  "maxComparableListings": 10,
  "searchBedrooms": 1,
  "searchGuests": 2,
  "calendarMonths": 6,
  "currency": "USD"
}
```

### Revenue methodology

The model is transparent and adjustable:

1. Public forward calendar dates are separated into available and blocked nights.
2. Estimated booked nights = blocked nights × your booking-share assumption.
3. ADR priority is: your `nightlyRateOverride`, published calendar price, a live public booking quote, then a public market-search price.
4. Gross revenue = estimated booked nights × ADR + optional cleaning-fee revenue.
5. `weeklyProjections` groups observed dates into ISO Monday–Sunday weeks; boundary weeks can contain fewer than seven observed days.
6. When fewer than 12 months are analyzed, the selected window is annualized. The output warns that a short window may not capture full seasonality.
7. Conservative and optimistic scenarios vary booking share by 15 percentage points and ADR by 10%.

These are directional investment estimates, not Airbnb host payout data or verified reservations.

### ROI methodology

- **NOI** = gross revenue − operating expenses, before mortgage debt service.
- **Cap rate** = NOI ÷ purchase price.
- **Cash investment** = down payment + closing costs + furnishing/startup costs.
- **Annual cash flow** = NOI − annual mortgage payments.
- **Cash-on-cash return** = annual cash flow ÷ cash investment.
- **Break-even occupancy** covers fixed operating expenses and debt service after variable costs.

Set any expense to zero when it does not apply. Explicit zero values are preserved.

### Inputs that materially affect the result

| Input | Effect |
|---|---|
| `calendarMonths` | Longer windows improve seasonality coverage |
| `nightlyRateOverride` | Replaces published forward-calendar ADR |
| `bookingShareOfBlockedPercent` | Converts blocked nights into modeled booked nights |
| `averageStayNights` | Controls estimated reservation count and cleaning economics |
| Operating expenses | Affect NOI, cap rate and break-even occupancy |
| Purchase and financing inputs | Enable acquisition returns and cash flow |

### Portfolio, CSV and monitoring output

`SUMMARY` includes median occupancy, ADR, annual revenue and NOI across all delivered properties. Market mode also includes up to ten `topOpportunities`; the transparent score combines estimated occupancy (45%), confidence (25%) and revenue relative to the strongest analyzed comparable (30%).

Set `emitProjectionRows: true` to append `weekly_projection` and `monthly_projection` rows after each main `property_analysis` row. Projection rows are not separate billable property events.

To compare a new run with an older export, pass selected prior results through `previousSnapshots`. Matching listings receive `changesSincePrevious` with occupancy-point, ADR and annual-revenue deltas plus alerts for declines of at least 10% or 10 percentage points.

### Reliability and billing safeguards

- Inputs are validated before network work starts.
- Duplicate listing IDs are removed before requests and charging.
- Each listing has bounded retries and the complete run has a hard deadline.
- Results are delivered progressively.
- A failed, removed or unavailable listing is written to `FAILED_INPUTS` and is not charged as a successful property analysis.
- Pay-per-result charging occurs only after an analysis is delivered to the Dataset.
- Residential proxy is recommended for public Airbnb calendar access.

### Pricing

Pay per successfully delivered property analysis, from **$5 per 1,000 results** on paid Apify plans. Platform compute, storage and proxy traffic are paid by the run owner.

### Responsible use

This Actor uses public listing signals and is not affiliated with or endorsed by Airbnb. Use it for lawful research and underwriting, respect applicable laws and platform terms, and independently verify financial assumptions before purchasing or operating a property.

# Actor input Schema

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

Analyze supplied listing URLs or discover and rank comparable listings for a location.

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

Public Airbnb room links or numeric listing IDs. One analysis row is returned per successful listing.

## `searchLocation` (type: `string`):

City, neighborhood or destination used to discover public comparable listings in market mode.

## `maxComparableListings` (type: `integer`):

Number of discovered properties to analyze and rank in market mode.

## `searchBedrooms` (type: `integer`):

Optional minimum bedroom filter for market comparable discovery. Use 0 for any.

## `searchGuests` (type: `integer`):

Optional guest-count filter for market comparable discovery. Use 0 for Airbnb defaults.

## `calendarMonths` (type: `integer`):

Analyze 1–12 months of forward availability. Longer windows improve seasonality coverage.

## `currency` (type: `string`):

Three-letter currency requested for published Airbnb prices and used for your financial assumptions.

## `nightlyRateOverride` (type: `number`):

Optional ADR assumption. Set 0 to use published forward calendar prices.

## `bookingShareOfBlockedPercent` (type: `number`):

Blocked nights may also be owner blocks or maintenance. This assumption converts the public blocked-night rate into estimated occupancy.

## `averageStayNights` (type: `number`):

Average booked nights per reservation, used for cleaning revenue and cost modeling.

## `cleaningFeeRevenuePerStay` (type: `number`):

Cleaning fee revenue collected from the guest for each estimated reservation.

## `cleaningCostPerStay` (type: `number`):

Your cleaning expense for each estimated reservation.

## `platformFeePercent` (type: `number`):

Estimated booking-platform fee as a percentage of gross revenue.

## `managementFeePercent` (type: `number`):

Property-management cost as a percentage of gross revenue.

## `maintenancePercent` (type: `number`):

Maintenance and replacement reserve as a percentage of gross revenue.

## `utilitiesMonthly` (type: `number`):

Average monthly utilities paid by the property owner.

## `insuranceAnnual` (type: `number`):

Annual insurance cost for the property.

## `propertyTaxAnnual` (type: `number`):

Annual property-tax expense.

## `hoaMonthly` (type: `number`):

Monthly homeowners-association or building fee.

## `mortgageMonthly` (type: `number`):

Debt service is excluded from NOI and included in annual cash flow and cash-on-cash return.

## `purchasePrice` (type: `number`):

Required for cap rate and acquisition return metrics. Set 0 for operations-only analysis.

## `downPaymentPercent` (type: `number`):

Down payment as a percentage of purchase price, used to calculate cash invested.

## `closingCosts` (type: `number`):

One-time acquisition closing costs included in cash invested.

## `furnishingCosts` (type: `number`):

One-time furnishing and launch costs included in cash invested.

## `emitProjectionRows` (type: `boolean`):

Also emit each weekly and monthly projection as a separate uncharged Dataset row for CSV and spreadsheet workflows.

## `previousSnapshots` (type: `array`):

Optional prior property metrics used to calculate occupancy, ADR and annual-revenue changes and monitoring alerts.

## `maxConcurrency` (type: `integer`):

Parallel property analyses. The default balances speed and upstream reliability.

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

Residential proxy is recommended for public Airbnb availability.

## Actor input object example

```json
{
  "mode": "listing",
  "listingUrls": [
    "https://www.airbnb.com/rooms/910250"
  ],
  "searchLocation": "Austin, Texas",
  "maxComparableListings": 10,
  "searchBedrooms": 0,
  "searchGuests": 0,
  "calendarMonths": 2,
  "currency": "USD",
  "nightlyRateOverride": 200,
  "bookingShareOfBlockedPercent": 75,
  "averageStayNights": 3,
  "cleaningFeeRevenuePerStay": 0,
  "cleaningCostPerStay": 0,
  "platformFeePercent": 3,
  "managementFeePercent": 15,
  "maintenancePercent": 5,
  "utilitiesMonthly": 300,
  "insuranceAnnual": 1500,
  "propertyTaxAnnual": 0,
  "hoaMonthly": 0,
  "mortgageMonthly": 0,
  "purchasePrice": 0,
  "downPaymentPercent": 20,
  "closingCosts": 0,
  "furnishingCosts": 0,
  "emitProjectionRows": false,
  "previousSnapshots": [],
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "countryCode": "US"
  }
}
```

# Actor output Schema

## `propertyAnalyses` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `failedInputs` (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 = {
    "listingUrls": [
        "https://www.airbnb.com/rooms/910250"
    ],
    "searchLocation": "Austin, Texas",
    "calendarMonths": 2,
    "currency": "USD",
    "nightlyRateOverride": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("apivault_labs/airbnb-revenue-occupancy-roi-analyzer").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 = {
    "listingUrls": ["https://www.airbnb.com/rooms/910250"],
    "searchLocation": "Austin, Texas",
    "calendarMonths": 2,
    "currency": "USD",
    "nightlyRateOverride": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("apivault_labs/airbnb-revenue-occupancy-roi-analyzer").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 '{
  "listingUrls": [
    "https://www.airbnb.com/rooms/910250"
  ],
  "searchLocation": "Austin, Texas",
  "calendarMonths": 2,
  "currency": "USD",
  "nightlyRateOverride": 200
}' |
apify call apivault_labs/airbnb-revenue-occupancy-roi-analyzer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apivault_labs/airbnb-revenue-occupancy-roi-analyzer"
        }
    }
}

```

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/wVemIrVEggLe7FC7j/builds/Td7wC0ToJQYpW58bW/openapi.json
