# Airbnb Scraper & API: Every Listing, Rates and Occupancy (`brainfoods_studio/airbnb-market-scraper`) Actor

Every listing in a city, nightly rates and occupancy for hosts and investors. No login required. Pay per listing delivered.

- **URL**: https://apify.com/brainfoods_studio/airbnb-market-scraper.md
- **Developed by:** [Brainfoods Studio](https://apify.com/brainfoods_studio) (community)
- **Categories:** Real estate, Travel, E-commerce
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.60 / 1,000 listings

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

## Airbnb Market Scraper

> **Yes, we're late to the party.** The Store already has Airbnb scrapers. We built one more for a simple reason: when you want to know about a city's short-let market, the usual scrapers cap out at 240 listings per search and leave you guessing about the rest. This one keeps searching until the whole area is covered, gives you complete market inventory, and measures forward occupancy across upcoming windows.

**Airbnb Market Scraper** gives you **every listing in a whole city or neighbourhood** from Airbnb: listing ID, name, property type, bedrooms, bathrooms, ratings, reviews, nightly rates, total prices, and coordinates. For hosts and investors, it measures **forward occupancy ("booked or blocked" share)** across future dates and produces a full **market report** with rate percentiles and top zones.

**No login · No Airbnb account · From $0.60 per 1,000 listings · Complete city inventory & occupancy**

### What does Airbnb Market Scraper do?

- **Covers the whole area.** It partitions the map and keeps searching until Airbnb has nothing new to show for the area, reaching over 98% of total listings.
- **Tells you how complete it is.** A free coverage row per area says how many boxes were searched, how many listings were found, Airbnb's own stated total, and the exact coverage percentage.
- **Measures forward occupancy.** Specify upcoming date windows to measure how many listings are booked or blocked vs available, broken down by zone, property type, and bedroom count.
- **Nightly rate spread.** Captures nightly rates, stay totals, and discount labels (such as early-booking discounts).
- **Optional listing details.** Enrich listings with superhost status, room type, guest capacity, amenities, and cancellation policy by reading listing pages.
- **Market summary report.** An area report per city with rate percentiles (25th, median, 75th), rating distributions, guest-favourite shares, and top zones.
- **Market numbers only mode.** Deliver only occupancy and area report rows, not one row per listing. Every listing in the area is still searched and counted, paying a small fee per listing searched instead of the listing price.
- **Free rows.** Coverage, summary, and error rows are completely free.

### Who is it for?

- **Short-let hosts** checking competing listings, rate trends, and seasonal occupancy in their neighbourhood.
- **Real estate investors** looking for high-occupancy zones and revenue potential before buying or leasing property.
- **Property managers** benchmarking pricing and tracking market demand across property sizes.
- **Market analysts and AI agents** needing structured, deduplicated listing datasets with complete coverage guarantees.

### Use cases

| You want | What to set |
| --- | --- |
| Every listing in a city | Locations `Austin, TX`, Max listings `50000` |
| Rates for specific travel dates | Check-in `2026-12-11`, Check-out `2026-12-13` |
| Forward occupancy for the next month | Occupancy windows `4`, Window nights `2` |
| Deep listing amenities & superhost data | Include listing details `true` |
| Neighbourhood market report | Locations `Austin, TX`, Include area report `true` |
| Track a market every week | Market numbers only (no listing rows) `true`, Occupancy windows `4`, Include area report `true` |
| An exact custom boundary | Custom area: GeoJSON, centre and radius, or bounding box |

### How it finds your area

You type a place name. **Google Maps decides which place you mean**, so city and neighbourhood names match accurately.

- **Cities** are searched to their municipal boundary.
- **Neighbourhoods** without a published boundary are searched within a radius around their centre.
- **Need an exact shape?** Provide a **Custom area** with GeoJSON, a centre and radius, or a bounding box.
- The run log confirms the resolved boundary and area size in km².

### What we measured

Live runs of this actor on Apify Proxy (datacenter), November 2026.

| Run | Result |
| --- | --- |
| Input form prefill (Austin, TX, max 50 listings) | about 30 seconds |
| Lisbon, every listing | 13,797 listings, 98.6% of what Airbnb lists in the area, in 12 minutes |
| Austin, every listing, plus 2 occupancy windows and the area report | 7,172 listings in 11 minutes; 79% and 69% booked or blocked for the next two weekends |
| Austin market numbers only (no listing rows), plus 2 occupancy windows and the area report | 7,121 listings searched and counted in 14 minutes; 80% and 69% booked or blocked |
| Austin market numbers | median $209 a night (middle half $140–$344); homes 85% booked or blocked that weekend, apartments 75%, rooms 60% |
| Errors and blocks across these runs | none |

A whole city takes minutes rather than seconds because it covers every street systematically. The status line shows live progress as it searches.

### How to use it

1. Type one or more **Locations** (for example, `Austin, TX`).
2. If you want prices for specific dates, set **Check-in date** and **Check-out date**. To measure forward occupancy or collect total active inventory, leave dates empty.
3. If measuring occupancy, set **Occupancy windows** (e.g. `2` or `4`).
4. Set **Max listings** and optional flags (**Include listing details**, **Include area report**).
5. Run the actor and download results as JSON, CSV, or Excel.

#### Input example

```json
{
  "locations": ["Austin, TX"],
  "occupancyWindows": 2,
  "windowNights": 2,
  "includeAreaReport": true,
  "maxListings": 10000
}
```

#### Use it from an AI agent

Call it from the Apify API or MCP server. Every row has a `type` (`listing`, `occupancy`, `area-report`, `coverage`, `summary`, or `error`), so an agent can read the `coverage` row to verify completeness before analysing `listing` and `occupancy` rows.

### What you get

| Row type | What's in it | Cost |
| --- | --- | --- |
| `listing` | Listing ID, URL, name, title, property type, coordinates, zone, bedrooms, beds, bathrooms, rating, reviews count, nightly rate, total price, original price, discount labels, guest favourite badge, photo URL, and optional details | per listing delivered |
| `occupancy` | Window check-in, window check-out, inventory count, available count, booked-or-blocked share, plus breakdown by zone, property type, and bedroom count | per window measured |
| `area-report` | Listing count, nightly rate percentiles (p25, p50, p75) overall and by type/bedrooms/zone, rating spread, new listing share, guest favourite share, and mean booked share | per area |
| `coverage` | Boxes searched, boxes split, requests, listings found, stated total, and coverage percentage | free |
| `summary` | Listings delivered, areas searched, details read, windows measured, charges, and stop reason | free |
| `error` | Any location that could not be resolved or network/block issues | free |

### Pricing

You pay only for listings delivered (or, in market numbers only mode, a smaller fee per listing searched) and the market reports you ask for.

| Event | Free plan | Bronze | Silver | Gold and up | Notes |
| --- | --- | --- | --- | --- | --- |
| `listing` | $1.50 per 1,000 | $1.10 per 1,000 | $0.80 per 1,000 | $0.60 per 1,000 | per 1,000 listings delivered |
| `listing-searched` | $0.40 per 1,000 | $0.30 per 1,000 | $0.20 per 1,000 | $0.15 per 1,000 | per 1,000 listings searched in market mode |
| `listing-details` | $1.00 per 1,000 | $0.80 per 1,000 | $0.60 per 1,000 | $0.50 per 1,000 | only with Include listing details, per 1,000 listing pages read |
| `occupancy-window` | $0.40 | $0.30 | $0.25 | $0.20 | per area and window measured |
| `area-report` | $1.00 | $0.80 | $0.60 | $0.50 | per area market summary report |

- **Charged only after rows are delivered** (in market mode, once the search finishes). Coverage, summary, and error rows are always free.
- **Never exceeds your spending limit.** If the spending limit is reached, the search stops and delivers whatever has been found so far.

#### What typical runs cost on the Free plan

- **Austin every listing + report + 4 windows** ≈ $13.36
- **Austin market numbers weekly** ≈ $5.47 a run ($21.88 a month)
- **Every Lisbon listing** ≈ $20.70
- **One neighbourhood of 600 listings with details, report and 4 windows** ≈ $4.10

### FAQ

#### Do I need an account or an API key?

No. The actor reads public Airbnb search results the same way a desktop browser does. No login, session cookies, or API keys are required.

#### Why "booked or blocked"?

When a listing is unavailable on Airbnb, it can be because a guest booked it or because the host blocked the calendar (for personal use, repairs, or minimum stay rules). Public searches cannot distinguish between the two, so the honest label is "booked or blocked".

#### How do I know the list is complete?

Read the `coverage` row in your dataset. It compares the number of listings found against Airbnb's own stated total for the searched area and gives you the exact coverage percentage (typically 98%+).

#### Does it collect personal data?

No host names, guest names or review texts are collected, only public listing facts and prices.

### Legal note

This actor collects publicly available listings and rates. You're responsible for how you use the data, including local rules on data use and personal data.

### More from Brainfoods Studio

- [Google Maps Places Scraper](https://apify.com/brainfoods_studio/google-maps-places-scraper)
- [Google Trends Scraper](https://apify.com/brainfoods_studio/google-trends-scraper)
- [Google News Scraper](https://apify.com/brainfoods_studio/google-news-scraper)
- [Google Ads Transparency Scraper](https://apify.com/brainfoods_studio/google-ads-transparency-scraper)
- [Google Play Scraper](https://apify.com/brainfoods_studio/google-play-scraper)

### Support

Found a bug or missing a metric? Open an issue on the actor's Issues tab. We're the new kids here, so we read every one and usually reply within a day.

***

<sub>Area boundaries © OpenStreetMap contributors (ODbL).</sub>

# Actor input Schema

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

Places to cover completely, up to 10, such as "Austin, TX" or "Lisbon, Portugal". Google Maps decides which place you mean. Cities and neighbourhoods are searched thoroughly to collect active listings. Duplicates are removed.

## `customArea` (type: `object`):

Optional. Your own area instead of, or as well as, the locations. Give one of: {"geojson": a Polygon, MultiPolygon or Feature}, {"center": {"lat": 30.26, "lng": -97.74}, "radiusKm": 5} (up to 100 km), or {"bbox": {"south": 30.2, "west": -97.8, "north": 30.3, "east": -97.7}}. It appears in the results as "custom area".

## `checkin` (type: `string`):

Check-in date (YYYY-MM-DD). Use together with check-out to search specific dates and get exact rates and available listings. Leave empty for occupancy or full-market inventory.

## `checkout` (type: `string`):

Check-out date (YYYY-MM-DD). Must be after check-in and at most 30 nights later.

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

Number of adult guests (1 to 16).

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

3-letter currency code for prices (e.g. USD, EUR, GBP).

## `occupancyWindows` (type: `integer`):

Number of future windows to measure booked-or-blocked share (0 to 12). Requires check-in and check-out to be empty because occupancy is measured against total listings.

## `windowNights` (type: `integer`):

Length of each occupancy window in nights (1 to 7).

## `windowStart` (type: `string`):

Optional start date for the first occupancy window (YYYY-MM-DD). Defaults to the upcoming Friday. Each subsequent window steps forward by 7 days.

## `includeAreaReport` (type: `boolean`):

Generate a market summary report for each area with rate percentiles, rating spreads, guest-favourite shares, and top zones.

## `marketMode` (type: `boolean`):

Deliver only the occupancy and area report rows, not one row per listing. Every listing in the area is still searched and counted; you pay a small fee per listing searched instead of the listing price. For tracking a market over time.

## `includeDetails` (type: `boolean`):

Fetch individual listing pages for superhost status, room type, guest capacity, amenities, and cancellation policy.

## `maxListings` (type: `integer`):

Maximum number of listings to deliver across all areas.

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

Maximum number of simultaneous requests (1 to 16).

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

Proxy settings. Apify datacenter proxies are used by default.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "adults": 1,
  "currency": "USD",
  "occupancyWindows": 0,
  "windowNights": 2,
  "includeAreaReport": false,
  "marketMode": false,
  "includeDetails": false,
  "maxListings": 50,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All rows: listings with rates and zones, occupancy rows per window, optional area reports, a free coverage row per area, a free summary row, and error rows.

## `stats` (type: `string`):

Requests, successes, rate limits, retries, session changes and a summary of rows and charges for this run.

# 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": [
        "Austin, TX"
    ],
    "maxListings": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("brainfoods_studio/airbnb-market-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 = {
    "locations": ["Austin, TX"],
    "maxListings": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("brainfoods_studio/airbnb-market-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 '{
  "locations": [
    "Austin, TX"
  ],
  "maxListings": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call brainfoods_studio/airbnb-market-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,brainfoods_studio/airbnb-market-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/wDMYH8ZyIhye6le9c/builds/evs487471AAniOgrq/openapi.json
