← Blog

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.

Epic Scrapers

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.

What data you get from Airbnb

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.

How to scrape Airbnb listings in 5 minutes

  1. Open the Airbnb Scraper and click Try for free.
  2. Under Location Queries, type one or more places the way you would in Airbnb’s search bar: Lisbon, Le Marais, Paris, Brooklyn, NY.
  3. Set Check-In Date and Check-Out Date, the number of adults, and a currency.
  4. Optionally add filters: minimum and maximum nightly price, minimum beds, bedrooms or bathrooms.
  5. Set Max Results to something small like 20 for a first run, then click Start.
  6. Open the Output tab and export as JSON, CSV or Excel.

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.

Scrape specific Airbnb listings by URL

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.

Sample output

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.

Add guest reviews

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.

Run it from the API

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}'

What people use Airbnb data for

  • Short-term rental investment. Before buying, pull every comparable unit near the address for several date windows (peak, shoulder, off-season). Filter by minBedrooms and personCapacity, then use price.breakDown.total and rating.reviewsCount to estimate what the property could realistically earn.
  • Pricing for hosts and property managers. Re-run the same neighbourhood weekly with fixed dates and compare your rate to the median of similar listings. price.originalPrice against price.discountedPrice shows who is discounting.
  • Amenity gap analysis. The 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.
  • Market and policy research. 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.
  • Guest sentiment. Feed review 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.

Pricing

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.

FAQ

Does Airbnb have a public API?

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.

Can I get Airbnb occupancy rates?

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.

How many Airbnb listings can I scrape?

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.

Can I scrape Airbnb reviews for many listings at once?

Yes. Pass any number of room URLs to the Airbnb Reviews Scraper and use maxReviewsPerListing to cap each one.

Start scraping Airbnb

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.