Airbnb Scraper API: Listings, Prices, Reviews & Calendar avatar

Airbnb Scraper API: Listings, Prices, Reviews & Calendar

Pricing

from $0.75 / 1,000 listings

Go to Apify Store
Airbnb Scraper API: Listings, Prices, Reviews & Calendar

Airbnb Scraper API: Listings, Prices, Reviews & Calendar

Scrape Airbnb listings, prices, reviews, ratings and availability calendars with occupancy for any city or listing URL. Get the nightly rate and stay total as numbers, six rating categories, host, amenities and photos: 99 fields per short-term rental. Calendar included; failed listings are free.

Pricing

from $0.75 / 1,000 listings

Rating

5.0

(1)

Developer

CodePoetry

CodePoetry

Maintained by Community

Actor stats

2

Bookmarked

20

Total users

9

Monthly active users

an hour ago

Last modified

Share

Airbnb Scraper

Airbnb Scraper API extracts public Airbnb listing data without an Airbnb API key, which does not exist for developers. Give it a city, a region or room URLs and it returns 99 fields per property: the nightly rate and stay total as numbers, the availability calendar with an occupancy rate, all six rating categories, the host, amenities and guest reviews. Export to JSON, CSV or Excel, or read the results over the API.

Why this Airbnb scraper

  • The price for your stay, as numbers. Set check_in, check_out and guests, and every listing comes back with price_per_night and total_price you can sort and average, quoted for exactly those nights.
  • Availability calendar and occupancy in the listing price. Up to 12 months of day-by-day availability, blocked days, occupancy_rate and the next free date, at no extra charge.
  • All six rating categories. Accuracy, check-in, cleanliness, communication, location and value, plus the share of 5 to 1 star reviews, instead of one overall star.
  • Every review once. Reviews are paged newest first, so each comes back exactly once. Paging Airbnb's default order by offset returned a 373-review listing as 322 distinct reviews, with duplicates and gaps.
  • You pay for data you can use. Search pages are free, failed listings are free and say what went wrong, and a maximum cost per run is respected.
  • Airbnb as other countries see it. Browse from 23 markets, in 18 languages, with prices in 28 currencies, each checked against Airbnb.
  • A stable shape. A field Airbnb leaves out is null, never dropped, and coordinates say whether they are the exact spot or Airbnb's privacy circle.

Measured, not claimed

Every number on this page comes from a run, on the date given, not from a spec sheet.

WhatMeasuredWhen
Fields per listing9920 Oct 2026
Currencies28, each run against Airbnb and returning that currency2 Sep 2026
Languages18, each run and returned translated2 Sep 2026
Default run20 listings, all 99 fields, 22 seconds2 Sep 2026
Listings priced for a set stay20 of 20 in Paris, 5 nights in July 202720 Oct 2026
Billing3 listings and 6 reviews delivered, 3 and 6 charged20 Oct 2026

What Airbnb data can you extract?

Every full detail record contains:

GroupFields
Identityid, url, name, title, subtitle, description, description language, SEO title, thumbnail, images
Locationlatitude, longitude, coordinates, city, country, neighbourhood, location descriptions, and whether the coordinates are the exact spot rather than Airbnb's privacy circle
Capacityperson capacity, bedrooms, beds, bathrooms, room type, property type, home tier
Priceprice_per_night and total_price as numbers, currency, original and discounted price, nights, the check-in and check-out they were quoted for, and the price label and breakdown Airbnb shows. Airbnb quotes all-in prices and no longer itemises cleaning or service fees, so neither does this
Ratingsguest satisfaction overall, plus accuracy, check-in, cleanliness, communication, location and value, and the share of 5 to 1 star reviews
Hostname, id, profile URL, photo, superhost and verified status, years hosting, response rate and time, rating average and count, highlights, about (co-hosts are a separate top-level field)
Amenitiesthe complete list by category, plus direct flags for wifi, air conditioning, heating, kitchen, parking, washer, TV, pool, dedicated workspace and pets
Reviewsreviewer, date, rating, review text, language, highlights and the host response, up to a limit you set
Availabilityday by day calendar, minimum and maximum nights, and from today on: days total, days available, days blocked, occupancy rate and the next available date
Rules and policieshouse rules, cancellation policy, check-in and check-out times, self check-in, smoking, parties, commercial photography, licence number
Metadatainstant book, Guest Favourite, highlights, badges, scraped_at timestamp

