# Airbnb Calendar & Availability Scraper (`integrative_tangent/airbnb-calendar-scraper`) Actor

Scrapes Airbnb calendar availability, pricing, and occupancy data for 1-12 months forward. Supports listing IDs, URLs, search URLs, bounding boxes, and location names.

- **URL**: https://apify.com/integrative\_tangent/airbnb-calendar-scraper.md
- **Developed by:** [Luis Segura](https://apify.com/integrative_tangent) (community)
- **Categories:** Travel, Real estate, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$0.30 / listing calendar scraped

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Calendar & Availability Scraper

**The fastest way to pull day-by-day Airbnb availability, pricing, and occupancy for any listing — or every listing in an entire city — directly into JSON, CSV, or your data pipeline.**

Most Airbnb scrapers only tell you what a listing looks like. This actor tells you **whether it's booked, how much it costs per night, and how full it is over the next 12 months** — the data that actually moves the needle for revenue estimation, investment analysis, and dynamic pricing.

### What you get

For every listing, the actor returns:

- **Day-by-day availability** (available / blocked) for 1–12 months forward
- **Nightly prices** in your chosen currency
- **Min / max night requirements** per date
- **Check-in / check-out eligibility** per date
- **Occupancy rate** (% of days blocked)
- **Average, minimum, and maximum nightly price**
- **Full listing metadata** when scraping by area (title, coordinates, room type, bedrooms, rating)

### Why use this actor

- **Bulk-capable** — point it at a bounding box or a city name and it will discover every listing in the area and pull its calendar. No per-listing manual work.
- **Precision-safe** — 19-digit Airbnb listing IDs are handled as strings throughout, so you never lose data to JavaScript number precision.
- **Adaptive rate limiting** — the actor speeds up when Airbnb is responsive and automatically backs off on HTTP 429 / 403, so long runs don't die halfway.
- **Session rotation built in** — Playwright rotates cookies automatically; you don't need to babysit expired sessions.
- **5 ways to define input** — direct IDs, URLs, search-page URLs, bounding boxes, or plain location names.
- **Ready for scheduling** — combine with an Apify schedule to run daily and detect new bookings by diffing the calendar over time.

### Input modes

| Mode  | Field        | Use case                                            |
| ----- | ------------ | --------------------------------------------------- |
| **A** | `listingIds` | You already know which listings to track           |
| **B** | `urls`       | Copy-paste listing URLs from your browser          |
| **C** | `searchUrl`  | Paste an Airbnb search page URL with map view      |
| **D** | `boundingBox`| Define a geographic rectangle by lat/lng corners   |
| **E** | `location`   | Just type "Punta Cana" or "Barcelona, Spain"       |

Provide **one** of these — the actor will resolve it to the listing IDs and pull calendars for each.

### Example inputs

#### Mode A — Specific listing IDs

```json
{
    "listingIds": ["1415214853332746816", "1060090216136524847"],
    "calendarMonths": 12,
    "currency": "USD"
}
````

#### Mode D — All listings in a bounding box

```json
{
    "boundingBox": {
        "ne_lat": 18.75,
        "ne_lng": -68.30,
        "sw_lat": 18.50,
        "sw_lng": -68.55
    },
    "calendarMonths": 6,
    "currency": "USD"
}
```

#### Mode E — An entire city by name

```json
{
    "location": "Las Terrenas, Dominican Republic",
    "calendarMonths": 12,
    "maxListings": 50
}
```

### Example output

One record per listing:

```json
{
    "listingId": "1415214853332746816",
    "title": "Brand New Beach Apartment with Private Pool",
    "url": "https://www.airbnb.com/rooms/1415214853332746816",
    "scrapedAt": "2026-04-09T14:30:00.000Z",
    "calendarMonths": 12,
    "location": { "lat": 18.6108, "lng": -68.7158 },
    "listingDetails": {
        "roomType": "Entire home",
        "bedrooms": 2,
        "bathrooms": 2,
        "maxGuests": 4,
        "rating": 4.92,
        "reviewCount": 138
    },
    "summary": {
        "totalDays": 365,
        "daysAvailable": 249,
        "daysBlocked": 116,
        "occupancyRate": 0.318,
        "avgNightlyPrice": 85.00,
        "minPrice": 65.00,
        "maxPrice": 150.00,
        "currency": "USD"
    },
    "calendar": [
        {
            "date": "2026-04-09",
            "available": false,
            "price": 85.00,
            "minNights": 2,
            "maxNights": 30,
            "checkinAllowed": false,
            "checkoutAllowed": true
        }
    ]
}
```

### Use cases

- **Revenue estimation** — multiply occupancy × average nightly price to project annual revenue
- **Competitor tracking** — monitor a set of rival listings and detect when they change pricing
- **Market research** — occupancy trends across neighborhoods, cities, or seasonal periods
- **Dynamic pricing** — feed prices back into a pricing-optimization model
- **Investment due diligence** — evaluate a property's short-term rental potential before purchase
- **Booking pace / demand tracking** — schedule daily runs and diff the calendar to see new bookings

### Performance

- \~2 listings/second at default rate (tunable up to 5/sec)
- 100 listings in ~1 minute
- 1,000 listings in ~10 minutes
- Memory: ~256 MB (Playwright is only used briefly for session setup)

### Proxy recommendations

For large runs, use **Apify Proxy with the residential group** for best reliability. The actor also works without a proxy for small runs or quick tests.

### Integrations

Results can be exported to JSON, CSV, Excel, or piped into Google Sheets, Zapier, Make, Slack, or any HTTP endpoint via the built-in Apify integrations.

### Pricing

This actor is priced per **1,000 calendar days** returned, so you only pay for data you actually receive. A single listing scraped for 12 months = 365 days ≈ one third of a unit. Failed or empty listings are not charged.

### Legal

Use this actor only for data that Airbnb makes publicly available. You are responsible for complying with Airbnb's Terms of Service and any applicable laws in your jurisdiction (including GDPR, CCPA, and local data-protection rules). This actor does not collect reviews, personal information about hosts, or any private data.

### Support

Found a bug or have a feature request? Open an issue on the actor's page or reach out through the Apify console. Pull requests and suggestions welcome.

# Actor input Schema

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

Airbnb listing IDs to scrape calendars for. Example: \["1415214853332746816", "1060090216136524847"]. Always provide as strings to avoid precision loss.

## `urls` (type: `array`):

Airbnb listing page URLs. Example: \["https://www.airbnb.com/rooms/1415214853332746816"]

## `searchUrl` (type: `string`):

An Airbnb search results page URL. The actor will extract the map bounding box and discover all listings in that area. Example: "https://www.airbnb.com/s/homes?ne\_lat=19.8\&ne\_lng=-70.35\&sw\_lat=19.72\&sw\_lng=-70.48\&search\_by\_map=true"

## `boundingBox` (type: `object`):

Geographic bounding box to search for listings. Provide as JSON: { "ne\_lat": 18.75, "ne\_lng": -68.30, "sw\_lat": 18.50, "sw\_lng": -68.55 }

## `location` (type: `string`):

Location name to search. The actor will resolve this to a geographic area. Example: "Las Terrenas, Dominican Republic"

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

Number of months of calendar data to scrape (1-12).

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

Currency code for pricing data.

## `maxListings` (type: `integer`):

Maximum number of listings to process. Set to 0 for unlimited. Useful for testing.

## `requestsPerSecond` (type: `number`):

Starting request rate. The actor adapts automatically — backs off on rate limits and speeds up when safe. Range: 0.5-5.

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

Configure proxy settings. Recommended: use Apify Proxy with residential group for best results.

## Actor input object example

```json
{
  "calendarMonths": 12,
  "currency": "USD",
  "maxListings": 0,
  "requestsPerSecond": 2
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("integrative_tangent/airbnb-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("integrative_tangent/airbnb-calendar-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call integrative_tangent/airbnb-calendar-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=integrative_tangent/airbnb-calendar-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Airbnb Calendar & Availability Scraper",
        "description": "Scrapes Airbnb calendar availability, pricing, and occupancy data for 1-12 months forward. Supports listing IDs, URLs, search URLs, bounding boxes, and location names.",
        "version": "1.0",
        "x-build-id": "LjmyOdyHrVFFiOkmn"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/integrative_tangent~airbnb-calendar-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-integrative_tangent-airbnb-calendar-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/integrative_tangent~airbnb-calendar-scraper/runs": {
            "post": {
                "operationId": "runs-sync-integrative_tangent-airbnb-calendar-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/integrative_tangent~airbnb-calendar-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-integrative_tangent-airbnb-calendar-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "listingIds": {
                        "title": "Listing IDs",
                        "type": "array",
                        "description": "Airbnb listing IDs to scrape calendars for. Example: [\"1415214853332746816\", \"1060090216136524847\"]. Always provide as strings to avoid precision loss.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "urls": {
                        "title": "Listing URLs",
                        "type": "array",
                        "description": "Airbnb listing page URLs. Example: [\"https://www.airbnb.com/rooms/1415214853332746816\"]",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchUrl": {
                        "title": "Search URL",
                        "type": "string",
                        "description": "An Airbnb search results page URL. The actor will extract the map bounding box and discover all listings in that area. Example: \"https://www.airbnb.com/s/homes?ne_lat=19.8&ne_lng=-70.35&sw_lat=19.72&sw_lng=-70.48&search_by_map=true\""
                    },
                    "boundingBox": {
                        "title": "Bounding Box",
                        "type": "object",
                        "description": "Geographic bounding box to search for listings. Provide as JSON: { \"ne_lat\": 18.75, \"ne_lng\": -68.30, \"sw_lat\": 18.50, \"sw_lng\": -68.55 }"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Location name to search. The actor will resolve this to a geographic area. Example: \"Las Terrenas, Dominican Republic\""
                    },
                    "calendarMonths": {
                        "title": "Calendar Months",
                        "minimum": 1,
                        "maximum": 12,
                        "type": "integer",
                        "description": "Number of months of calendar data to scrape (1-12).",
                        "default": 12
                    },
                    "currency": {
                        "title": "Currency",
                        "enum": [
                            "USD",
                            "EUR",
                            "GBP",
                            "CAD",
                            "AUD",
                            "MXN",
                            "DOP",
                            "BRL",
                            "COP"
                        ],
                        "type": "string",
                        "description": "Currency code for pricing data.",
                        "default": "USD"
                    },
                    "maxListings": {
                        "title": "Max Listings",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of listings to process. Set to 0 for unlimited. Useful for testing.",
                        "default": 0
                    },
                    "requestsPerSecond": {
                        "title": "Requests Per Second",
                        "minimum": 0.5,
                        "maximum": 5,
                        "type": "number",
                        "description": "Starting request rate. The actor adapts automatically — backs off on rate limits and speeds up when safe. Range: 0.5-5.",
                        "default": 2
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Configure proxy settings. Recommended: use Apify Proxy with residential group for best results."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
