# Airbnb Scraper — Calendar, Availability, Prices & Reviews (`k1ra/airbnb-scraper`) Actor

Search Airbnb by city and get complete, verified data — no login. Real-location validation (never pays for generic results), full map-grid coverage past the 270-listing cap, exact prices, host profiles, per-day calendar (12mo), guest reviews, and new-listing monitoring for scheduled runs.

- **URL**: https://apify.com/k1ra/airbnb-scraper.md
- **Developed by:** [Kevin Savani](https://apify.com/k1ra) (community)
- **Categories:**
- **Stats:** 1 total users, 0 monthly users, 94.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper — Calendar, Availability, Prices & Reviews

Search Airbnb by city, neighborhood, or map area and get **complete, verified listing data** — no login, no cookies, no account risk. Real prices with dates, per-day availability calendars up to 12 months out, guest reviews, host profiles, and full-city coverage past Airbnb's ~270-listing search cap. Use it as an Airbnb calendar scraper, an availability scraper, a bulk/full-coverage listings scraper, or a new-listing monitor for scheduled market alerts.

***

### Use Cases

#### Airbnb Calendar Scraper

Fetch per-day availability up to 12 months ahead — available, check-in allowed, and minimum-nights for every date. Run it as an **Airbnb calendar scraper** to model occupancy, spot open windows for a specific stay length, or feed a dynamic-pricing model with real availability data.

#### Airbnb Availability Scraper

Combine `calendarMonths` with `checkIn`/`checkOut` to check exact-date availability and pricing together — an **Airbnb availability scraper** that tells you not just whether a listing is bookable on your dates, but what it actually costs.

#### Airbnb Price Scraper with Real, Dated Totals

Airbnb has no dateless nightly rate. Set `checkIn`/`checkOut` and guest counts to get the **exact stay total** — nightly rate, cleaning fee, taxes, and discounts broken out line by line, in your chosen currency. A true **Airbnb price scraper**, not a rounded estimate.

#### Full-City Airbnb Scraper Past the 270-Listing Cap

A single Airbnb search maxes out at ~270 results. Enable `fullCoverage` and the resolved map area is recursively split into sub-areas until every listing is collected — a **bulk Airbnb scraper** built for short-term-rental supply analysis across an entire city.

#### Airbnb Monitor for New-Listing Alerts

Schedule this actor with `onlyNewListings` and a `monitoringId` and it becomes an **Airbnb monitor** — only listings never seen in a previous run for that market are returned, so you get alerted the moment new supply appears in an area you track.

#### Airbnb Host Data Scraper

Every enriched listing includes the host's name, Superhost status, rating, review count, months hosting, profile URL, and bio — an **Airbnb host data scraper** for vetting hosts at scale or studying who's operating in a market.

#### Vacation Rental Market Research

Search any city or neighborhood and pull prices, ratings, badges, host data, and availability for the whole local supply — built for **short-term-rental investment research**, competitor pricing for property managers, and academic market studies.

#### No-Login Airbnb Scraper

No account, cookies, or session tokens required. Every listing `id` and `url` is verified to resolve to a real `/rooms/…` page, and a location that Airbnb can't resolve **fails loudly instead of silently charging you for generic results** from the wrong place.

***

### Who Uses This

| Use Case | Who It's For |
|---|---|
| STR supply & pricing analysis across a whole city | Property managers, real-estate investors |
| Dynamic-pricing and revenue-management inputs | Pricing tool builders, revenue managers |
| New-listing alerts for a market | Market researchers, competitive intel teams |
| Host and listing vetting | Due-diligence, compliance, and research teams |
| Travel deal and price-drop monitoring | Travel agents, deal-alert builders |
| Academic and market-sizing research | Analysts, researchers |

***

### What's New

**Initial release**

- Full-city coverage past Airbnb's ~270-listing search cap via recursive map-grid splitting.
- Real, dated price breakdowns (nightly rate, cleaning fee, taxes, discounts).
- Per-day availability calendars up to 12 months out.
- New-listing monitoring mode for scheduled market alerts.

***

### Output

```json
{
  "id": "8272629",
  "url": "https://www.airbnb.com/rooms/8272629",
  "name": "Eastside Bungalow - Keep Austin Cozy!",
  "title": "Guesthouse in Austin",
  "coordinates": { "latitude": 30.26, "longitude": -97.71 },
  "price": {
    "display": "$604",
    "qualifier": "for 5 nights",
    "breakdown": [
      { "description": "5 nights x $120.65", "price": "$603.23" }
    ]
  },
  "rating": { "value": 4.96, "count": 262 },
  "badges": ["Guest favorite"],
  "photos": ["https://a0.muscache.com/im/pictures/…"],
  "resolvedLocation": "Austin, TX",
  "searchQuery": "Austin, Texas"
}
```

With `includeDetails` each listing adds: full `description`, all `images`, `host` (name, Superhost status, rating, review count, months hosting, profile URL, about), `houseRules`, `personCapacity`, and cancellation policy details.

With `calendarMonths` each listing adds a `calendar` array of per-day availability. With `includeReviews`, a `reviews` array with reviewer, rating, date, and host responses.

Fields are properly typed, and a listing whose detail fetch fails still ships with its core search fields plus a `detailError` note — the run never crashes on one bad listing.

***

### How to Use

**1.** In the **Input** tab, add one or more `locationQueries` (cities, neighborhoods, or areas) and/or `startUrls` for specific listings.

**2.** Set `checkIn`/`checkOut` and guest counts if you want real dated prices; enable `includeDetails`, `calendarMonths`, or `includeReviews` for enrichment.

**3.** Click **Start** — results stream into the **Dataset** tab as each location and listing completes.

**Input format:**

| Field | Type | Example |
|---|---|---|
| `locationQueries` | array of strings | `["Austin, Texas"]` |
| `startUrls` | array of URL objects | `[{ "url": "https://www.airbnb.com/rooms/48145872" }]` |
| `checkIn` / `checkOut` | `YYYY-MM-DD` string | `"2026-10-05"` / `"2026-10-10"` |
| `adults` / `children` / `infants` / `pets` | integer | `2` |
| `maxItems` | integer | `100` |
| `fullCoverage` | boolean | `true` |
| `includeDetails` | boolean | `true` |
| `calendarMonths` | integer, 0-12 | `6` |
| `includeReviews` | boolean | `true` |
| `onlyNewListings` + `monitoringId` | boolean + string | `true` + `"joshua-tree"` |
| `currency` / `locale` | select | `"USD"` / `"en"` |

**Market snapshot with real prices:**

```json
{
  "locationQueries": ["Austin, Texas"],
  "checkIn": "2026-10-05", "checkOut": "2026-10-10", "adults": 2,
  "maxItems": 100, "includeDetails": true
}
```

**Every listing in a city (STR supply analysis):**

```json
{
  "locationQueries": ["Austin, Texas"],
  "fullCoverage": true, "maxItems": 5000
}
```

**New-listing alerts (schedule daily):**

```json
{
  "locationQueries": ["Joshua Tree, California"],
  "onlyNewListings": true, "monitoringId": "joshua-tree"
}
```

**Specific listings by URL:**

```json
{
  "startUrls": [{ "url": "https://www.airbnb.com/rooms/48145872" }],
  "checkIn": "2026-10-05", "checkOut": "2026-10-10",
  "calendarMonths": 6, "includeReviews": true
}
```

***

### Proxy

The actor comes with a built-in proxy that works out of the box — no configuration needed. Just run it.

***

### Pricing

**$2 per 1,000 listings scraped ($0.002 per listing).**

You're charged only for listings actually returned — a location Airbnb can't resolve **fails the run instead of billing you for generic results** from the wrong place.

| Listings scraped | Estimated cost |
|---|---|
| 100 | ~$0.20 |
| 1,000 | ~$2.00 |
| 10,000 | ~$20.00 |

***

### Schedule & Automate

Use Apify's built-in **Scheduler** to run this actor on a cron — daily, weekly, or hourly — for new-listing monitoring or recurring market snapshots. Connect the dataset to Google Sheets, Zapier, Make, or any webhook via the Apify API.

***

### Integrations & Automation

Plugs into the entire Apify integrations ecosystem and any tool that speaks HTTP:

- **Make** ([docs](https://docs.apify.com/platform/integrations/make)) — trigger Airbnb searches from any Make scenario.
- **Zapier** ([docs](https://docs.apify.com/platform/integrations/zapier)) — pipe listings into CRMs, alerts, or spreadsheets.
- **Google Sheets** — auto-export every run's dataset to a live market-tracking Sheet.
- **Slack** ([docs](https://docs.apify.com/platform/integrations/slack)) — get notified when a scheduled monitoring run finds new listings.
- **Airbyte** ([docs](https://docs.apify.com/platform/integrations/airbyte)) — sync listings to your data warehouse (Snowflake, BigQuery, Redshift, Postgres).
- **Apify API** — full programmatic control via the [`apify-client`](https://docs.apify.com/api/v2) SDKs for Node.js and Python, or direct REST calls.
- **Webhooks** ([docs](https://docs.apify.com/platform/integrations/webhooks)) — fire an HTTP endpoint when a run finishes, fails, or finds new listings.

Strict input schema and fail-loud location validation make this a safe building block for agent and MCP pipelines — a failed location never produces silent junk data.

***

### Honest Limitations

- **Prices require dates.** Without `checkIn`/`checkOut`, listings are returned without stay totals — Airbnb itself has no dateless price.
- **Host contact details (phone/email) are login-walled by Airbnb** and out of scope.
- Currency and language are pinned via `currency`/`locale` inputs, independent of proxy location.

***

### FAQ

**Do I need to log in or provide cookies?**
No. The actor works with no Airbnb account, cookies, or session tokens.

**What happens if I misspell a city or search somewhere Airbnb can't resolve?**
The run fails loudly with a clear error instead of silently returning generic listings from the wrong place — every `locationQuery` is validated against Airbnb's own resolved geography.

**Can I get every listing in a city, not just the first ~270?**
Yes. Enable `fullCoverage` — the resolved map area is recursively split into sub-areas until every listing in it is collected.

**Does it return real prices, or estimates?**
Real, dated totals. Set `checkIn`/`checkOut` and guest counts and each listing returns the exact nightly rate, cleaning fee, taxes, discounts, and stay total in your chosen currency.

**Can I get availability without booking dates?**
Yes — set `calendarMonths` (up to 12) to get a per-day calendar of availability, check-in eligibility, and minimum nights, independent of `checkIn`/`checkOut`.

**Can I monitor a market for new listings?**
Yes. Enable `onlyNewListings` with a `monitoringId` and schedule the actor — each run returns only listings never seen before under that monitor.

**Does it return guest reviews and host information?**
Yes, with `includeDetails` and `includeReviews` enabled: host name, Superhost status, rating, review count, months hosting, profile URL, bio, and a list of guest reviews with reviewer, rating, date, and host responses.

**Can I scrape specific listings by URL instead of searching?**
Yes — pass `startUrls` with Airbnb room URLs, in addition to or instead of `locationQueries`.

**Do I need my own proxy?**
No. The actor works out of the box — a built-in proxy handles it automatically. No setup or configuration required.

**Can I export results to a spreadsheet?**
Yes. After the run completes, go to **Storage** → **Dataset** → **Export** → choose CSV, Excel, or JSON, or auto-export to Google Sheets via the Apify integration.

**Can I run this via API?**
Yes — use the Apify API or the official Node.js/Python SDKs to trigger runs and retrieve results programmatically.

**Is it legal to scrape public Airbnb listings?**
The actor only extracts **publicly available listing data** — what Airbnb displays to any visitor without an account. It does not bypass login walls or extract private guest/host information. You are responsible for compliance with Airbnb's Terms of Service and applicable laws when using the extracted data.

***

### ⭐ Bookmark This Actor & Leave a Review

If this actor saves you time:

- **⭐ Click the star** at the top of the actor page to bookmark it — it makes the actor easier for you to find later and helps other Apify users discover it.
- **📝 Leave a review** — even one sentence on what you use it for helps prioritize the next feature.

Your bookmarks and reviews directly improve this actor's discoverability across the Apify Store.

***

### Related Apify Actors

Looking for more scraping power? You may also like:

- [Airbnb Scrapers](https://apify.com/store?search=airbnb%20scraper) — the full catalog of Airbnb data actors
- [Travel & Hospitality Scrapers](https://apify.com/store?category=TRAVEL) — booking sites, flights, and hotel data
- [Real Estate Scrapers](https://apify.com/store?category=REAL_ESTATE) — listings, valuations, and property data across platforms

***

### Support & Feedback

Found a bug or want a new field or input option supported?

- **Open an issue** on the actor's Issues tab in the Apify Console.
- **Feature requests** are welcome — especially for new enrichment fields or search filters.

# Actor input Schema

## `locationQueries` (type: `array`):

Cities, neighborhoods, or areas to search (e.g. 'Austin, Texas', 'Paris 11e', 'Lake Tahoe'). Each location is validated against Airbnb's resolved geography — unresolvable locations fail loudly instead of returning generic listings.

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

Airbnb room URLs (https://www.airbnb.com/rooms/12345) to scrape directly, in addition to or instead of location searches.

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

YYYY-MM-DD. Airbnb has no dateless nightly rate — set check-in/checkout to get real stay totals with the full price breakdown.

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

YYYY-MM-DD. Required together with check-in for pricing.

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

Guest count used for search and pricing.

## `children` (type: `integer`):

Children count for pricing accuracy.

## `infants` (type: `integer`):

Infant count for pricing accuracy.

## `pets` (type: `integer`):

Pet count — also filters out listings that don't allow pets.

## `priceMin` (type: `integer`):

Native Airbnb price filter, in the selected currency.

## `priceMax` (type: `integer`):

Native Airbnb price filter, in the selected currency.

## `minBeds` (type: `integer`):

Minimum number of beds.

## `minBedrooms` (type: `integer`):

Minimum number of bedrooms.

## `minBathrooms` (type: `integer`):

Minimum number of bathrooms.

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

Prices are pinned to this currency regardless of proxy location.

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

Language for titles, descriptions, and reviews.

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

Cap per location query. One Airbnb search returns at most ~270 listings — enable Full coverage to go past that.

## `fullCoverage` (type: `boolean`):

Go past Airbnb's ~270-listings-per-search cap by recursively splitting the resolved map area into sub-areas until every listing is collected. Slower; combine with a high Max listings.

## `includeDetails` (type: `boolean`):

Fetch each listing's page: description, all images, host profile (name, Superhost, rating, months hosting), house rules, capacity — plus the exact stay price breakdown and cancellation policies when dates are set.

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

Fetch per-day availability (available / check-in allowed / min nights) this many months ahead (0 = off, max 12).

## `includeReviews` (type: `boolean`):

Fetch guest reviews for each listing.

## `maxReviews` (type: `integer`):

Cap on reviews fetched per listing.

## `reviewsSort` (type: `string`):

Order in which reviews are fetched.

## `onlyNewListings` (type: `boolean`):

Output only listings never seen in previous runs with the same Monitoring ID — schedule this actor to get alerted the moment new listings appear.

## `monitoringId` (type: `string`):

Separates the seen-listings memory of different monitors (one per market you track).

## Actor input object example

```json
{
  "locationQueries": [
    "Austin, Texas"
  ],
  "adults": 1,
  "currency": "USD",
  "locale": "en",
  "maxItems": 100,
  "fullCoverage": false,
  "includeDetails": false,
  "calendarMonths": 0,
  "includeReviews": false,
  "maxReviews": 24,
  "reviewsSort": "MOST_RECENT",
  "onlyNewListings": false
}
```

# Actor output Schema

## `id` (type: `string`):

Airbnb's stable listing id.

## `url` (type: `string`):

Public /rooms/ URL, verified to resolve.

## `name` (type: `string`):

Host-given listing name.

## `title` (type: `string`):

Property type/summary (e.g. 'Guesthouse in Austin').

## `coordinates` (type: `string`):

Latitude/longitude.

## `price` (type: `string`):

Display price, qualifier, and line-item breakdown when dates are set.

## `rating` (type: `string`):

Aggregate rating value and review count.

## `badges` (type: `string`):

Airbnb badges (e.g. 'Guest favorite', 'Superhost').

## `photos` (type: `string`):

Listing photo URLs.

## `resolvedLocation` (type: `string`):

The location this listing matched, as Airbnb resolved it.

## `searchQuery` (type: `string`):

The input locationQuery this listing came from.

## `description` (type: `string`):

Full listing description. Included with Include full details.

## `images` (type: `string`):

All listing images. Included with Include full details.

## `host` (type: `string`):

Host name, Superhost status, rating, months hosting, profile URL, about. Included with Include full details.

## `houseRules` (type: `string`):

Host-listed house rules. Included with Include full details.

## `personCapacity` (type: `string`):

Max guests. Included with Include full details.

## `cancellationPolicies` (type: `string`):

Cancellation policy name + details. Included with Include full details.

## `calendar` (type: `string`):

Per-day availability, check-in eligibility, and minimum nights. Included with Calendar months.

## `reviews` (type: `string`):

Guest reviews with reviewer, rating, date, and host response. Included with Include reviews.

## `detailError` (type: `string`):

Present only when this listing's detail/calendar/reviews fetch failed; core search fields are still returned.

# 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 = {
    "locationQueries": [
        "Austin, Texas"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("k1ra/airbnb-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 = { "locationQueries": ["Austin, Texas"] }

# Run the Actor and wait for it to finish
run = client.actor("k1ra/airbnb-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 '{
  "locationQueries": [
    "Austin, Texas"
  ]
}' |
apify call k1ra/airbnb-scraper --silent --output-dataset

```

## MCP server setup

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