# Airbnb Search Scraper (`silentflow/airbnb-search-scraper`) Actor

Search Airbnb rentals by city with filters for dates, guests, price range and room type. Extract 35+ fields per listing: nightly prices, fee breakdowns, amenities, ratings, host info, GPS coordinates, photos and cancellation policies. Supports 35+ Airbnb markets for analysis and monitoring.

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

## Pricing

$19.99/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period.You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#rental-actors

## 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 Rental Search Scraper

by [SilentFlow](https://apify.com/silentflow)

Extract Airbnb rental listings by location with full details: prices, amenities, ratings, host info, coordinates, photos, and cancellation policies.

### How it works

![How it works](https://api.apify.com/v2/key-value-stores/AP04AzbLPNZCNSFym/records/airbnb-search-how-it-works-v3.png)

### ✨ Why use this scraper?

Looking for rental data across multiple cities? Tired of copying prices one by one from Airbnb? Need accurate nightly rates with fee breakdowns?

- 🔍 **No login required**: Works without an Airbnb account
- 🏨 **Complete listing data**: Get 35+ fields per listing including description, amenities, fees, cancellation policies, host info, and photos
- 🌍 **35+ markets**: Supports all major Airbnb domains with locale-specific pricing
- 📅 **Date-aware pricing**: Add check-in/check-out dates to get accurate nightly rates and fee breakdowns
- 🎯 **Flexible filters**: Filter by price range, room type, bedrooms, beds, bathrooms, and number of guests
- 📋 **Full detail page data**: Every listing includes description, amenities, cancellation policy, and host info automatically

### 🎯 Use cases

| Team | What they build |
|------|----------------|
| **Travel platforms** | Compare rental options across destinations with real pricing data |
| **Market researchers** | Analyze nightly prices, occupancy patterns, and room types by city |
| **Real estate analysts** | Benchmark short-term rental income vs. long-term rental yields |
| **Revenue managers** | Track competitor pricing across dates and seasons to optimize rates |
| **Data teams** | Build rental market datasets with 35+ fields for investment models |
| **Tourism planners** | Map accommodation supply, pricing trends, and capacity in emerging destinations |

### 📥 Input parameters

#### Input mode

| Parameter | Type | Description |
|-----------|------|-------------|
| `mode` | string | **searchUrl** (paste Airbnb search URLs), **search** (search by location), or **urls** (extract specific listings) |

#### Search URLs

| Parameter | Type | Description |
|-----------|------|-------------|
| `searchUrls` | URL\[] | Paste Airbnb search result URLs directly (e.g. from your browser). Supports airbnb.com, airbnb.fr, airbnb.es, etc. |

#### Search by Location

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `locations` | string\[] | `["Paris"]` | Cities, regions, or landmarks to search (e.g. Paris, Côte d'Azur, Rome) |

#### Listing URLs

| Parameter | Type | Description |
|-----------|------|-------------|
| `listingUrls` | URL\[] | Direct Airbnb listing URLs. Works with airbnb.com, airbnb.fr, airbnb.es, etc. |

#### Dates & Guests

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `checkIn` | string |, | Check-in date in `YYYY-MM-DD` format. Leave empty to search without dates |
| `checkOut` | string |, | Check-out date in `YYYY-MM-DD` format. Required if check-in is set |
| `adults` | integer | 1 | Number of adults (1–16) |
| `children` | integer | 0 | Number of children ages 2–12 |
| `infants` | integer | 0 | Number of infants under 2 |
| `pets` | integer | 0 | Number of pets |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `priceMin` | integer |, | Minimum nightly price in the selected currency |
| `priceMax` | integer |, | Maximum nightly price in the selected currency |
| `currency` | string | USD | Price currency (USD, EUR, GBP, JPY, ...) |
| `roomTypes` | string\[] |, | Filter by room type: **Entire home/apt**, **Private room**, **Hotel room**, **Shared room** |
| `minBedrooms` | integer |, | Minimum number of bedrooms |
| `minBeds` | integer |, | Minimum number of beds |
| `minBathrooms` | integer |, | Minimum number of bathrooms |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `locale` | string | en | Airbnb market/language (e.g. fr, es, de, en-gb). Determines domain and language of results |
| `includeDetails` | boolean | true | Visit each listing's detail page for full description, amenities, cancellation policy, and host info |
| `maxListings` | integer | 0 (unlimited) | Maximum total listings to collect |

### 📊 Output data

#### Listing example

```json
{
  "listingId": "1476693113851393112",
  "url": "https://www.airbnb.fr/rooms/1476693113851393112",
  "name": "Oasis urbaine, charmant et reposant",
  "title": "Appartement · Paris",
  "description": "Séjournez dans un appartement paisible et parfaitement situé dans le 11e arrondissement...",
  "roomType": "Entire home/apt",
  "propertyType": "Apartment",
  "bedrooms": 1,
  "beds": 1,
  "bathrooms": 1,
  "maxGuests": 2,
  "amenities": ["Wifi", "Kitchen", "Washer", "Air conditioning", "Iron", "Hair dryer"],
  "city": "Paris",
  "neighborhood": "Paris, Île-de-France, France",
  "latitude": 48.86664,
  "longitude": 2.36973,
  "searchCity": "Paris",
  "hostName": "Yann",
  "hostId": "50670964",
  "hostUrl": "https://www.airbnb.fr/users/show/50670964",
  "isSuperhost": true,
  "isProHost": false,
  "hostListings": 3,
  "rating": 4.97,
  "reviewCount": 185,
  "hasGuestFavorite": true,
  "badges": ["Guest favorite"],
  "price": "€ 98 per night",
  "pricePerNight": "€98",
  "pricePerNightValue": 98,
  "priceTotal": 588,
  "priceTotalDisplay": "€588 total",
  "cleaningFee": 35,
  "serviceFee": 52,
  "taxes": "€62",
  "numberOfNights": 6,
  "currency": "EUR",
  "hasFlexibleCancellation": false,
  "cancellationPolicy": "Free cancellation before Apr 3",
  "checkIn": "2025-04-09",
  "checkOut": "2025-04-15",
  "thumbnail": "https://a0.muscache.com/im/pictures/hosting/...",
  "photos": [
    "https://a0.muscache.com/im/pictures/hosting/Hosting-photo-1.jpg",
    "https://a0.muscache.com/im/pictures/hosting/Hosting-photo-2.jpg"
  ],
  "scrapedAt": "2025-04-01T10:23:45Z"
}
```

### 🗂️ Data fields

| Category | Fields |
|----------|--------|
| **Identity** | `listingId`, `url`, `name`, `title` |
| **Property** | `roomType`, `propertyType`, `bedrooms`, `beds`, `bathrooms`, `maxGuests` |
| **Amenities** | `amenities` (full list, 40+ items when available) |
| **Location** | `city`, `neighborhood`, `country`, `latitude`, `longitude`, `searchCity` |
| **Host** | `hostName`, `hostId`, `hostUrl`, `isSuperhost`, `isProHost`, `hostListings` |
| **Ratings** | `rating`, `reviewCount`, `hasGuestFavorite`, `badges` |
| **Price** | `price`, `pricePerNight`, `pricePerNightValue`, `priceTotal`, `priceTotalDisplay` |
| **Fee breakdown** | `cleaningFee`, `serviceFee`, `taxes`, `originalPrice`, `numberOfNights`, `currency` |
| **Cancellation** | `hasFlexibleCancellation`, `cancellationPolicy` |
| **Dates** | `checkIn`, `checkOut` |
| **Media** | `thumbnail`, `photos` |
| **Meta** | `description`, `scrapedAt` |

### 🚀 Examples

#### Search rentals in a city

```json
{
  "mode": "search",
  "locations": ["Paris"],
  "locale": "fr",
  "currency": "EUR",
  "adults": 2,
  "maxListings": 50
}
```

#### Search with dates for accurate pricing

```json
{
  "mode": "search",
  "locations": ["Barcelona"],
  "locale": "es",
  "currency": "EUR",
  "checkIn": "2025-07-15",
  "checkOut": "2025-07-22",
  "adults": 2,
  "priceMin": 50,
  "priceMax": 200,
  "roomTypes": ["Entire home/apt"]
}
```

#### Extract specific listing URLs

```json
{
  "mode": "urls",
  "listingUrls": [
    {"url": "https://www.airbnb.com/rooms/12345678"},
    {"url": "https://www.airbnb.fr/rooms/87654321"}
  ],
  "checkIn": "2025-08-01",
  "checkOut": "2025-08-07",
  "adults": 4
}
```

#### Multi-city market research

```json
{
  "mode": "search",
  "locations": ["Amsterdam", "Brussels", "Antwerp"],
  "locale": "nl",
  "currency": "EUR",
  "maxListings": 100
}
```

### 💻 Integrations

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("silentflow/airbnb-search-scraper").call(run_input={
    "mode": "search",
    "locations": ["Paris"],
    "locale": "fr",
    "currency": "EUR",
    "checkIn": "2025-07-15",
    "checkOut": "2025-07-22",
    "adults": 2,
    "maxListings": 50
})

for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{listing['name']}: €{listing.get('pricePerNightValue', 'N/A')}/night, {listing.get('rating', 'N/A')}⭐")
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('silentflow/airbnb-search-scraper').call({
    mode: 'search',
    locations: ['Barcelona'],
    locale: 'es',
    currency: 'EUR',
    checkIn: '2025-07-15',
    checkOut: '2025-07-22',
    adults: 2,
    priceMax: 150
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Found ${items.length} listings`);
items.forEach(l => console.log(`${l.name}: €${l.pricePerNightValue}/night`));
```

#### cURL / API

```bash
curl "https://api.apify.com/v2/acts/silentflow~airbnb-search-scraper/runs" \
    -d '{"mode":"search","locations":["Paris"],"locale":"fr","currency":"EUR","adults":2,"maxListings":50}' \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer YOUR_API_TOKEN"
```

### 📈 Performance & limits

| Metric | Value |
|--------|-------|
| Listings per page | ~18 |
| Enrichment speed | ~2 listings/second |
| Max pages per location | 200 |
| Supported markets | 35+ locales |

### 💡 Tips for best results

1. **Add dates for accurate prices**: Without check-in/check-out dates, price totals and fee breakdowns are not available
2. **Start with `maxListings: 50`**: Test your filters before running large scrapes
3. **Match locale to destination**: Use `fr` for France (airbnb.fr), `es` for Spain (airbnb.es), ensures results and prices are in the right language and currency
4. **Large cities**: Paris, London, New York can have 100+ pages, use `priceMin`/`priceMax` or `roomTypes` to narrow results

### ❓ FAQ

**Q: Do I need an Airbnb account to use this scraper?**
A: No. The scraper works without any credentials.

**Q: Why are cleaning fees and service fees missing?**
A: Fee breakdowns are only available when check-in and check-out dates are provided. Add dates to your input to get full price details.

**Q: What data is included for each listing?**
A: Every listing includes full detail page data: description, amenities, cancellation policy, host info, photos, and more. There is no reduced mode. You always get the complete dataset.

**Q: How many listings can I scrape per location?**
A: Airbnb typically shows up to ~3,600 listings per search (200 pages × 18 listings). Use price or room type filters to narrow results for large cities.

### 📬 Support

Need something this scraper does not do yet? We ship features fast.

- Feature requests go straight to our backlog
- Enterprise needs? We do custom integrations

Check out our other scrapers: [SilentFlow on Apify](https://apify.com/silentflow)

# Actor input Schema

## `mode` (type: `string`):

**Search by URL** - Paste an Airbnb search URL with all your filters already applied. Easiest way to get started.

**Search by Location** - Discover rentals by location name.

**Listing URLs** - Paste one or multiple Airbnb listing URLs to extract their data.

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

Paste one or more Airbnb search URLs. Go to airbnb.com, apply your filters (dates, guests, price, room type, etc.), then copy the URL from your browser and paste it here. All filters from the URL are used automatically.

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

Add one location per line. Can be a city, region, or landmark (e.g. Paris, Rome, Tokyo).

## `listingUrls` (type: `array`):

Paste one or more Airbnb listing URLs. Works with airbnb.com, airbnb.fr, airbnb.es, etc.

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

Check-in date in YYYY-MM-DD format (e.g. 2026-07-15). Needed for accurate nightly prices and fee breakdowns. Only for Search by Location mode.

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

Check-out date in YYYY-MM-DD format. Required if check-in is set.

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

Number of adults.

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

Currency for prices.

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

Selects the Airbnb domain and language. Only for Search by Location mode.

## `maxListings` (type: `integer`):

Maximum total listings to collect. Set to 0 for no limit.

## Actor input object example

```json
{
  "mode": "searchUrl",
  "searchUrls": [
    {
      "url": "https://www.airbnb.com/s/Paris--France/homes?checkin=2026-07-01&checkout=2026-07-07&adults=2"
    }
  ],
  "locations": [
    "Paris"
  ],
  "adults": 1,
  "currency": "USD",
  "locale": "en",
  "maxListings": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Complete listing data including: id, name, roomType, city, pricePerNightValue, priceTotal, rating, reviewCount, bedrooms, maxGuests, isSuperhost, amenities, coordinates, photos, and more.

## `resultsCSV` (type: `string`):

Rental listings in CSV format.

## `resultsExcel` (type: `string`):

Rental listings in Excel format.

# 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 = {
    "searchUrls": [
        {
            "url": "https://www.airbnb.com/s/Paris--France/homes?checkin=2026-07-01&checkout=2026-07-07&adults=2"
        }
    ],
    "locations": [
        "Paris"
    ],
    "maxListings": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("silentflow/airbnb-search-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 = {
    "searchUrls": [{ "url": "https://www.airbnb.com/s/Paris--France/homes?checkin=2026-07-01&checkout=2026-07-07&adults=2" }],
    "locations": ["Paris"],
    "maxListings": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("silentflow/airbnb-search-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 '{
  "searchUrls": [
    {
      "url": "https://www.airbnb.com/s/Paris--France/homes?checkin=2026-07-01&checkout=2026-07-07&adults=2"
    }
  ],
  "locations": [
    "Paris"
  ],
  "maxListings": 5
}' |
apify call silentflow/airbnb-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1oxi3yqLsLDSE6jSb/builds/UYGbbIrONQvO43g1Y/openapi.json
