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

Day-by-day availability of any Airbnb listing for up to 12 months: open and booked days, check-in and check-out rules, minimum and maximum nights, an occupancy rate estimate, and the price for your dates. Paste links or ids. Export to JSON, CSV or Excel, or via API. No login.

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

## Pricing

from $3.00 / 1,000 listing with its 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

### What does Airbnb Availability Calendar Scraper do?

**Airbnb Availability Calendar Scraper** reads the **availability calendar of any Airbnb listing, day by day, for up to 12 months**: which days are open, which are booked or blocked, whether check-in and check-out are allowed each day, and the minimum and maximum nights. Every listing also comes with an **occupancy summary** (open days, booked or blocked days, their share, the first open date) and the listing's own data — title, rating, host, amenities, photos, coordinates. Give it dates and you also get **the price of that stay**.

Paste as many listing links as you want in one run. It talks to the same API Airbnb's own site uses: **no login, no browser, no proxies**.

### Why use it?

- 📈 **Estimate occupancy** — the share of booked or blocked days over the coming months, per listing, for investors and short-term rental analysts.
- 🏘️ **Benchmark your competitors** — how full the listings around yours are, and from when they open up.
- 🧮 **Revenue management** — minimum stays and check-in rules per day, to align your own calendar and pricing.
- 🔔 **Monitor availability** — schedule it daily and see days get booked; compare runs to spot when demand picks up.
- 🤖 **Feed dashboards, sheets and AI agents** — JSON, CSV or Excel, or straight into Google Sheets, Slack or Make through Apify integrations.

### Features

- ✅ **Many listings per run** — links (`https://www.airbnb.com/rooms/11337562`, any Airbnb domain) or just the numbers; repeats are read once.
- ✅ **Up to 12 months** in one row per listing, starting from the current month.
- ✅ **Per day**: `available`, `availableForCheckIn`, `availableForCheckOut`, `minNights`, `maxNights`.
- ✅ **Occupancy summary from today**: days, open days, booked or blocked days, their share, the first open date, and the shortest stay accepted.
- ✅ **Optional price for your dates**: total with fees, nightly rate, and whether the stay can be booked.
- ✅ **The listing too**: title, type, rating, reviews, Superhost, host profile, amenities, rules, cancellation policy, photos, coordinates.
- ✅ **Fair billing** — one charge per listing, whatever the number of months. A link to a listing that no longer exists is reported and **not charged**. No start fee.

### How to scrape Airbnb availability calendars

