# Airbnb Availability Calendar Scraper (`piotrv1001/airbnb-availability-calendar-scraper`) Actor

Get the Airbnb availability calendar of any listing for up to 12 months: which nights are booked or open, check-in and check-out days, minimum and maximum stay, plus occupancy rate and next free date. One row per listing, or one row per day in the Days view. Bulk listing URLs.

- **URL**: https://apify.com/piotrv1001/airbnb-availability-calendar-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Travel, Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 listing calendars

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Availability Calendar Scraper: Booked Dates and Occupancy

Get the **Airbnb availability calendar** of any listing for up to 12 months as JSON, CSV or Excel. The **Airbnb Availability Calendar Scraper** shows which nights are open or unavailable, which days allow check-in and check-out, the minimum and maximum stay, and sums it up as available days, an occupancy rate and the next free date. Use it to estimate Airbnb occupancy, watch competitors' calendars or plan your own pricing.

### 🎯 Use Cases

- **Airbnb occupancy rate estimates**: see how many of the next 12 months' nights are already unavailable for a listing or a whole neighborhood.
- **Competitor calendar monitoring**: run it weekly on nearby listings and watch nights get booked.
- **Airbnb market analysis**: combine calendars with listing prices to estimate demand and revenue in an area.
- **Availability checks at scale**: find which homes in a list are free for a given week before you contact hosts.
- **Minimum-stay research**: compare minimum and maximum nights across similar listings.

### ✨ Features

- **Up to 12 months per listing**, starting today.
- **Every day**: available or not, check-in allowed, check-out allowed, minimum and maximum nights.
- **Summary columns**: available days, unavailable days, occupancy rate, next available date, number of possible check-in days and the shortest minimum stay.
- **One row per listing, or one row per day**: the **Overview** view has one row per listing; the **Days** view (and its CSV/Excel export) lists every day as its own row, ready for spreadsheets and pivot tables.
- **Bulk listings**: paste many links or IDs in one run.
- **Fair billing**: removed or private listings are skipped and not charged.

### 🛠️ How It Works

1. **Paste Airbnb listing URLs or IDs**, one per line.
2. **Choose how many months** you need (1–12, default 12).
3. **Run the scraper** and open the Overview or Days view, or pull the data through the Apify API.

### ⚙️ Input

| Field | What it does |
| --- | --- |
| **Listing URLs or IDs** | Links like `https://www.airbnb.com/rooms/19130047` or the number alone. |
| **Months** | How many months to get, starting with the current month. 1–12, default 12. |
| **Max listings** | Stop after this many listings. Default 50. |

```json
{
    "listings": ["https://www.airbnb.com/rooms/19130047", "https://www.airbnb.com/rooms/54337496"],
    "months": 12
}
```

### 💰 Pricing

Pay only for the calendars you get. No monthly rental.

| Event | Price | What you get |
| --- | --- | --- |
| **Listing calendar** | $0.003 per listing ($3.00 per 1,000) | Up to 12 months of days for one listing, with the summary columns |
| **Actor start** | $0.00005 per run | Charged once when the run starts |

Examples: 10 listings = $0.03 · 200 listings in a neighborhood = $0.60 · 1,000 listings = $3.00. The price is per listing, not per day: a full year of 365 days costs the same as one month.

### 📊 Sample Output Data

```json
{
    "id": "1550967010992579703",
    "url": "https://www.airbnb.com/rooms/1550967010992579703",
    "firstDate": "2026-10-22",
    "lastDate": "2027-09-30",
    "daysCount": 344,
    "availableDays": 150,
    "unavailableDays": 194,
    "occupancyRate": 56.4,
    "nextAvailableDate": "2026-10-26",
    "checkinDays": 107,
    "minNights": 2,
    "days": [
        { "date": "2026-10-25", "available": false, "availableForCheckin": false, "availableForCheckout": false, "minNights": 2, "maxNights": 365 },
        { "date": "2026-10-26", "available": true, "availableForCheckin": true, "availableForCheckout": false, "minNights": 2, "maxNights": 365 }
    ],
    "months": 12,
    "scrapedAt": "2026-10-22T07:32:11.065Z"
}
```

