Airbnb Scraper - Most Comprehensive avatar

Airbnb Scraper - Most Comprehensive

Pricing

from $0.40 / 1,000 places

Go to Apify Store
Airbnb Scraper - Most Comprehensive

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

Kai

Maintained by Community

Actor stats

2

Bookmarked

80

Total users

18

Monthly active users

0.00084 hours

Issues response

2 days ago

Last modified

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?

DataWhen you get it
Listing ID, link, name, property type, room type, and guest capacityEvery listing
Description, photos with captions, rooms, and sleeping arrangementsWhen the host added them
Amenities by group, also the amenities that the listing does not haveEvery listing
Overall rating, review count, category ratings, star distribution, and review tagsWhen the listing has reviews. Airbnb hides the rating until a listing has 3 reviews.
Guest Favorite status and top-percent rankWhen Airbnb gives the badge
Host name, Superhost status, years of hosting, rating, response rate, highlights, and co-hostsEvery listing. Co-hosts and the response rate only when Airbnb shows them.
House rules, safety devices, and property detailsWhen the host set them
Coordinates, location text, neighborhood text, and getting-around textEvery listing. Neighborhood texts only when the host wrote them.
Price with total, original price, and price breakdownListings from a search
Search target, resolved place, and distance of the resultsListings from a search
Reviews with text, rating, date, language, reviewer, and host responseWhen 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

  1. Enter a place, such as Paris, France, in Location. Or enter listing URLs in Listing URLs or IDs.
  2. Set Max Listings.
  3. 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 haveUseResult
Listing URLs or listing IDslistingsOne item for each listing ID
A city, address, district, or regionlocationListings from an Airbnb place search
Latitude and longitudelatitude and longitudeListings 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/36276450 and 36276450 are the same listing.
  • Other Airbnb domains, such as airbnb.co.uk and airbnb.fr, work too. So do /rooms/36276450 and URLs with a query string. The Actor uses only the listing ID. Dates in the URL are not used; set checkIn and checkOut.
  • 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 shows Skipped 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.

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.
Without this check, Airbnb would return listings from anywhere in the world.

{
"location": "Qwxzv Plmokn 98765",
"maxListings": 3
}

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.
  • 0 turns 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.

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.

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.

  • checkIn and checkOut. The stay dates, as YYYY-MM-DD. Airbnb shows only listings that are free on those dates, and the price is for that stay.
  • adults, children, infants, and pets. The guests. Airbnb shows only listings for that many guests. Infants do not count toward the guest limit.
  • minPrice and maxPrice. Airbnb's price filter, in the currency that currency sets.
  • propertyType. Any combination of entire_home, private_room, shared_room, and hotel_room. Airbnb's filter works for entire_home and private_room. For shared_room or hotel_room, the Actor checks each listing page, and reads up to 10 search listings for each listing in maxListings. If it finds fewer, the log shows a warning. Airbnb lists many small hotels as private rooms.
  • minBedrooms, minBeds, and minBathrooms. 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. currency sets the currency of the prices and of the price filter. The default is USD. Use a three-letter code, such as EUR, GBP, or JPY. The Actor reads it in upper case.
  • Dates. With checkIn and checkOut, the price is for your stay. Without dates, Airbnb prices a stay that it chooses, and price.qualifier gives its length, such as for 5 nights.
  • Price basis. Airbnb shows visitors from some countries the total with taxes. price.qualifier is then total. 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.originalAmount is the price before a discount. price.details lists 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 is 20. 0 gets every review that Airbnb gives.
  • reviewsSortBy. MOST_RECENT (the default), RATING_DESC for the best reviews first, or RATING_ASC for 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:

InputWhy
{}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.

FieldTypeDefaultDescription
listingsstring[][]Airbnb listing URLs or numeric listing IDs.
locationstringnoneCity, address, district, or region to search.
latitudenumbernoneSearch latitude from -90 to 90. Set it with longitude.
longitudenumbernoneSearch longitude from -180 to 180. Set it with latitude.
maxLocationDeviationnumber200Largest 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.
checkInstringnoneCheck-in date as YYYY-MM-DD.
checkOutstringnoneCheck-out date as YYYY-MM-DD.
adultsinteger1Number of adults. At least 1.
childreninteger0Number of children.
infantsinteger0Number of infants.
petsinteger0Number of pets.
minPriceintegernoneLowest nightly price, in currency.
maxPriceintegernoneHighest nightly price, in currency.
currencystringUSDCurrency code for prices and the price filter, such as EUR.
propertyTypestring[]all typesAny of entire_home, private_room, shared_room, and hotel_room. Other values are ignored.
minBedroomsintegernoneSmallest number of bedrooms.
minBathroomsintegernoneSmallest number of bathrooms.
minBedsintegernoneSmallest number of beds.
superhostOnlybooleanfalseOnly listings of Superhosts.
instantBookbooleanfalseOnly listings with Instant Book.
maxListingsinteger20Largest number of search listings. At least 1. Does not limit listings.
maxSearchPagesinteger5Largest number of search pages. At least 1. About 18 listings each.
includeReviewsbooleanfalseAdd reviews to each listing.
maxReviewsPerListinginteger20Largest number of reviews for each listing. 0 gets all reviews.
reviewsSortBystringMOST_RECENTMOST_RECENT, RATING_DESC, or RATING_ASC.
proxyConfigurationobjectApify ProxyConnection 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": 0 or "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

