Skip to content

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_rating and sort run on our side, and filters_applied says 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.

POST /search · the captured request
{
  "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.
Rome, 2026-12-15 → 2026-12-18 · 2 of 26 listings, trimmed · captured 2026-10-23
{
  "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
    }
  ]
}
FieldTypeMeaningFirst excerpted listing
price_totalnumber | nullThe total Airbnb quoted, for the nights on the row.259 USD
price_per_nightnumber | nullAirbnb'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_totalnumber | nullThe struck-through price when the listing is discounted; null when it is not.284
currencystringThe currency you sent, or USD when you sent none.USD
rating / rating_scalenumber | null · number | nullOut of 5 on every rated row; both null when the listing has no rating yet.4.79 · 5
latitude / longitudenumber | null · number | nullWhere Airbnb places the listing on its map; null when Airbnb leaves them out.41.88112 · 12.5062
linkstringThe 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.

captured run · 2026-10-23
ListingRatingReviewsPer nightTotal, 3 nightsWas
Deluxe Double Room with Extra Bed——73.88269—link →
Veio garden Bed & Breakfast, Bright room4.7951972.56259284link →
Paolo S's B&B4.842,09568.45246275link →
Daniele Manin Guesthouse - Room with private bathroom4.8514281.91280—link →
Cozy and modern flat near the Colosseum4.93426147.41403483link →
Room 2 Eternal Residency4.8716482.65289—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 · POST /search
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.

ParameterTypeWhat it doesRuns at
destinationstring, requiredFree text, the way a person types it: "Rome, Italy", "Lisbon", "Brooklyn, New York"Airbnb
checkin_dateYYYY-MM-DD, requiredFirst night. Today or laterAirbnb
checkout_dateYYYY-MM-DD, requiredAfter checkin_dateAirbnb
adultsintegerAdult guestsAirbnb
childrenintegerChildrenAirbnb
infantsintegerInfantsAirbnb
petsintegerPetsAirbnb
currencyISO code, default USDPrices and currency on every row come back in itAirbnb
price_minnumberAirbnb's own price filter, per night, in currencyAirbnb
price_maxnumberAirbnb's own price filter, per night, in currencyAirbnb
min_bedroomsintegerMinimum bedroomsAirbnb
min_bedsintegerMinimum bedsAirbnb
min_bathroomsnumberMinimum bathroomsAirbnb
room_typesarray of stringsAny of "Entire home/apt", "Private room", "Shared room", "Hotel room". Any other value is ignored, so spell them exactlyAirbnb
min_ratingnumber, out of 5Airbnb's search has no rating filter, so this runs on the rows. A listing with no rating is dropped, not keptours
sortprice_asc, price_desc, rating_descAirbnb'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 refusedours
proxy_countrytwo-letter lowercase code, e.g. deSends the search out through a residential connection in that country. Filters nothingours

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 | null

5 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_includednull

Always 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 | null

The night count Airbnb quoted the price for. It can differ from your dates when Airbnb shifts them, so read it before dividing.

availableboolean

true 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 | null

Airbnb'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 · POST /details
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_statusHTTPsearch_reasonWhat it meansWhat to do
ok200okListings foundUse them
empty200no_resultsThe 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
degraded502blocked_statusAirbnb refused the request (403, 429, 451...), after our proxy retryRetry after a pause
degraded502blocked_pageThe page came back without results data (a challenge or a different page)Retry once. If it sticks, message us
degraded502parse_failedThe data was there in a shape we don't know. The clearest sign Airbnb changed somethingRetry once, then message us
degraded502upstream_errorAirbnb answered 5xx, or the connection failedRetry
degraded502timeoutAirbnb took too longRetry
error400invalid_requestA required field is missing, a date is malformed or in the past, checkout isn't after check-in, or the body isn't JSONFix the request
error400unsupported_for_providerYou sent a Booking.com-only field. unsupported_fields and supported_fields say whichUse the Airbnb parameter named in detail
error400bad_requestThe request was well formed but can't be searched: a listing_id that isn't digits, an unknown sortFix the request
error400unknown_providerYou sent a provider other than airbnbLeave 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.

PlanPrice / moRequests$ / 1k reqOverageRate limit
BASICFree100 / mo—hard cap—Get this plan →
PRO$1010,000 / mo$1.00$0.001 / req60 / minGet this plan →
ULTRA$2535,000 / mo$0.71$0.0007 / req150 / minGet this plan →
MEGA$50100,000 / mo$0.50$0.0005 / req300 / minGet 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_night move.
  • 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_included is null here, 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_total or shows price_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.