Airbnb Live API
Live Airbnb listings, with real numbers
Send a place and two dates to POST /search and you get the listings Airbnb is showing right now, with the stay total and the price per night as numbers in your currency (USD if you do not say). Free BASIC plan with 100 requests a month, then $10 for 10,000.
- Price range, room type and minimum beds, bedrooms and bathrooms go to Airbnb's own search, so the page comes back already cut
min_ratingandsortrun on our side, andfilters_appliedsays which filter ran where- Each row carries rating, review count, beds, bedrooms, baths, coordinates and a direct link
Its own RapidAPI listing: airbnb-live-api.p.rapidapi.com. Free tier: 100 requests a month.
{
"destination": "Rome, Italy",
"checkin_date": "2026-12-15",
"checkout_date": "2026-12-18",
"adults": 2,
"currency": "USD"
}The response this exact request produced is rendered below, labelled as a captured run.
Short answer
What an Airbnb search returns
POST /search on airbnb-live-api.p.rapidapi.com, with a RapidAPI key, takes a free-text destination plus checkin_date and checkout_date, and returns the listings Airbnb is showing right now: the stay total and the price per night as numbers, the currency, the rating out of 5, review count, beds, bedrooms, baths, coordinates and a link to the listing. No listing id, no lookup step. Nothing is cached.{
"provider": "airbnb",
"destination": "Rome, Italy",
"checkin_date": "2026-12-15",
"checkout_date": "2026-12-18",
"search_status": "ok",
"search_reason": "ok",
"properties": [
{
"name": "Veio garden Bed & Breakfast, Bright room",
"price_total": 259,
"price_per_night": 72.56,
"price_original_total": 284,
"currency": "USD",
"nights": 3,
"rating": 4.79,
"rating_scale": 5,
"review_count": 519,
"beds": 2,
"bedrooms": null,
"baths": 1,
"latitude": 41.88112,
"longitude": 12.5062,
"link": "https://www.airbnb.com/rooms/46730658",
"available": true
},
{
"name": "Cozy and modern flat near the Colosseum",
"price_total": 403,
"price_per_night": 147.41,
"price_original_total": 483,
"currency": "USD",
"nights": 3,
"rating": 4.93,
"rating_scale": 5,
"review_count": 426,
"beds": 1,
"bedrooms": 1,
"baths": 1,
"latitude": 41.8949,
"longitude": 12.496,
"link": "https://www.airbnb.com/rooms/25792224",
"available": true
}
]
}| Field | Type | Meaning | First excerpted listing |
|---|---|---|---|
price_total | number | null | The total Airbnb quoted, for the nights on the row. | 259 USD |
price_per_night | number | null | Airbnb's own per-night line; we only divide when Airbnb didn't print one. Here 3 × 72.56 is below the 259 total, so don't rebuild the total from it. | 72.56 |
price_original_total | number | null | The struck-through price when the listing is discounted; null when it is not. | 284 |
currency | string | The currency you sent, or USD when you sent none. | USD |
rating / rating_scale | number | null · number | null | Out of 5 on every rated row; both null when the listing has no rating yet. | 4.79 · 5 |
latitude / longitude | number | null · number | null | Where Airbnb places the listing on its map; null when Airbnb leaves them out. | 41.88112 · 12.5062 |
link | string | The listing on airbnb.com. | airbnb.com/rooms/… |
Every row has every key: a field Airbnb didn't publish is null, never a made-up zero and never missing. Branch on search_status, not on the length of properties.
The response, rendered
What came back for Rome
The first 6 of the 26 listings the request above returned: 3 nights, 2 adults, priced in USD.
| Listing | Rating | Reviews | Per night | Total, 3 nights | Was | |
|---|---|---|---|---|---|---|
| Deluxe Double Room with Extra Bed | — | — | 73.88 | 269 | — | link → |
| Veio garden Bed & Breakfast, Bright room | 4.79 | 519 | 72.56 | 259 | 284 | link → |
| Paolo S's B&B | 4.84 | 2,095 | 68.45 | 246 | 275 | link → |
| Daniele Manin Guesthouse - Room with private bathroom | 4.85 | 142 | 81.91 | 280 | — | link → |
| Cozy and modern flat near the Colosseum | 4.93 | 426 | 147.41 | 403 | 483 | link → |
| Room 2 Eternal Residency | 4.87 | 164 | 82.65 | 289 | — | link → |
Prices in USD. “Was” is price_original_total, the struck-through price on a discounted listing; a dash is a null in the response (the first row of this table had no rating yet). Every row also has price_string, image_url, provider_property_id and retrieved_at.
First call
One request, no lookup step
You say where and when, you get what it costs. Replace $RAPIDAPI_KEY and paste it in a terminal.
curl -X POST "https://airbnb-live-api.p.rapidapi.com/search" \
-H "Content-Type: application/json" \
-H "x-rapidapi-host: airbnb-live-api.p.rapidapi.com" \
-H "x-rapidapi-key: $RAPIDAPI_KEY" \
-d '{"destination":"Rome, Italy","checkin_date":"2026-12-15","checkout_date":"2026-12-18","adults":2,"currency":"USD"}'Filters
Filtered at the source
Most of these are Airbnb's own search parameters, so the page you get is already narrowed. Two run on our side, on the rows we parsed, and filters_applied in the response marks them post_filter: true. proxy_country is ours too, but it only picks where the request leaves from.
| Parameter | Type | What it does | Runs at |
|---|---|---|---|
destination | string, required | Free text, the way a person types it: "Rome, Italy", "Lisbon", "Brooklyn, New York" | Airbnb |
checkin_date | YYYY-MM-DD, required | First night. Today or later | Airbnb |
checkout_date | YYYY-MM-DD, required | After checkin_date | Airbnb |
adults | integer | Adult guests | Airbnb |
children | integer | Children | Airbnb |
infants | integer | Infants | Airbnb |
pets | integer | Pets | Airbnb |
currency | ISO code, default USD | Prices and currency on every row come back in it | Airbnb |
price_min | number | Airbnb's own price filter, per night, in currency | Airbnb |
price_max | number | Airbnb's own price filter, per night, in currency | Airbnb |
min_bedrooms | integer | Minimum bedrooms | Airbnb |
min_beds | integer | Minimum beds | Airbnb |
min_bathrooms | number | Minimum bathrooms | Airbnb |
room_types | array of strings | Any of "Entire home/apt", "Private room", "Shared room", "Hotel room". Any other value is ignored, so spell them exactly | Airbnb |
min_rating | number, out of 5 | Airbnb's search has no rating filter, so this runs on the rows. A listing with no rating is dropped, not kept | ours |
sort | price_asc, price_desc, rating_desc | Airbnb's search has no sort. This orders the page you got back (by price_per_night or rating), not all of Airbnb. Rows with no value go last. Any other value is refused | ours |
proxy_country | two-letter lowercase code, e.g. de | Sends the search out through a residential connection in that country. Filters nothing | ours |
A filter that belongs to our Booking.com API (filters, budget_per_night, free_cancellation, hotel_name, hotel_booking_id, price_as_seen_from) is refused with unsupported_for_provider and, where Airbnb has one, the name of the parameter to use instead. Refused, not dropped, because a dropped filter hands you more listings than you asked for. A parameter name this API doesn't know (a typo like min_bedroom) is ignored, so check filters_applied: a filter that isn't listed there didn't run.
If you want to check whether prices differ by country, hold one listing fixed and call each country a few times. One call per country isn't a measurement.
The rows
What else to know about the rows
rating_scale5 | null5 on every rated row (null when the listing has no rating yet). Our Booking.com API rates out of 10, so check the scale before you put a 4.86 next to an 8.3.
taxes_includednullAlways null. Airbnb's display total treats taxes differently by place and we haven't pinned it down, so the field says “not known” instead of guessing.
nightsnumber | nullThe night count Airbnb quoted the price for. It can differ from your dates when Airbnb shifts them, so read it before dividing.
availablebooleantrue when the row has a price. It does not promise your exact dates: when nights differs from your stay, Airbnb priced different dates.
price_stringstring | nullAirbnb's own label, if you want to show exactly what a guest saw: "$259 total, originally $284" on the first excerpted listing.
POST /details
One listing in detail (no price)
listing_id is the number at the end of an airbnb.com/rooms/... link, and provider_property_id on every search row.
curl -X POST "https://airbnb-live-api.p.rapidapi.com/details" \
-H "Content-Type: application/json" \
-H "x-rapidapi-host: airbnb-live-api.p.rapidapi.com" \
-H "x-rapidapi-key: $RAPIDAPI_KEY" \
-d '{"listing_id":"46730658","checkin_date":"2026-12-15","checkout_date":"2026-12-18","adults":2}'You get the name, property type, rating, review count, coordinates, person_capacity and the full amenities list. No price, and it says so: Airbnb loads a listing page's price after the page opens, so it isn't in what we read. price_total and available are null and the row carries price_available_on_this_page: false. For a price, search.
Errors
When something comes back wrong
Every response has search_status and search_reason, and every degraded or error one has detail, a sentence you can act on. A 200 with an empty properties list only ever means search_status: empty. A page we couldn't read is never a 200.
| search_status | HTTP | search_reason | What it means | What to do |
|---|---|---|---|---|
| ok | 200 | ok | Listings found | Use them |
| empty | 200 | no_results | The page was read and nothing on it matched: Airbnb listed nothing for those dates, or your min_rating removed every row (check filters_applied) | Don't retry the same request. Loosen min_rating if you set one |
| degraded | 502 | blocked_status | Airbnb refused the request (403, 429, 451...), after our proxy retry | Retry after a pause |
| degraded | 502 | blocked_page | The page came back without results data (a challenge or a different page) | Retry once. If it sticks, message us |
| degraded | 502 | parse_failed | The data was there in a shape we don't know. The clearest sign Airbnb changed something | Retry once, then message us |
| degraded | 502 | upstream_error | Airbnb answered 5xx, or the connection failed | Retry |
| degraded | 502 | timeout | Airbnb took too long | Retry |
| error | 400 | invalid_request | A required field is missing, a date is malformed or in the past, checkout isn't after check-in, or the body isn't JSON | Fix the request |
| error | 400 | unsupported_for_provider | You sent a Booking.com-only field. unsupported_fields and supported_fields say which | Use the Airbnb parameter named in detail |
| error | 400 | bad_request | The request was well formed but can't be searched: a listing_id that isn't digits, an unknown sort | Fix the request |
| error | 400 | unknown_provider | You sent a provider other than airbnb | Leave provider out |
Pricing
10,000 requests for $10
An Airbnb search is a plain page read. There's no browser behind it, and it goes out direct: a residential proxy only comes in when Airbnb refuses the direct request, or when you ask for a country with proxy_country. It costs far less to serve, so PRO here is 10,000 requests for $10, against 2,500 on the flights API.
| Plan | Price / mo | Requests | $ / 1k req | Overage | Rate limit | |
|---|---|---|---|---|---|---|
| BASIC | Free | 100 / mo | — | hard cap | — | Get this plan → |
| PRO | $10 | 10,000 / mo | $1.00 | $0.001 / req | 60 / min | Get this plan → |
| ULTRA | $25 | 35,000 / mo | $0.71 | $0.0007 / req | 150 / min | Get this plan → |
| MEGA | $50 | 100,000 / mo | $0.50 | $0.0005 / req | 300 / min | Get this plan → |
Swipe the table sideways for overage and rate limits.
Every plan on this API includes all of its endpoints; Airbnb, Booking.com hotels and flights are separate subscriptions. Read from the live listing on 2026-10-23; the listing is authoritative.
Every field and every filter is on every plan, the free one too. A call to any endpoint is one request, and a 400 counts like any other call, so keep check-in in the future.
Build with it
Things to build with it
- Deal scanning. Sweep a city across a month of check-in dates on a schedule and watch
price_per_nightmove. - Rentals next to hotels. Same trip, this API and our Booking.com search. Airbnb rates out of 5 and Booking out of 10, and
taxes_includedisnullhere, so compare with that in mind. - AI travel agents. Flat JSON that drops straight into a tool call.
- Market analysis. Coordinates on the rows, so you can place listings by neighbourhood. One search is one page, so cover a city with several searches (by price band or room type).
- Price alerts. Re-run the same search on a schedule and fire when a listing on it drops in
price_totalor showsprice_original_total.
Questions, answered plainly
- Does Airbnb have a public API for searching listings?
- No. Its API program serves software for hosts, with no guest-side search. The Airbnb Live API reads the same search page a guest reads, live, when you ask, and hands it back as flat JSON. Nothing is cached.
- Is the price per night or for the stay?
- Both, as numbers. price_total is the total Airbnb quoted, for the nights on the row. price_per_night is Airbnb's own per-night line (we only divide when Airbnb didn't print one), so nights times price_per_night need not add up to price_total. price_string carries Airbnb's own label, the way a guest saw it.
- How many listings does one search return?
- One search returns one page of Airbnb's results; that was 20 to 30 listings a search in our tests. The Rome capture on this page returned 26.
- Can I get prices in euros or pounds?
- Send currency (EUR, GBP...) and prices come back in it. Leave it out and you get USD, and every row says which currency it is in.
- Can I use my Booking.com filters here?
- No, and the API says so instead of ignoring them. filters, budget_per_night, free_cancellation, hotel_name, hotel_booking_id and price_as_seen_from are refused with unsupported_for_provider and, where Airbnb has one, the name of the parameter to use instead. A parameter name this API does not know at all (a typo) is ignored, so check filters_applied: a filter that is not listed there did not run.
- Is it the same key as the flights and Booking.com APIs?
- One RapidAPI key works on all three once you subscribe to each. The Airbnb Live API is its own listing and its own subscription.
- Is this an official Airbnb API?
- No. It is an independent API, not affiliated with, endorsed by, or sponsored by Airbnb, Inc.
Start with one search
Live Airbnb listings with the stay total, the price per night, ratings and coordinates, as flat JSON your code or your agent can use directly.
Free tier: 100 requests a month.
Independent API. Not affiliated with, endorsed by, or sponsored by Airbnb, Inc.