Airbnb Scraper: All Listings in a City, Prices & Hosts avatar

Airbnb Scraper: All Listings in a City, Prices & Hosts

Pricing

from $0.50 / 1,000 results

Go to Apify Store
Airbnb Scraper: All Listings in a City, Prices & Hosts

Airbnb Scraper: All Listings in a City, Prices & Hosts

Scrape every Airbnb listing in a city, past the 300-result limit. Prices for your dates (total, nightly, fees), ratings, host details, registration numbers, amenities and photos. Paste search or room URLs. $0.50 per 1,000 listings, no login. Export to CSV, Excel or API.

Pricing

from $0.50 / 1,000 results

Rating

0.0

(0)

Developer

Epic Scrapers

Epic Scrapers

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

3

Monthly active users

10 days ago

Last modified

Share

Airbnb Scraper: every listing in a city, with prices for your dates, ratings, hosts and license numbers

Airbnb Scraper turns any Airbnb search into a spreadsheet for short-term rental market research, pricing and monitoring. Enter a city, paste a search URL or a list of room links, and you get one row per listing: the price for your dates (total, nightly rate and fees), the rating and its six categories, the host, the registration or license number, amenities, house rules, cancellation policy and the full photo gallery.

  • No 300-listing limit. Airbnb stops every search at about 300 results, and a scraper that just pages through the search stops there too. This Actor splits big areas into smaller map areas until each one fits, so you get a whole city. In our test, Porto returned 11,173 unique listings in about 2.5 minutes.
  • Prices for your exact stay. Set check-in, check-out and guests, and every listing shows its total price, nightly rate, discounts and fees for those nights. Listings that aren't free for those nights don't appear, so the results show what's actually available.
  • The data professionals need. Registration and license numbers, business hosts (EU), Superhost and Guest Favorite status, the host's ID and review count, rating categories, cancellation policy and safety items. All of it is Airbnb's own data, not modeled.
  • Built for repeated runs. Schedule it daily or weekly and compare runs to follow prices, availability, new listings and hosts' portfolios.
  • Pay per listing, no subscription. $0.50 per 1,000 listings on paid Apify plans ($4 on the Free plan), with or without details. No Airbnb account, API key or proxy setup. Export to JSON, CSV, Excel or Google Sheets, or use the API.

Scope: This Actor collects listings. For guest review texts, use Airbnb Reviews Scraper with the same room URLs.

What can you do with Airbnb Scraper?

GoalHow
Size a short-term rental marketScrape a whole city with Max listings per search set to 0, then count listings by roomType, bedrooms and city.
Set or check your nightly rateSearch your area for your dates and compare pricePerNight and priceTotal across listings with the same bedrooms and personCapacity.
Track competitors' pricesPaste your competitors' room URLs, set the dates, and schedule the task. Each run records their price and whether they're still bookable.
Check license and registration complianceRead registrationNumber for every listing in a city and find the ones without one.
Find professional hostsGroup listings by host.id: hosts with many listings, host.isBusiness, host.ratingCount and host.timeAsHost.
Compare qualityCompare rating.cleanliness, rating.location, rating.value, isGuestFavorite and amenitiesList across a market.
Watch seasonal demandRun the same search for several stay dates. How many listings are still available, and at what price, shows how full the market is.

How it compares

What you needAirbnb ScraperPage-by-page Airbnb scrapersMarket-data subscriptions (AirDNA, Airbtics)
Listings per searchA whole city (searches split by map area)About 300, Airbnb's limitWhole markets, in their reports
PricesAirbnb's live price for your dates, with feesVariesOften modeled averages
Registration numbers, host dataYes, per listingOften missingVaries
Raw data for your own analysisEvery field, as JSON, CSV, Excel or APIYesMostly dashboards
PricePay per listingPay per listingMonthly subscription

Market-data subscriptions estimate occupancy and revenue with models. This Actor reports what Airbnb shows: listings, live prices and availability for the dates you choose, ratings and host details. To follow occupancy yourself, schedule runs for future dates and watch which listings stop being available (see the recipes below).

Quick start

  1. Click Try for free and sign in to Apify.
  2. Add a place to Locations, for example Lisbon, Portugal. Or paste room links or an Airbnb search URL into Airbnb URLs.
  3. For a first run, set Max listings per search to 50.
  4. Click Start. When the run finishes, open the Output tab and export the data.
{
"locationQueries": ["Lisbon, Portugal"],
"maxResultsPerSearch": 50,
"checkIn": "2026-12-04",
"checkOut": "2026-12-07",
"adults": 2
}