`days` is shortened here; a 12-month run has every day from today to the end of the last month. `occupancyRate` is the share of days that are not open for booking, in percent. It counts nights booked by guests and nights the host blocked, because Airbnb shows both the same way. `checkinDays` counts the days a stay can start. The calendar has **no prices**: Airbnb's public calendar does not show nightly rates; use the Airbnb Listings Scraper with check-in and check-out dates to get prices.

### 🔁 Schedule and Integrate

For occupancy tracking, run it **once a week** on the same listings: comparing runs shows which nights got booked in between. Set it up in Apify **Schedules**, then send the Days view to **Google Sheets** or to **Zapier**, **Make**, **n8n** or a webhook with Apify **integrations**.

### 🤖 Use with AI Agents (MCP)

This Actor works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (`https://mcp.apify.com`). An agent can call it with:

```json
{ "listings": ["https://www.airbnb.com/rooms/19130047"], "months": 3 }
```

### ❓ FAQ

**Does Airbnb have an API for availability calendars?** Airbnb's API and calendar sync (iCal) work only for hosts and approved partners on their own listings. This Actor needs no key or account and reads the public calendar any guest sees on a listing page.

**Can I see whether a night was booked or blocked by the host?** No. Airbnb shows both as unavailable, so `occupancyRate` is an upper bound for real bookings. Weekly runs make the trend clear: nights that turn unavailable close to the date are usually bookings.

**Why are there no prices?** The public calendar has none. Get prices for specific dates with the Airbnb Listings Scraper.

**Do I need an Airbnb account?** No.

**What if a listing is removed?** It is skipped, not charged, and named in the status message.

**How do I get one row per day in a spreadsheet?** Open the run's **Days** view in Apify Console and export it as CSV or Excel, or use the API with `unwind=days`.

### 🔗 Related Scrapers

- [Airbnb Listings Scraper](https://apify.com/piotrv1001/airbnb-listings-scraper): every listing in a city with prices and ratings, to feed into this Actor.
- [Airbnb Rooms Scraper](https://apify.com/piotrv1001/airbnb-rooms-scraper): full listing details, amenities and house rules.
- [Airbnb Reviews Scraper](https://apify.com/piotrv1001/airbnb-reviews-scraper): all reviews of a listing with ratings and dates.
- [Booking.com Rates Scraper](https://apify.com/piotrv1001/booking-com-rates-scraper): Booking.com room rates by date.
- [Google Hotels Scraper & Price Tracker](https://apify.com/piotrv1001/google-hotels-scraper): hotel prices across booking sites.

# Actor input Schema

## `listings` (type: `array`):

Airbnb listing links (https://www.airbnb.com/rooms/…) or numeric listing IDs, one per line. Any Airbnb country domain works.

## `months` (type: `integer`):

How many months to get, starting with the current month (1-12).

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

Stop after this many listings.

## Actor input object example

```json
{
  "listings": [
    "https://www.airbnb.com/rooms/19130047",
    "https://www.airbnb.com/rooms/54337496"
  ],
  "months": 12,
  "maxItems": 50
}
```

# 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 = {
    "listings": [
        "https://www.airbnb.com/rooms/19130047",
        "https://www.airbnb.com/rooms/54337496"
    ],
    "months": 12,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/airbnb-availability-calendar-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 = {
    "listings": [
        "https://www.airbnb.com/rooms/19130047",
        "https://www.airbnb.com/rooms/54337496",
    ],
    "months": 12,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/airbnb-availability-calendar-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 '{
  "listings": [
    "https://www.airbnb.com/rooms/19130047",
    "https://www.airbnb.com/rooms/54337496"
  ],
  "months": 12,
  "maxItems": 50
}' |
apify call piotrv1001/airbnb-availability-calendar-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/airbnb-availability-calendar-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/XrO0Cj4k4hmQpWldg/builds/RbvBLpG6GHNQt2Lf5/openapi.json
