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

Scrape Airbnb listing availability calendars: day-by-day booking status, minimum/maximum nights, and optional live pricing with local-currency support and rolling date ranges.

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

## Pricing

from $2.50 / 1,000 standards

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/platform/actors/running/actors-in-store#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 the **Airbnb availability calendar** for any listing: day-by-day booking status, minimum/maximum nights, and check-in/check-out eligibility, with optional live nightly pricing.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Point it at any Airbnb listing URL and get a full day-by-day calendar back — plus, unlike other Airbnb calendar scrapers, rolling date ranges (today + N days) and pricing in your own local currency.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/airbnb-availability-calendar-scraper on Apify. Call it with the apify-client SDK: `client.actor("parsebird/airbnb-availability-calendar-scraper").call(run_input={"listingUrl": "https://www.airbnb.com/rooms/860663943931949474", "startDate": "+7", "endDate": "+37", "enrichWithPricing": True, "currency": "EUR"})`. Inputs: listingUrl (string, required, Airbnb listing URL or numeric ID), startDate/endDate (string, YYYY-MM-DD or rolling offset like "+7" for today+7 days, default today / today+3 months), enrichWithPricing (boolean, default false), currency (string, ISO 4217 code, default USD), proxyConfiguration (object, default Apify Proxy on). Output dataset fields: listingId, date, available, availableForCheckin, availableForCheckout, bookable, minNights, maxNights, month, year, scrapedAt, plus nightlyRate, nightlyRateFormatted, totalPrice, priceFormatted, taxes, taxesFormatted, maxGuests, canInstantBook, cancellationPolicy when enrichWithPricing is true. Full API spec: https://apify.com/parsebird/airbnb-availability-calendar-scraper/api. Get an API token at https://console.apify.com/account/integrations.
```

### What does Airbnb Availability Calendar Scraper do?

**Airbnb Availability Calendar Scraper** extracts the day-by-day booking calendar shown on any [Airbnb](https://www.airbnb.com) listing page — the same data a guest sees when they open the date picker — without opening a browser or clicking through months by hand. Paste a listing URL or ID and get every date in your chosen range back as structured data: whether it's available, whether check-in or check-out is allowed on that date, and the host's minimum/maximum night requirements.

Turn on **pricing enrichment** and the actor also fetches the live nightly rate, total price, taxes, maximum guest capacity, instant-book eligibility, and cancellation policy for every bookable date — priced in the currency of your choice, not just USD or GBP.

- 📅 Full day-by-day availability calendar for any public Airbnb listing
- 💶 Live pricing in any ISO currency (EUR, GBP, JPY, and more) — a local-currency option most Airbnb calendar scrapers don't offer
- ⏩ Rolling date ranges like "today + 7 days" alongside exact YYYY-MM-DD dates, so scheduled runs always look the right number of days ahead
- 🔁 Runs on a [schedule](https://docs.apify.com/platform/schedules) to track availability and pricing changes over time
- 🔌 Full [API](https://docs.apify.com/api/v2), Python and JavaScript SDKs, and [integrations](https://apify.com/integrations) with Zapier, Make, and Google Sheets
- 📤 Export results as JSON, CSV, Excel, HTML, or XML directly from the Apify Console

### What data can you extract from an Airbnb calendar?

| Field | Description |
|-------|-------------|
| `listingId` | Airbnb listing ID |
| `date` | Calendar date (YYYY-MM-DD) |
| `available` | Whether the date is available for booking |
| `availableForCheckin` | Whether check-in is allowed on this date |
| `availableForCheckout` | Whether check-out is allowed on this date |
| `bookable` | Whether the date can be booked |
| `minNights` | Minimum nights required for a stay starting on this date |
| `maxNights` | Maximum nights allowed |
| `month` / `year` | Calendar month and year |
| `scrapedAt` | ISO timestamp of when the date was scraped |

With `enrichWithPricing` enabled, every bookable date also includes:

| Field | Description |
|-------|-------------|
| `nightlyRate` / `nightlyRateFormatted` | Base nightly price, numeric and currency-formatted |
| `totalPrice` / `priceFormatted` | Total price for the stay, numeric and currency-formatted |
| `taxes` / `taxesFormatted` | Tax amount, when Airbnb breaks it out separately |
| `maxGuests` | Maximum guest capacity for the listing |
| `canInstantBook` | Whether Instant Book is available |
| `cancellationPolicy` | The host's cancellation policy for that stay |

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| listingUrl | string | **Yes** | — | Airbnb listing URL (e.g. `https://www.airbnb.com/rooms/860663943931949474`) or the numeric listing ID |
| startDate | string | No | today | `YYYY-MM-DD`, or a rolling offset like `+7` (today + 7 days) |
| endDate | string | No | start + 3 months | `YYYY-MM-DD`, or a rolling offset like `+90` (today + 90 days). Airbnb exposes at most 12 months of calendar from today |
| enrichWithPricing | boolean | No | false | Fetch nightly rate, total price, taxes, and booking details for every bookable date |
| currency | string | No | USD | ISO 4217 currency code to price results in (EUR, GBP, JPY, …) |
| proxyConfiguration | object | No | Apify Proxy on | Use Apify Proxy so requests come from residential-style IPs |