What data can you extract?

Every row is one listing. These fields come from the search results, so they are there even with details turned off:

GroupFields
Listingid, url, title, listingType, city, coordinates, thumbnail, images (whole gallery), imageCount
PricecheckIn, checkOut, nights, pricePerNight, priceTotal, priceTotalOriginal (before discount), currency, priceLabel, priceBreakdown
SearchsearchQuery, searchRank, isAvailable
ReputationratingAverage, reviewsCount, isNewListing, isSuperhost, isGuestFavorite, badges

With Include listing details on (the default), each row also has:

GroupFields
PropertypropertyType, roomType, personCapacity, bedrooms, beds, bathrooms, sleepingArrangements, registrationNumber
Ratingsrating (guestSatisfaction, accuracy, cleanliness, checking, communication, location, value, reviewsCount), ratingDistribution (share of 1–5 stars)
Hosthost (id, name, profileUrl, isSuperHost, isVerified, isBusiness, ratingAverage, ratingCount, timeAsHost, about, hostDetails such as response rate), coHosts
Descriptiondescription, descriptionSections, htmlDescription, highlights, locationSubtitle, locationDescriptions
AmenitiesamenitiesList (available amenities as plain names), amenities (grouped by category, including the ones that aren't available)
RuleshouseRules, cancellationPolicy (name, summary), safetyAndProperty (alarms, cameras, parking)

Collect a whole city

Airbnb answers each search with at most about 300 listings. When a search has more, the Actor:

  1. Saves the first ~300 results in Airbnb's own order, with searchRank.
  2. Takes the map area those listings cover and splits it into four. Each part is searched on its own.
  3. Splits again any part that still has more than Airbnb will show, until every part fits. Duplicates are removed.

Set Max listings per search to 0 to get everything, and turn off Include listing details for the fastest and cheapest snapshot:

{
"locationQueries": ["Porto, Portugal"],
"maxResultsPerSearch": 0,
"includeDetails": false
}

Measured on October 11, 2026: Barcelona, 2,000 listings without details in 21 seconds on the Apify platform; Porto with no limit, 11,173 unique listings in about 2.5 minutes. Details add one request per listing, fetched 10 at a time (100 listings with details took 14 seconds).

The map area follows where Airbnb's results for the place are, so it can include neighboring towns (a "Lisbon" search also covers Almada and Costa da Caparica). Every row has city to filter on. To scrape an exact area, zoom the map on airbnb.com to it and paste the URL: the Actor keeps the map box from the URL.

Track Airbnb over time with scheduled runs

Most of the value comes from running the same search again and comparing. Apify can run the Actor for you on a schedule and send the results wherever you need them.

1. Save your input as a task

Open the Actor, set your locations, dates and options, then click Save as a new task. A task is a saved input you can run again with one click or on a schedule.

2. Schedule the task

In Apify Console, go to Schedules, click Create new, choose how often to run (for example daily at 06:00 in your time zone), and add your task. See Schedules and How to create a schedule.

Watch how to schedule an Actor:

Or schedule a saved task:

Common schedules:

Use caseFrequencyCron expression
Competitor prices for upcoming weekendsDaily0 6 * * *
Availability for an event or holidayTwice a day0 6,18 * * *
Whole-market snapshot (supply, new hosts)Weekly (Monday)0 6 * * 1
Registration compliance auditMonthly0 6 1 * *

Dates in a saved task are fixed. For "the next weekend" on every run, update checkIn and checkOut through the API before each run (see below), or keep one task per stay you track.

3. Send the results to a spreadsheet

Connect Google in the task's Integrations tab to save every run to Google Sheets or Google Drive automatically:

4. Compare runs

Every row has id, host.id, checkIn, checkOut and timestamp, so runs are easy to join:

  • Price changes: pricePerNight and priceTotal per id and stay dates.
  • Availability: with dates set, a listing that was in yesterday's results and is missing today was booked, blocked or removed. For room URLs, isAvailable turns false.
  • New supply: ids that appear for the first time, with isNewListing and reviewsCount.
  • Host portfolios: number of listings per host.id over time.
  • Quality drift: ratingAverage, rating.cleanliness and reviewsCount per id.

Input reference

FieldTypeDefaultEffect
locationQueriesArray of stringsEmptyPlaces to search, as you'd type them on Airbnb.
startUrlsArray of URLsEmptyRoom URLs (/rooms/<id>) or search URLs (/s/...) from any Airbnb domain. Search URLs keep their filters and map area.
maxResultsPerSearchInteger300Maximum listings per location or search URL. 0 means no limit.
maxResultsIntegerEmptyOptional cap for the whole run.
includeDetailsBooleantrueAdds the detail fields above. One extra request per listing, same price. Room URLs always get details.
checkIn/checkOutDateEmptyYYYY-MM-DD. Only listings available for the stay, priced for those nights. Without dates, Airbnb prices a stay it picks (see checkIn).
adults, children, infants, petsInteger1, 0, 0, 0Guests. Pets return only pet-friendly listings.
priceMin/priceMaxIntegerEmptyTotal price of the stay, including fees, in currency.
roomTypeString"any""entire", "private", "hotel" or "shared".
minBedrooms, minBeds, minBathroomsIntegerEmptyMinimum room counts.
localeString"en-US"Language of titles and labels. Airbnb translates listing texts written in other languages.
currencyString"USD"Currency of every price.
dedupeAcrossSearchesBooleantrueSave each listing once per run. Turn off to keep every search's full list, for example for ranks per neighborhood.
concurrencyInteger10Listing details fetched at the same time (1–30).
proxyConfigurationObjectApify datacenter proxyFailed requests are retried on a new IP.

Ready-to-run examples

Snapshot a whole market

{
"locationQueries": ["Porto, Portugal"],
"maxResultsPerSearch": 0,
"includeDetails": false,
"currency": "EUR"
}

Count listings by roomType and city, and compare pricePerNight across the market. Run weekly to follow supply.

Price a two-bedroom for a holiday weekend

{
"locationQueries": ["Austin, Texas"],
"checkIn": "2026-12-31",
"checkOut": "2027-01-02",
"adults": 4,
"minBedrooms": 2,
"roomType": "entire",
"maxResultsPerSearch": 500
}

Sort by pricePerNight, then compare the cheapest and the best-rated (ratingAverage, isGuestFavorite).

Monitor competitors' prices and availability

{
"startUrls": [{ "url": "https://www.airbnb.com/rooms/12937" }, { "url": "https://www.airbnb.co.uk/rooms/7743405" }],
"checkIn": "2026-12-04",
"checkOut": "2026-12-07",
"adults": 2
}

Each row has the listing's price for those nights and isAvailable. Schedule it daily and chart priceTotal per id.

Audit registration numbers

{
"locationQueries": ["Lisbon, Portugal"],
"maxResultsPerSearch": 0,
"roomType": "entire"
}

Filter rows where registrationNumber is empty, and group by host.id to see which hosts they belong to.

Paste a search with filters from airbnb.com

{
"startUrls": [
{
"url": "https://www.airbnb.com/s/Lisbon--Portugal/homes?checkin=2026-12-01&checkout=2026-12-04&adults=2&amenities%5B%5D=7"
}
],
"maxResultsPerSearch": 0
}

Every filter in the URL is kept (here: pool), including ones the input doesn't offer, such as amenities, and the map area if you zoomed in.

Compare neighborhoods

{
"locationQueries": ["Shoreditch, London", "Camden, London", "Brixton, London"],
"maxResultsPerSearch": 300,
"dedupeAcrossSearches": false
}

Every row has searchQuery, so you can compare prices and ratings per neighborhood.

Use it from your code

Run the Actor and get the listings with the Apify API, for example from a nightly job:

curl -X POST "https://api.apify.com/v2/acts/epicscrapers~airbnb-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"locationQueries": ["Lisbon, Portugal"], "maxResultsPerSearch": 100, "checkIn": "2026-12-04", "checkOut": "2026-12-07"}'

Python, with the Apify client:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("epicscrapers/airbnb-scraper").call(run_input={
"locationQueries": ["Porto, Portugal"],
"maxResultsPerSearch": 0,
"includeDetails": False,
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing["id"], listing["pricePerNight"], listing["ratingAverage"])

run-sync endpoints wait up to 5 minutes. For whole cities, start the run, wait for it to finish, then read the dataset. The Actor also works with Make, Zapier and n8n.

Analyze the results with ChatGPT or Claude

Export the dataset as CSV (the Prices & ranks or Market & hosts view keeps it small) and attach it to a chat with ChatGPT, Claude or another AI assistant. Some prompts to start with:

Price a listing. "This is Airbnb data for one city and one stay. For listings with 2 bedrooms that sleep 4, show the median, 25th and 75th percentile pricePerNight, split by isGuestFavorite. Recommend a nightly rate for a new 2-bedroom with a 4.8 rating and explain why."

Map the professional hosts. "Group the listings by host.id. List the 20 hosts with the most listings, with their host.name, number of listings, average pricePerNight, average ratingAverage and how many of their listings have a registrationNumber."

Find gaps in a market. "Compare amenities (amenitiesList) between listings with ratingAverage of 4.9 or more and the rest. Which amenities are much more common among the top-rated ones?"

Output

Results go to the run's default dataset. Use the views Overview, Prices & ranks, Market & hosts or Ratings & amenities, or export everything as JSON, CSV, Excel, XML or HTML.

This is a real row from an Austin, Texas search for December 4–7, 2026, 2 adults, scraped on October 11, 2026. The description, amenities, photos and rules are shortened:

{
"id": "1084003745739020477",
"url": "https://www.airbnb.com/rooms/1084003745739020477",
"title": "Prime East Downtown Studio w/ pool, gym, laundry",
"listingType": "Apartment in Austin",
"city": "Austin",
"coordinates": { "latitude": 30.26117, "longitude": -97.72278 },
"searchQuery": "Austin, Texas",
"searchRank": 1,
"currency": "USD",
"checkIn": "2026-12-04",
"checkOut": "2026-12-07",
"priceLabel": "$369 for 3 nights, originally $517",
"priceTotal": 369,
"priceTotalOriginal": 517,
"pricePerNight": 122.9,
"nights": 3,
"priceBreakdown": [{ "description": "3 nights x $122.90", "price": "$368.70", "amount": 368.7 }],
"ratingAverage": 4.76,
"reviewsCount": 42,
"isSuperhost": false,
"isGuestFavorite": false,
"imageCount": 22,
"isAvailable": true,
"propertyType": "Entire rental unit",
"roomType": "Entire home/apt",
"personCapacity": 2,
"bedrooms": 1,
"beds": 1,
"bathrooms": 1,
"locationSubtitle": "Austin, Texas, United States",
"registrationNumber": "OL 2025 065577",
"rating": {
"guestSatisfaction": 4.76,
"accuracy": 4.83,
"checking": 4.64,
"cleanliness": 4.79,
"communication": 4.88,
"location": 4.9,
"value": 4.69,
"reviewsCount": 42
},
"ratingDistribution": { "1": 0, "2": 0, "3": 0.024, "4": 0.19, "5": 0.786 },
"host": {
"id": "35817561",
"name": "Jen And Steven",
"profileUrl": "https://www.airbnb.com/users/show/35817561",
"isSuperHost": false,
"isVerified": true,
"isBusiness": false,
"ratingAverage": 4.77,
"ratingCount": 7517,
"timeAsHost": { "years": 9, "months": 0 },
"hostDetails": ["Response rate: 100%", "Responds within an hour"]
},
"amenitiesList": ["Bathtub", "Hair dryer", "Cleaning products", "Shampoo", "Conditioner", "…"],
"houseRules": {
"general": [
{
"title": "Checking in and out",
"values": [
{ "title": "Check-in after 4:00 PM", "icon": "SYSTEM_CLOCK", "additionalInfo": null },
{ "title": "Checkout before 10:00 AM", "icon": "SYSTEM_CLOCK", "additionalInfo": null }
]
}
]
},
"safetyAndProperty": [
{
"section": "Safety devices",
"title": "Exterior security cameras on property",
"details": "“There is 1 outdoor security camera above the front door…”"
}
],
"cancellationPolicy": {
"name": "Non-refundable",
"id": 51,
"summary": "Free cancellation for 24 hours. After that, the reservation is non-refundable."
},
"detailsScraped": true,
"timestamp": "2026-10-11T10:41:54.799Z"
}

Notes on fields

  • priceTotal is the total for the stay as Airbnb shows it, in currency; pricePerNight is the nightly rate from Airbnb's price breakdown, before fees and taxes. priceBreakdown lists the lines Airbnb shows (nights, discounts, taxes).
  • Without dates, Airbnb prices a stay it picks itself (in our tests, 5 nights within the next few weeks). checkIn, checkOut and nights show which stay the price is for.
  • isAvailable is true for listings from a search with dates. For room URLs with dates it is false when Airbnb doesn't offer the listing for those nights (booked, blocked or outside its minimum stay); its price is then empty. Without dates it is null.
  • searchRank is the position in Airbnb's own order among the first ~300 results. Listings found by splitting the map have searchRank: null.
  • registrationNumber is the number from the listing's "Registration details" block, as the host entered it. It is empty when the listing shows none.
  • host.isBusiness is true when the host declared itself a professional host. Airbnb shows this declaration on listings in the EU; elsewhere it is usually false.
  • bedrooms, beds and bathrooms are read from Airbnb's English summary line. With a locale other than English they may be empty; subDescription.items always has the localized text.
  • images comes from the search card and has the whole gallery. Captions are filled in for the photos the listing page shows first.
  • Missing values are null. Every row has timestamp in UTC.

FAQ

How many listings can I get?

As many as Airbnb has in the area. Above ~300 results, the Actor splits the map until every part fits. A large city can have tens of thousands of listings, so with maxResultsPerSearch: 0 set a maximum cost per run.

Why are there listings outside the city I searched?

The map area is taken from where Airbnb's results for the place are, and it's a rectangle, so it can include neighboring towns. Filter on city, or paste a search URL with the map zoomed to the exact area.

Does it return prices?

Yes, for every listing in a search, and for room URLs when the listing is bookable. Set check-in and check-out for prices for your stay. The price filter (priceMin/priceMax) works on the total price of the stay, as on airbnb.com.

Can it show occupancy or revenue?

Airbnb doesn't publish occupancy or revenue, so the Actor doesn't estimate them. You can measure availability yourself: run the same search with dates on a schedule and see which listings disappear from the results or turn isAvailable: false.

Can I scrape a search URL with filters?

Yes. Set up the search on airbnb.com (place, dates, guests, price, amenities, map area) and paste the URL into Airbnb URLs. Every filter in the URL is kept, and filters in the URL take priority over the input.

How fast is it?

On the Apify platform, 2,000 listings without details took 21 seconds and 100 listings with details took 14 seconds. Details add one request per listing.

Why did my run stop before reaching my limit?

If the log says the run reached its maximum cost, the run hit its cost limit or your account's spending limit. Everything collected before that is saved. Raise the limit in the run options to collect more.

Do I need proxies, an Airbnb account or an API key?

No. The Actor uses Apify's datacenter proxies by default and retries failed requests on a new IP. It doesn't log in.

How is this different from Airbnb's official API?

Airbnb's API is only for approved software partners that manage their own listings. It doesn't offer search or other hosts' listings. This Actor returns what a visitor sees on airbnb.com.

The Actor collects publicly visible listing data. Host names and photos are personal data, so handle them according to laws such as GDPR. You are responsible for how you use the data, including Airbnb's terms.

Can I get reviews too?

Use Airbnb Reviews Scraper with the url of the listings you collected. It returns every review, with ratings, host replies and translations.

Cost

This Actor uses pay-per-event pricing. You pay for each listing saved, with or without details, plus a tiny start fee. There is no subscription.

EventPaid Apify plansFree planCharged when
Listing$0.0005$0.004A listing is saved to the dataset.
Actor start$0.00005$0.00005Once per run (per GB of memory; the Actor uses 1 GB).
RunPaid plansFree plan
100 listings with details$0.05$0.40
1,000 listings$0.50$4
A whole city (Porto, 11,173 listings)$5.59$44.69
20 competitor URLs, daily for 30 days$0.30$2.40

Set a maximum cost per run in the run options; the Actor stops cleanly when it's reached. The Pricing tab always shows the current prices for your plan.

Support

Report problems or request features in the Issues tab. Include the run ID, the input and what you expected. We read every issue.

This Actor is not affiliated with or endorsed by Airbnb, Inc. "Airbnb" is a trademark of Airbnb, Inc. AirDNA and Airbtics are trademarks of their respective owners; this Actor is not affiliated with them.