Airbnb Scraper icon

Airbnb Scraper

Scrape Airbnb stays by destination or link: nightly and total price, rating breakdown, host stats, amenities, house rules, coordinates, photos, and the…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Airbnb Scraper at a glance

Airbnb Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes kind, listingid, url, title and categorylabel, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $0.90 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Web data
Pricing
$2.00 per 1,000 results (Free plan), from $0.90 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
34 options

Scrape Airbnb stays by destination or link: nightly and total price, rating breakdown, host stats, amenities, house rules, coordinates, photos, and the full review history with text and star ratings. Dual mode, filters, incremental monitoring, resume, MCP export.

What Airbnb Scraper can do

  • Two ways to find stays. Search by destination with your own filters, or paste listing and search links and mix both in the same run.
  • The complete review history, not a sample. Every review carries its text, star rating, exact date, language, the reviewer's first name and the host's public reply when there is one.
  • Full listing detail on demand. Description, amenities, house rules, host stats and the complete rating breakdown, added only when you turn it on, so a plain search stays cheap.
  • Goes past the site's own result pager. The website's pager stops at 270 stays per search; a run keeps returning stays until the destination genuinely runs out.
  • Built for recurring monitoring. Incremental mode returns only new, updated and reappeared listings on repeat runs, and a run that cannot connect fails loudly instead of returning an empty dataset.
  • Resume a large pull. Continue an interrupted run from its run ID or dataset ID without paying twice for listings it already collected.

Choose what to collect

These inputs let you configure Airbnb Scraper - Stays, Reviews, Hosts & Prices. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredSearch reads stays for the destinations you name, with your dates, guests and filters applied. URL mode reads the links you paste: a listing link is read in full, a search link is used exactly as pasted.

Choices: search, url

