Travel
Airbnb Scraper: Scrape Airbnb Listings, Prices and Reviews
Scrape Airbnb listings with prices, fee breakdowns, ratings, hosts and amenities, plus guest reviews, for short-term rental market research. No code needed.
Travel
Scrape Airbnb listings with prices, fee breakdowns, ratings, hosts and amenities, plus guest reviews, for short-term rental market research. No code needed.
Airbnb is the biggest public dataset on short-term rentals: what’s available, what it costs for real dates, how guests rate it, and who runs it. The site doesn’t offer a public API for that data, so investors, hosts, property managers and researchers scrape it.
This guide shows how to scrape Airbnb listings with the Airbnb Scraper by Epic Scrapers on Apify, how to add guest reviews with the companion Airbnb Reviews Scraper, and how to turn the output into short-term rental analysis.
The listing scraper returns one record per property with 70+ fields. The ones people use most:
| Group | Fields |
|---|---|
| Listing | id, url, title, description, propertyType, roomType, personCapacity, subDescription |
| Price | price.label, price.price, price.qualifier, price.originalPrice, price.discountedPrice, price.breakDown (base price, cleaning fee, service fee, taxes, total, special offers, early-bird discount) |
| Ratings | rating.guestSatisfaction, rating.accuracy, rating.cleanliness, rating.checking, rating.communication, rating.location, rating.value, rating.reviewsCount |
| Location | coordinates.latitude, coordinates.longitude, location, locationSubtitle |
| Host | host.name, host.isSuperHost, host.isVerified, host.ratingAverage, host.ratingCount, host.timeAsHost, coHosts |
| Details | amenities (grouped, with available flags), highlights, houseRules, cancellationPolicies, images, isAvailable, timestamp |
Prices depend on the dates and guests you search for. If you pass checkIn and checkOut, you get what a guest would pay for that stay, which is what you want for revenue modelling.
Lisbon, Le Marais, Paris, Brooklyn, NY.Here’s the same search as JSON input. It looks for two-bedroom places in Lisbon for a four-night stay in March, priced in euros:
{
"locationQueries": ["Lisbon"],
"checkIn": "2027-03-10",
"checkOut": "2027-03-14",
"adults": 4,
"currency": "EUR",
"locale": "en-US",
"priceMin": 80,
"priceMax": 300,
"minBedrooms": 2,
"maxResults": 50
}
maxResults caps the total across all queries. Leave it empty to collect everything Airbnb returns; each location query pages through up to about 15 search pages (roughly 300 to 450 listings). For a full city, split it into neighbourhood queries such as Alfama, Lisbon and Príncipe Real, Lisbon, and duplicates across queries are removed automatically.
If you already track a competitive set, pass room URLs or an Airbnb search URL in startUrls instead:
{
"startUrls": [
{ "url": "https://www.airbnb.com/rooms/1212782301994274588" },
{ "url": "https://www.airbnb.com/rooms/12937" }
],
"checkIn": "2027-03-10",
"checkOut": "2027-03-14",
"adults": 2,
"currency": "GBP",
"locale": "en-US"
}
locale supports 11 languages (en-US, de-DE, fr-FR, es-ES, it-IT, pt-BR, ja-JP, ko-KR, zh-CN, ru-RU, ar-XX) and currency supports 27 currencies, including USD, EUR, GBP, AUD, CAD, CHF, JPY and AED. If you need more detail on hosts and co-hosts, turn on Enrich User Profiles (enrichUserProfiles). It makes extra requests per host, so it costs more and runs slower.
A trimmed record from a London search:
{
"id": "1212782301994274588",
"url": "https://www.airbnb.com/rooms/1212782301994274588",
"title": "Bright and Newly Renovated Studio near Hyde Park",
"propertyType": "Entire rental unit",
"roomType": "Entire home/apt",
"personCapacity": 2,
"price": {
"label": "$1,081 total",
"price": "$1,081",
"qualifier": "total"
},
"rating": {
"guestSatisfaction": 5.0,
"cleanliness": 4.8,
"location": 4.93,
"value": 4.87,
"reviewsCount": "15"
},
"coordinates": { "latitude": 51.5167, "longitude": -0.1881 },
"locationSubtitle": "Greater London, England, United Kingdom",
"host": {
"name": "Ulrich",
"isSuperHost": true,
"ratingAverage": 4.96,
"ratingCount": 46,
"timeAsHost": { "years": 11, "months": 0 }
},
"subDescription": {
"title": "Rental unit in Greater London",
"items": ["1 bedroom", "1 bed", "1 private bath"]
},
"isAvailable": true,
"checkIn": "2026-07-01",
"checkOut": "2026-07-05",
"timestamp": "2026-06-23T18:11:29.012Z"
}
Price values are formatted strings like "$1,081", so strip the currency symbol and separators before doing math. When Airbnb returns the line items, price.breakDown splits the total into base price, cleaning fee, service fee and taxes.
Listing data tells you price and rating; reviews tell you why. The Airbnb Reviews Scraper takes room URLs and returns every review with text, rating (1 to 5), createdAt, language, reviewerName, revieweeName (the host), the host’s response, and localizedText when Airbnb has a translation.
{
"startUrls": [
{ "url": "https://www.airbnb.com/rooms/12937" }
],
"maxReviewsPerListing": 100,
"sortBy": "most-recent",
"sinceDate": "2026-01-01",
"locale": "en-GB"
}
sortBy accepts most-recent, most-relevant, highest-rated and lowest-rated. sinceDate only works with most-recent, which makes it ideal for a weekly run that only picks up new reviews. A common pipeline: run the listing scraper for a neighbourhood, take the top 50 url values, and feed them to the reviews scraper.
Every run is available through the Apify API. With Python and apify-client:
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("epicscrapers/airbnb-scraper").call(run_input={
"locationQueries": ["Lisbon"],
"checkIn": "2027-03-10",
"checkOut": "2027-03-14",
"adults": 2,
"currency": "EUR",
"maxResults": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["price"]["price"], item["rating"]["guestSatisfaction"])
Or with cURL, which waits for the run to finish and returns the dataset items directly:
curl -X POST "https://api.apify.com/v2/acts/epicscrapers~airbnb-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"locationQueries": ["Lisbon"], "checkIn": "2027-03-10", "checkOut": "2027-03-14", "maxResults": 20}'
minBedrooms and personCapacity, then use price.breakDown.total and rating.reviewsCount to estimate what the property could realistically earn.price.originalPrice against price.discountedPrice shows who is discounting.amenities array is structured, so you can count how many top-rated listings have a dedicated workspace, parking or air conditioning and see what yours is missing.coordinates let you map listing density by street or district. host.timeAsHost, host.ratingCount and coHosts help separate professional operators from occasional hosts. Schedule runs and the timestamp field dates every observation.text into a sentiment or topic model to find what drives 5-star and 3-star stays in a market.For property sale and rental data rather than holiday lets, see the Idealista scraper guide for Spain, Italy and Portugal, or the Rightmove scraper guide for UK sold prices.
Both actors charge per result with no subscription. Reviews are billed per review, listings per listing, and enriching host profiles adds extra requests. Check the Pricing tab on each actor for current rates, and set a maximum cost per run if you want a hard ceiling.
No. Airbnb’s API is limited to approved partners for managing their own listings. To get search results, prices and reviews into a spreadsheet or code, people use a scraper exposed through an API, like the Apify actors above.
The actors read publicly visible listing and review pages without logging in. Host names, profile photos and reviewer first names are still personal data under GDPR and similar laws, so collect only what you need, don’t use it to contact or profile individuals, and respect Airbnb’s terms. This isn’t legal advice.
Not directly. Airbnb doesn’t publish occupancy. You can estimate demand by searching specific dates and tracking isAvailable, price changes and review growth over time.
There’s no fixed run limit. Each location query covers up to about 15 search pages, so for whole cities use several neighbourhood queries in one run.
Yes. Pass any number of room URLs to the Airbnb Reviews Scraper and use maxReviewsPerListing to cap each one.
Pick one neighbourhood, set real dates and a limit of 20, and check the rows. Then widen the search, add reviews, or schedule it weekly. Run the Airbnb Scraper on Apify, and add the Airbnb Reviews Scraper when you need guest feedback.