CasereviewslocationResolutionprice
Listing from listings, reviews offnullnull, or an object when the search also found itnull, or a price object when the search also found it
Listing from listings, reviews onReview arraySame as aboveSame as above
Listing from a place searchnull, [], or a review arrayObject with inputLocationPrice object, or null when the search result has no price
Listing from a coordinate searchnull, [], or a review arrayObject with inputCoordinatesPrice object, or null when the search result has no price
Reviews on, the listing has no reviews[]By originBy origin
Reviews on, the reviews failednullBy originBy origin

Field groups

GroupRoot fields
Listingid, url, canonicalUrl, shareUrl, pdpType, isElvisListing, name, sharingTitle, propertyType, roomType, personCapacity, embedData
DescriptionhtmlDescription, descriptionSections
PhotosheroImages, photoTourImages, rooms, sleepingArrangements
Amenities and highlightsamenitiesPreview, amenitiesGrouped, highlights
RatingsoverallRating, overallReviewCount, isGuestFavorite, qualityScorePercentile, brandDescription, categoryRatings, ratingDistribution, reviewTags, reviewSortOptions
Locationlocation
Hosthost
Rules and safetyhouseRules, houseRulesSections, safetyAndProperty, safetyAndPropertySections
BookingcancellationPolicyId, cancellationPolicyName, maxGuestCapacity, maxPlusValue, petsAllowed, canInstantBook, calendarDescriptionItems
Searchprice, locationResolution
Page dataseo
RunscrapedAt
Reviewsreviews

Field notes

  • id is the Airbnb listing ID. Use it to remove listings that you already have. url always starts with https://www.airbnb.com/rooms/.
  • pdpType is MARKETPLACE for homes and HOTEL for hotel rooms. Hotel rooms often have no safety details and no neighborhood text.
  • roomType is entire_home, private_room, shared_room, or hotel_room. It uses the same values as the propertyType input. propertyType is Airbnb's text, such as Private room in condo.
  • personCapacity is the guest capacity. maxGuestCapacity is the most guests that you can book. maxPlusValue is the largest guest number in the booking form.
  • htmlDescription is the full description, with Airbnb's headings in <b> tags. Hotel rooms have the short description. descriptionSections holds the extra parts of the description dialog, such as the host's legal status.
  • heroImages are the cover photos. photoTourImages are all the photos, and rooms gives the photos of each room.
  • amenitiesGrouped has a Not included group. Its amenities have available: false.
  • overallRating is 0 until a listing has 3 reviews. qualityScorePercentile is Airbnb's rank bucket, such as TOP_5. isGuestFavorite comes from the Guest Favorite badge, not from highlights.
  • location.lat and location.lng are approximate for homes. Airbnb shows the exact place only after a booking. location.subtitle is the area, such as Paris, Île-de-France, France. For hotel rooms, it is the town.
  • host.hostDetails has the response rate and the response time, when Airbnb shows them.
  • houseRules and safetyAndProperty list every item. houseRulesSections and safetyAndPropertySections group the same items. In a rule item, subtitle is Airbnb's text, such as quiet hours, and html is the host's own text.
  • calendarDescriptionItems are the summary lines next to the calendar, such as the room type, beds, and bathroom. They are not the availability.
  • price holds the amounts as Airbnb writes them, with the currency symbol, for example $140. See Prices and currency.
  • locationResolution.deviationKm is the distance between the search target and the center of all the search results. withinThreshold tells if that distance is within maxLocationDeviation. It is true when the distance check is off.
  • reviews[].language is the language that the guest wrote in. The review text stays in that language.
  • reviews[].response is the host's reply. responder can be null even 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:

  • maxSearchPages is 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, or hotel_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