Airbnb All-in-One API
Pricing
Pay per event + usage
Airbnb All-in-One API
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.
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.
It talks directly to the same internal API the official Airbnb 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 — realRpamounts, 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
- 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. - Call any endpoint — for example:
Every call needs your Apify API token, either ascurl "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"Authorization: Bearer <token>or?token=<token>— the Actor's page API tab has a ready-to-copy version with your token filled in. - Read the JSON response — no setup required.
Add ¤cy=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:
{"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:
{"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:
{"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:
{"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:
{"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'sresponsefield isnullif the host hasn't replied, or a string withrespondedAt/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./searchpagination: the first page is aGET; every following page requires aPOSTto the same endpoint withcursorset to the previous response'sresults.paginationInfo.nextPageCursor— confirmed live across 13 real pages during development. A client that only ever sendsGETwill silently see page 1 forever./searchfilters are the real values the app sends, not a guessed enum:room_typeaccepts exactly"Entire home/apt"or"Private room"(confirmed by toggling the filter chip and inspecting the request — snake_case values likeentire_homeare not real).allows_petsis a boolean "Allows pets" filter chip, unrelated to how many pets are travelling.amenitiesis 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 (defaultUSD). Verified against the raw response body, not just the display string — real server-computed amounts in the requested currency./experienceand/serviceboth accept a numericlisting_idfrom their respective category in/search(Airbnb calls both anActivityListinginternally — same underlying node type, different presentation).host_idfor/hostcomes from any/listingor/reviewsresponse'sreviewee.idfield 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-listingsreturns 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'samenitiesid 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'sFINDINGS.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.
