# Airbnb Occupancy Scraper (`fastdataapi/airbnb-occupancy-scraper`) Actor

Airbnb Occupancy Scraper — Extract Airbnb listing availability and occupancy data, including booking calendars, nightly prices, locations, guest capacity, and listing details. Useful for rental market research, occupancy analysis, revenue estimation, and short-term rental investment insights.

- **URL**: https://apify.com/fastdataapi/airbnb-occupancy-scraper.md
- **Developed by:** [Fast Data API](https://apify.com/fastdataapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Occupancy Scraper — Extract Availability, Calendar & Status

Airbnb Occupancy Scraper extracts the day-by-day availability calendar for any Airbnb listing, returning one JSON row per calendar date with its booking status. Give it one or more Airbnb room IDs and it returns a 12-month window of per-date data: room ID, calendar date, and availability status. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed an occupancy-monitoring pipeline. **No Airbnb account or login is needed.** Start with one listing, then scale to a full portfolio of units.

![Airbnb Occupancy Scraper output: availability per room and date as JSON](https://api.apify.com/v2/key-value-stores/Lg9lp51Levfro6SrV/records/i-airbnb-occupancy-hero.webp)

***

### What data can I extract with Airbnb Occupancy Scraper?

Using this Airbnb occupancy scraper, you will be able to extract the following Airbnb availability data:

| 🆔 Room ID | 📅 Calendar date (YYYY-MM-DD) | ✅ Availability status (true / false / null) | |
|---|---|---|---|

***

### How to use Airbnb Occupancy Scraper

Property managers, researchers and AI agent builders use it the same way: give it one or more Airbnb room IDs and get Airbnb occupancy data back in one run, one JSON row per calendar date.

**Copy to your AI assistant:**

```text
Airbnb Occupancy Scraper (Apify Actor ID: fastdataapi/airbnb-occupancy-scraper, https://apify.com/fastdataapi/airbnb-occupancy-scraper) is an Apify Actor that returns an Airbnb listing's day-by-day availability calendar as structured JSON: room ID, calendar date, and availability status. Use it whenever someone needs a listing's booking calendar without cookies, a login, or a browser - portfolio occupancy tracking, demand research from availability patterns, or a booking-status alert. Inputs: roomIds (array of strings, one or more Airbnb room IDs), month (integer 1-12, default 12), year (integer, default 2026), proxyConfiguration (object, proxy tier selection). Each run returns a fixed 12-month window of per-date data starting from the month and year you choose.
```

#### Airbnb Occupancy Scraper MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at Apify's MCP server and it can find and call Airbnb Occupancy Scraper on its own — no glue code, no scraping logic in your prompts.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=fastdataapi/airbnb-occupancy-scraper"
```

#### Step by step

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open **[Airbnb Occupancy Scraper](https://apify.com/fastdataapi/airbnb-occupancy-scraper)** in the Apify Store (or find it already added in your Apify Console).
3. Enter one or more Airbnb room IDs.
4. Click **Start** (or send your API request).
5. Download or stream your results in JSON, CSV or Excel.

#### How to scale Airbnb Occupancy Scraper to bulk

The room ID list accepts an array, so the most common way to scale is to list every room ID you track in one run — a portfolio of 5 units or 500 runs the same way, processed one room at a time with the results streaming into the same table as they're ready. For a recurring occupancy check, schedule the same input on a daily or weekly Apify schedule instead of triggering runs manually. There is no documented cap on how many room IDs one run can hold.

***

### ✨ Features

Airbnb Occupancy Scraper fetches clean, structured occupancy data straight from Airbnb's own calendar ⚡ for one or many listings at once — an Airbnb occupancy rate scraper and an Airbnb booking stats API rolled into one Actor. It's ideal for portfolio occupancy tracking, demand research, booking-status alerts, and feeding an occupancy-monitoring pipeline.

It extracts, per date:

- **Room ID** – which Airbnb listing the row belongs to
- **Calendar date** – the specific day inside the 12-month window
- **Availability status** – whether that date is bookable, blocked, or unreported

⚡ Escalates automatically from a direct connection to a proxy when Airbnb blocks a request, so you don't maintain retry logic yourself.

***

### Use cases 💡

- **Property manager** — compare Airbnb booking status across every unit to spot calendar gaps.
- **Market researcher** — run it as an Airbnb occupancy tracker and an Airbnb vacancy data scraper.
- **Data engineer** — refresh an Airbnb room availability data dashboard every scheduled run.
- **AI agent builder** — feed the calendar date and availability status into a RAG pipeline.

Building an AI agent? [Connect Airbnb Occupancy Scraper over MCP](#airbnb-occupancy-scraper-mcp-server-use-these-actors-from-chatgpt-claude-or-cursor) and let it call the actor on its own.

***

### Why choose this actor?

1. **A full 12-month calendar in one call per room.** Give it a room ID and it returns every date in a 12-month window — no pagination and no follow-up requests on your side.
2. **Three clean facts per date, nothing to parse.** Each row carries the room ID, the exact calendar date, and whether that date is available, blocked, or unreported — ready to use as-is.
3. **One Actor for any number of listings.** Pass 1 room ID or 100 in the same room ID list; the Actor works through each one and keeps streaming rows into the same table.

***

### ⬇️ Input

![Airbnb Occupancy Scraper input form with room IDs, start month and year](https://api.apify.com/v2/key-value-stores/Lg9lp51Levfro6SrV/records/i-airbnb-occupancy-input.webp)

Airbnb Occupancy Scraper accepts a list of Airbnb room IDs — the room ID list is the only required field.

| Parameter | Required | Type | Description | Example Value |
| --- | --- | --- | --- | --- |
| `roomIds` | Yes | array of strings | List one or more Airbnb room IDs to scrape occupancy data for (e.g., 35329051, 769824007018240779). | `["35329051", "769824007018240779"]` |
| `month` | No (default `12`) | integer (1–12) | Month to fetch occupancy data for (1-12). | `12` |
| `year` | No (default `2026`) | integer | Year to fetch occupancy data for. | `2026` |
| `proxyConfiguration` | No | object | Choose which proxies to use. If Airbnb rejects the proxy, fallback to residential proxy will be used automatically. | `{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}` |

#### Example input

```json
{
  "roomIds": ["35329051", "769824007018240779"],
  "month": 12,
  "year": 2026,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

#### Free plan limits

Free plan: up to 20 calendar dates per run (all rooms together) and 200 per month; paid plans have no limit.

***

### ⬆️ Output

![Airbnb Occupancy Scraper output fields: room_id, date and available](https://api.apify.com/v2/key-value-stores/Lg9lp51Levfro6SrV/records/i-airbnb-occupancy-output.webp)

Each run writes one typed, normalized JSON row per calendar date, with the same three-field schema on every run. Export formats: JSON (default), CSV, or Excel.

#### Example output

```json
[
  { "room_id": "35329051", "date": "2026-12-01", "available": false },
  { "room_id": "35329051", "date": "2026-12-02", "available": true },
  { "room_id": "35329051", "date": "2026-12-03", "available": true },
  { "room_id": "35329051", "date": "2026-12-04", "available": null },
  { "room_id": "769824007018240779", "date": "2026-12-01", "available": false },
  { "room_id": "769824007018240779", "date": "2026-12-02", "available": true }
]
```

Availability status is passed through exactly as Airbnb reports it: `true` for bookable, `false` for blocked, and `null` when Airbnb does not report a status for that date — `null` is never coerced into `false`.

***

### How does it work?

Airbnb Occupancy Scraper gets public Airbnb listing availability data without needing an Airbnb account. It reads the same public calendar data any visitor sees on a listing page — plain HTTP requests, no browser. When Airbnb starts blocking a connection, requests escalate automatically: direct first, then a datacenter proxy, then a residential proxy, sticking with whichever one keeps working. Retries use exponential backoff so one slow response doesn't fail a whole room. The output schema — room ID, calendar date, and availability status — stays stable even when Airbnb changes details on its side, so your integration doesn't need to change when that happens.

***

### How do you integrate Airbnb Occupancy Scraper into your stack?

Airbnb Occupancy Scraper works with what you already use: a REST API from any language, MCP for AI agents, and no-code automation tools.

#### MCP integration for AI agents

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=fastdataapi/airbnb-occupancy-scraper"
```

This registers Apify's MCP server as a tool your agent can call directly, instead of writing scraping logic into your prompts. Once added, the agent finds Airbnb Occupancy Scraper on its own through the server's search, add and call-actor tools, so there is no actor ID to hardcode. The same server exposes every other Apify Actor you add, so this one setup step covers this scraper and anything else you connect later. Compatible with Claude Code, Cursor, and Windsurf.

#### No-code tools (n8n, Make, LangChain)

In n8n, add the Apify node, select **Run Actor**, and choose **Airbnb Occupancy Scraper** from your added Actors, passing your room IDs (plus optional month and year) as the run input. In Make, use the Apify app's "Run an Actor" module the same way, then "Get Dataset Items" to pull the rows into the rest of your scenario. LangChain integrates through the `langchain-apify` package, wrapping this Actor as a callable tool once you've added it to your account.

***

### Is it legal to scrape Airbnb data?

Yes, scraping publicly available Airbnb availability data is generally permitted. Airbnb Occupancy Scraper returns only publicly available data — what any visitor sees on a listing's page without logging in; it does not access login-gated data, guest information, or personal data such as host or reviewer names. Scraping public data is generally permissible, but storing and using it must comply with local data-protection law (GDPR, CCPA). Consult legal counsel if your use case involves bulk storage of personal data.

***

### Frequently asked questions

#### What fields does Airbnb Occupancy Scraper return?

Every row carries three fields: the room ID, the calendar date, and the availability status (bookable, blocked, or unreported) — enough to check Airbnb availability by date for any room ID you track. See [the data fields section](#what-data-can-i-extract-with-airbnb-occupancy-scraper) above.

#### Does Airbnb Occupancy Scraper require an Airbnb account or login?

No. Only public calendar data is extracted. No credentials needed.

#### What happens if a room ID is invalid, delisted, or the request fails?

The Actor logs the error for that specific room ID, lists it as failed in the run summary, and continues processing the remaining room IDs. No dataset rows are written for a room that fails, and delisted or access-restricted listings will not return availability data.

#### Can I scrape multiple Airbnb room IDs at once?

Yes. Pass an array of room IDs and the Actor processes them one at a time, continuing past any room ID that fails rather than stopping the whole run.

#### Does Airbnb Occupancy Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes — Airbnb Occupancy Scraper is available as a tool through Apify's MCP server. Run `claude mcp add --transport http apify "https://mcp.apify.com?tools=fastdataapi/airbnb-occupancy-scraper"` to register it in Claude Code, Cursor, or Windsurf. Any agent that can call an HTTP endpoint can use the REST API directly.

#### Does Airbnb Occupancy Scraper return data in a format LLMs can use directly?

Yes. Output is typed, normalized JSON with stable field names: room ID, calendar date, and availability status — no HTML, no selectors, no parsing step needed before passing it into an LLM context window or vector store.

#### What happens when Airbnb changes its layout or updates its anti-bot system?

Airbnb Occupancy Scraper is maintained. When Airbnb changes its layout or detection, the Actor is updated — your calls keep returning the same room ID, calendar date and availability status JSON schema with no changes on your end. No specific fix turnaround time is promised.

#### Can I use Airbnb Occupancy Scraper without managing proxies or browser infrastructure?

Yes. By default it connects directly with no proxy, and automatically escalates to a datacenter proxy and then a residential proxy on its own if Airbnb starts blocking requests. You send one run request and get structured JSON back — no proxy accounts and no browser setup to maintain.

#### Which Airbnb Occupancy Scraper fields work best for AI training data and RAG indexing?

For RAG indexing: the calendar date paired with the availability status gives an agent a direct, queryable answer to "is this listing free on this date." For training data: availability status is a clean boolean (or null) signal and calendar date is a consistent ISO string — both typed primitives with no normalization needed.

***

### Your feedback

Found a bug or missing a field? We want to know. Leave feedback or report an issue directly from the Actor's page in Apify Console, or open an issue on the Actor's issue tracker if one is linked there — it helps keep this scraper maintained and accurate.

# Actor input Schema

## `roomIds` (type: `array`):

List one or more Airbnb room IDs to scrape occupancy data for (e.g., 35329051, 769824007018240779).

## `month` (type: `integer`):

Month to fetch occupancy data for (1-12).

## `year` (type: `integer`):

Year to fetch occupancy data for.

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

Choose which proxies to use. If Airbnb rejects the proxy, fallback to residential proxy will be used automatically.

## Actor input object example

```json
{
  "roomIds": [
    "35329051",
    "769824007018240779"
  ],
  "month": 12,
  "year": 2026,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per room/date with room_id, date (ISO), and available (true/false/null if Airbnb did not report a status for that date).

# 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 = {
    "roomIds": [
        "35329051",
        "769824007018240779"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fastdataapi/airbnb-occupancy-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 = {
    "roomIds": [
        "35329051",
        "769824007018240779",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("fastdataapi/airbnb-occupancy-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 '{
  "roomIds": [
    "35329051",
    "769824007018240779"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call fastdataapi/airbnb-occupancy-scraper --silent --output-dataset

```

## MCP server setup

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