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

Scrape day-by-day availability for any Airbnb listing. Returns up to 12 months of calendar data per request: available/booked status, minimum and maximum stay nights, check-in and check-out eligibility, and the nightly price string when visible. Fast HTTP-only scraper, no browser needed.

- **URL**: https://apify.com/cirkit/airbnb-availability-scraper.md
- **Developed by:** [Crikit](https://apify.com/cirkit) (community)
- **Categories:** E-commerce
- **Stats:** 55 total users, 26 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.50 / 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.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Airbnb Availability Calendar Scraper

**Scrape Airbnb availability** for any listing, up to 12 months of calendar in a single request. This **Airbnb availability scraper** returns a day-by-day breakdown: booked or free, minimum and maximum stay nights, check-in and check-out eligibility, and the nightly price string when Airbnb exposes it.

No Airbnb API key, no login, and no headless browser. Results land in a structured dataset you can export to JSON, CSV, Excel, or XML, or pull straight from the Apify API.

### What is Airbnb Availability Calendar Scraper?

Airbnb Availability Calendar Scraper is an [Apify Actor](https://apify.com/actors) that extracts day-by-day calendar availability from [Airbnb](https://www.airbnb.com) and returns them as clean, structured records. One row comes back per listing with a nested `days` array plus pre-computed totals — available days, blocked days, and the calendar window — so you can chart occupancy without post-processing.

### What data can this Airbnb availability scraper extract?

Every run writes one row per listing calendar. Full field list:

| Field | Type | Description |
| --- | --- | --- |
| `listingId` | string | listingId |
| `url` | string | url |
| `currency` | string | currency |
| `requestedMonths` | integer | requestedMonths |
| `startMonth` | integer | startMonth |
| `startYear` | integer | startYear |
| `firstDate` | string | firstDate |
| `lastDate` | string | lastDate |
| `totalDays` | integer | totalDays |
| `availableDays` | integer | availableDays |
| `blockedDays` | integer | blockedDays |
| `scrapedAt` | string | scrapedAt |
| `days` | array | days |
| `warning` | string | warning |
| `message` | string | message |
| `error` | string | error |

### How to scrape Airbnb availability calendars

1. Open [Airbnb Availability Calendar Scraper](https://apify.com/cirkit/airbnb-availability-scraper) and click **Try for free**.
2. Add Airbnb listing URLs to `startUrls`, or bare IDs to `listingIds`.
3. Set `months` for how far ahead to read, up to 12.
4. Optionally pin `startMonth` and `startYear` to begin somewhere other than today.
5. Choose `currency` and `locale`, then set `maxItems` to cap the run.
6. Click **Start** and watch rows appear live in the **Output** tab.
7. Export the dataset as JSON, CSV, Excel, or XML — or fetch it from the [Apify API](https://docs.apify.com/api/v2) once the run finishes.

### Airbnb Availability Calendar Scraper input options

| Input | Type | What it does | Default |
| --- | --- | --- | --- |
| `startUrls` | array | Full Airbnb listing URLs in the form https://www.airbnb.com/rooms/. You may pass either this field, listingIds, or both. | `see schema` |
| `listingIds` | array | Airbnb numeric listing IDs as strings. Use this when you already have the IDs and want to skip URL parsing. |  |
| `months` | integer | How many months of availability to return per listing, starting at startMonth/startYear. Range 1 to 12; defaults to 12. | `12` |
| `startMonth` | integer | Month of the first calendar month to return (1 to 12). Defaults to the current UTC month. |  |
| `startYear` | integer | Year of the first calendar month to return (e.g. 2026). Defaults to the current UTC year. |  |
| `currency` | string | Three-letter ISO currency code for the priceFormatted field. Defaults to USD. | `"USD"` |
| `locale` | string | Locale tag passed to the Airbnb GraphQL endpoint (e.g. en-US, en-GB). Defaults to en-US. | `"en-US"` |
| `maxItems` | integer | Hard cap on the total number of calendar items returned. Leave 0 for no limit. | `0` |

Proxy is configured through the standard `proxyConfiguration` object; the defaults shipped with this Actor are already tuned for the target site.

### Example output

```json
{
  "listingId": "48938114",
  "url": "https://www.airbnb.ca/rooms/48938114?photo_id=1688729784&source_impression_id=p3_c238cec1-a66b-431e-af2c-5ab1af1ffaef_48938114_0&previous_page_section_name=1000",
  "currency": "USD",
  "requestedMonths": 12,
  "startMonth": 8,
  "startYear": 2026,
  "firstDate": "2026-08-01",
  "lastDate": "2027-07-31",
  "totalDays": 365,
  "availableDays": 264,
  "blockedDays": 101,
  "scrapedAt": "2026-08-28T15:43:51.808Z",
  "days": [
    {
      "calendarDate": "2026-08-01",
      "available": false,
      "availableForCheckin": false,
      "availableForCheckout": false,
      "minNights": 1,
      "maxNights": 1125,
      "bookable": null,
      "priceFormatted": null
    },
    {
      "calendarDate": "2026-08-02",
      "available": false,
      "availableForCheckin": false,
      "availableForCheckout": false,
      "minNights": 1,
      "maxNights": 1125,
      "bookable": null,
      "priceFormatted": null
    },
    {
      "calendarDate": "2026-08-03",
      "available": false,
      "availableForCheckin": false,
      "availableForCheckout": false,
      "minNights": 1,
      "maxNights": 1125,
      "bookable": null,
      "priceFormatted": null
    },
    {
      "calendarDate": "2026-08-04",
      "available": false,
      "availableForCheckin": false,
      "availableForCheckout": false,
      "minNights": 1,
      "maxNights": 1125,
      "bookable": null,
      "priceFormatted": null
    },
    {
      "calendarDate": "2026-08-05",
      "available": false,
      "availableForCheckin": false,
      "availableForCheckout": false,
      "minNights": 1,
      "maxNights": 1125,
      "bookable": null,
      "priceFormatted": null
    },
    {
      "calendarDate": "2026-08-06",
      "available": false,
      "availableForCheckin": false,
      "availableForCheckout": false,
      "minNights": 1,
      "maxNights": 1125,
      "bookable": null,
      "priceFormatted": null
    },
    {
      "calendarDate": "2026-08-07",
      "available": false,
      "availableForCheckin": false,
      "availableForCheckout": false,
      "minNights": 1,
  "...": "..."
}
```

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

This Actor runs on **pay per result** pricing: **$0.0025 per listing calendar** ($2.5 per 1,000). A one-time start fee of $0.0075 applies per run.

| Results | Approximate cost |
| --- | --- |
| 1,000 | $2.51 |
| 10,000 | $25.01 |
| 100,000 | $250.01 |

You pay for rows you actually receive, so a search that returns nothing costs nothing beyond the start fee. Every Apify account includes free monthly usage credit, so you can trial Airbnb Availability Calendar Scraper at no cost.

### What can you build with Airbnb data?

#### Estimate occupancy for a competitor set

`availableDays` against `totalDays` gives a fast occupancy proxy per listing without paying for a full market crawl — good enough to rank a comp set by how booked it is.

#### Find gaps to fill in your own calendar

Run your portfolio nightly and alert on any listing whose next 30 days are under-booked while neighbours are full.

#### Detect minimum-stay strategy across a market

`minNights` per day exposes exactly how competitors tighten and loosen stay requirements around weekends, holidays, and local events.

#### Time a pricing change to real demand

Booked-day density by month shows where demand actually sits, which is a better trigger for a rate change than a calendar heuristic.

#### Feed channel-manager or PMS reconciliation

Compare what Airbnb shows publicly against what your property-management system believes is blocked to catch sync failures.

### Airbnb scraping tips and limits

- This Actor reads availability, not resolved prices. When you need the real nightly rate a guest is quoted, use [Airbnb Full-Year Price Scraper](https://apify.com/cirkit/airbnb-full-year-price-scraper).
- A blocked day is not necessarily a booked day — hosts block dates for their own use. [Airbnb Market Occupancy Scraper](https://apify.com/cirkit/airbnb-market-occupancy-scraper) corrects for owner blocks.
- Twelve months is Airbnb's own horizon. Requesting more returns nothing extra, so leave `months` at 12 for a full read.
- Queue many listings in one run — the per-run start fee is charged once regardless of how many calendars you pull.

### Integrations and automation

Run Airbnb Availability Calendar Scraper on a [schedule](https://docs.apify.com/platform/schedules) to keep a Airbnb dataset fresh, or trigger it from your own stack through the [Apify API](https://docs.apify.com/api/v2) and the official [JavaScript](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python) clients. Native [integrations](https://docs.apify.com/platform/integrations) push results into Google Sheets, Slack, Airtable, Zapier, Make, GitHub, or any webhook endpoint. The Actor also works as an [MCP](https://docs.apify.com/platform/integrations/mcp) tool, so an AI agent can call it directly.

### Related scrapers

| Actor | What it does |
| --- | --- |
| [Airbnb Full-Year Price Scraper](https://apify.com/cirkit/airbnb-full-year-price-scraper) | Same calendar, but with the real nightly price resolved per day. |
| [Airbnb Market Occupancy Scraper](https://apify.com/cirkit/airbnb-market-occupancy-scraper) | True occupancy across a whole market, corrected for owner blocks. |
| [Airbnb Search Scraper](https://apify.com/cirkit/airbnb-search-scraper) | Find the listings to feed in. |
| [Airbnb Listing Details Scraper](https://apify.com/cirkit/airbnb-details-scraper) | Full property detail for each listing. |

### Frequently asked questions

#### How far ahead does Airbnb publish availability?

Twelve months is the maximum Airbnb exposes on a listing calendar, and hosts commonly open a shorter window than that. The `firstDate` and `lastDate` fields tell you the real span returned for each listing.

#### Is a blocked day the same as a booked day?

No, and treating them as the same is the classic mistake in Airbnb occupancy analysis. Airbnb does not distinguish a guest booking from an owner block. Use the market occupancy Actor if that distinction matters.

#### Do I need a Airbnb API key?

No. Airbnb Availability Calendar Scraper reads publicly available Airbnb pages and endpoints directly, so there is no key to obtain, no OAuth app to register, and no account to connect.

#### Can I export Airbnb data to CSV, Excel, or Google Sheets?

Yes. Every run stores results in an Apify dataset that exports to JSON, JSONL, CSV, Excel, XML, or HTML with one click, and the Google Sheets integration writes rows straight into a spreadsheet.

#### Can I run Airbnb Availability Calendar Scraper on a schedule?

Yes. Apify schedules run the Actor hourly, daily, weekly, or on any cron expression, and webhooks can notify your systems the moment a run finishes.

#### Is it legal to scrape Airbnb?

Scraping publicly available data is broadly lawful in the US and EU, but the answer depends on what you collect and how you use it. This Actor is built to gather public calendar information Airbnb publishes on public listing pages. Personal data carries extra obligations under GDPR and CCPA. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and take your own legal advice for your use case.

### Support and feedback

Found a bug, a missing field, or a Airbnb page shape this Actor does not handle yet? Open an issue from the **Issues** tab on the Actor page. Feature requests and custom-scraper enquiries are welcome there too.

# Actor input Schema

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

Full Airbnb listing URLs in the form https://www.airbnb.com/rooms/<id>. You may pass either this field, listingIds, or both.

## `listingIds` (type: `array`):

Airbnb numeric listing IDs as strings. Use this when you already have the IDs and want to skip URL parsing.

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

How many months of availability to return per listing, starting at startMonth/startYear. Range 1 to 12; defaults to 12.

## `startMonth` (type: `integer`):

Month of the first calendar month to return (1 to 12). Defaults to the current UTC month.

## `startYear` (type: `integer`):

Year of the first calendar month to return (e.g. 2026). Defaults to the current UTC year.

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

Three-letter ISO currency code for the priceFormatted field. Defaults to USD.

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

Locale tag passed to the Airbnb GraphQL endpoint (e.g. en-US, en-GB). Defaults to en-US.

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

Hard cap on the total number of calendar items returned. Leave 0 for no limit.

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

Apify Proxy is enabled by default. The Airbnb calendar endpoint is not anti-bot heavy, so the default group is sufficient.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.airbnb.com/rooms/12937"
    }
  ],
  "listingIds": [],
  "months": 12,
  "currency": "USD",
  "locale": "en-US",
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (type: `string`):

All listing calendars from the latest run.

## `itemsCsv` (type: `string`):

Overview table in CSV format.

## `itemsJson` (type: `string`):

Full JSON output including the `days` array per listing.

## `consoleRun` (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 = {
    "startUrls": [
        {
            "url": "https://www.airbnb.com/rooms/12937"
        }
    ],
    "listingIds": [],
    "months": 12,
    "currency": "USD",
    "locale": "en-US",
    "maxItems": 0,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/airbnb-availability-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 = {
    "startUrls": [{ "url": "https://www.airbnb.com/rooms/12937" }],
    "listingIds": [],
    "months": 12,
    "currency": "USD",
    "locale": "en-US",
    "maxItems": 0,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/airbnb-availability-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 '{
  "startUrls": [
    {
      "url": "https://www.airbnb.com/rooms/12937"
    }
  ],
  "listingIds": [],
  "months": 12,
  "currency": "USD",
  "locale": "en-US",
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cirkit/airbnb-availability-scraper --silent --output-dataset

```

## MCP server setup

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