# Airbnb All-in-One API (`romy/airbnb-all-in-one-api`) Actor

Unofficial always-on REST API for live Airbnb data: search, listing detail, reviews, availability calendar, similar listings, destination autosuggest, plus Experiences and Services (tours, photography, chefs, and more) with host profiles. Powered by Apify Standby — no cold start, no account needed.

- **URL**: https://apify.com/romy/airbnb-all-in-one-api.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** Travel
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event + usage

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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

### What does Airbnb All-in-One API do?

**Airbnb All-in-One API** is a REST endpoint for Airbnb's live data — home search with full filters, listing detail, reviews, availability, and a full-year calendar — plus two product lines most Airbnb scrapers don't cover at all: **Experiences** (bookable tours, workshops, and activities) and **Services** (photography, private chefs, massage, and other in-person services), each with real host profiles you can cross-reference to every other listing that host owns. All from a single always-on API powered by [Apify Standby](https://docs.apify.com/platform/actors/development/programming-interface/standby).

It talks directly to the same internal API the official [Airbnb](https://www.airbnb.com/) Android app uses (`api.airbnb.com`), reverse-engineered by live MITM capture against a real device — every endpoint below is a real Apollo-style GraphQL persisted query the app itself sends (exact query hashes captured live, never guessed). No Airbnb account, no API key, no scraping setup — call the endpoint, get JSON back. Read endpoints work fully anonymously (confirmed by inspecting real request headers — no Authorization header, no cookie, no session token needed).

**Confirmed working worldwide** — tested live in Indonesia, the UK (London), and Japan (Tokyo) during development, including a hotel-style multi-room-type listing, not just one market.

### Why use Airbnb All-in-One API?

- **Full home search** — location, dates, guests, price range, room type, and amenities, the same filters as the app's own search
- **Real, server-computed pricing in any currency** — pass `currency=IDR` (or any ISO code) and get genuine localized prices from Airbnb's own server, not a client-side conversion (verified against the raw response — real `Rp` amounts, real per-night breakdowns)
- **Experiences & Services** — tours, workshops, photography, chefs, massage and more, with their own pricing/availability — a product line most Airbnb API wrappers skip entirely
- **Host profiles** — bio, verification, Superhost status, every other listing the host owns, and reviews written about them as a person — walk from any listing's review straight to the host's full portfolio
- **Reviews with real host replies** — including the reply text, who replied, and when; filterable by topic (cleanliness, location, ...) with the matching snippet highlighted, or sorted by recency/rating
- **Global** — not tied to one country's data
- **Always-on** — Standby mode means no cold start, responds in milliseconds
- **No account needed** — every read request works fully anonymously
- **Use cases:** travel search products, price-comparison tools, market research, host/listing portfolio analysis, review sentiment pipelines, local-experience marketplaces

### Endpoints

| Method | Path                | Description                                                              |
| ------ | ------------------- | ------------------------------------------------------------------------ |
| `GET`  | `/search`           | Home search — location, dates, guests, price range, room type, amenities |
| `GET`  | `/listing`          | Full listing detail — host, amenities, description, rating breakdown     |
| `GET`  | `/reviews`          | Paginated reviews, with host replies, topic filtering, and sorting       |
| `GET`  | `/availability`     | Monthly availability calendar (a full year in one call)                  |
| `GET`  | `/similar-listings` | Listings similar to a given one                                          |
| `GET`  | `/autosuggest`      | Destination autocomplete                                                 |
| `GET`  | `/experience`       | Experience (tour/workshop/activity) detail, pricing, and availability    |
| `GET`  | `/service`          | Service (photography/chef/massage/...) detail and booking bar            |
| `GET`  | `/host`             | Public host profile, their other listings, and reviews about them        |

### Parameters

Every endpoint also takes `currency` (ISO code, default `USD`) — see Data notes below.

**`GET /search`** — `query` OR `place_id` required, everything else optional.

| Param            | Type             | Example                   | Meaning                                                                       |
| ---------------- | ---------------- | ------------------------- | ----------------------------------------------------------------------------- |
| `query`          | string           | `Bali, Indonesia`         | Free-text destination                                                         |
| `place_id`       | string           | `ChIJnUvjRe...`           | Exact place id from /autosuggest, more precise than `query`                   |
| `checkin`        | date             | `2026-09-01`              | Check-in date                                                                 |
| `checkout`       | date             | `2026-09-05`              | Check-out date                                                                |
| `adults`         | int, default 1   | `2`                       | Adult guests (13+)                                                            |
| `children`       | int, default 0   | `1`                       | Child guests (2–12)                                                           |
| `infants`        | int, default 0   | `0`                       | Infant guests (under 2)                                                       |
| `price_min`      | int              | `500000`                  | Minimum total trip price, in whole units of `currency`                        |
| `price_max`      | int              | `3000000`                 | Maximum total trip price                                                      |
| `bedrooms`       | int              | `2`                       | Minimum bedrooms ("at least this many")                                       |
| `beds`           | int              | `2`                       | Minimum beds                                                                  |
| `bathrooms`      | int              | `1`                       | Minimum bathrooms                                                             |
| `room_type`      | enum             | `Entire home/apt`         | `Entire home/apt` | `Private room` — the real strings the app sends          |
| `amenities`      | int\[], repeat    | `amenities=4&amenities=7` | Airbnb amenity ids; only Wifi=4, Pool=7 confirmed by hand, any real id works  |
| `allows_pets`    | boolean          | `true`                    | "Allows pets" filter chip — NOT a pet count (see `pets` on /listing for that) |
| `instant_book`   | boolean          | `true`                    | Only Instant Book listings                                                    |
| `guest_favorite` | boolean          | `true`                    | Only "Guest favourite" listings                                               |
| `host_languages` | string\[], repeat | `host_languages=en`       | ISO-ish 2-letter host language codes                                          |
| `cursor`         | string           | (from prev response)      | Pagination cursor — copy from `results.paginationInfo.nextPageCursor`         |

**`GET /listing`** — `listing_id` required.

| Param        | Type           | Example               | Meaning                                                                                |
| ------------ | -------------- | --------------------- | -------------------------------------------------------------------------------------- |
| `listing_id` | string         | `1633199196629299212` | Plain numeric listing id (from a /search result or the Airbnb URL)                     |
| `checkin`    | date           | `2026-09-01`          | Check-in date, affects price shown                                                     |
| `checkout`   | date           | `2026-09-05`          | Check-out date                                                                         |
| `adults`     | int, default 1 | `2`                   | Adult guests                                                                           |
| `children`   | int, default 0 | `0`                   | Child guests                                                                           |
| `infants`    | int, default 0 | `0`                   | Infant guests                                                                          |
| `pets`       | int, default 0 | `0`                   | Number of pets travelling — a guest count, unrelated to /search's `allows_pets` toggle |

**`GET /reviews`** — `listing_id` required.

| Param        | Type            | Example               | Meaning                                                                                                              |
| ------------ | --------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `listing_id` | string          | `1633199196629299212` | Same id as /listing                                                                                                  |
| `offset`     | int, default 0  | `0`                   | Reviews to skip — page by adding `limit` each call                                                                   |
| `limit`      | int, default 20 | `20`                  | Reviews per page                                                                                                     |
| `sort`       | enum            | `MOST_RECENT`         | `BEST_QUALITY` (default, "most relevant") | `MOST_RECENT` | `RATING_DESC` | `RATING_ASC`                          |
| `tag`        | enum            | `CLEANLINESS`         | Filter to reviews mentioning a topic (15 confirmed values — see OpenAPI); a listing may expose other real values too |

**`GET /availability`** — `listing_id`, `month`, `year` required.

| Param        | Type            | Example               | Meaning                               |
| ------------ | --------------- | --------------------- | ------------------------------------- |
| `listing_id` | string          | `1652144683809168862` | Same id as /listing                   |
| `month`      | int 1–12        | `9`                   | First month to fetch                  |
| `year`       | int             | `2026`                | Year matching `month`                 |
| `count`      | int, default 12 | `12`                  | How many consecutive months to return |

**`GET /similar-listings`** — `listing_id` required.

| Param        | Type           | Example               | Meaning                                       |
| ------------ | -------------- | --------------------- | --------------------------------------------- |
| `listing_id` | string         | `1652144683809168862` | Listing to find similar stays for             |
| `checkin`    | date           | `2026-09-01`          | Optional, recommended (see Known limitations) |
| `checkout`   | date           | `2026-09-05`          | Optional                                      |
| `adults`     | int, default 1 | `2`                   | Adult guests, for pricing on results          |

**`GET /autosuggest`** — `query` required.

| Param   | Type   | Example  | Meaning                          |
| ------- | ------ | -------- | -------------------------------- |
| `query` | string | `London` | Partial or full destination name |

**`GET /experience`** — `listing_id` required.

| Param        | Type           | Example   | Meaning                                |
| ------------ | -------------- | --------- | -------------------------------------- |
| `listing_id` | string         | `7032932` | Plain numeric Experience id            |
| `adults`     | int, default 1 | `2`       | Adult guests, for pricing/availability |

**`GET /service`** — `listing_id` required.

| Param        | Type           | Example   | Meaning                                    |
| ------------ | -------------- | --------- | ------------------------------------------ |
| `listing_id` | string         | `7201659` | Plain numeric Service id                   |
| `adults`     | int, default 1 | `1`       | Adult guests, for pricing where applicable |

**`GET /host`** — `host_id` required.

| Param            | Type            | Example               | Meaning                                                                                           |
| ---------------- | --------------- | --------------------- | ------------------------------------------------------------------------------------------------- |
| `host_id`        | string          | `1618048489116497162` | Plain numeric host id — from any /listing or /reviews `reviewee.id` on a review with a host reply |
| `reviews_offset` | int, default 0  | `0`                   | Host reviews to skip                                                                              |
| `reviews_limit`  | int, default 10 | `10`                  | Host reviews per page                                                                             |

### How to use Airbnb All-in-One API

1. Open this Actor's Standby API URL (shown on the Actor's page, under the API tab) — `https://romy--airbnb-all-in-one-api.apify.actor`.
2. Call any endpoint — for example:
   ```bash
   curl "https://romy--airbnb-all-in-one-api.apify.actor/search?query=Bali,%20Indonesia&checkin=2026-09-01&checkout=2026-09-05&adults=2"
   curl "https://romy--airbnb-all-in-one-api.apify.actor/listing?listing_id=1633199196629299212"
   curl "https://romy--airbnb-all-in-one-api.apify.actor/reviews?listing_id=1633199196629299212&sort=MOST_RECENT&limit=5"
   curl "https://romy--airbnb-all-in-one-api.apify.actor/availability?listing_id=1652144683809168862&month=9&year=2026"
   curl "https://romy--airbnb-all-in-one-api.apify.actor/autosuggest?query=London"
   curl "https://romy--airbnb-all-in-one-api.apify.actor/experience?listing_id=7032932"
   curl "https://romy--airbnb-all-in-one-api.apify.actor/service?listing_id=7201659"
   curl "https://romy--airbnb-all-in-one-api.apify.actor/host?host_id=1618048489116497162"
   ```
   Every call needs your Apify API token, either as `Authorization: Bearer <token>` or `?token=<token>` — the Actor's page API tab has a ready-to-copy version with your token filled in.
3. Read the JSON response — no setup required.

Add `&currency=IDR` (or any ISO currency code) to any endpoint to get real, server-computed localized prices.

### Input

This Actor takes no run-input; it starts immediately in Standby mode. All parameters are passed per-request as HTTP query strings — see the endpoint table above and the OpenAPI schema (API tab on the Actor's page).

### Output

Every response is returned directly over HTTP — this Actor does not write to an Apify dataset. Responses pass through Airbnb's own real (deeply nested) GraphQL data — every field the app itself receives, not a manually re-typed subset. Real responses (trimmed to the most relevant fields for readability — the actual response includes much more):

`GET /search?query=Bali&checkin=2026-08-25&checkout=2026-08-30`:

```json
{
    "success": true,
    "results": {
        "searchResults": [
            {
                "title": "Villa in Tegalalang",
                "avgRatingA11yLabel": "New place to stay",
                "propertyTypeLabel": "Entire villa",
                "structuredDisplayPrice": {
                    "primaryLine": { "originalPrice": "$380 USD", "discountedPrice": "$281 USD", "qualifier": "total" }
                },
                "demandStayListing": { "id": "RGVtYW5kU3RheUxpc3Rpbmc6MTc0OTY2OTEzMTQ5MDM3NTU0Ng==" }
            }
        ],
        "paginationInfo": { "nextPageCursor": "eyJzZWN0aW9uX29mZnNldCI6MCwiaXRlbXNfb2Zmc2V0Ijo4LCJ2ZXJzaW9uIjoxfQ==" }
    }
}
```

`GET /listing?listing_id=1633199196629299212`:

```json
{
    "success": true,
    "listing": {
        "sections": {
            "sectionContainer": [
                {
                    "sectionId": "TITLE_DEFAULT",
                    "section": { "title": "Furnished Studio Flat by Regent's Park | AC + Lift" }
                },
                {
                    "sectionId": "HOST_OVERVIEW_DEFAULT",
                    "section": { "title": "Hosted by Lukasz", "isSuperhost": true }
                }
            ]
        }
    }
}
```

`GET /reviews?listing_id=1633199196629299212&limit=1`:

```json
{
    "success": true,
    "reviews": {
        "pdpReviews": [
            {
                "id": "1743086535494888639",
                "comments": "Luh is a great host, she had good local recommendations as well. She is very responsive and helpful...",
                "localizedDate": "2 weeks ago",
                "ratingAccessibilityLabel": "Rating, 5 stars",
                "response": null,
                "reviewee": { "firstName": "Luh", "id": "Q29udGV4dHVhbFVzZXI6MTYxODA0ODQ4OTExNjQ5NzE2Mg==" }
            }
        ]
    }
}
```

`GET /availability?listing_id=1652144683809168862&month=9&year=2026`:

```json
{
    "success": true,
    "calendar": {
        "calendar_months": [
            {
                "month": 9,
                "year": 2026,
                "days": [
                    { "date": "2026-09-01", "available": false, "min_nights": 1, "max_nights": 365 },
                    { "date": "2026-09-05", "available": true, "price": { "local_price_formatted": "Rp 2,151,719" } }
                ]
            }
        ]
    }
}
```

`GET /host?host_id=1618048489116497162`:

```json
{
    "success": true,
    "profile": {
        "displayFirstName": "Luh",
        "isSuperHost": true,
        "location": "Denpasar, Indonesia",
        "timeAsHost": { "years": 0, "months": 5 },
        "verificationInfo": { "verifiedSinceText": "Verified since February 2026", "hasVerificationBadge": true }
    },
    "reviews": {
        "reviewsReceivedFromGuests": {
            "edges": ["... 10 reviews written about Luh as a host, across all their listings ..."]
        }
    }
}
```

### Data notes

- **`/reviews`**: each review's `response` field is `null` if the host hasn't replied, or a string with `respondedAt`/`localizedRespondedDate`/`reviewee` (who replied) if they have. Only one reply per review — Airbnb's data model doesn't support threaded replies, so there's nothing to paginate there.
- **`/search` pagination**: the first page is a `GET`; every following page requires a `POST` to the same endpoint with `cursor` set to the previous response's `results.paginationInfo.nextPageCursor` — confirmed live across 13 real pages during development. A client that only ever sends `GET` will silently see page 1 forever.
- **`/search` filters are the real values the app sends, not a guessed enum**: `room_type` accepts exactly `"Entire home/apt"` or `"Private room"` (confirmed by toggling the filter chip and inspecting the request — snake\_case values like `entire_home` are not real). `allows_pets` is a boolean "Allows pets" filter chip, unrelated to how many pets are travelling. `amenities` is a single shared numeric-id space that also covers things the app shows as separate filter sections (self check-in, individual accessibility features) — only a couple of ids are documented by hand (Wifi=4, Pool=7) since cataloguing the full id space live, one chip at a time, wasn't practical; any other real Airbnb amenity id also works, nothing is restricted client-side.
- **`currency`**: works as a plain query parameter on every endpoint (default `USD`). Verified against the raw response body, not just the display string — real server-computed amounts in the requested currency.
- **`/experience` and `/service`** both accept a numeric `listing_id` from their respective category in `/search` (Airbnb calls both an `ActivityListing` internally — same underlying node type, different presentation).
- **`host_id`** for `/host` comes from any `/listing` or `/reviews` response's `reviewee.id` field on a review that has a host reply — no separate lookup needed.

### Pricing

Pay-per-event, billed on each successful call. See the Actor's Pricing tab for current rates.

### Known limitations

- **`/similar-listings` returns an empty array for many listings**, including some where the official app itself shows real recommendations for the exact same listing/dates. Confirmed by replicating the app's own captured request byte-for-byte (same listing id, same dates, same currency) and still getting an empty result — this looks like a real-time/session-scoped recommendation on Airbnb's side rather than a request-shape issue on ours. Kept in the API since it does return real data for some listings, not removed.
- **`/search`'s `amenities` id catalogue is incomplete.** The filter itself is real and works with any valid numeric id, but only 2 ids (Wifi, Pool) were confirmed by hand-toggling the app's filter chips one at a time — the app exposes 30+ amenity/accessibility chips across 5 categories (see the "Homes filters" research in the source repo's `FINDINGS.md`), and cataloguing all of them live wasn't done this round. Pass any id you already know; more will be documented as they're confirmed.
- This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by Airbnb. Behavior may change if Airbnb changes its API.

Found a bug or have a feature request? Use the Issues tab on this Actor's page.

# Actor input Schema

## Actor input object example

```json
{}
```

# Actor output Schema

## `api` (type: `string`):

This Actor doesn't write to a dataset — every response is returned directly over HTTP by its Standby web server. See the README / web server OpenAPI schema (webServerSchema) for the full endpoint list and response shapes (GET /search).

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("romy/airbnb-all-in-one-api").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("romy/airbnb-all-in-one-api").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 '{}' |
apify call romy/airbnb-all-in-one-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,romy/airbnb-all-in-one-api"
        }
    }
}

```

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/Yaw5h8ptc5YVPoOvp/builds/wbXQ8f6BBnphsGVGc/openapi.json