Search mode returns what the result card carries: id, url, name, title, subtitle, thumbnail, images, latitude, longitude and coordinates, nightly rate, stay total and original price as numbers, nights, the price label and breakdown, the check_in and check_out it was quoted for, rating, review count, Superhost, badges and the scraped_at timestamp. Room type, capacity and everything else below the card are full-detail fields.

Seven tabs instead of one 99-column table

A record this wide is unreadable as one table, so the dataset arrives grouped. Each tab answers one question:

TabWhat it answers
ListingsThe whole picture: photo, name, city, type, capacity, all three prices with the stay they were quoted for, rating, review count, Guest Favourite, Superhost, occupancy and the booking terms
AvailabilityThe day-by-day calendar, minimum and maximum nights, days free, days blocked, occupancy rate and the next free date
Ratings & reviewsAll six category scores behind the star, the rating distribution, and the reviews themselves
HostHost and co-hosts, Superhost status, licence, whether the address is verified
LocationCoordinates and whether they are exact rather than Airbnb's privacy circle, address, neighbourhood, map link
Amenities & rulesThe full amenity list by category, direct flags for the ones people filter on, house rules, cancellation terms, safety features
Description & photosThe listing's own copy, highlights, sleeping arrangements, badges and every image

Export any tab to JSON, CSV or Excel. All fields shows the raw record.

Output example

From a run on 20 Oct 2026: three Porto listings, 2 adults, 15 to 20 March 2027.

idnameperson_capacityprice_per_nighttotal_pricerating.guest_satisfactionnumber_of_reviewsoccupancy_rate
29480483Porto AAA - Almada Aliados Apartment2132.556634.973680.74
602831143027997558Almada Prime with Balcony - Heart of the City2119.095634.992960.62
10097660Oporto's heArt (PRIVATE PARKING)3111.025564.994730.40

The first of them as JSON, shortened: lists keep their first item, and long text is cut.

{
"id": "29480483",
"url": "https://www.airbnb.com/rooms/29480483",
"name": "Porto AAA - Almada Aliados Apartment",
"property_type": "Entire rental unit",
"room_type": "Entire home/apt",
"person_capacity": 2,
"bedrooms": 1,
"beds": 1,
"bathrooms": 1,
"city": "Porto",
"country": "Portugal",
"latitude": 41.14608,
"longitude": -8.61115,
"is_exact_location": false,
"check_in": "2027-03-15",
"check_out": "2027-03-20",
"nights": 5,
"price_per_night": 132.55,
"total_price": 663,
"original_price": null,
"currency": "USD",
"price": {
"label": "$663 for 5 nights",
"amount": "$663",
"qualifier": "for 5 nights",
"currency": "USD",
"breakdown": [{ "label": "5 nights x $132.55", "amount": "$662.73" }]
},
"stars": 4.97,
"number_of_reviews": 368,
"rating": {
"guest_satisfaction": 4.97,
"accuracy": 4.99,
"checkin": 4.98,
"cleanliness": 4.98,
"communication": 4.97,
"location": 4.98,
"value": 4.95
},
"is_guest_favorite": true,
"is_super_host": true,
"host": {
"name": "Teresa",
"profile_url": "https://www.airbnb.com/users/show/28228281",
"is_super_host": true,
"is_verified": true,
"rating_average": 4.93,
"rating_count": 1322
},
"amenities_count": 42,
"amenity_wifi": true,
"amenity_kitchen": true,
"amenity_ac": true,
"amenity_washer": true,
"house_rules": [{ "rule": "Up to 2 overnight guests", "icon": "SYSTEM_FAMILY" }],
"instant_book": true,
"min_nights": 2,
"max_nights": 1125,
"availability": [
{
"date": "2026-10-01",
"available": false,
"available_for_checkin": false,
"available_for_checkout": false,
"min_nights": 1,
"max_nights": 1125,
"bookable": null
}
],
"availability_days_total": 42,
"availability_days_available": 11,
"blocked_days": 31,
"occupancy_rate": 0.7380952380952381,
"next_available_date": "2026-11-04",
"reviews": [
{
"reviewer_name": "Denise",
"rating": 5,
"text": "We had a wonderful stay in this beautiful apartment and felt at home from the very first moment...",
"created_at": "2026-10-19T10:41:58Z",
"language": "en",
"response": null
}
],
"scraped_at": "2026-10-20T19:28:09.533978935Z",
"error": null
}

