Airbnb Scraper - Most Comprehensive
Pricing
from $0.40 / 1,000 places
Airbnb Scraper - Most Comprehensive
🔥 ~$0.1/1K places 🔥 Scrape Airbnb listings by URL, listing ID, or location search. Returns full listing details including description, amenities, host info, location, photos, policies, and ratings. Optionally fetches reviews inline.
Pricing
from $0.40 / 1,000 places
Rating
5.0
(1)
Developer
Kai
Maintained by CommunityActor stats
2
Bookmarked
80
Total users
18
Monthly active users
0.00084 hours
Issues response
2 days ago
Last modified
Categories
Share
Get Airbnb listings with full details from a place search, map coordinates, or listing URLs. Each listing has 48 fields: name, property and room type, capacity, description, photos, amenities, rating breakdown, host profile, house rules, safety details, location, and the search price. Add the guest reviews of each listing in the same run. Filter the search by dates, guests, price, room type, rooms, Superhost, and Instant Book.
What can you do with it?
- Market research. Compare the listings of a city or area by price, room type, capacity, rating, and amenities.
- Price monitoring. Get the price of your dates for every search listing, in one currency. Run the same search on a schedule.
- Competitor benchmarking. Compare your listing with nearby listings: category ratings, Guest Favorite status, Superhost hosts, and house rules.
- Review analysis. Feed review text, ratings, dates, languages, and host responses into sentiment and topic models.
- Investment research. Count the listings of an area by property type, room type, and size, and see how guests rate them.
- Listing audits. Check the photos, description, amenities, rules, and safety details of known listings.
What data does it extract?
| Data | When you get it |
|---|---|
| Listing ID, link, name, property type, room type, and guest capacity | Every listing |
| Description, photos with captions, rooms, and sleeping arrangements | When the host added them |
| Amenities by group, also the amenities that the listing does not have | Every listing |
| Overall rating, review count, category ratings, star distribution, and review tags | When the listing has reviews. Airbnb hides the rating until a listing has 3 reviews. |
| Guest Favorite status and top-percent rank | When Airbnb gives the badge |
| Host name, Superhost status, years of hosting, rating, response rate, highlights, and co-hosts | Every listing. Co-hosts and the response rate only when Airbnb shows them. |
| House rules, safety devices, and property details | When the host set them |
| Coordinates, location text, neighborhood text, and getting-around text | Every listing. Neighborhood texts only when the host wrote them. |
| Price with total, original price, and price breakdown | Listings from a search |
| Search target, resolved place, and distance of the results | Listings from a search |
| Reviews with text, rating, date, language, reviewer, and host response | When you turn on reviews |
Airbnb does not have every field for every listing. A field without data is
null, "", 0, or []. See Output.
Quick start
- Enter a place, such as
Paris, France, in Location. Or enter listing URLs in Listing URLs or IDs. - Set Max Listings.
- Click Start. Download the results as JSON, CSV, Excel, or HTML.
The same input as JSON:
{"location": "Paris, France","maxListings": 20}
A new run in Apify Console starts with one listing URL in Listing URLs or IDs. An API call without a target does nothing. See Inputs that return nothing.
Examples by use case
One listing. Use a listing URL or the number in it:
{"listings": ["https://www.airbnb.com/rooms/36276450"]}
The price of your dates in a city. Set the dates and the guests. Every listing then has the price of that stay:
{"location": "Paris, France","checkIn": "2026-12-04","checkOut": "2026-12-06","adults": 2,"maxListings": 50,"maxSearchPages": 3}
Whole homes for a family, in euros. Two adults, one child, one infant, and a pet, at most 300 EUR a night, from Superhosts:
{"location": "Paris, France","checkIn": "2026-12-04","checkOut": "2026-12-06","adults": 2,"children": 1,"infants": 1,"pets": 1,"currency": "EUR","maxPrice": 300,"propertyType": ["entire_home"],"minBedrooms": 2,"superhostOnly": true,"maxListings": 20}
Private rooms only:
{"location": "Paris, France","propertyType": ["private_room"],"maxListings": 20}
Shared rooms and hotel rooms. Airbnb's search filter does not work for these two types. The Actor checks each listing page instead, so the run is slower:
{"location": "Tokyo, Japan","propertyType": ["shared_room", "hotel_room"],"maxListings": 10,"maxSearchPages": 5}
Listings that you can book at once:
{"location": "Paris, France","instantBook": true,"maxListings": 20}
Listings around a point. Use coordinates from a map. With
maxLocationDeviation, the Actor drops listings that are more than 3 km away:
{"latitude": 48.8566,"longitude": 2.3522,"maxLocationDeviation": 3,"maxListings": 20}
Many listings in a city. Each search page has about 18 listings, so 100 listings need at least 6 pages:
{"location": "London, United Kingdom","maxListings": 100,"maxSearchPages": 10}
Every review of a listing:
{"listings": ["36276450"],"includeReviews": true,"maxReviewsPerListing": 0}
The worst reviews first. Find complaints:
{"listings": ["36276450"],"includeReviews": true,"maxReviewsPerListing": 20,"reviewsSortBy": "RATING_ASC"}
The best reviews first. Find what guests like most:
{"listings": ["36276450"],"includeReviews": true,"maxReviewsPerListing": 20,"reviewsSortBy": "RATING_DESC"}
Compare your listing with its area. One run gets your listing and the search listings. Each listing has 10 reviews:
{"location": "Paris, France","listings": ["36276450"],"maxListings": 30,"includeReviews": true,"maxReviewsPerListing": 10}
Choose the listings
Use one or both of these targets:
| You have | Use | Result |
|---|---|---|
| Listing URLs or listing IDs | listings | One item for each listing ID |
| A city, address, district, or region | location | Listings from an Airbnb place search |
| Latitude and longitude | latitude and longitude | Listings from a search around the point |
You can put listings and one search in the same run. If you set location
and both coordinates, the coordinates set the search area.
Listing URLs and IDs
Each entry in listings is a listing URL or the listing ID. The listing ID is
the number after /rooms/ in the URL.
https://www.airbnb.com/rooms/36276450and36276450are the same listing.- Other Airbnb domains, such as
airbnb.co.ukandairbnb.fr, work too. So do/rooms/36276450and URLs with a query string. The Actor uses only the listing ID. Dates in the URL are not used; setcheckInandcheckOut. - A repeated listing ID gives one item:
{"listings": ["36276450", "https://www.airbnb.com/rooms/36276450"]}
- An entry without a listing ID, such as
not-a-listing, is skipped. The log showsSkipped 1 malformed listing reference, and the other entries run. - A listing that does not exist, or that Airbnb removed, gives no item. The log
shows
Failed to process listing. The other listings still run, and the run succeeds. You do not pay for a listing that gives no item.
Place search
location is the text that you would type in the Airbnb search box. Airbnb's
own place search reads it, so it accepts cities, addresses, districts,
airports, names in other languages, and small typos.
If Airbnb does not know the place, the run returns no listings. The log shows
Airbnb does not know the location "<text>". Check the spelling, or use latitude and longitude.{"location": "Qwxzv Plmokn 98765","maxListings": 3}
Coordinate search
Set latitude and longitude together. The search area is a square around
the point. Its half-width is maxLocationDeviation, 200 km by default, or 50
km when maxLocationDeviation is 0. The Actor also drops each result that is
farther away than maxLocationDeviation.
{"latitude": 48.8566,"longitude": 2.3522,"maxLocationDeviation": 20,"maxListings": 3}
An input with only latitude or only longitude and no other target does
nothing.
Distance check
maxLocationDeviation is the largest distance in km between the search target
and a result.
- For a coordinate search, it applies automatically.
- For a place search, it applies only when you set it. The target is the center of the place that Airbnb found.
0turns the check off:
{"location": "Paris, France","maxLocationDeviation": 0,"maxListings": 2}
The log shows each dropped result. If 3 search pages in a row have only dropped results, the Actor stops the search, because Airbnb probably searched the wrong region. The check uses the approximate center of the place, so it is not exact geofencing.
Combine listings and a search
You get the search listings and every listing from listings. A listing ID
that does not exist gives no item:
{"location": "Paris, France","listings": ["36276450", "999999999999999999"],"maxListings": 3}
maxListings and the search filters apply only to the search. They never drop
a listing from listings. If the search also finds a listing from listings,
that listing gets the search price and locationResolution, and it does not
count toward maxListings.
Order of the results
Search listings come first, in Airbnb's search order. Then come the listings
from listings, in your order. A listing that fails does not stop the others.
Get many listings
maxListings is the limit for the search. The default is 20.
maxSearchPages is the limit of search pages. The default is 5.
Each search page has about 18 listings, and some pages repeat listings from
earlier pages. Set maxSearchPages to at least maxListings / 18, rounded up.
With the default of 5 pages, a search gives at most about 90 listings.
{"location": "Paris, France","maxListings": 40,"maxSearchPages": 3}
Airbnb gives at most 15 pages for one search. Some pages repeat listings, so one
search gives fewer than 270 listings. For more listings in a big city, split the area
into several runs: use coordinates with a small maxLocationDeviation, price
ranges, or room types. Each run has its own result list. Use the id field to
remove repeats.
Filter the search
The filters apply to the place search and the coordinate search. They do not
remove listings that you give in listings. A listing must match every filter
that you set.
checkInandcheckOut. The stay dates, asYYYY-MM-DD. Airbnb shows only listings that are free on those dates, and the price is for that stay.adults,children,infants, andpets. The guests. Airbnb shows only listings for that many guests. Infants do not count toward the guest limit.minPriceandmaxPrice. Airbnb's price filter, in the currency thatcurrencysets.propertyType. Any combination ofentire_home,private_room,shared_room, andhotel_room. Airbnb's filter works forentire_homeandprivate_room. Forshared_roomorhotel_room, the Actor checks each listing page, and reads up to 10 search listings for each listing inmaxListings. If it finds fewer, the log shows a warning. Airbnb lists many small hotels as private rooms.minBedrooms,minBeds, andminBathrooms. The smallest number of each.superhostOnly. Only listings of Superhosts. Airbnb's filter also returns other hosts, so the Actor checks each listing page, as for shared rooms.instantBook. Only listings that you can book without a request.
{"location": "Paris, France","checkIn": "2026-12-04","checkOut": "2026-12-06","adults": 2,"children": 1,"infants": 1,"pets": 1,"minPrice": 1,"maxPrice": 10000,"currency": "EUR","propertyType": ["entire_home"],"minBedrooms": 0,"minBathrooms": 0,"minBeds": 0,"superhostOnly": true,"maxLocationDeviation": 50,"maxListings": 3,"maxSearchPages": 1,"includeReviews": true,"maxReviewsPerListing": 2}
Prices and currency
The price comes from the search results. The listing page has no price. So a
listing from listings has price: null, unless the search in the same run
also finds it.
- Currency.
currencysets the currency of the prices and of the price filter. The default isUSD. Use a three-letter code, such asEUR,GBP, orJPY. The Actor reads it in upper case. - Dates. With
checkInandcheckOut, the price is for your stay. Without dates, Airbnb prices a stay that it chooses, andprice.qualifiergives its length, such asfor 5 nights. - Price basis. Airbnb shows visitors from some countries the total with
taxes.
price.qualifieris thentotal. The proxy decides the country of the visitor. For the same basis on every listing, set the proxy country to the United States:
{"location": "Austin, TX","maxListings": 40,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyCountry": "US"}}
- Discounts.
price.originalAmountis the price before a discount.price.detailslists the nights, fees, discounts, and taxes, as Airbnb shows them.
Get reviews
Set includeReviews to true to add the reviews of each listing to its item.
maxReviewsPerListing. The limit for each listing. The default is20.0gets every review that Airbnb gives.reviewsSortBy.MOST_RECENT(the default),RATING_DESCfor the best reviews first, orRATING_ASCfor the worst reviews first.
{"listings": ["36276450"],"includeReviews": true,"maxReviewsPerListing": 60,"reviewsSortBy": "MOST_RECENT"}
For a search with superhostOnly or a room-type check, the Actor reads reviews
only for the listings that pass the check. You pay only for those reviews.
If the reviews of a listing fail, the Actor keeps the listing with
reviews: null and writes a warning to the log. reviews: [] means that the
listing has no reviews.
Inputs that return nothing
These inputs end as succeeded, with no items and no cost for items:
| Input | Why |
|---|---|
{} | No target. The log shows No listing IDs to process. |
{ "latitude": 48.8566 } | One coordinate is not a target. |
{ "listings": ["not-a-listing"] } | The entry has no listing ID. |
{ "listings": ["999999999999999999"] } | The listing does not exist. |
{ "location": "Qwxzv Plmokn 98765" } | Airbnb does not know the place. |
A valid search can also find no listings, for example with strict filters.
Input reference
You need one target: listings, location, or latitude with longitude.
| Field | Type | Default | Description |
|---|---|---|---|
listings | string[] | [] | Airbnb listing URLs or numeric listing IDs. |
location | string | none | City, address, district, or region to search. |
latitude | number | none | Search latitude from -90 to 90. Set it with longitude. |
longitude | number | none | Search longitude from -180 to 180. Set it with latitude. |
maxLocationDeviation | number | 200 | Largest distance in km between the target and a result. Applies to coordinate searches, and to place searches when you set it. 0 turns it off. For coordinates, it also sets the search area. |
checkIn | string | none | Check-in date as YYYY-MM-DD. |
checkOut | string | none | Check-out date as YYYY-MM-DD. |
adults | integer | 1 | Number of adults. At least 1. |
children | integer | 0 | Number of children. |
infants | integer | 0 | Number of infants. |
pets | integer | 0 | Number of pets. |
minPrice | integer | none | Lowest nightly price, in currency. |
maxPrice | integer | none | Highest nightly price, in currency. |
currency | string | USD | Currency code for prices and the price filter, such as EUR. |
propertyType | string[] | all types | Any of entire_home, private_room, shared_room, and hotel_room. Other values are ignored. |
minBedrooms | integer | none | Smallest number of bedrooms. |
minBathrooms | integer | none | Smallest number of bathrooms. |
minBeds | integer | none | Smallest number of beds. |
superhostOnly | boolean | false | Only listings of Superhosts. |
instantBook | boolean | false | Only listings with Instant Book. |
maxListings | integer | 20 | Largest number of search listings. At least 1. Does not limit listings. |
maxSearchPages | integer | 5 | Largest number of search pages. At least 1. About 18 listings each. |
includeReviews | boolean | false | Add reviews to each listing. |
maxReviewsPerListing | integer | 20 | Largest number of reviews for each listing. 0 gets all reviews. |
reviewsSortBy | string | MOST_RECENT | MOST_RECENT, RATING_DESC, or RATING_ASC. |
proxyConfiguration | object | Apify Proxy | Connection settings. See below. |
- Proxy. The default uses Apify Proxy. You can choose a proxy group, a proxy country, or your own proxy URLs. The Actor tests a chosen proxy group or country at the start. If your account cannot use it, the run fails.
{"listings": ["36276450"],"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["<your proxy group>"]}}
- Unknown fields. The Actor ignores input fields that it does not know, so that old and new integrations keep working:
{"listings": ["36276450"],"futurePlatformField": { "enabled": true }}
- Invalid values. A value outside the limits above fails the run at the
start, for example
"adults": 0or"maxListings": 0.
Output
Each item in the dataset is one listing. The Listing Overview table shows the name, ID, type, rating, review count, location, host, Superhost status, maximum guests, and price. Every field below is in every item.
These fields are always empty, because Airbnb no longer puts the data on the
listing page: cancellationPolicyId, cancellationPolicyName, and
canInstantBook are null; location.mapMarkerType and
host.contactHostCopy are ""; location.mapMarkerRadiusInMeters is 0.
petsAllowed is null, except for hotel rooms. The empty fields stay so that
existing integrations keep working.
Fields by topic
- Listing. ID, links, page type, name, sharing title, property type, room type, and guest capacity.
- Description. The full description as HTML, and the extra parts of the description dialog.
- Photos. The cover photos, every photo with its room and caption, the rooms, and the sleeping arrangements.
- Amenities. A short list, and every amenity by group, with a flag for the amenities that the listing does not have.
- Ratings. Overall rating, review count, Guest Favorite status, rank, category ratings, star distribution, review tags, and review sort options.
- Location. Coordinates, location text, verification flag, neighborhood text, and getting-around text.
- Host. Name, IDs, photo, Superhost and verified flags, stats, years and months of hosting, rating, about text, highlights, response rate, and co-hosts.
- Rules and safety. House rules, safety devices, and property details, as flat lists and by group.
- Booking. Maximum guests and the guest limit for extras. The calendar summary lines.
- Search. Price, and the search target with the distance of the results.
- Run. The UTC time at which the Actor read the listing.
- Reviews. The reviews, when you turn them on.
Listing example
This example is a direct listing with reviews. Each long list keeps its first item. Square brackets mark values removed from the documentation.
Search listing example
A listing from a place search has a price and a locationResolution. Only these
fields differ from the example above:
{"id": "7253149","price": {"label": "$140 for 2 nights, originally $175","amount": "$140","originalAmount": "$175","qualifier": "for 2 nights","details": [{ "description": "2 nights x $87.50", "amount": "$175.00" },{ "description": "Discount", "amount": "-$35.00" },{ "description": "Price after discount", "amount": "$140.00" }]},"locationResolution": {"inputLocation": "Paris, France","inputCoordinates": null,"resolvedLocation": "Paris, France","resolvedCenter": { "latitude": 48.8588549, "longitude": 2.3470341 },"resultCentroid": { "latitude": 48.87064, "longitude": 2.37454 },"deviationKm": 2.4,"withinThreshold": true}}
A listing from a coordinate search has inputCoordinates and no
inputLocation:
{"id": "1671993776446695850","locationResolution": {"inputLocation": null,"inputCoordinates": { "latitude": 48.8566, "longitude": 2.3522 },"resolvedLocation": null,"resolvedCenter": { "latitude": 48.8566, "longitude": 2.3522 },"resultCentroid": { "latitude": 48.7957, "longitude": 2.4257 },"deviationKm": 8.6,"withinThreshold": true}}
Output by listing origin
| Case | reviews | locationResolution | price |
|---|---|---|---|
Listing from listings, reviews off | null | null, or an object when the search also found it | null, or a price object when the search also found it |
Listing from listings, reviews on | Review array | Same as above | Same as above |
| Listing from a place search | null, [], or a review array | Object with inputLocation | Price object, or null when the search result has no price |
| Listing from a coordinate search | null, [], or a review array | Object with inputCoordinates | Price object, or null when the search result has no price |
| Reviews on, the listing has no reviews | [] | By origin | By origin |
| Reviews on, the reviews failed | null | By origin | By origin |
Field groups
| Group | Root fields |
|---|---|
| Listing | id, url, canonicalUrl, shareUrl, pdpType, isElvisListing, name, sharingTitle, propertyType, roomType, personCapacity, embedData |
| Description | htmlDescription, descriptionSections |
| Photos | heroImages, photoTourImages, rooms, sleepingArrangements |
| Amenities and highlights | amenitiesPreview, amenitiesGrouped, highlights |
| Ratings | overallRating, overallReviewCount, isGuestFavorite, qualityScorePercentile, brandDescription, categoryRatings, ratingDistribution, reviewTags, reviewSortOptions |
| Location | location |
| Host | host |
| Rules and safety | houseRules, houseRulesSections, safetyAndProperty, safetyAndPropertySections |
| Booking | cancellationPolicyId, cancellationPolicyName, maxGuestCapacity, maxPlusValue, petsAllowed, canInstantBook, calendarDescriptionItems |
| Search | price, locationResolution |
| Page data | seo |
| Run | scrapedAt |
| Reviews | reviews |
Field notes
idis the Airbnb listing ID. Use it to remove listings that you already have.urlalways starts withhttps://www.airbnb.com/rooms/.pdpTypeisMARKETPLACEfor homes andHOTELfor hotel rooms. Hotel rooms often have no safety details and no neighborhood text.roomTypeisentire_home,private_room,shared_room, orhotel_room. It uses the same values as thepropertyTypeinput.propertyTypeis Airbnb's text, such asPrivate room in condo.personCapacityis the guest capacity.maxGuestCapacityis the most guests that you can book.maxPlusValueis the largest guest number in the booking form.htmlDescriptionis the full description, with Airbnb's headings in<b>tags. Hotel rooms have the short description.descriptionSectionsholds the extra parts of the description dialog, such as the host's legal status.heroImagesare the cover photos.photoTourImagesare all the photos, androomsgives the photos of each room.amenitiesGroupedhas aNot includedgroup. Its amenities haveavailable: false.overallRatingis0until a listing has 3 reviews.qualityScorePercentileis Airbnb's rank bucket, such asTOP_5.isGuestFavoritecomes from the Guest Favorite badge, not fromhighlights.location.latandlocation.lngare approximate for homes. Airbnb shows the exact place only after a booking.location.subtitleis the area, such asParis, Île-de-France, France. For hotel rooms, it is the town.host.hostDetailshas the response rate and the response time, when Airbnb shows them.houseRulesandsafetyAndPropertylist every item.houseRulesSectionsandsafetyAndPropertySectionsgroup the same items. In a rule item,subtitleis Airbnb's text, such as quiet hours, andhtmlis the host's own text.calendarDescriptionItemsare the summary lines next to the calendar, such as the room type, beds, and bathroom. They are not the availability.priceholds the amounts as Airbnb writes them, with the currency symbol, for example$140. See Prices and currency.locationResolution.deviationKmis the distance between the search target and the center of all the search results.withinThresholdtells if that distance is withinmaxLocationDeviation. It istruewhen the distance check is off.reviews[].languageis the language that the guest wrote in. The review text stays in that language.reviews[].responseis the host's reply.respondercan benulleven when there is a reply.- Airbnb can change or remove public values at any time. Treat prices, availability, ratings, and review counts as a point-in-time result.
FAQ
How many listings can I get?
One search gives at most 15 pages, so fewer than 270 listings. Split a big city
into several runs with coordinates, price ranges, or room types. There is no
limit for listings.
Why did I get fewer listings than maxListings?
maxListings is an upper limit. These things can lower the number:
maxSearchPagesis too small. Each page has about 18 listings.- Your filters and dates leave fewer listings.
- The distance check dropped results. The log shows each drop.
- With
superhostOnly,shared_room, orhotel_room, not enough listings passed the check of the listing page. The log shows a warning. - Airbnb gives at most 15 pages for one search.
Why is price null?
The listing page has no price. A listing from listings gets a price only when
the search in the same run also finds it. Add a location or coordinates near
the listing. A search result can also come without a price from Airbnb.
Why does a price differ from the Airbnb website?
Check these four things: the currency, the dates, the number of guests, and the
price basis. The website uses your own country, which can show the total with
taxes. Set currency, checkIn, checkOut, and the guests, and see
Prices and currency.
Can I get the availability calendar or the cancellation policy?
No. Airbnb loads them in the browser after the page, so they are not in the
listing page. cancellationPolicyId, cancellationPolicyName, and
canInstantBook are always null. To find listings that are free on your
dates, set checkIn and checkOut. To find listings that you can book at once,
set instantBook.
How do I monitor prices or new listings?
Run the same search on a schedule, with the same dates, guests, and currency.
Use the id field to match the listings between runs.
How do I find the listing ID?
Open the listing on Airbnb. The ID is the number after /rooms/ in the URL.
You can also give the whole URL.
A feature or field that I need is missing. What can I do?
Tell us in the Issues tab. Describe what you need, and give an example listing or search.
Where can I report a problem?
Open an issue in the Issues tab. Include the run ID and the input, so that we can reproduce it.
Similar Actors
- Booking Hotels Scraper. Booking.com hotel profiles, guest reviews, facilities, photos, and stay availability, by hotel or destination.
- Google Hotels & Vacation Scraper. Google Hotels and vacation rentals with prices, filters, offers, booking links, and reviews.
- TripAdvisor Places Scraper. TripAdvisor hotels, restaurants, and things to do in a city.
- TripAdvisor Reviews Scraper. TripAdvisor reviews of any hotel, restaurant, attraction, or cruise.