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

Airbnb price monitoring and short-term rental market research: price, rating, reviews, property type, neighborhood and coordinates for any city.

- **URL**: https://apify.com/dev\_web\_col/airbnb-scraper.md
- **Developed by:** [Diseño Web de Colombia](https://apify.com/dev_web_col) (community)
- **Categories:** Travel, Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 listing returneds

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

**Type a city. Get every listing with its price, rating and exact location.**

### What is the Airbnb Scraper?

This Actor extracts Airbnb listings for any city or area: the listing name, property type, neighbourhood, rating, review count, price with the struck-through original when there is a discount, the dates that price refers to, exact coordinates, photo and the direct Airbnb link.

It runs without a headless browser, which is unusual for Airbnb and is why runs finish in seconds instead of minutes.

### No browser, so it is fast and cheap

Airbnb embeds its search results directly in the page HTML. This Actor reads them straight from there — no headless Chrome to start, no JavaScript to wait for.

Measured: a run returning 53 listings finishes in about 30 seconds and peaks at **120 MB of memory**. That matters to you because Apify bills memory multiplied by time, so a lighter Actor is a cheaper one.

It also survives Airbnb's blocking properly. Each attempt uses a fresh IP, and a failure part-way through pagination delivers the listings already collected rather than throwing the whole run away. Measured across 10 consecutive cloud runs: **10 succeeded**.

### What you can use it for

| What you want | How to ask for it |
|---|---|
| **Price monitoring** — what do comparable places charge? | `location` + `checkIn`/`checkOut`, read `priceText` |
| **Revenue management** — set your nightly rate | Same dates and guest count as your own listing |
| **Short-term rental market research** | `location`, read `rating`, `reviewsCount`, `propertyType` |
| **Real estate data** — yield estimates by area | `lat`/`lon` plus price, grouped by `neighborhood` |
| **Occupancy signals** — what is already booked | Run the same dates repeatedly; listings that vanish are booked |
| **Competitor tracking** — a specific set of hosts | Narrow by `location` and `minRating` |
| **Mapping and geo analysis** | Every row carries exact `lat` and `lon` |
| **Seasonality** — how prices move across the year | Same search, different `checkIn` months |

Typical jobs: **price monitoring**, **short-term rental** and **vacation rental**
market research, **real estate data** collection, and revenue management.

### What data you get

Listing name, property type, neighbourhood, rating, review count, price text with currency, parsed price amount, original price before discount, the stay dates that price covers, badge, latitude, longitude, photo URL and the Airbnb listing link.

### Input

Every field is optional unless marked required.

| Field | Type | Description |
|---|---|---|
| `location` | string, **required** | Type it the way you would on Airbnb: Madrid, Miami Beach, Lisbon, Bali. It must be a place Airbnb recognises — if it does not, Airbnb quietly returns unrelated listings instead of an error, so check the first rows before running a big job. |
| `checkIn` | string | Format YYYY-MM-DD. Leave both dates empty for Airbnb's default dates. Prices always refer to the dates actually used. |
| `checkOut` | string | Format YYYY-MM-DD. Must be later than the check-in date. |
| `adults` | integer | Number of adults. Changes which listings Airbnb shows and what they cost. |
| `minRating` | integer | Keeps only listings rated at or above this. Note that brand-new listings have no rating yet and are dropped by this filter. |
| `maxPages` | integer | Each page is 18 listings. Airbnb caps a search at about 270 listings, so 15 pages is the practical maximum. |
| `maxResults` | integer | Safety cap. You are charged per listing returned. |
| `proxyConfiguration` | object | Required. Airbnb blocks datacenter IPs, including Apify's, so runs without a residential proxy come back empty. |

#### Input sample

```json
{
  "location": "Madrid",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

### Output sample

One real row from an actual run:

```json
{
  "id": "1279100007550603724",
  "url": "https://www.airbnb.com/rooms/1279100007550603724",
  "name": "Madrid´s sky Luxury Penthouse 6Pax. 10 min Airport",
  "title": "Apartment in San Sebastián de los Reyes",
  "propertyType": "Apartment",
  "neighborhood": "San Sebastián de los Reyes",
  "rating": 4.98,
  "reviewsCount": 242,
  "priceText": "$1,687 for 5 nights, originally $2,788",
  "priceAmount": 1687,
  "currency": "USD",
  "originalPriceText": "$2,788",
  "stayDates": "Oct 8 – 13",
  "badge": "Guest favorite",
  "lat": 40.5533,
  "lon": -3.6178,
  "imageUrl": "https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MTI3OTEwMDAwNzU1MDYwMzcyNA%3D%3D/original/8ab6b544-bfeb-4708-b983-2b4e55b3ea57.jpeg"
}
```

### Who uses this

- **Short-term rental hosts** — see what comparable places charge on your dates
- **Property investors** — yield estimates from real prices, by neighbourhood
- **Market researchers** — price distribution with coordinates for mapping
- **Travel tools** — inventory with ratings and working links
- **Revenue managers** — track competitor pricing across a season

### Honest limits

These are real and none of them is fixable by any tool. They are here so you know what you are buying before you run it.

- **A residential proxy is required.** Airbnb blocks datacenter IPs, Apify's included. The default input already asks for one.
- **Airbnb caps a search at about 270 listings** — 15 pages of 18. There is no way to page past it. Narrow by dates, guests or a smaller area to reach different listings.
- **A location Airbnb does not recognise returns unrelated listings, not an error.** Measured: a nonsense place name still came back with 18 listings. Check the first rows before launching a large run.
- **The currency follows the IP the run uses**, not a setting. A run through a US proxy prices in USD. The `priceText` field always states the currency.
- **Prices are for a stay length**, not per night. "for 5 nights" is the total. Set check-in and check-out for a defined window.
- **Listings with no reviews have no rating**, and the minimum-rating filter drops them along with genuinely new listings.

### FAQ

#### Do I need an Airbnb account?

No. This reads the public search pages that any logged-out visitor sees.

#### Why can I only get about 270 listings per search?

That is Airbnb's own limit — it stops paginating after 15 pages. To cover a large city, split the search: by neighbourhood, by date range, or by guest count. Each variation returns a different slice.

#### Why is the price in a currency I did not ask for?

Airbnb decides the currency from the IP address of the request, and the proxy determines that. There is no setting to override it. `priceText` always spells out which currency you got, and `currency` is parsed from it.

#### Is the price per night?

No. Airbnb quotes a total for a stay, and the row tells you which stay — for example "for 5 nights". Set your own check-in and check-out dates if you need a fixed comparison window.

#### Why did a made-up city still return listings?

Because Airbnb silently falls back instead of erroring, and there is no signal in the response to detect it — I checked the results block, the metadata and the page title. Always eyeball the first rows of a new search.

#### Can I get reviews for each listing?

Not in this Actor. It returns the listing-level data from search results, including the rating and review count, but not the individual reviews.

#### Do I need an account or an API key for the source?

No. This Actor only reads public pages and public endpoints, the same ones any
logged-out visitor sees. You never give it credentials, and nothing is done on
your behalf.

#### Is it legal to scrape this data?

Scraping publicly available information is broadly accepted as legal, and this
Actor only ever touches pages that require no login. That said, what you may do
with the data afterwards is a separate question — personal data in particular is
regulated by GDPR and CCPA. If you plan to process personal data, take advice
first. Apify has a good primer: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

#### How much will a run cost me?

You are charged per result, so the cost scales with what you actually get back.
The pricing is shown on this page above the input form. Start with a small run to
see real numbers before you scale up.

#### Can I export to Excel, CSV or Google Sheets?

Yes. Every run's dataset can be downloaded as CSV, Excel, JSON, XML or HTML from
the **Storage** tab, and Apify integrates directly with Google Sheets, Airtable,
Zapier, Make and Slack.

#### Can I run this on a schedule?

Yes. Open the **Schedules** tab and pick an interval — hourly, daily, weekly.
Each run only costs you what it returns.

#### Can I call it from my own code instead of the console?

Yes. Every Actor on Apify is also an API endpoint. There are official clients for
[Python](https://docs.apify.com/api/client/python/) and
[JavaScript](https://docs.apify.com/api/client/js/), plus a plain REST API. The
**API** tab on this page shows ready-made snippets with your input already filled in.

#### Something came back empty. Is it broken?

Usually not. An empty result normally means the filters were too narrow, or the
source genuinely has nothing to return for that query. This Actor is written to
finish successfully and tell you what happened rather than fail — check the run
log, it says which step returned nothing.

### Related Actors

- **Local Business Scraper with Emails** — local businesses from OpenStreetMap
- **Google Trends Scraper** — seasonality and demand by region

### Where the data comes from

The public Airbnb search pages, exactly as a logged-out visitor sees them. No login, no account, and no personal data about hosts beyond the public listing name Airbnb already displays.

# Actor input Schema

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

Type it the way you would on Airbnb: Madrid, Miami Beach, Lisbon, Bali. It must be a place Airbnb recognises — if it does not, Airbnb quietly returns unrelated listings instead of an error, so check the first rows before running a big job.

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

Format YYYY-MM-DD. Leave both dates empty for Airbnb's default dates. Prices always refer to the dates actually used.

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

Format YYYY-MM-DD. Must be later than the check-in date.

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

Number of adults. Changes which listings Airbnb shows and what they cost.

## `minRating` (type: `integer`):

Keeps only listings rated at or above this. Note that brand-new listings have no rating yet and are dropped by this filter.

## `maxPages` (type: `integer`):

Each page is 18 listings. Airbnb caps a search at about 270 listings, so 15 pages is the practical maximum.

## `maxResults` (type: `integer`):

Safety cap. You are charged per listing returned.

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

Required. Airbnb blocks datacenter IPs, including Apify's, so runs without a residential proxy come back empty.

## Actor input object example

```json
{
  "location": "Madrid",
  "maxPages": 5,
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One dataset item per listing.

# 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": "Madrid",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dev_web_col/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 = {
    "location": "Madrid",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("dev_web_col/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 '{
  "location": "Madrid",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call dev_web_col/airbnb-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/QaihJSAblBNfqvdWm/builds/49IFf3b1OQs9ec8SN/openapi.json