Airbnb prices for your dates

Airbnb quotes by stay, so the same listing has no single price. Pass check_in, check_out and guest counts, and every record carries the price a guest would be shown for those nights, plus the check_in and check_out it was quoted for. A location search without dates prices one night about a month out. Listings fetched by start_urls are priced only when you give dates.

A price label tells you what a listing asks. "$663 for 5 nights" is a string; 663 and 132.55 are numbers you can sort, filter and average. Where a stay is discounted, the pre-discount price comes too, and available says whether the listing can be booked for those dates at all. Seven of eight listings sampled in one city could not be.

Ratings work the same way. An overall 4.9 hides whether guests marked a place down on cleanliness or on value, and six category scores tell you which.

Airbnb occupancy rate and availability calendar

Every full listing carries its day-by-day calendar for calendar_months months (3 by default, up to 12), at no extra charge. From the calendar, the scraper counts the days from today to the end of the window and reports how many are free and how many are blocked. occupancy_rate is blocked days divided by that total.

The Porto apartment above, scraped on 20 Oct 2026, had 42 days left in its window, 11 free and 31 blocked, so its occupancy_rate is 0.738. Its next_available_date was 4 Nov 2026.

Airbnb does not say why a day is blocked. A blocked day is either a booking or the host closing the date, so treat the rate as an upper bound on bookings rather than a count of them. It is most useful for comparing listings and neighbourhoods measured the same way, or for tracking one listing over time on a schedule. Nightly rates alone tell you what a market advertises; rates with occupancy tell you what it books.

Is there an Airbnb API?

Not a public one. Airbnb's API is closed to approved partners, such as channel managers and property-management software, and there is no key you can sign up for as a developer. Searching for an Airbnb API key, or for free Airbnb API access, turns up partner application forms rather than documentation you can use.

This is the practical substitute. Give it a location and it walks Airbnb's search results, opens each property page, and returns one record per listing through a REST API you already have credentials for. There is no Airbnb login or partner application, and no rate limit to negotiate.

It runs two ways. Full detail opens every property page and returns everything above. Search mode reads only the results pages and returns the card-level fields, billed per search result. Sweep a whole market in search mode, then go deep on the properties that matter.

How much does the Airbnb scraper cost?

You pay only for the events below. Compute, proxies and storage are covered by the price. Prices depend on your Apify plan:

EventFree planStarterScaleBusiness and above
Listing, full detail with calendar$3.00 / 1,000$1.50 / 1,000$1.10 / 1,000$0.75 / 1,000
Search result, card only$0.50 / 1,000$0.50 / 1,000$0.50 / 1,000$0.50 / 1,000
Review$0.30 / 1,000$0.30 / 1,000$0.30 / 1,000$0.30 / 1,000
Run start$0.0001$0.0001$0.0001$0.0001
Search page walkedfreefreefreefree
Failed listingfreefreefreefree

The Free plan listing price is $3.00 per 1,000 from 22 October 2026, and $2.00 before that. The Pricing tab of this page always shows the current prices.

Some examples:

  • 1,000 full listings with a 3-month calendar, on Starter: $1.50.
  • The same 1,000 listings with 20 reviews each: $1.50 + 20,000 × $0.0003 = $7.50.
  • 5,000 search cards across a country's cities in search mode: $2.50.

Reviews are the one line that depends on the properties rather than on how many you asked for. A busy listing carries a couple of hundred, so pulling all of them costs far more than the listing itself; max_reviews_per_listing caps it at 50 by default. If you are budgeting a run, this is the number to look at twice. Set a maximum cost per run in the run options and the scraper stops before it would bill past it.

Finding listings is free. Paginating a city of 240 listings takes about 14 search pages and costs nothing. A removed property, or one Airbnb refuses to serve, still comes back as a record carrying the id, the url and what happened, and that record is not billed.

How to scrape Airbnb listings without an API key

  1. Add the locations you want under location_queries, or paste listing URLs into start_urls.
  2. Set check_in and check_out for the stay you care about.
  3. Choose mode. Use full for complete property data, search for a quick sweep of the result cards.
  4. Set max_listings to cap the run. Turn on include_reviews if you want reviews, and max_reviews_per_listing to bound how many of them you pay for.
  5. Start the run. Results appear in the dataset while the run is still going, so you can begin reading before it finishes.