searchQueriesarraySearch mode: one or more places, written the way you would type them into the site, for example 'Paris, France', 'Kyoto, Japan' or 'Austin, Texas'. Each destination is read separately and shares the item limit.
listingUrlsarrayURL mode: listing links (/rooms/, /rooms/plus/, /rooms//reviews, any airbnb host, optional ?check_in=&check_out=&adults=), bare listing ids, search links (/s//homes?... including filters, sort, category tags, items_offset or cursor) or destination pages (//stays). A search link that already points at a later stretch of results continues from there.
urlsarrayAlias for Listing and search links, accepted under the name other Apify actors use for URL mode. Entries are read in order.
checkInstringStay start date as YYYY-MM-DD. Leave both dates empty to let the site quote its own rolling default window. Applies in both modes: it filters the search and prices the stay.
checkOutstringStay end date as YYYY-MM-DD. Ignored unless Check-in is also set.
adultsintegerNumber of adults the stay is priced for.
Show 27 more inputs
More input fields
InputWhat it controls
childrenintegerNumber of children (ages 2 to 12).
infantsintegerNumber of infants (under 2).
petsintegerNumber of pets. Narrows a destination search to stays that accept them.
currencystringThree letter currency code the prices are quoted in, for example USD, EUR, GBP, AUD, CAD, JPY, BRL, MXN. The record reports the currency that was actually rendered, and leaves it empty rather than guessing when the symbol is ambiguous.
localestringInterface language and regional variant the site renders in (affects listing titles, descriptions and labels). English variants only: the source answers other languages with a country-domain redirect that this actor cannot follow. Default en keeps current behaviour.

Choices: en, en-US, en-GB, en-AU, en-CA, en-IN

priceMinintegerSearch mode: lowest nightly price, in the currency above. The site filters on the nightly rate before fees and taxes, which is the same quantity the record reports as Price per night.
priceMaxintegerSearch mode: highest nightly price, in the currency above.
roomTypesarraySearch mode: keep only these kinds of stay. Leave empty for all of them.
minBedroomsintegerSearch mode: keep only stays with at least this many bedrooms.
minBedsintegerSearch mode: keep only stays with at least this many beds.
minBathroomsintegerSearch mode: keep only stays with at least this many bathrooms.
superhostOnlybooleanSearch mode: keep only stays whose host carries the Superhost badge.
instantBookOnlybooleanSearch mode: keep only stays that can be booked without waiting for host approval.
guestFavoriteOnlybooleanSearch mode: keep only stays carrying the Guest favourite badge.
maxItemsintegerStop after this many listing records (0 = no limit; the run then stops when every search runs out of results; values above 100000 are read as 100000).
fetchDetailsbooleanOff by default: search records already carry price, rating, review count, coordinates, photos and the stay type. Turn on to add description, amenities, house rules, host stats and the full rating breakdown to every record. Adds one Listing enrichment event per listing. Always included in URL mode for a listing link.
includeReviewsbooleanOff by default. Turn on to add the review history to every record, up to Max reviews per listing: text, star rating, date, reviewer first name and the host reply. Shares the same single Listing enrichment event as the detail read, so a listing is never charged twice.
maxReviewsPerListingintegerCap on reviews collected per listing when Read the review history is on. Reviews are read 24 per page, so this rounds up to the page, the default of 20 reads one page. Set 0 to skip reviews entirely.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large pull without returning listings already collected there.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns every matching listing as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED listings. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each destination, filter and lookup setup; use State key to name or deliberately share a monitoring campaign. Compared for UPDATED: every output field (price, rating, review count, host, amenities, photos and so on) except the ones excluded. Excluded from the comparison, though still in the output: the review-sample statistics (reviewsFetched, reviewsAverageOfFetched), each review's relative date, and any fields you list under Ignore fields. Without pinned stay dates the quoted window and its price (check-in, check-out, nights and every price field) are excluded too, because the site moves them on its own.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search and filter settings.
emitUnchangedbooleanOff by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have.
emitExpiredbooleanOff by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search.
ignoreFieldsForChangesarrayOptional. Field names to leave out of UPDATED detection and changedFields, on top of the built-in exclusions (review-sample statistics, each review's relative date, and the stay window and price when no dates are pinned). Use a plain name such as hostResponseRate, or a dotted path for a nested field such as reviews.reviewerName. The fields stay in the output.
mcpConnectorsarrayOptionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output.
notionParentPageUrlstringURL or id of the Notion page under which listing pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on listings written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

kindkind
listingIdlistingId
urlurl
titletitle
categoryLabelcategoryLabel
stayCategorystayCategory
roomTyperoomType
propertyTypepropertyType
locationLabellocationLabel
subtitlesubtitle
priceLabelpriceLabel
priceTotalpriceTotal
Show 74 more fields
pricePerNightpricePerNight
pricePerNightListedpricePerNightListed
priceOriginalTotalpriceOriginalTotal
priceCurrencypriceCurrency
priceCurrencyRequestedpriceCurrencyRequested
priceQualifierpriceQualifier
nightsnights
checkIncheckIn
checkOutcheckOut
adultsadults
ratingrating
reviewsCountreviewsCount
ratingCleanlinessratingCleanliness
ratingAccuracyratingAccuracy
ratingCheckinratingCheckin
ratingCommunicationratingCommunication
ratingLocationratingLocation
ratingValueratingValue
ratingDistributionratingDistribution
reviewTagsreviewTags
isGuestFavoriteisGuestFavorite
isSuperhostisSuperhost
badgesbadges
personCapacitypersonCapacity
bedroomsbedrooms
bedsbeds
bathroomsbathrooms
latitudelatitude
longitudelongitude
citycity
regionregion
countrycountry
locationSubtitlelocationSubtitle
locationIsVerifiedlocationIsVerified
imagesimages
imagesCountimagesCount
descriptiondescription
highlightshighlights
sleepingArrangementssleepingArrangements
amenitiesamenities
amenityGroupsamenityGroups
amenitiesCountamenitiesCount
houseRuleshouseRules
safetyAndPropertysafetyAndProperty
cancellationPolicycancellationPolicy
licenseInfolicenseInfo
hostNamehostName
hostIdhostId
hostIsSuperhosthostIsSuperhost
hostIsVerifiedhostIsVerified
hostRatinghostRating
hostReviewsCounthostReviewsCount
hostYearsHostinghostYearsHosting
hostResponseRatehostResponseRate
hostResponseTimehostResponseTime
hostProfileImageUrlhostProfileImageUrl
coHostNamescoHostNames
reviewsreviews
reviewsFetchedreviewsFetched
reviewsAverageOfFetchedreviewsAverageOfFetched
detailLoadeddetailLoaded
changeTypechangeType
changedFieldschangedFields
firstSeenAtfirstSeenAt
lastSeenAtlastSeenAt
thumbnailthumbnail
coordinatescoordinates
localelocale
languagelanguage
homeTierhomeTier
locationDescriptionslocationDescriptions
coHostscoHosts
hostHighlightshostHighlights
hostAbouthostAbout

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "kind": "listing",
  "listingId": "900000000000000001",
  "url": "https://www.airbnb.com/rooms/900000000000000001",
  "title": "Example stay in Sample District",
  "subtitle": "Hosted by Example Host",
  "categoryLabel": "Entire home/apt",
  "stayCategory": "Entire home/apt",
  "roomType": "Entire home/apt",
  "propertyType": "Entire rental unit",
  "pricePerNight": 180,
  "pricePerNightListed": 210,
  "priceTotal": 540,
  "priceCurrency": "EUR",
  "priceCurrencyRequested": "EUR",
  "nights": 3,
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-13",
  "adults": 2,
  "rating": 4.9,
  "reviewsCount": 57,
  "ratingCleanliness": 4.95,
  "ratingAccuracy": 4.9,
  "ratingValue": 4.8,
  "isGuestFavorite": true,
  "isSuperhost": true,
  "personCapacity": 4,
  "bedrooms": 2,
  "beds": 3,
  "bathrooms": 1,
  "latitude": 41.15,
  "longitude": -8.61,
  "city": "Sample City",
  "country": "Sample Country",
  "amenitiesCount": 38,
  "hostName": "Example Host",
  "hostId": "700000001",
  "hostIsSuperhost": true,
  "hostRating": 4.9,
  "hostReviewsCount": 57,
  "hostResponseRate": "100%",
  "hostResponseTime": "within an hour",
  "reviews": [
    {
      "reviewId": "900000000000000101",
      "createdAt": "2026-08-01T00:00:00Z",
      "rating": 5,
      "comment": "Example review text describing the stay.",
      "reviewerName": "Example Guest",
      "hostResponse": "Example host reply, thank you for staying!"
    }
  ],
  "reviewsFetched": 30,
  "reviewsAverageOfFetched": 4.87,
  "detailLoaded": true
}

Ways to use this data

  • Travel planning and price comparison: pull every stay in a destination for your dates and guest count to compare price, rating and location in one dataset.
  • Short-term rental market research: track nightly rates, availability and stay types across neighbourhoods or cities over time.
  • Host and property analytics: collect Superhost status, response rate, review scores and amenity mix across a market or a portfolio of listings.
  • Review mining and reputation analysis: gather the full review history, text and star ratings included, for sentiment or trend analysis.
  • Recurring price and availability monitoring: schedule the actor with incremental mode to get only what changed since the last run, and know when a tracked listing disappears.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Airbnb Scraper return?

The documented output for Airbnb Scraper includes kind, listingid, url, title, categorylabel, staycategory, roomtype and propertytype. Availability of each field depends on the source page and the selected mode.

How much does Airbnb Scraper cost?

It costs $2.00 per 1,000 results on the Apify Free plan and from $0.90 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared listings, and unchanged ones are not billed unless you turn on Emit unchanged. Set Max items to 0 so every run checks the whole search. With a finite limit, each run only checks a leading slice of results (see "How Max items shapes a run").

Why does a search filter return listings that do not seem to match?

stayCategory is the category line the search result itself carries (for example "Room in Sample City" or "Hotel in Sample District"). It overlaps the Stay types filter rather than matching it one to one: in the site's own taxonomy a hotel room is also a private room, so a Private room search can legitimately return rows whose stayCategory is Hotel room. roomType is the value the listing page itself publishes and only appears once full detail is read. Also, the price filter narrows on the nightly rate after any discount, the same quantity reported as pricePerNight, so a discounted listing can sit inside a price cap even though its listed rate looks higher.

Why did my run fail instead of returning an empty dataset?

If the site refuses every request, the run stops with a clear connection message so "no stays for this search" is never confused with "nothing could be read". Run it again in a few minutes. If only some listings or pages could not be read, you still get what was found.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with Airbnb Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.