# Cheapest Airbnb Scraper $0.50/1K - Occupancy, ADR & Revenue (`codetr/airbnb-market-intel`) Actor

The cheapest Airbnb scraper: only $0.50 per 1,000 listings, with 12-month occupancy, ADR, estimated revenue and an investment score included.

- **URL**: https://apify.com/codetr/airbnb-market-intel.md
- **Developed by:** [Yusuf Barış](https://apify.com/codetr) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Airbnb Market Intel Scraper do?

💸 **The cheapest Airbnb scraper on the Store: only $0.50 per 1,000 listings – occupancy, ADR and revenue estimates included.**

**Airbnb Market Intel Scraper** extracts listings from [Airbnb](https://www.airbnb.com) and turns them into **investment-ready market data**: for every listing you get price, rating and location **plus** a 12-month availability analysis with **occupancy rate, ADR, estimated monthly and annual revenue, price position vs. the local market and an investment score**. Think of it as an **AirDNA alternative** you can run on demand through the Apify API, at a fraction of the price.

It does not log in, does not book anything and does not collect guest or host personal data. It is fast and very cheap to run.

### Why use Airbnb Market Intel Scraper?

Most Airbnb scrapers return a flat list of titles and prices. Investors, property managers and analysts need to know **how well a listing performs**, not only what it costs. This Actor gives you that in one run:

- 📊 **Occupancy & seasonality** – booked/blocked share of the next 12 months, month by month.
- 💰 **Revenue estimates** – monthly and yearly revenue per listing from occupancy × ADR.
- 🏙️ **Market context** – every listing is compared with the median price of its area (`below_market` / `at_market` / `above_market`).
- ⭐ **Investment score (0–100)** – one number that combines demand, rating, review volume and price fit.
- 🔌 **Apify platform features** – schedule runs, call it via API, export to JSON/CSV/Excel, plug into Make, Zapier, Google Sheets or webhooks, monitor runs and get alerts.
- 🛡️ **Reliable runs** – automatic retries and proxy handling are built in.

**Use cases:** short-term rental investment research, market sizing for a city or neighbourhood, pricing benchmarks for hosts and property managers, competitor monitoring, real-estate and tourism dashboards.

### What data can Airbnb Market Intel Scraper extract?

| Field | Type | Description |
| --- | --- | --- |
| `id`, `url`, `name` | string | Listing identity and link |
| `propertyType`, `isHotel` | string / boolean | e.g. "Apartment in Lisbon"; hotel room types are flagged |
| `rating`, `reviewsCount` | number | Guest rating and number of reviews |
| `latitude`, `longitude` | number | Coordinates |
| `adr` | number | Nightly rate of the sample stay, in your chosen currency |
| `occupancyRate` | number | Share of unavailable nights over the analysed period (0–1) |
| `monthlyOccupancy` | object | Occupancy per month, e.g. `{"2026-12": 0.16}` |
| `estimatedMonthlyRevenue`, `estimatedAnnualRevenue` | number | `occupancy × ADR × 30` and `× 365` |
| `avgMinNights` | number | Average minimum-stay rule in the calendar |
| `marketMedianPrice`, `pricePositionVsMarketPct`, `pricePositionLabel` | number / string | Price vs. the median of the collected listings for the same search |
| `investmentScore` | number | 0–100 heuristic: demand 45 · rating 25 · reviews 15 · price fit 15 |
| `photos`, `badges`, `sampleCheckIn`, `sampleCheckOut` | array / string | Pictures (first 5), badges and the stay the price was read for |

#### How are the numbers calculated?

- **Occupancy is an upper bound.** Airbnb's public calendar shows whether a night is *available*, not *why* it is not. Unavailable nights are bookings **plus** nights blocked by the host. Far-future months also look emptier than they will end up, because most guests book late.
- **ADR is the asking rate of a sample stay** read from the search results (discounts included). Airbnb no longer publishes per-night prices in its calendar. To compare seasons, run the Actor with different check-in/check-out dates.
- **Revenue estimates and the investment score are heuristics**, not guarantees or financial advice.

### How to scrape Airbnb listings

1. Click **Try for free** / **Start** on the Actor page.
2. Enter one or more **Locations** (for example `Lisbon, Portugal`) or paste your own **Airbnb search URLs** with filters already applied.
3. Set **Max listings per location** and, if you like, a **sample check-in/check-out date** and **currency**.
4. Leave **Include calendar analytics** on to get occupancy and revenue estimates.
5. Click **Start** and wait for the run to finish.
6. Open the **Output** tab and download the dataset as JSON, CSV or Excel – or fetch it from the API.

### How much will it cost to scrape Airbnb?

The Actor uses **pay-per-event pricing: you pay for each listing returned, calendar analytics included**. The price is deliberately set far below typical Airbnb scrapers:

| Listings | Approx. cost |
| --- | --- |
| 1,000 | **$0.50** |
| 10,000 | **$5.00** |
| 100,000 | **$50.00** |

That means the monthly free credits of an Apify free plan cover thousands of listings. There are no extra charges for the calendar analytics.

### Input

See the **Input** tab for all options. The main fields are:

- **Locations** and **Airbnb search URLs** – what to scrape. Large runs of several hundred listings are supported.
- **Max listings per location** – hard cap per location.
- **Calendar months** – 1 to 12 months of availability to analyse.
- **Sample check-in / check-out, adults, currency** – define the stay used to read the nightly price.
- **Proxy configuration** – the default settings work for most runs.

Example input:

```json
{
    "locations": ["Lisbon, Portugal"],
    "maxListingsPerLocation": 100,
    "currency": "EUR",
    "checkIn": "2027-03-10",
    "checkOut": "2027-03-14"
}
```

### Output

You can download the dataset extracted by Airbnb Market Intel Scraper in various formats such as JSON, HTML, CSV, or Excel. Example item:

```json
{
    "id": "1765879455249604033",
    "url": "https://www.airbnb.com/rooms/1765879455249604033",
    "name": "Perfect Stay Avenida 5",
    "propertyType": "Apartment in Lisbon",
    "isHotel": false,
    "rating": 5.0,
    "reviewsCount": 3,
    "latitude": 38.73869,
    "longitude": -9.14764,
    "adr": 145.97,
    "currency": "USD",
    "occupancyRate": 0.1303,
    "monthlyOccupancy": { "2026-10": 0.8421, "2026-11": 0.5667, "2026-12": 0.1613 },
    "avgMinNights": 2.0,
    "estimatedMonthlyRevenue": 570.6,
    "estimatedAnnualRevenue": 6942.26,
    "marketMedianPrice": 266.5,
    "pricePositionVsMarketPct": -45.2,
    "pricePositionLabel": "below_market",
    "investmentScore": 51
}
```

### Tips

- Filter out `isHotel: true` for private-rental investment analysis – hotel calendars work per room type.
- Use the same check-in/check-out window across cities to get comparable ADR values.
- Schedule the Actor weekly to track how occupancy and prices of a market change over time.
- Keep **Max concurrency** at the default for the most stable runs.

### FAQ, disclaimers, and support

#### Is it legal to scrape Airbnb?

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers. You are also responsible for complying with Airbnb's terms of service.

#### Does it work with any city?

Yes – anything you can search on airbnb.com, either by location name or by pasting a search URL.

#### The calendar data is missing or looks wrong

Open an issue in the **Issues** tab with a link to your run and we will look into it.

#### Where can I get help or request features?

Use the **Issues** tab of this Actor. For programmatic access see the **API** tab – you can start runs and fetch datasets from any language, or integrate the Actor with Make, Zapier, n8n and Google Sheets.

# Actor input Schema

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

Places to analyse, e.g. "Lisbon, Portugal". One search is run per location.

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

Optional full Airbnb search result URLs (https://www.airbnb.com/s/...). Filters in the URL are kept.

## `maxListingsPerLocation` (type: `integer`):

Maximum number of listings collected per location / search URL.

## `includeCalendar` (type: `boolean`):

Fetch the availability calendar and compute occupancy, estimated revenue and investment score.

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

How many months ahead (starting this month) to analyse.

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

Optional YYYY-MM-DD. Together with check-out it defines the stay used to read the nightly price (ADR). Leave empty for Airbnb's default sample stay.

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

Optional YYYY-MM-DD, must be after check-in.

## `adults` (type: `integer`):

Number of adult guests used for the price sample.

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

ISO currency code for all prices (e.g. USD, EUR, TRY).

## `locale` (type: `string`):

Site language. Keep "en" for best results.

## `priceBands` (type: `array`):

Advanced. Optional list of \[min, max] nightly price bands (in the selected currency, null = open end) to control how large searches are sampled. Leave empty unless you know you need it.

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

Parallel HTTP requests.

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

Proxy settings. The defaults work for most runs.

## `escalateToResidential` (type: `boolean`):

Automatically retry blocked requests through residential proxies (billed per GB by Apify).

## `residentialCountry` (type: `string`):

Optional two-letter country code for residential proxies, e.g. US.

## `calendarQueryHash` (type: `string`):

Advanced. Leave empty unless support asks you to set it.

## Actor input object example

```json
{
  "locations": [
    "Lisbon, Portugal"
  ],
  "maxListingsPerLocation": 50,
  "includeCalendar": true,
  "calendarMonths": 12,
  "adults": 2,
  "currency": "USD",
  "locale": "en",
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "escalateToResidential": true
}
```

# 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 = {
    "locations": [
        "Lisbon, Portugal"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("codetr/airbnb-market-intel").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": ["Lisbon, Portugal"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("codetr/airbnb-market-intel").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": [
    "Lisbon, Portugal"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call codetr/airbnb-market-intel --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,codetr/airbnb-market-intel"
        }
    }
}
```

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/tdQ5authNiOWnJzsa/builds/RwAQeXnRW1yq0vk5c/openapi.json