Ready-made example tasks

Each opens a copy you can run as is or edit:

Input

Search one city or many

Each location becomes its own search and all of them merge into a single dataset. Covering ten cities takes one run rather than ten.

{
"location_queries": ["Porto, Portugal", "Lisbon, Portugal", "Braga, Portugal"],
"mode": "full",
"max_listings": 500
}

Set dates, guests and prices

Guest counts change both the price and which listings appear.

{
"location_queries": ["Barcelona, Spain"],
"check_in": "2027-03-15",
"check_out": "2027-03-20",
"adults": 2,
"children": 1,
"price_min": 80,
"price_max": 300
}

Scrape Airbnb from another country

Airbnb ranks results and shows prices and availability differently depending on where you browse from. A Paris search seen from France is not the same result set as the one you get from a US connection: different ordering, different totals, sometimes different listings.

proxy_country picks the country to browse from, and the scraper reads that country's own Airbnb site. 23 markets are supported:

{
"location_queries": ["Paris, France"],
"proxy_country": "FR"
}
EuropeUnited Kingdom, France, Germany, Spain, Italy, Portugal, Netherlands, Poland, Sweden, Denmark, Austria, Ireland, Greece, Turkey
AmericasUnited States, Canada, Brazil, Mexico
Asia-PacificJapan, South Korea, India, Singapore, Australia

Leave it empty and the market follows the language you chose. Set both when you want them to differ, for example an English-speaking buyer researching the French market. China and Russia are not offered: Airbnb withdrew from both, and a search from either returns nothing. Russian and Chinese are still offered as languages, and left to follow the language they browse the United States.

Scrape specific listings

Skip search entirely when you already know the properties. start_urls accepts room URLs and bare listing ids in the same list. Add check_in and check_out to price them.

{
"start_urls": [
"https://www.airbnb.com/rooms/29480483",
"https://www.airbnb.com/rooms/602831143027997558",
"10097660"
],
"check_in": "2027-03-15",
"check_out": "2027-03-20",
"mode": "full"
}

Filter what comes back

{
"location_queries": ["Lisbon, Portugal"],
"room_types": ["Entire home/apt"],
"property_types": ["Apartment", "Loft"],
"min_bedrooms": 2,
"min_bathrooms": 1,
"min_rating": 4.8
}

Scrape Airbnb reviews and the availability calendar

The calendar comes with every full listing. Reviews are opt-in and billed per review. Both arrive nested inside the listing record, so a property and its history stay together.

{
"location_queries": ["Madrid, Spain"],
"include_reviews": true,
"max_reviews_per_listing": 20,
"calendar_months": 3
}

Set max_reviews_per_listing to 0 to take every review a listing has.

All input options

OptionTypeWhat it does
location_queriesarrayLocations to search. Each becomes its own search, merged into one dataset.
start_urlsarrayRoom URLs or bare listing ids to fetch directly, skipping search. Give this or location_queries, not both.
modestringfull opens every property page. search reads results pages only.
check_in, check_outstringStay dates, so prices reflect a real booking.
adults, children, infants, petsintegerGuest counts. These change price and availability.
price_min, price_maxintegerNightly price bounds.
min_beds, min_bedrooms, min_bathroomsintegerSize filters.
room_typesarrayEntire home/apt, private room, shared room, hotel room.
property_typesarrayKeep only listings matching these property types.
min_ratingnumberDrop listings rated below this.
max_pagesintegerSearch pages to walk per location. Usually leave empty; max_listings already bounds the run.
max_listingsintegerHow many listings to return. Defaults to 20; 0 takes every listing found.
include_reviewsbooleanFetch guest reviews. Off by default; billed per review.
max_reviews_per_listingintegerReviews per property, at most. Defaults to 50; 0 fetches every one.
calendar_monthsintegerMonths of availability to pull, from today, up to 12. 0 skips the calendar.
calendar_start_month, calendar_start_yearintegerStart the calendar somewhere other than today. Defaults to the current month and year.
currencystringPrices converted to this. 28 options, each checked against Airbnb.
localestringLanguage for review dates, house rules and cancellation terms. 18 options.
proxy_countrystringCountry to browse Airbnb from. 23 markets; empty follows locale.

Who uses Airbnb data, and for what

Property managers and hosts track what comparable listings nearby charge for the same nights, and how their occupancy compares. The price for a set stay and the availability calendar together show what a market books at, rather than what it advertises.

