# Airbnb Listings Scraper | Prices, Ratings, Map Coordinates (`akatra/airbnb-listings-scraper`) Actor

Scrape Airbnb search results for any city or region: listing name, type, nightly and total price for your dates, rating, reviews, bedrooms, beds, baths, coordinates, badges and photos. Goes past Airbnb's 270-result limit by splitting the search into price ranges. No host personal data.

- **URL**: https://apify.com/akatra/airbnb-listings-scraper.md
- **Developed by:** [Akatra](https://apify.com/akatra) (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 $2.10 / 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.
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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Airbnb Listings Scraper: prices, ratings and coordinates for any location

Collect Airbnb listings for any city, neighbourhood or region. For each listing you get the name and type, the **nightly and total price for your dates**, any discount, rating and review count, bedrooms, beds and baths, **map coordinates**, badges such as Superhost and Guest favorite, and photos.

Airbnb shows about 270 listings per search. Ask for more and the scraper **splits the search into price ranges** and merges the results, so you can cover a whole market.

**Pay per result** · **No login, no API key** · **Public data only** · **Tested daily** · **LLM-ready JSON for AI agents (MCP)**

### 🛠️ What does Airbnb Listings Scraper do?

- 🗺️ **Whole markets, not just one results page.** Airbnb shows about 270 listings per search; the scraper splits the search into price ranges and merges the results.
- 💵 **Nightly and total price for your dates**, including discounts.
- 📍 **Map coordinates, rating and review count, bedrooms, beds and baths, badges and photos** for every listing.
- 🛡️ **Built to get through blocking.** Requests go out with a real browser fingerprint through rotating proxies, and a blocked request is retried from a fresh IP. A result that could not be completed is never charged.

#### What people use it for

- **Short-term rental market research.** Compare prices, ratings and supply across neighbourhoods and cities.
- **Pricing your own listing.** See what similar places charge for your dates.
- **Investment analysis.** Map listings and prices before buying a property.
- **Travel products and dashboards.** Feed fresh listing data into your own app, sheet or BI tool.
- **Tracking prices over time.** Run it on a schedule for the same dates and watch the market move.

### 📊 What data can you extract?

Every result is one JSON object (one row in CSV or Excel) with these fields:

| Field | Meaning |
|---|---|
| `listingId`, `url` | Airbnb's ID for the listing and a link to it with your dates |
| `name`, `title` | The listing's name and Airbnb's short title ("Apartment in Santa Maria Maior") |
| `latitude`, `longitude` | Map position as Airbnb shows it in search results (approximate) |
| `bedrooms`, `beds`, `baths` | Room counts. A studio has 0 bedrooms |
| `rating`, `reviewCount`, `isNew` | Average guest rating and number of reviews. New listings have no rating yet |
| `badges` | Airbnb's badges, such as "Superhost" and "Guest favorite" |
| `priceTotal`, `priceOriginal`, `nights`, `pricePerNight`, `priceText`, `currency` | Price for the stay as shown in search, the price before discount when there is one, and the price per night |
| `checkIn`, `checkOut` | The dates the price is for: your dates, or the sample dates Airbnb chose when you gave none |
| `propertyType`, `area` | Filled when Airbnb's title has the form "Apartment in Alfama"; hotels and branded places use their own name as title |
| `images` | Up to 10 photo links |
| `searchLocation`, `resolvedLocation` | The location you entered and the place Airbnb matched it to |

### 🚀 How to use Airbnb Listings Scraper

1. Create a free [Apify](https://apify.com) account and open this Actor.
2. Add one or more **locations**, written the way you would type them into Airbnb's search box: `Lisbon, Portugal`, `Brooklyn, NY`.
3. Set **check-in and check-out** to get the exact price for your stay. Leave them empty for a general scan.
4. Set guests and, if you like, the type of place, minimum bedrooms and a price range.
5. Choose the **currency** and how many listings you want per location.
6. Run it and download the results as JSON, CSV or Excel, or connect them through the API.

### 📥 Input example (JSON)

```json
{
  "locations": ["Lisbon, Portugal", "Porto, Portugal"],
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-13",
  "adults": 2,
  "roomType": "entire",
  "minBedrooms": 1,
  "currency": "EUR",
  "maxItemsPerLocation": 500
}
```

### 📤 Sample output (JSON)

![Sample output table of Airbnb Listings Scraper](https://api.apify.com/v2/key-value-stores/GkJnrNz6YWKHQYnZr/records/airbnb-listings-scraper-output.png)

```json
{
  "listingId": "52911113",
  "url": "https://www.airbnb.com/rooms/52911113?check_in=2026-11-10&check_out=2026-11-13&adults=2",
  "name": "Alfama Renovated Studio with River View",
  "title": "Apartment in Santa Maria Maior",
  "propertyType": "Apartment",
  "area": "Santa Maria Maior",
  "latitude": 38.713,
  "longitude": -9.1255,
  "bedrooms": 1,
  "beds": 1,
  "baths": 1,
  "rating": 4.55,
  "reviewCount": 179,
  "isNew": false,
  "badges": ["Superhost"],
  "priceTotal": 274,
  "priceOriginal": 367,
  "nights": 3,
  "pricePerNight": 91.33,
  "priceText": "$274 for 3 nights, originally $367",
  "currency": "USD",
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-13",
  "adults": 2,
  "images": ["https://a0.muscache.com/im/pictures/miso/Hosting-52911113/original/539662b5.jpeg"],
  "searchLocation": "Lisbon, Portugal",
  "resolvedLocation": "Lisbon, Portugal",
  "scrapedAt": "2026-10-02T00:49:26+00:00"
}
```

### 🤖 Use it with AI agents, MCP and the API

The output is clean JSON with stable field names, ready for LLM pipelines, RAG and agent tools without extra parsing.

- **AI agents and MCP (Claude, ChatGPT, Cursor and others).** Add the Apify MCP server with this Actor as a tool: `https://mcp.apify.com?tools=akatra/airbnb-listings-scraper`. The agent can then run it and read the results by itself.
- **API.** Start a run and get the results in a single call:

```bash
curl -X POST "https://api.apify.com/v2/acts/akatra~airbnb-listings-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"locations": ["Lisbon, Portugal", "Porto, Portugal"], "checkIn": "2026-11-10", "checkOut": "2026-11-13", "adults": 2, "roomType": "entire", "minBedrooms": 1, "currency": "EUR", "maxItemsPerLocation": 500}'
```

- **No-code tools and SDKs.** Works with Make, n8n, Zapier and LangChain through Apify's integrations, and with the Apify clients for Python and JavaScript. Schedule it and send the results to a webhook, Google Sheets or your own database.

### 💰 Pricing: pay per result

You pay per listing, nothing for empty runs beyond a tiny start fee. See the price on the Pricing tab. There is no subscription or rental fee. New to Apify? The free plan includes $5 of platform credit every month, enough for about 1,600 listings with this Actor, and no credit card is needed.

### 🚦 Run status and error messages

Every run ends with a plain status message, so automated workflows (API, Make, n8n, AI agents) can tell what happened without reading the log:

| Situation | What you get |
|---|---|
| Finished normally | `Saved N listings.` |
| Nothing matched | The run succeeds with `No listings saved. Check the location name, or widen the dates and filters.` You pay only the start fee. |
| Airbnb does not recognize a location | `Airbnb did not recognize N location(s): …` Nothing is charged for that location. |
| A price range holds more listings than Airbnb shows | `N price range(s) hold more listings than Airbnb shows; narrow the area or the price range to reach the rest.` |
| Missing or unsupported input | The run fails at once and the log names the field to fix. Nothing is scraped. |
| The site kept blocking some pages | `Some pages stayed blocked, so the results are incomplete; run again to get the rest.` |
| Your maximum charge is reached | Stops cleanly with `Stopped at your maximum charge limit.` Everything saved so far stays in the dataset. |

### ℹ️ Good to know

- Prices are the ones shown in Airbnb's search results. With dates they are the total for your stay. Without dates Airbnb picks sample dates for each listing; `checkIn`, `checkOut` and `nights` then tell you which dates the price is for.
- A location Airbnb does not recognize returns nothing and costs nothing; the run log tells you which one. If a name with accents is not recognized, the scraper also tries it without accents ("Kadıköy" as "Kadikoy").
- One search shows about 270 listings. Above that the scraper uses the prices it has seen to split the search into price ranges, and splits a range again when it is still full. If a range still holds more listings than Airbnb shows, the run log and status message say so; narrow the area or the price range to reach the rest.
- A listing is delivered once per run, even when it appears for several of your locations. If you set a maximum charge for a run, the scraper stops as soon as that limit is reached.
- The scraper reads search results only. It does not collect host names, host profiles or guest reviews.

### 📝 Changelog

- **2026-10-02** Searches without dates now say which sample dates and how many nights the price belongs to. README restructured: data table, API and MCP examples, run status messages.
- **2026-10-02** Full price ranges are split again and the part that cannot be reached is reported, after an independent audit.
- **2026-10-02** First release: listings with prices, ratings and coordinates; price-range splitting beyond 270 listings.

### ⚖️ Legal and privacy

This scraper is an independent tool and is not affiliated with, endorsed by, or sponsored by Airbnb. "Airbnb" is a trademark of its owner and is used here only to show which website the tool works with. It reads only pages that are public without logging in. Use the data in line with the laws that apply to you and the source site's terms.

The source site's name and logo are trademarks of their owner and appear here only to identify the website this tool works with. The Actor reads only pages that are public without logging in. How you store and use the data is your responsibility: follow the laws that apply to you, such as GDPR and CCPA.

### 🔗 More scrapers from Akatra

- [Indeed Jobs Scraper](https://apify.com/akatra/indeed-jobs-scraper): 💼 job ads from Indeed in 30 countries, with yearly salary and only-new mode.
- [Google News Scraper](https://apify.com/akatra/google-news-scraper): 📰 news by keyword or topic in 50 editions, with the real article URLs.
- [Google Trends Scraper](https://apify.com/akatra/google-trends-scraper): 📈 interest over time, by region, and rising related queries.
- [Google Ads Transparency Scraper](https://apify.com/akatra/google-ads-transparency-scraper): 🔎 every ad a company runs on Google, with regions and dates.
- [YouTube Transcript Scraper](https://apify.com/akatra/youtube-transcript-scraper): 🎬 video transcripts as clean text and timestamped lines.

### 💬 Support

Found a bug or need a field that is missing? Open an issue on the Issues tab and we usually reply within a day.

# Actor input Schema

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

Cities, neighbourhoods or regions, one per line, written the way you would type them into Airbnb's search box, for example 'Lisbon, Portugal' or 'Brooklyn, NY'.

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

Optional. With dates you get the exact price for your stay. Without dates Airbnb shows a price for sample dates.

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

Optional. Set it together with the check-in date.

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

Number of adult guests.

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

Number of children (ages 2 to 12).

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

Number of infants (under 2).

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

Number of pets, passed to Airbnb's own pet filter.

## `roomType` (type: `string`):

Only entire homes or only private rooms.

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

Only listings with at least this many bedrooms. 0 means any.

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

Optional, in the currency chosen below. 0 means no minimum.

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

Optional, in the currency chosen below. 0 means no maximum.

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

Currency for prices and for the price filters.

## `maxItemsPerLocation` (type: `integer`):

Stop after this many listings for each location. Airbnb shows about 270 listings per search; when you ask for more, the scraper splits the search into price ranges to find more.

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

Apify Proxy is recommended. The scraper spreads requests over several IPs automatically.

## Actor input object example

```json
{
  "locations": [
    "Lisbon, Portugal"
  ],
  "adults": 2,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "roomType": "",
  "minBedrooms": 0,
  "priceMin": 0,
  "priceMax": 0,
  "currency": "USD",
  "maxItemsPerLocation": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped listings, shown in the overview table.

## `listingsFull` (type: `string`):

All scraped listings with every field, including coordinates and photos.

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

// Run the Actor and wait for it to finish
const run = await client.actor("akatra/airbnb-listings-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": ["Lisbon, Portugal"],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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