# AirDNA Scraper: STR Market Revenue, Occupancy, ADR & YoY Trends (`getascraper/airdna-market-data-scraper`) Actor

Extract AirDNA's public short-term-rental market data: active listings, annual revenue, occupancy, ADR, RevPAR, and real year-over-year revenue and occupancy trend deltas. No AirDNA account, password, or API key required. Monitor mode flags NEW, UPDATED, and CURRENT markets. $0.0025/market.

- **URL**: https://apify.com/getascraper/airdna-market-data-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Travel, Real estate
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.87 / 1,000 market records

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

## AirDNA Scraper: STR Market Revenue, Occupancy, ADR & YoY Trends

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#EAF6F6;border:1px solid #C7E6E6;border-top:4px solid #0E7C86;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Need AirDNA's market numbers without handing over your AirDNA login?</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Get active listings, annual revenue, occupancy, average daily rate, RevPAR, and real year-over-year trends for any short-term-rental market, straight from AirDNA's public data. No AirDNA account, no password, nothing to set up.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7E6E6;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0B646C">🔓 No AirDNA login</span><br>
<span style="font-size:12px;color:#57534E">Pull market data without ever creating an AirDNA account or handing over a password.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7E6E6;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0B646C">📈 Real YoY trends</span><br>
<span style="font-size:12px;color:#57534E">Revenue and occupancy trend deltas built into every row, not a single flat snapshot.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7E6E6;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0B646C">🔔 Monitor mode</span><br>
<span style="font-size:12px;color:#57534E">Tags every market NEW, UPDATED, or CURRENT, so a scheduled run flags only what moved.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7E6E6;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0B646C">🗺️ Two ways in</span><br>
<span style="font-size:12px;color:#57534E">Paste specific market URLs, or let the actor discover markets by country, state, and city.</span>
</td>
</tr>
</table>

### 🔍 What does AirDNA Market Data Scraper do?

This actor reads AirDNA's public short-term-rental market pages and turns them into a clean
dataset: active listings, annual revenue, occupancy rate, average daily rate, RevPAR, and how
each of those numbers moved from last year. Point it at one city or hundreds, and get back
structured rows ready for a spreadsheet, a dashboard, or a client report.

Unlike a tool that asks for your own AirDNA email and password to pull this data, this actor
never asks for AirDNA credentials of any kind. It reads the same market pages AirDNA publishes
for anyone to see.

### 👤 Who is this for?

- **I am a real estate investor** comparing short-term-rental markets across several cities to
  find the best revenue-per-listing opportunity before I buy a property.
- **I am a short-term-rental host or property manager** tracking my own market's occupancy and
  average daily rate month to month, so I know when to adjust pricing.
- **I am a market analyst or content creator** building short-term-rental market reports and
  needing fresh revenue, occupancy, and RevPAR figures for many cities at once.

### 🚀 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#EAF6F6;border:1px solid #C7E6E6;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0E7C86;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Add your markets</span><br>
<span style="font-size:12px;color:#57534E">Paste AirDNA market URLs, or set country, state, and city filters instead.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EAF6F6;border:1px solid #C7E6E6;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0E7C86;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run the actor</span><br>
<span style="font-size:12px;color:#57534E">It reads AirDNA's public market pages directly. No account or login needed.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EAF6F6;border:1px solid #C7E6E6;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0E7C86;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Get your data</span><br>
<span style="font-size:12px;color:#57534E">Download active listings, revenue, occupancy, ADR, RevPAR, and YoY trends as JSON, CSV, or Excel.</span>
</td>
</tr>
</table>

### 📋 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `marketUrls` | array of URLs | No | Direct AirDNA market overview URLs. The cheapest, most reliable way in since it skips discovery entirely. Defaults to one example market; clear it to use the filters below instead. |
| `countries` | array of strings | No | Country slugs to browse for markets when `marketUrls` is empty, for example `us`. Leave empty to skip country-level discovery. |
| `states` | array of strings | No | State or region slugs to narrow discovery within the selected countries, for example `california`. Leave empty to include every state found. |
| `cities` | array of strings | No | City slugs to narrow discovery within the selected states, for example `los-angeles`. Leave empty to include every city found. |
| `proxyConfiguration` | object | No | Proxy settings for reaching AirDNA. The default works out of the box; only change it if you see repeated failures. |
| `maxItems` | integer | No | Maximum number of markets to scrape in this run. Defaults to 12, since each market is a full page load. |
| `incrementalMonitorMode` | boolean | No | Turns on change tracking. Each market's core metrics are compared to the previous run and tagged NEW, UPDATED, or CURRENT. Defaults to false. |
| `monitorStateName` | string | No | Name of the stored state used by monitor mode. Use different names to run multiple independent monitors without their history overwriting each other. Defaults to `default`. |