1. Click **Try for free**.
2. Paste **listing links** (one per line) or listing numbers.
3. Choose how many **months** to read (12 by default).
4. Optionally set **check-in and check-out** to also get the price of that stay.
5. Click **Start** and download the rows as JSON, CSV or Excel. To monitor, add a [schedule](https://docs.apify.com/platform/schedules).

### Input example

```json
{
    "listingUrls": ["https://www.airbnb.com/rooms/29048719", "https://www.airbnb.com/rooms/32976368"],
    "calendarMonths": 12,
    "currency": "EUR"
}
```

### Output example

One item per listing (the calendar and the listing details shortened here):

```json
{
    "id": "29048719",
    "url": "https://www.airbnb.com/rooms/29048719",
    "title": "Chiado River View",
    "placeType": "Condo in Lisbon",
    "rating": 4.84,
    "reviewsCount": 217,
    "isSuperhost": true,
    "bedrooms": 1,
    "beds": 1,
    "bathrooms": 1,
    "latitude": 38.7086,
    "longitude": -9.1427,
    "price": null,
    "minNights": 2,
    "calendarSummary": {
        "from": "2026-10-04",
        "to": "2026-11-30",
        "days": 58,
        "availableDays": 34,
        "unavailableDays": 24,
        "unavailableShare": 0.414,
        "firstAvailableDate": "2026-10-05"
    },
    "calendar": [
        { "date": "2026-10-05", "available": true, "availableForCheckIn": false, "availableForCheckOut": false, "minNights": 2, "maxNights": 90 },
        { "date": "2026-10-06", "available": false, "availableForCheckIn": false, "availableForCheckOut": false, "minNights": 2, "maxNights": 90 }
    ],
    "details": { "propertyType": "Entire condo", "host": { "name": "Ricardo", "isSuperhost": true, "rating": 4.82, "yearsHosting": 8 }, "cancellationPolicy": null, "canInstantBook": true },
    "scrapedAt": "2026-10-04T20:07:33.383Z"
}
```

### Output fields

| field | meaning |
|---|---|
| `calendar` | Every day from the first of the current month: `date`, `available`, `availableForCheckIn`, `availableForCheckOut`, `minNights`, `maxNights`. |
| `calendarSummary` | The days from today on: `from`, `to`, `days`, `availableDays`, `unavailableDays`, `unavailableShare` (rounded to 3 decimals), `firstAvailableDate` (`null` if nothing is open). |
| `minNights` | The shortest stay accepted on any open day. |
| `price` | With dates: the total for that stay with fees, `perNight`, `nights`; `null` without dates or when the stay cannot be booked. |
| `id`, `url`, `title`, `placeType`, `rating`, `reviewsCount`, `isSuperhost`, `isGuestFavorite`, `bedrooms`, `beds`, `bathrooms`, `latitude`, `longitude`, `photos` | The listing as its page shows it. |
| `details` | The rest of the listing page: description, amenities, host, house rules, safety, cancellation policy, category ratings, review tags, photos with captions. |
| `searchLocation` | The link or number you gave. |

The run's **SUMMARY** record lists any link that was not found or refused; those are not charged.

### Limits and tips

- **Booked and blocked look the same**: Airbnb's calendar says a day is unavailable, not why. A host who blocks days shows them as unavailable, so `unavailableShare` is an upper bound of occupancy.
- Days before today in the current month come as unavailable; the summary starts counting today (UTC).
- Each listing is two requests (its page and its calendar), whatever the number of months.
- Want every listing of a city instead of known ones? Use [Airbnb Scraper](https://apify.com/steadyscrape/airbnb-scraper) with **Availability calendar months**: same data, found by place or search link.

### Is it legal to scrape Airbnb?

This Actor reads only data Airbnb shows publicly to anyone, without logging in, and does not collect personal data beyond what hosts publish on their listings. Scraping public data is generally legal; still, make sure your use complies with Airbnb's terms and the laws that apply to you, and use it responsibly. Read Apify's [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) guide.

### Your feedback

Missing something? Open an issue on the **Issues** tab: issues are answered, and the Actor is checked against the live site so it keeps working when Airbnb changes.

# Actor input Schema

## `listingUrls` (type: `array`):

Airbnb listing links (<code>https://www.airbnb.com/rooms/11337562</code>) or just their numbers, one per line. Each one's calendar is read, with the listing's own data.

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

Months to read from the current one, up to 12. Each day says whether it is available, whether check-in and check-out are allowed, and the minimum and maximum nights; the summary counts the days from today.

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

<code>YYYY-MM-DD</code>. Give a stay to also get its total price, fees included, and whether it can be booked.

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

<code>YYYY-MM-DD</code>, after check-in.

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

Guests aged 13 or more.

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

3-letter code for every price in the output: <code>USD</code>, <code>EUR</code>, <code>GBP</code>…

## Actor input object example

```json
{
  "listingUrls": [
    "https://www.airbnb.com/rooms/11337562",
    "https://www.airbnb.com/rooms/29048719"
  ],
  "calendarMonths": 3,
  "adults": 1,
  "currency": "USD"
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `summary` (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 = {
    "listingUrls": [
        "https://www.airbnb.com/rooms/11337562",
        "https://www.airbnb.com/rooms/29048719"
    ],
    "calendarMonths": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/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 = {
    "listingUrls": [
        "https://www.airbnb.com/rooms/11337562",
        "https://www.airbnb.com/rooms/29048719",
    ],
    "calendarMonths": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/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 '{
  "listingUrls": [
    "https://www.airbnb.com/rooms/11337562",
    "https://www.airbnb.com/rooms/29048719"
  ],
  "calendarMonths": 3
}' |
apify call steadyscrape/airbnb-availability-calendar-scraper --silent --output-dataset

```

## MCP server setup

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