# Airbnb Scraper — Listings, Prices & Availability/Occupancy (`ruslanzotkin/airbnb-str-scraper`) Actor

Scrape Airbnb listings by location: price/night, rating, reviews, coordinates, room type, photos — plus 365-day availability calendar for occupancy & revenue analysis. No API key.

- **URL**: https://apify.com/ruslanzotkin/airbnb-str-scraper.md
- **Developed by:** [Ruslan Zotkin](https://apify.com/ruslanzotkin) (community)
- **Categories:** E-commerce, Real estate, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 listings

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 Scraper — Listings, Prices & 365-Day Availability (Occupancy / STR Data)

Scrape **Airbnb** by location into clean, structured data — **price per night, rating, reviews, coordinates, room type, photos** — plus the **365-day availability calendar** for every listing, the raw input for **occupancy and revenue analysis**. No API key, no login.

Pay only for the results you get — no monthly subscription.

> 🏅 **Reliable availability, where others break.** Airbnb loads availability through an internal GraphQL API whose query hash **rotates** — HTTP-only scrapers go stale and return half-empty data. This actor harvests the current hash with a real browser, then fetches calendars over fast HTTP, so you get **complete 365-day availability** on every listing.

---

### ⚡ Two layers — pick what you pay for

| Layer | Turn on | What you get |
|---|---|---|
| **Listings** | default | Price/night, total, rating, reviews, coordinates, room type, photos, badges |
| **+ Availability** | `Scrape availability calendar = true` | 365-day calendar per listing: available vs booked days, **unavailable rate** (occupancy proxy), min nights, next check-in, month-by-month breakdown |

---

### 🎯 Why this scraper

- ✅ **Complete 365-day availability** — browser-harvested query hash + fast HTTP. Not the "occasionally blocked" partial data of HTTP-only tools.
- ✅ **Geo + occupancy ready** — coordinates and availability per listing → build heatmaps, occupancy %, revenue estimates by area.
- ✅ **Clean, typed data** — prices are numbers, dates are ISO, ready for analysis.
- ✅ **No API key, no login.** Pin currency and country.
- ✅ **Cost control** — hard `Max listings` cap.

---

### 📦 Output fields

#### Listing
| Field | Type | Description |
|---|---|---|
| `listingId` | string | Airbnb listing ID |
| `url` | string | Room URL |
| `name` | string | Listing title |
| `roomType` | string\|null | e.g. "1 bedroom", "Entire home" |
| `pricePerNight` | number\|null | Nightly price |
| `priceTotal` | number\|null | Total for the searched dates, if shown |
| `currency` | string | ISO currency |
| `rating` | number\|null | Average rating |
| `reviewsCount` | number\|null | Number of reviews |
| `latitude` / `longitude` | number\|null | Coordinates |
| `badges` | array | e.g. Guest favorite, Superhost |
| `image` | string\|null | Main photo |
| `scrapedAt` | string | ISO timestamp |

#### Availability (when enabled)
| Field | Type | Description |
|---|---|---|
| `horizonDays` | number | Days analyzed (~365) |
| `availableDays` | number | Open days |
| `unavailableDays` | number | Booked or host-blocked days |
| `unavailableRate` | number | Share unavailable (occupancy proxy, 0–1) |
| `minNights` | number\|null | Minimum stay |
| `nextAvailableCheckin` | string\|null | Next bookable check-in date |
| `byMonth` | object | `{ "2026-07": { available, unavailable } }` |

> ℹ️ `unavailableDays` combines **booked** and **host-blocked** days (Airbnb doesn't expose which). For true occupancy, schedule the actor and **diff availability over time** — days that flip available→unavailable near their date indicate bookings.

---

### 🛠️ Input

| Field | Type | Default | Description |
|---|---|---|---|
| `location` | string[] | `["Lisbon, Portugal"]` | Places to search, e.g. "Austin, TX" |
| `startUrls` | URL[] | — | Airbnb search (/s/) or room (/rooms/) URLs |
| `scrapeAvailability` | boolean | `false` | Fetch the 365-day calendar per listing |
| `maxItems` | integer | 50 | Cap on listings (caps cost) |
| `currency` | string | USD | ISO currency code |
| `adults` | integer | 2 | Guests (affects pricing) |
| `country` | string | US | Proxy/geolocation country (ISO-2) |

#### Example
```json
{
  "location": ["Lisbon, Portugal"],
  "scrapeAvailability": true,
  "maxItems": 100,
  "currency": "EUR"
}
````

***

### 💡 Use cases

- **Short-term rental (STR) market research** — occupancy proxy, price distribution, supply by area.
- **Airbnb investment analysis** — estimate revenue (price × booked nights) for a city/zip before buying.
- **Host pricing & competition** — benchmark nearby listings' prices and availability.
- **Geo / heatmaps** — coordinates + price + occupancy per listing.

### 💵 Pricing

Pay-per-event, all platform & proxy costs included:

- **Listing** (`listing-scraped`)
- **Availability calendar** (`listing-availability-scraped`)

### ❓ FAQ

**Need an API key?** No.
**Why is availability reliable here?** A real browser harvests Airbnb's rotating query hash; data is then fetched over fast HTTP. HTTP-only scrapers break when the hash rotates.
**True occupancy?** `unavailableRate` is a proxy; schedule + diff over time to separate bookings from host blocks.
**Is scraping Airbnb legal?** This extracts only public listing data. Comply with Airbnb's Terms and local law (GDPR/CCPA); no personal data is collected.

### 🛟 Support

Open an issue with your run ID for bugs or field requests.

# Actor input Schema

## `location` (type: `array`):

Places to search on Airbnb, e.g. "Lisbon, Portugal" or "Austin, TX". Each is searched separately.

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

Airbnb search URLs (/s/...) or room URLs (/rooms/123). Use instead of, or together with, Locations.

## `scrapeAvailability` (type: `boolean`):

For each listing, fetch the 365-day availability calendar (available/booked days, min nights, next check-in) for occupancy & revenue analysis. Costs more per listing.

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

Maximum number of listings to return (caps your cost).

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

ISO currency code for prices (USD, EUR, GBP…).

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

Number of adults in the search (affects pricing).

## `country` (type: `string`):

Residential proxy country, e.g. US, GB, DE. Affects geolocation/availability.

## Actor input object example

```json
{
  "location": [
    "Lisbon, Portugal"
  ],
  "scrapeAvailability": false,
  "maxItems": 50,
  "currency": "USD",
  "adults": 2,
  "country": "US"
}
```

# Actor output Schema

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

Airbnb listings (with optional 365-day availability) in the default dataset.

# 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 = {
    "location": [
        "Lisbon, Portugal"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("ruslanzotkin/airbnb-str-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 = {
    "location": ["Lisbon, Portugal"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("ruslanzotkin/airbnb-str-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 '{
  "location": [
    "Lisbon, Portugal"
  ],
  "maxItems": 50
}' |
apify call ruslanzotkin/airbnb-str-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Airbnb Scraper — Listings, Prices & Availability/Occupancy",
        "description": "Scrape Airbnb listings by location: price/night, rating, reviews, coordinates, room type, photos — plus 365-day availability calendar for occupancy & revenue analysis. No API key.",
        "version": "0.1",
        "x-build-id": "dacz7Mp7TbGMnjINs"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ruslanzotkin~airbnb-str-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ruslanzotkin-airbnb-str-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/ruslanzotkin~airbnb-str-scraper/runs": {
            "post": {
                "operationId": "runs-sync-ruslanzotkin-airbnb-str-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/ruslanzotkin~airbnb-str-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-ruslanzotkin-airbnb-str-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": {
                    "location": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Places to search on Airbnb, e.g. \"Lisbon, Portugal\" or \"Austin, TX\". Each is searched separately.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs (search or room)",
                        "type": "array",
                        "description": "Airbnb search URLs (/s/...) or room URLs (/rooms/123). Use instead of, or together with, Locations.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "scrapeAvailability": {
                        "title": "Scrape availability calendar (365 days)",
                        "type": "boolean",
                        "description": "For each listing, fetch the 365-day availability calendar (available/booked days, min nights, next check-in) for occupancy & revenue analysis. Costs more per listing.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max listings",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of listings to return (caps your cost).",
                        "default": 50
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "ISO currency code for prices (USD, EUR, GBP…).",
                        "default": "USD"
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of adults in the search (affects pricing).",
                        "default": 2
                    },
                    "country": {
                        "title": "Proxy country (ISO-2)",
                        "type": "string",
                        "description": "Residential proxy country, e.g. US, GB, DE. Affects geolocation/availability.",
                        "default": "US"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