Real estate investors screen neighbourhoods before buying by pulling every listing in an area with occupancy rates and nightly rates attached.

Travel and booking sites build inventory feeds, comparing Airbnb prices against their own.

Researchers and journalists study short-term rental density in cities considering regulation, using coordinates, licence numbers and host portfolios.

Anyone doing due diligence on a host can pull their full portfolio through start_urls and check ratings, response rates and review history across properties.

When another tool fits better

  • Revenue and RevPAR estimates. This returns the raw inputs, the price for a stay and the calendar, and leaves the modelling to you. It does not estimate revenue the way AirDNA or similar market-data products do.
  • Airbnb Experiences. Only stays are scraped.
  • Host emails and phone numbers. Airbnb does not publish them, and this does not try to find them.

How the Airbnb scraper handles blocks and failures

A listing that cannot be fetched becomes a record instead of disappearing. It carries the id and url you asked for, plus an error array explaining what happened:

{
"id": "999999999999999",
"url": "https://www.airbnb.com/rooms/999999999999999",
"error": [
{
"scope": "listing",
"type": "listing.state_missing",
"message": "the detail page carried no listing state, so every field below the search card is null"
}
]
}

The run carries on and finishes normally. One removed property does not cost you the other 499, and error records are not charged.

Problems that affect the whole run, such as a location Airbnb does not recognise, appear in the run summary rather than being attached to a listing.

Frequently asked questions

Do I need an Airbnb API key? No. There is no public Airbnb API to get a key for; it is restricted to approved partner integrations. This reads the same public pages a browser does, so there is nothing to apply for and no quota to negotiate.

Do I need an Airbnb account? No. The scraper reads public listing pages and needs no login or cookies.

How much does it cost to scrape 1,000 Airbnb listings? $1.50 on the Starter plan, with the price for your dates and a 3-month availability calendar on every listing. It is $3.00 on the Free plan and $0.75 on Business. Reviews, if you turn them on, add $0.30 per 1,000. Failed listings and search pages are free.

How is the occupancy rate calculated? Blocked days divided by the days from today to the end of the calendar window. Airbnb does not separate bookings from days the host closed, so the rate counts both. Set calendar_months for a longer window.

Why are prices different from what I see on Airbnb? Usually because the stay is different. Without check_in and check_out, a search prices one night about a month out and says which night on every record. Pass your own dates and guest counts and the numbers match what a guest is shown.

Can I call it from Python, n8n or an AI agent? Yes. It is an ordinary Apify Actor, so anything that can make an HTTP request can start a run and read the dataset: the Python and JavaScript clients, n8n, Make, Zapier, or plain curl. AI agents can call it as a tool through Apify's MCP server. The API tab on this page has the exact call with your token filled in.

Can I get every listing in a city? Airbnb caps how deep its own search goes, so no scraper can return literally every property from one query. Splitting a city into neighbourhoods or price bands and passing them as separate location_queries reaches more of the inventory.

How many reviews can I get? As many as a listing has, up to max_reviews_per_listing: 50 by default, or 0 for every one. Reviews add time, so cap it when you are sweeping a whole market.

What does search mode leave out? Everything that only exists on the property page: room type and capacity, the availability calendar, reviews, the full amenity list, host details and house rules. Search mode gives you the card: id, url, title, prices, rating, review count, coordinates, thumbnail and images.

Can I run this on a schedule? Yes. Schedule it like any other Actor and each run writes a fresh dataset. The scraped_at field on every record tells you which run it came from, so a weekly schedule on the same listings gives you a price and occupancy history.

Is it legal to scrape Airbnb? This reads only pages Airbnb shows to any visitor without logging in. Whether a given use is allowed depends on where you are and what you do with the data, especially the personal data in host profiles and reviews. Check with a lawyer if you are unsure.

Notes

This is an unofficial scraper. It is not affiliated with, authorised by, sponsored by or endorsed by Airbnb, and "Airbnb" is used only to say which public website it reads.

Prices, availability and ratings change constantly. A record is a snapshot at scraped_at, not a standing fact.

Review counts and calendar depth are the two settings that drive run length. A market sweep with reviews off and calendar_months at 1 finishes far quicker than the same sweep with every review and a year of availability.

Start scraping

Paste a city into location_queries, set check_in and check_out, and run it, or open one of the example tasks above.