### How to scrape an Airbnb availability calendar

1. Open [Airbnb Availability Calendar Scraper](https://apify.com/parsebird/airbnb-availability-calendar-scraper) on Apify and click **Try for free**.
2. Paste the Airbnb listing URL (or just its numeric ID) into **Airbnb listing URL or ID**.
3. Set a **Start date** and **End date** — exact dates, or rolling offsets such as `+7` and `+37`.
4. Toggle **Enrich with pricing** on if you need nightly rates and total prices, and set a **Currency** if you want prices in something other than USD.
5. Click **Start** and open the **Dataset** tab when the run finishes to view, filter, or export the results.

### Output example

Without pricing (`enrichWithPricing: false`):

```json
{
  "listingId": "860663943931949474",
  "date": "2025-12-07",
  "available": true,
  "availableForCheckin": true,
  "availableForCheckout": false,
  "bookable": true,
  "minNights": 1,
  "maxNights": 1125,
  "month": 12,
  "year": 2025,
  "scrapedAt": "2025-11-26T17:30:00.000Z"
}
```

With pricing (`enrichWithPricing: true`):

```json
{
  "listingId": "860663943931949474",
  "date": "2025-12-07",
  "available": true,
  "availableForCheckin": true,
  "availableForCheckout": false,
  "bookable": true,
  "minNights": 1,
  "maxNights": 1125,
  "nightlyRate": 48.34,
  "nightlyRateFormatted": "£48.34",
  "totalPrice": 65.03,
  "priceFormatted": "£65.03",
  "taxes": 7.85,
  "taxesFormatted": "£7.85",
  "maxGuests": 2,
  "canInstantBook": false,
  "cancellationPolicy": "Free cancellation before 6 December",
  "month": 12,
  "year": 2025,
  "scrapedAt": "2025-11-26T17:30:00.000Z"
}
```

Download results in JSON, CSV, Excel, HTML, or XML from the **Dataset** tab, or pull them programmatically via the [Apify API](https://docs.apify.com/api/v2).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/airbnb-availability-calendar-scraper").call(run_input={
    "listingUrl": "https://www.airbnb.com/rooms/860663943931949474",
    "startDate": "+7",
    "endDate": "+37",
    "enrichWithPricing": True,
    "currency": "EUR",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('parsebird/airbnb-availability-calendar-scraper').call({
    listingUrl: 'https://www.airbnb.com/rooms/860663943931949474',
    startDate: '+7',
    endDate: '+37',
    enrichWithPricing: true,
    currency: 'EUR',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### How it works

1. **Calendar fetch** — Fetches Airbnb's own availability calendar for the listing, covering every month from today out to Airbnb's 12-month booking horizon.
2. **Date filtering** — Filters the calendar down to the exact start/end date range you asked for, resolving rolling offsets (`+7`, `+30`, …) against today's date.
3. **Pricing fetch (optional)** — When `enrichWithPricing` is on, the actor fetches detailed pricing for every date where check-in is allowed. It requests a stay matching the listing's own `minNights` requirement (e.g. a 2-night quote if `minNights` is 2) and computes the per-night rate from that quote, so pricing always respects the host's minimum-stay rules instead of guessing a 1-night rate that isn't actually bookable.

#### Rolling dates and local currency

Two things guests and analysts commonly ask Airbnb calendar tools for — and this actor supports both:

- **Rolling date ranges**: instead of hardcoding `startDate`/`endDate` and having to update them before every run, set them to offsets like `+7` and `+37`. Every scheduled run automatically looks the same number of days ahead from *today*, so a weekly schedule always checks "next week through six weeks out" without any manual date edits.
- **Local currency pricing**: set `currency` to any ISO 4217 code (EUR, GBP, JPY, CAD, …) and pricing enrichment returns nightly rates and totals in that currency instead of being locked to USD or GBP.

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

Airbnb Availability Calendar Scraper uses Apify's [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing) pricing — you pay only for the calendar dates returned, not for compute time.

| Mode | Event | Free | Bronze | Silver | Gold |
|------|-------|------|--------|--------|------|
| Availability only | `availability-scraped` | $2.90 / 1,000 | $2.80 / 1,000 | $2.70 / 1,000 | $2.50 / 1,000 |
| With pricing | `availability-priced` | $8.00 / 1,000 | $7.50 / 1,000 | $7.00 / 1,000 | $6.50 / 1,000 |

A 3-month calendar (≈90 dates) without pricing costs a few cents; the same run with pricing enrichment costs under $1. New Apify accounts include free monthly platform credits, so you can try the availability-only mode at no cost before enabling pricing enrichment.

### Is it legal to scrape Airbnb?

Scraping publicly available data — like the availability calendar shown on any public Airbnb listing page — is generally considered legal, but the specifics depend on your jurisdiction and how you use the data. Avoid scraping data behind a login, personal or sensitive information, and always review Airbnb's [Terms of Service](https://www.airbnb.com/terms) before large-scale use. See Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) for more detail. This actor only reads calendar data Airbnb already serves to any visitor of a listing page.

### Related Airbnb & travel scrapers

- [GetYourGuide Tours & Activities Scraper](https://apify.com/parsebird/getyourguide-scraper) — prices, ratings, and highlights for tours and activities
- [GetYourGuide Review Scraper](https://apify.com/parsebird/getyourguide-review-scraper) — guest reviews for any GetYourGuide activity
- [Kayak Car Rental Scraper](https://apify.com/parsebird/kayak-car-rental-scraper) — car rental offers, prices, and cancellation terms from Kayak

### FAQ

**How far ahead can I scrape availability?**
Airbnb only exposes 12 months of calendar data from today for any listing. If `endDate` (or a rolling offset) goes beyond that, the actor automatically clamps it to the furthest date Airbnb makes available and logs a warning.

**What does the rolling date format look like?**
Use `+N` (e.g. `+7`, `+30`, `+90`) in `startDate` or `endDate` to mean "today plus N days." You can also use `+7d`. Leave either field blank to default to today (`startDate`) or three months after the start date (`endDate`).

**Can I get prices in my own currency instead of USD or GBP?**
Yes. Set `currency` to any ISO 4217 code — EUR, GBP, JPY, CAD, AUD, and more — and every pricing field in the output is returned in that currency.

**Why are some dates missing pricing fields even with enrichWithPricing on?**
Pricing is only fetched for dates where check-in is allowed (`availableForCheckin: true`). Blocked dates and checkout-only dates return availability fields alone, since Airbnb has no bookable stay to price on those days.

**Why don't all currencies show a `taxes` value?**
Airbnb only breaks out a separate tax line for some listings and currencies. When it doesn't, `taxes` and `taxesFormatted` are returned as `null` rather than a guessed value.

**Does this work for any Airbnb listing?**
Yes — pass any public Airbnb listing URL or numeric ID. Delisted, private, or removed listings return no data along with a clear error message.

**Can I automate recurring runs?**
Yes. Use Apify's [Scheduler](https://docs.apify.com/platform/schedules) to run this actor daily, weekly, or on any cron interval — combine it with rolling dates so every run automatically covers the same forward-looking window.

**Is there API access?**
Yes. Every run is available through the [Apify API](https://docs.apify.com/api/v2), the Python and JavaScript SDKs shown above, and Apify's [MCP server](https://docs.apify.com/platform/integrations/mcp) for LLM agents.

**Something not working, or have a feature request?**
Open an issue on the actor's Issues tab — response times are shown on the actor page, and feedback directly shapes what gets built next.

# Actor input Schema

## `listingUrl` (type: `string`):

Paste a full Airbnb listing URL (e.g. https://www.airbnb.com/rooms/860663943931949474) or just the numeric listing ID.

## `startDate` (type: `string`):

Exact date as YYYY-MM-DD, or a rolling offset from today such as +7 (today + 7 days) or +30 (today + 30 days). Leave blank to default to today.

## `endDate` (type: `string`):

Exact date as YYYY-MM-DD, or a rolling offset from today such as +90 (today + 90 days). Leave blank to default to 3 months after the start date. Airbnb only exposes availability up to 12 months out.

## `enrichWithPricing` (type: `boolean`):

Fetch nightly rate, total price, taxes, and booking details for every bookable date. Slower and billed at a higher rate per date than availability alone.

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

3-letter ISO 4217 currency code to display prices in (e.g. USD, EUR, GBP, JPY). Leave blank to default to USD.

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

Use Apify Proxy so Airbnb sees requests from residential IPs instead of datacenter IPs.

## Actor input object example

```json
{
  "listingUrl": "https://www.airbnb.com/rooms/860663943931949474",
  "enrichWithPricing": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "listingUrl": "https://www.airbnb.com/rooms/860663943931949474",
    "startDate": "",
    "endDate": "",
    "currency": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "listingUrl": "https://www.airbnb.com/rooms/860663943931949474",
    "startDate": "",
    "endDate": "",
    "currency": "",
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "listingUrl": "https://www.airbnb.com/rooms/860663943931949474",
  "startDate": "",
  "endDate": "",
  "currency": ""
}' |
apify call parsebird/airbnb-availability-calendar-scraper --silent --output-dataset

```

## MCP server setup

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