### 📊 Data table

| Field | Type | Description |
| --- | --- | --- |
| `marketName` | string | Display name of the market, for example "Los Angeles, California". |
| `country` | string | Country slug the market belongs to. |
| `state` | string | State or region slug the market belongs to. |
| `city` | string | City slug the market belongs to. |
| `activeListings` | number | Number of active short-term-rental listings in the market. |
| `annualRevenue` | number | Average annual revenue per listing, in US dollars. |
| `occupancyPct` | number | Average occupancy rate, as a percentage. |
| `averageDailyRate` | number | Average daily rate, in US dollars. |
| `revpar` | number | Revenue per available rental, in US dollars. |
| `revenueYoYPct` | number | Year-over-year change in average revenue per listing, as a percentage. Only present when AirDNA has published trailing-year data for this market. |
| `occupancyYoYPct` | number | Year-over-year change in occupancy, as a percentage. Only present when AirDNA has published trailing-year data for this market. |
| `temporalCoverage` | string | Date range the published figures cover. |
| `dateModified` | string | Date AirDNA last updated this market's figures. |
| `sourceUrl` | string | The AirDNA market page this row came from. |
| `scrapedAt` | string | Timestamp this row was scraped. |
| `changeType` | string | `NEW`, `UPDATED`, or `CURRENT`. Only present when monitor mode is on. |

```json
{
    "marketName": "Los Angeles, California",
    "country": "us",
    "state": "california",
    "city": "los-angeles",
    "activeListings": 30561,
    "annualRevenue": 48700,
    "occupancyPct": 68,
    "averageDailyRate": 220,
    "revpar": 149,
    "revenueYoYPct": 173.2,
    "occupancyYoYPct": 25.4,
    "temporalCoverage": "2025-09-01/2026-08-31",
    "dateModified": "2026-09-08",
    "sourceUrl": "https://www.airdna.co/vacation-rental-data/app/us/california/los-angeles/overview",
    "scrapedAt": "2026-09-10T04:26:29.845Z"
}
```

### 💰 Pricing

Pricing is pay per result and is billed per market row successfully saved to your dataset. Empty
runs cost nothing. There are no fixed monthly subscriptions or hidden fees.

### ⭐ Enjoying AirDNA Market Data Scraper?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#EAF6F6;border:1px solid #C7E6E6;border-left:5px solid #0E7C86;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">If this saved you from an AirDNA login just to see market numbers, that's worth a rating.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other real estate investors and STR hosts find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#0E7C86;border:1px solid #C7E6E6;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/airdna-market-data-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

##### Does this need my AirDNA account?

No. This actor never asks for an AirDNA email, password, or API key. It reads AirDNA's public
market pages directly, the same pages AirDNA marks as free to view for anyone.

##### How fresh is the market data?

Each row includes `dateModified` and `temporalCoverage`, the exact dates AirDNA itself attaches
to that market's figures. AirDNA republishes these numbers on a monthly cadence, so scheduling
this actor with monitor mode on will pick up real month-over-month changes.

##### Which markets are covered?

Any market AirDNA publishes a public overview page for, across the countries, states, and cities
it tracks. Paste specific market URLs for guaranteed coverage, or use the country, state, and
city filters to discover markets automatically.

##### Does monitor mode cost extra?

No. Monitor mode is a free input toggle. It tags each row NEW, UPDATED, or CURRENT by comparing
this run's numbers to the last one, so you only need to look at what actually changed.

### 🔗 Other actors

