# Airbnb Scraper (`api-ninja/airbnb-scraper`) Actor

🏡 Search Airbnb listings with powerful filters, automatic pagination, and structured export-ready results

- **URL**: https://apify.com/api-ninja/airbnb-scraper.md
- **Developed by:** [API ninja](https://apify.com/api-ninja) (community)
- **Categories:** Travel, Automation, Developer tools
- **Features:** Limited permissions, Multi-tenant, Server interface
- **Stats:** 195 total users, 13 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 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?

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

### What does Airbnb Search Scraper do?

**Airbnb Search Scraper** extracts **Airbnb listings by location, travel dates, guest counts, and nightly price limits** from [Airbnb](https://www.airbnb.com/). Enter a location in the Input tab and run the Actor to collect listing names, links, photos, ratings, coordinates, and available pricing.

Apify provides API access, scheduling, integrations, monitoring, and dataset exports for repeatable searches.

### Why use Airbnb Search Scraper?

Compare rental inventory, research neighborhoods, monitor accommodation prices, and build travel dashboards. Numbered pagination and a configurable listing limit let you collect a small sample or all available search pages without handling requests yourself.

### How to use Airbnb Search Scraper

1. Open the **Input** tab.
2. Enter a full location name in `query`, for example `New York City, New York, United States`.
3. Optionally provide `place_id`, travel dates, guest counts, and nightly price limits.
4. Choose a listing limit or enable `scrapeAll`.
5. Run the Actor and open the **Output** tab to review or export your dataset.

### Input

The main form shows the location, Max listings, and Scrape all available listings. Expand **⚙️ Search filters (optional)** to adjust dates, guests, prices, the Airbnb country site, or an optional Google place ID.

| Field                    | Description                                                                   |
| ------------------------ | ----------------------------------------------------------------------------- |
| `query`                  | Required location name; include the state and country for accuracy            |
| `place_id`               | Optional Google place ID, if you already know it; otherwise leave blank       |
| `checkin`, `checkout`    | Present or future YYYY-MM-DD dates, supplied together; checkout must be later |
| `adults`                 | 0–16; default 2                                                               |
| `children`               | 0–15; default 0                                                               |
| `infants`, `pets`        | 0–5 each; default 0                                                           |
| `price_min`, `price_max` | Optional nonnegative integer nightly limits in the domain's currency          |
| `domain`                 | Airbnb country domain or URL; default `airbnb.com`                            |
| `homesPerSearch`         | Actor listing limit; default 120                                              |
| `scrapeAll`              | Ignore the listing limit and fetch all available pages; default false         |

```json
{
    "query": "New York City, New York, United States",
    "homesPerSearch": 36,
    "checkin": "2027-01-01",
    "checkout": "2027-01-06",
    "adults": 2,
    "price_min": 100,
    "price_max": 500,
    "domain": "airbnb.com"
}
```

Omit both dates to see prices for automatically selected upcoming stays. Those dates can differ between listings. The domain sets language and currency, with country sites including `airbnb.co.uk`, `airbnb.ca`, `airbnb.fr`, and `airbnb.com.vn`.

The updated search uses new input names. Update saved tasks and API clients: use `query` instead of `searchDestinations`, `checkin`/`checkout` instead of `checkIn`/`checkOut`, and `price_min`/`price_max` instead of `priceRangeMin`/`priceRangeMax`. Cursor pagination, flexible-date modes, separate currency selection, and advanced amenity, property, room-type, host, and booking filters are no longer supported.

### Output

Each listing is saved as one dataset item, including its price and coordinate data when available. The dataset overview displays these fields. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
[
    {
        "id": "992970965790772607",
        "name": "Steps to Times Square | Full Kitchen Pet-Friendly!",
        "title": "Room in New York City",
        "link": "https://www.airbnb.com/rooms/992970965790772607",
        "summary": ["1 queen bed"],
        "bedrooms": null,
        "beds": 1,
        "bathrooms": null,
        "rating": 4.73,
        "reviews_count": 2004,
        "is_superhost": true,
        "is_guest_favorite": false,
        "price": {
            "amount": 1858,
            "currency": "USD",
            "qualifier": "for 5 nights",
            "original_amount": 2107,
            "breakdown": [
                { "description": "5 nights x $348.56", "amount": 1742.78 },
                { "description": "Resort fee", "amount": 114.8 }
            ],
            "checkin": "2026-10-16",
            "checkout": "2026-10-21"
        },
        "coordinates": { "latitude": 40.75552, "longitude": -73.992 },
        "images": [
            "https://a0.muscache.com/im/pictures/prohost-api/Hosting-992970965790772607/original/b6f692d2-f4a7-44ee-a084-b66ba5ba1871.png"
        ]
    }
]
```

### Data table

| Fields                                     | Description                                                                                   |
| ------------------------------------------ | --------------------------------------------------------------------------------------------- |
| `id`, `name`, `title`, `link`              | Listing identity, description, and Airbnb URL                                                 |
| `summary`, `bedrooms`, `beds`, `bathrooms` | Accommodation information; unavailable values may be null                                     |
| `rating`, `reviews_count`                  | Rating and review count                                                                       |
| `is_superhost`, `is_guest_favorite`        | Listing badges                                                                                |
| `price`                                    | Nullable price object with amount, currency, qualifier, dates, original amount, and breakdown |
| `coordinates`                              | Latitude and longitude                                                                        |
| `images`                                   | Image URLs                                                                                    |

**Price amounts are not necessarily nightly prices.** Read `price.qualifier` and the accompanying dates; an amount may cover a multi-night stay. Some listings return `price: null` even when other listings have prices.

### How much does it cost to scrape Airbnb listings?

Cost depends on the Actor's current pricing, Apify resource usage, number of pages, and retries. Check the Actor's pricing tab for current rates. Use a small listing limit for initial runs. Each search page contains up to 18 homes, so a limit of 36 typically needs two successful requests.

### Tips and advanced options

- Enter a full location name including the state and country. If you already know the matching Google place ID, add it to improve location accuracy; otherwise leave it blank.
- Set explicit dates when comparing prices across listings.
- Pagination starts at page 1 automatically. Searches commonly have 15 available pages; the Actor never requests beyond page 50 or the reported final page.
- `scrapeAll` collects available search pages, which may be a capped sample of Airbnb inventory.
- Failed requests retry up to five attempts with exponential backoff. If retries are exhausted, the Actor stops fetching and preserves any saved listings.

### FAQ, disclaimers, and support

#### Does this fetch listing details?

The Actor returns search results only. Fields such as bathrooms, ratings, and prices can be unavailable. Use a separate detail workflow if you need additional property information.

#### Can existing integrations keep using the old output?

Update consumers to the documented output fields. Results now use `id`, `rating`, `price`, and `images` in place of the previous nested fields.

#### How should I use the data?

Use the Actor for permitted research and automation, and comply with applicable laws, Airbnb's terms, and the API provider's terms. Results and availability can change between runs.

#### Where can I get support?

Use the Actor page's **Issues** tab for bugs, questions, and feature requests. Contact the maintainer there to discuss a custom solution.

# Actor input Schema

## `query` (type: `string`):

Enter the city, region, or destination to search. Include the state and country for more accurate results, for example: New York City, New York, United States.

## `homesPerSearch` (type: `integer`):

Maximum number of listings to save across all pages. Ignored when Scrape all available listings is enabled.

## `scrapeAll` (type: `boolean`):

Collect all available search pages automatically, up to page 50. Ignores Max listings. Search results may cover only part of the listings in a destination.

## `checkin` (type: `string`):

Arrival date in YYYY-MM-DD format, today or later. Enter Check-out too. Leave both dates blank to see prices for automatically selected upcoming stays.

## `checkout` (type: `string`):

Departure date in YYYY-MM-DD format. Must be after Check-in. Enter both dates together, or leave both blank.

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

Number of adults (0–16).

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

Number of children (0–15).

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

Number of infants (0–5).

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

Number of pets (0–5).

## `price_min` (type: `integer`):

Minimum nightly price in the currency of your selected Airbnb country site. Leave blank for no minimum.

## `price_max` (type: `integer`):

Maximum nightly price in the currency of your selected Airbnb country site. Must be at least Minimum nightly price when both are set. Leave blank for no maximum.

## `domain` (type: `string`):

Choose the Airbnb country site to set the language and currency of results. Enter a domain or full URL, for example airbnb.com (US), airbnb.co.uk (UK), airbnb.ca (Canada), or airbnb.fr (France).

## `place_id` (type: `string`):

Optional Google place ID for your destination, if you already know it. It helps distinguish locations with similar names. Otherwise, leave this blank and enter the destination in Location query.

## Actor input object example

```json
{
  "query": "New York City, New York, United States",
  "homesPerSearch": 120,
  "scrapeAll": false,
  "adults": 2,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "domain": "airbnb.com"
}
```

# Actor output Schema

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

No description

# 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 = {
    "query": "New York City, New York, United States"
};

// Run the Actor and wait for it to finish
const run = await client.actor("api-ninja/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 = { "query": "New York City, New York, United States" }

# Run the Actor and wait for it to finish
run = client.actor("api-ninja/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 '{
  "query": "New York City, New York, United States"
}' |
apify call api-ninja/airbnb-scraper --silent --output-dataset

```

## MCP server setup

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