Airbnb Scraper: All Listings in a City, Prices & Hosts
Pricing
from $0.50 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
3
Monthly active users
10 days ago
Last modified
Categories
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?
| Goal | How |
|---|---|
| Size a short-term rental market | Scrape a whole city with Max listings per search set to 0, then count listings by roomType, bedrooms and city. |
| Set or check your nightly rate | Search your area for your dates and compare pricePerNight and priceTotal across listings with the same bedrooms and personCapacity. |
| Track competitors' prices | Paste 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 compliance | Read registrationNumber for every listing in a city and find the ones without one. |
| Find professional hosts | Group listings by host.id: hosts with many listings, host.isBusiness, host.ratingCount and host.timeAsHost. |
| Compare quality | Compare rating.cleanliness, rating.location, rating.value, isGuestFavorite and amenitiesList across a market. |
| Watch seasonal demand | Run 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 need | Airbnb Scraper | Page-by-page Airbnb scrapers | Market-data subscriptions (AirDNA, Airbtics) |
|---|---|---|---|
| Listings per search | A whole city (searches split by map area) | About 300, Airbnb's limit | Whole markets, in their reports |
| Prices | Airbnb's live price for your dates, with fees | Varies | Often modeled averages |
| Registration numbers, host data | Yes, per listing | Often missing | Varies |
| Raw data for your own analysis | Every field, as JSON, CSV, Excel or API | Yes | Mostly dashboards |
| Price | Pay per listing | Pay per listing | Monthly 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
- Click Try for free and sign in to Apify.
- Add a place to Locations, for example
Lisbon, Portugal. Or paste room links or an Airbnb search URL into Airbnb URLs. - For a first run, set Max listings per search to
50. - 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:
| Group | Fields |
|---|---|
| Listing | id, url, title, listingType, city, coordinates, thumbnail, images (whole gallery), imageCount |
| Price | checkIn, checkOut, nights, pricePerNight, priceTotal, priceTotalOriginal (before discount), currency, priceLabel, priceBreakdown |
| Search | searchQuery, searchRank, isAvailable |
| Reputation | ratingAverage, reviewsCount, isNewListing, isSuperhost, isGuestFavorite, badges |
With Include listing details on (the default), each row also has:
| Group | Fields |
|---|---|
| Property | propertyType, roomType, personCapacity, bedrooms, beds, bathrooms, sleepingArrangements, registrationNumber |
| Ratings | rating (guestSatisfaction, accuracy, cleanliness, checking, communication, location, value, reviewsCount), ratingDistribution (share of 1–5 stars) |
| Host | host (id, name, profileUrl, isSuperHost, isVerified, isBusiness, ratingAverage, ratingCount, timeAsHost, about, hostDetails such as response rate), coHosts |
| Description | description, descriptionSections, htmlDescription, highlights, locationSubtitle, locationDescriptions |
| Amenities | amenitiesList (available amenities as plain names), amenities (grouped by category, including the ones that aren't available) |
| Rules | houseRules, 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:
- Saves the first ~300 results in Airbnb's own order, with
searchRank. - Takes the map area those listings cover and splits it into four. Each part is searched on its own.
- 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 case | Frequency | Cron expression |
|---|---|---|
| Competitor prices for upcoming weekends | Daily | 0 6 * * * |
| Availability for an event or holiday | Twice a day | 0 6,18 * * * |
| Whole-market snapshot (supply, new hosts) | Weekly (Monday) | 0 6 * * 1 |
| Registration compliance audit | Monthly | 0 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:
pricePerNightandpriceTotalperidand 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,
isAvailableturnsfalse. - New supply:
ids that appear for the first time, withisNewListingandreviewsCount. - Host portfolios: number of listings per
host.idover time. - Quality drift:
ratingAverage,rating.cleanlinessandreviewsCountperid.
Input reference
| Field | Type | Default | Effect |
|---|---|---|---|
locationQueries | Array of strings | Empty | Places to search, as you'd type them on Airbnb. |
startUrls | Array of URLs | Empty | Room URLs (/rooms/<id>) or search URLs (/s/...) from any Airbnb domain. Search URLs keep their filters and map area. |
maxResultsPerSearch | Integer | 300 | Maximum listings per location or search URL. 0 means no limit. |
maxResults | Integer | Empty | Optional cap for the whole run. |
includeDetails | Boolean | true | Adds the detail fields above. One extra request per listing, same price. Room URLs always get details. |
checkIn/checkOut | Date | Empty | YYYY-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, pets | Integer | 1, 0, 0, 0 | Guests. Pets return only pet-friendly listings. |
priceMin/priceMax | Integer | Empty | Total price of the stay, including fees, in currency. |
roomType | String | "any" | "entire", "private", "hotel" or "shared". |
minBedrooms, minBeds, minBathrooms | Integer | Empty | Minimum room counts. |
locale | String | "en-US" | Language of titles and labels. Airbnb translates listing texts written in other languages. |
currency | String | "USD" | Currency of every price. |
dedupeAcrossSearches | Boolean | true | Save each listing once per run. Turn off to keep every search's full list, for example for ranks per neighborhood. |
concurrency | Integer | 10 | Listing details fetched at the same time (1–30). |
proxyConfiguration | Object | Apify datacenter proxy | Failed 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 ApifyClientclient = 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
priceTotalis the total for the stay as Airbnb shows it, incurrency;pricePerNightis the nightly rate from Airbnb's price breakdown, before fees and taxes.priceBreakdownlists 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,checkOutandnightsshow which stay the price is for. isAvailableistruefor listings from a search with dates. For room URLs with dates it isfalsewhen Airbnb doesn't offer the listing for those nights (booked, blocked or outside its minimum stay); its price is then empty. Without dates it isnull.searchRankis the position in Airbnb's own order among the first ~300 results. Listings found by splitting the map havesearchRank: null.registrationNumberis the number from the listing's "Registration details" block, as the host entered it. It is empty when the listing shows none.host.isBusinessistruewhen the host declared itself a professional host. Airbnb shows this declaration on listings in the EU; elsewhere it is usuallyfalse.bedrooms,bedsandbathroomsare read from Airbnb's English summary line. With alocaleother than English they may be empty;subDescription.itemsalways has the localized text.imagescomes 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 hastimestampin 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.
Is it legal to scrape Airbnb?
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.
| Event | Paid Apify plans | Free plan | Charged when |
|---|---|---|---|
| Listing | $0.0005 | $0.004 | A listing is saved to the dataset. |
| Actor start | $0.00005 | $0.00005 | Once per run (per GB of memory; the Actor uses 1 GB). |
| Run | Paid plans | Free 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.
Related Actors
- Airbnb Reviews Scraper: every guest review for any listing.
- Booking Reviews Scraper: hotel reviews from Booking.com.
- Tripadvisor Scraper and Tripadvisor Reviews Scraper: hotels, restaurants, prices and reviews.
- Agoda Property Details Scraper and Agoda Reviews Scraper: hotel details and reviews from Agoda.
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.