- [Landflip Scraper: US Land Listings & Broker Leads](https://apify.com/getascraper/landflip-scraper) ↗ - Track US land listings and broker contact details for land investors.
- [Choice Hotels Scraper: Room Rates, Reviews & Rate-Drop Alerts](https://apify.com/getascraper/choice-hotels-scraper) ↗ - Monitor hotel room rates and reviews with rate-drop alerts.
- [CommercialRealEstate.com.au scraper: prices, agents, and deal status ready for your spreadsheet](https://apify.com/getascraper/commercialrealestate-au-scraper) ↗ - Pull commercial property listings, prices, and agent details from Australia.
- [CIAN Real Estate Scraper: Недвижимость ЦИАН](https://apify.com/getascraper/cian-real-estate-scraper) ↗ - Extract Russian real estate listings with prices and property details.
- [Ostrovok Hotels Scraper: Отели Островок](https://apify.com/getascraper/ostrovok-hotels-scraper) ↗ - Get hotel listings, prices, and availability from Ostrovok.

# Actor input Schema

## `marketUrls` (type: `array`):

Direct AirDNA market overview page URLs, e.g. https://www.airdna.co/vacation-rental-data/app/us/california/los-angeles/overview. This is the cheapest and most reliable path since it skips browse-index discovery entirely, and it reads AirDNA's public market data with no AirDNA account or login required. Leave empty to discover markets instead using the filters below.

## `countries` (type: `array`):

Country slugs to browse for markets when Market Overview URLs is empty, e.g. "us". Matches AirDNA's own URL slugs (https://www.airdna.co/vacation-rental-data/app/{country}). Leave empty to skip country-level discovery.

## `states` (type: `array`):

State or region slugs to filter discovery within the selected countries, e.g. "california". Matches AirDNA's own URL slugs. Leave empty to include every state found for each selected country.

## `cities` (type: `array`):

City slugs to filter discovery within the selected states, e.g. "los-angeles". Matches AirDNA's own URL slugs. Leave empty to include every city found for each selected state.

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

AirDNA sits behind a Cloudflare managed challenge that a real browser clears immediately, so Apify's standard datacenter proxy is enough and is kept as the default here to hold costs down. If runs start failing, switch this to the RESIDENTIAL group in the picker as a fallback, no other change is needed.

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

Maximum number of market pages to scrape in this run. Each market is a full browser page load, so keep this modest for a quick run; raise it once you know how long your own market list takes.

## `incrementalMonitorMode` (type: `boolean`):

When enabled, each market's core metrics (active listings, annual revenue, occupancy, average daily rate, RevPAR) are fingerprinted and compared against the previous run, and every item is tagged NEW, UPDATED, or CURRENT. AirDNA republishes market numbers on a monthly cadence, so scheduling this actor with monitor mode on surfaces genuine month-over-month revenue and occupancy changes instead of a one-off snapshot.

## `monitorStateName` (type: `string`):

Name of the stored state bucket used by Monitor Mode. Use different names to run multiple independent monitors (for example, one per market portfolio) without their stored fingerprints overwriting each other. Ignored when Monitor Mode is off.

## Actor input object example

```json
{
  "marketUrls": [
    {
      "url": "https://www.airdna.co/vacation-rental-data/app/us/california/los-angeles/overview"
    }
  ],
  "countries": [],
  "states": [],
  "cities": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxItems": 12,
  "incrementalMonitorMode": false,
  "monitorStateName": "default"
}
```

# Actor output Schema

## `results` (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 = {
    "marketUrls": [
        {
            "url": "https://www.airdna.co/vacation-rental-data/app/us/california/los-angeles/overview"
        }
    ],
    "countries": [],
    "states": [],
    "cities": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "maxItems": 12,
    "incrementalMonitorMode": false,
    "monitorStateName": "default"
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/airdna-market-data-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 = {
    "marketUrls": [{ "url": "https://www.airdna.co/vacation-rental-data/app/us/california/los-angeles/overview" }],
    "countries": [],
    "states": [],
    "cities": [],
    "proxyConfiguration": { "useApifyProxy": True },
    "maxItems": 12,
    "incrementalMonitorMode": False,
    "monitorStateName": "default",
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/airdna-market-data-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 '{
  "marketUrls": [
    {
      "url": "https://www.airdna.co/vacation-rental-data/app/us/california/los-angeles/overview"
    }
  ],
  "countries": [],
  "states": [],
  "cities": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxItems": 12,
  "incrementalMonitorMode": false,
  "monitorStateName": "default"
}' |
apify call getascraper/airdna-market-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/airdna-market-data-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/AoeSh7XxpaB1J2H5C/builds/pIFdaokGs90jp8osa/openapi.json
