# Airbnb Scraper — Listings, Prices & Ratings (`ethanteague/airbnb-scraper`) Actor

Scrape Airbnb search results into clean flat JSON: listing IDs and URLs, nightly/total prices with discounts, ratings and review counts, coordinates, images, badges. Any Airbnb search URL with all its filters.

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

## Pricing

from $4.00 / 1,000 listing scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Scraper — Listings, Prices & Ratings

Scrape **Airbnb search results** into clean, flat JSON — the practical way to get **Airbnb data** with **no code required**: listing IDs and URLs, prices (including active discounts), ratings and review counts, GPS coordinates, photos, and badges like *Guest favorite* and *Superhost*. Paste any Airbnb search URL — **every filter you set in the browser is honored**: dates, guests, price range, amenities, property types, even a drawn map area.

Built reliability-first: no headless browsers to crash, no brittle CSS selectors — the actor reads Airbnb's own embedded data payload, with automatic retries and IP rotation.

### What you get per listing

| Field group | Fields |
|---|---|
| **Identity** | `listingId`, direct `url`, `name` (host's headline), `title` (e.g. "Home in Sarasota") |
| **Price** | `priceLabel` ("$1,223 for 5 nights, originally $1,573"), `price`, `originalPrice`, `discountedPrice`, `priceQualifier`, per-night line when shown |
| **Quality** | `rating` (4.95), `reviewsCount`, `isNewListing`, `badges` (Guest favorite, Superhost) |
| **Location** | `latitude`, `longitude` — map-ready |
| **Media** | Up to 5 photo URLs |
| **Context** | Search location, page, position (rank tracking), check-in/out dates used |

### Use cases

- **Vacation rental pricing data** — pull competitors' rates for your dates across a whole market; track discounts week over week.
- **Short-term rental (STR) market analysis** — supply counts, rating distributions, and price bands by neighborhood (coordinates included for mapping).
- **Deal hunting at scale** — filter by discount size across hundreds of listings.
- **Rank tracking** — position field shows where any listing appears for a given search.
- **Airbnb API alternative** — Airbnb's official API is closed to most developers; this actor returns structured JSON over plain HTTPS instead.
- **AI agents** — feed live short-term-rental market data to agents via API or MCP.

### Get Airbnb data in 3 steps — no code

1. Type plain locations (e.g. `Austin, Texas`) — optionally with check-in/out dates and guest count, so prices reflect real stays, **or** paste full Airbnb search URLs from your browser for full filter control.
2. Set max listings per search (Airbnb serves ~270 per search — split into narrower searches for full market coverage).
3. Run and export JSON/CSV/Excel, or call it on a schedule via the API.

### Example input

```json
{
  "locations": ["Sarasota, Florida"],
  "checkIn": "2026-08-16",
  "checkOut": "2026-08-21",
  "adults": 2,
  "maxListingsPerSearch": 180,
  "currency": "USD"
}
```

### Example output

```json
{
  "type": "listing",
  "listingId": "1652957843916333450",
  "url": "https://www.airbnb.com/rooms/1652957843916333450",
  "name": "Stylish Pool Home 4BR Near Siesta Key \"Palm Noir\"",
  "title": "Home in Sarasota",
  "rating": 5.0,
  "reviewsCount": 8,
  "isNewListing": false,
  "badges": ["Guest favorite"],
  "priceLabel": "$3,190 for 5 nights",
  "price": "$3,190",
  "priceQualifier": "for 5 nights",
  "latitude": 27.30754,
  "longitude": -82.52108,
  "images": ["https://a0.muscache.com/im/pictures/hosting/..."],
  "searchLocation": "Sarasota, Florida",
  "page": 0,
  "position": 2
}
```

### Pricing

| Event | Price |
|---|---|
| Actor start | $0.001 per run |
| Listing scraped | $0.004 (= **$4 per 1,000 listings**) |

A full market snapshot (270 listings) ≈ **$1.09**. You pay only for listings actually delivered — failed requests cost you nothing. Set a *Maximum total charge* on any run to hard-cap spend.

### Use it via API

```bash
curl -X POST "https://api.apify.com/v2/acts/USERNAME~airbnb-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"locations": ["Lisbon"], "maxListingsPerSearch": 54}'
```

Works with the Apify JavaScript/Python clients, schedules, webhooks, and integrations (Google Sheets, Make, Zapier, LangChain), and as an AI-agent tool via the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

### Reliability notes

- Reads Airbnb's embedded state payload — the same data the page itself renders — instead of scraping HTML markup, so cosmetic redesigns don't break it.
- Residential proxy on by default (Airbnb blocks datacenter IPs); requests retry with fresh IPs automatically.
- If Airbnb changes its payload structure, the actor fails loudly with a clear message rather than silently returning junk — and I ship fixes fast. Found an issue? Open it on the **Issues** tab; I typically respond within a day.

### FAQ

**Are prices per night or per stay?** When your search has dates, Airbnb shows stay totals (the `priceQualifier` says so, e.g. "for 5 nights") plus a per-night line when available. Without dates, listings show representative nightly pricing.

**Why max ~270 listings per search?** That's Airbnb's own cap per search. To cover a large market fully, run several narrower searches (by neighborhood, price band, or property type) — the actor dedupes by `listingId` within a run.

**Is there an official Airbnb API?** Airbnb's API is partner-gated and closed to most developers. For search-results data (listings, prices, ratings, locations), this actor is the practical alternative — structured JSON, no reverse engineering, no partner application.

**Is this allowed?** The actor reads publicly visible search results at polite rates. You're responsible for complying with applicable laws and terms for your use case.

**Roadmap** — listing detail enrichment (amenities, descriptions, host profiles), reviews, and availability calendars. Open an issue to vote.

# Actor input Schema

## `locations` (type: `array`):

Plain-text places to search, e.g. <code>Austin, Texas</code> or <code>Lisbon</code>. The actor builds the Airbnb search for you. Use <b>Search URLs</b> below instead when you want specific filters.

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

Optional. Applied to plain-text locations. With dates set, prices are stay totals for your dates.

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

Optional. Applied to plain-text locations.

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

Optional guest count applied to plain-text locations.

## `searchUrls` (type: `array`):

Full Airbnb search URLs copied from your browser — every filter is honored (price range, amenities, property type, dates, guests, map area). E.g. <code>https://www.airbnb.com/s/Austin--Texas/homes?price\_max=200</code>

## `maxListingsPerSearch` (type: `integer`):

Airbnb serves at most ~270 results (15 pages) per search. For more coverage, split into narrower searches (e.g. by price band or neighborhood).

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

ISO currency code for prices, e.g. USD, EUR, GBP.

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

Airbnb blocks datacenter IPs — keep residential proxy enabled on the platform.

## Actor input object example

```json
{
  "locations": [
    "Sarasota, Florida"
  ],
  "maxListingsPerSearch": 90,
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "locations": [
        "Sarasota, Florida"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ethanteague/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 = { "locations": ["Sarasota, Florida"] }

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

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/ENeILEvRe4Bl8V5LJ/builds/wD8l13JIivAsC0eVi/openapi.json
