π β¨ Airbnb Scraper β Listings, Fees, Host & Reviews
Pricing
$14.99/month + usage
π β¨ Airbnb Scraper β Listings, Fees, Host & Reviews
This actor extracts Airbnb property data to help real estate investors and analysts evaluate short-term rental markets. Get details on nightly rates, occupancy signals, and listing density fast.
Pricing
$14.99/month + usage
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Airbnb Scraper β Extract Listings, Host Profiles and Reviews
Airbnb Scraper β Listings, Fees, Host & Reviews pulls structured Airbnb stay data by location keyword or direct room URL/ID: property specs, an itemized price breakdown (nightly rate, cleaning fee, service fee, taxes), full host profiles, amenities, photo galleries, geolocation, and β when enabled β individual guest reviews with optional AI sentiment/topic tagging. Results stream to your Apify Dataset as typed JSON, not raw HTML, so there's nothing to parse before it lands in your database, spreadsheet, or LLM context window. Every pushed row is billed once under a single pay-per-event charge (row_result), and this guide covers every input, every output field, and how teams actually run it for pricing research, host monitoring, and RAG pipelines.
π§ What Does Airbnb Scraper β Listings, Fees, Host & Reviews Do?
It scrapes Airbnb (airbnb.com) stay listings by city/neighborhood keyword, a pasted search URL, or a direct room URL/numeric room ID, and returns two row types: listing and review. No Airbnb account or login is required β the Actor calls Airbnb's own public search HTML and persisted-query GraphQL endpoints anonymously, the same ones your browser calls when you use airbnb.com. It resolves the location you type through OpenStreetMap's Nominatim geocoder to get a bounding box, so a city name that exists in more than one country is matched to the right place.
- π Listings β specs, itemized fees, ratings, badges, coordinates, photos
- π§βπΌ Host profiles β name, Superhost/verified status, response rate/time, years hosting, about text (nested inside each listing)
- π¬ Individual reviews β reviewer, rating, text, date, host response, as linked child rows
- π€ Optional AI review enrichment β sentiment, topics, language, via your own API key to one of seven LLM providers
- π Two entry modes β search by location keyword/URL, or fetch specific rooms directly by URL or numeric ID
- π Geo-aware filtering β an optional strict bounding-box check so "Springfield" doesn't return the wrong state
β‘ Features & Capabilities
This Actor covers the full lifecycle of a listing lookup β from search discovery through the itemized price quote to the guest reviews underneath it β in one input schema and one charged event.
Core features
- Itemized price breakdown, flattened to numbers β
pricePerNight,basePriceSubtotal,totalStayPrice,cleaningFee,serviceFee,taxes,priceOriginal,discountPercent,pricePerGuestβ parsed out of Airbnb's price-explanation UI rather than left as a single formatted string. - Full host object per listing β
host.name,host.isSuperhost,host.isVerified,host.responseRate,host.responseTime,host.yearsHosting,host.about,host.ratingAverage. - Amenities, both flat and grouped β
amenities(a flat array of available amenity names) andamenityGroups(each group's title plus every amenity with itsavailableboolean), so you can tell "not offered" from "not documented." - Guest reviews as linked child rows β
type: "review",isChild: true,parentIdpointing back to the listing, withreviewText,reviewRating,reviewDate,reviewerLocation, andhostResponse. - Optional multi-provider AI review analysis β set
aiEnhancementon and each review getsaiSentiment,aiTopics, andaiLanguage, computed by whichever provider you configure inaiModel. - Automatic proxy escalation β every run starts on a direct connection (or your configured proxy) and only escalates to datacenter, then residential, when Airbnb actually blocks it.
How Airbnb Scraper β Listings, Fees, Host & Reviews compares to other Airbnb scrapers
| Feature | This Actor | blackfalcondata/airbnb-scraper | makework36/fast-airbnb-price-scraper |
|---|---|---|---|
| Output format | Typed JSON, flattened numeric price fields | Typed JSON, nested price object | Typed JSON, flattened price fields |
| Itemized fees (cleaning/service/tax as separate numbers) | β | Not documented as separate fields | β (not in output table, as observed on the Apify Store on 2026-07-26) |
| Individual guest reviews | β (linked child rows) | β
(reviews mode) | β β "for detailed per-listing reviews... you'd need to visit each listing page individually," as observed on the Apify Store on 2026-07-26 |
| Full host profile (response rate, years hosting) | β | Not documented | "Full host profile scraping is on the roadmap," as observed on the Apify Store on 2026-07-26 |
| Direct room URL/ID input | β | β | β (location/search only, as observed on the Apify Store on 2026-07-26) |
| Incremental/diff mode (new/changed/removed) | β | β , as observed on the Apify Store on 2026-07-26 | β |
| AI-based review sentiment/topic tagging | β (bring your own key) | Not documented | Not documented |
| Proxy escalation strategy | Direct β datacenter β residential, automatic | Not documented | Apify Proxy, automatic rotation, as observed on the Apify Store on 2026-07-26 |
If your use case is feeding structured data to an LLM, the output-format row is the decision-maker β HTML parsing inside an agent loop is a reliability failure mode, not a feature. Every field above already arrives typed, so a downstream agent never has to guess whether "$184" is a string or a number.
When another tool might suit you better
If you need every active listing from one specific host ID, or Airbnb Experiences data, openclawai/airbnb-scraper documents dedicated host_listings and experience_search modes for exactly that (as observed on the Apify Store on 2026-07-26) β this Actor has no host-portfolio-by-ID or Experiences mode. And if you only need bare search-result fields (price, rating, photos, coordinates) at the lowest possible per-row cost with no fee breakdown or host/review data at all, makework36/fast-airbnb-price-scraper's narrower field set is a lighter fit than this Actor's fuller row.
Airbnb Scraper β Listings, Fees, Host & Reviews within the Scrapio data stack
This Actor covers listings and reviews. For extracting host names, phone numbers, and other contact details from Airbnb host profiles as lead-generation records, use ../Airbnb-Host-Contact-%26-Lead-Scraper in the same Scrapio account, which is scoped specifically to host contact enrichment rather than listing/pricing data.
Why do developers and data teams scrape Airbnb?
Airbnb's public listing and review pages hold pricing, availability signals, and guest-sentiment text that no other single source aggregates at this scale, which is why it draws such different audiences.
π’ STR investors and property managers
Feed locationQueries for a target neighborhood, pull pricePerNight, totalStayPrice, cleaningFee, serviceFee, bedrooms, bathrooms, maxGuests, isSuperhost, and ratingAverage for every comparable listing, and build a comp set before buying or re-pricing a property. Because checkin/checkout are per-run inputs, the same query re-run across several date ranges surfaces how a market's nightly rate moves with the season β feed the flattened price columns straight into a spreadsheet or BI tool without touching a price string.
π AI training data and RAG indexing
description, highlights, and guest reviewText are the highest-information text fields in the row β description and highlights are host-written property copy, and reviewText is unstructured guest sentiment tied to a reviewRating. For RAG, index title + description + amenities per listing so an assistant can answer "which listings have a pool and self check-in" from retrieved context instead of a live API call. For training data, reviewText paired with reviewRating gives a naturally labeled sentiment dataset, and every field arrives as a typed primitive β no HTML stripping or price-string parsing needed first.
π± Competitive and market intelligence
Track pricePerNight, discountPercent, isGuestFavorite, and reviewsCount for a fixed set of startUrls on a recurring schedule to see how competing hosts move their rates and how quickly they accumulate reviews. priceQualifier and priceOriginal together tell you whether a competitor is currently running a discount and by how much.
π¬ Research and academic use
Public listing and review data supports housing-supply, tourism, and short-term-rental-regulation research without needing platform credentials β this Actor returns only what's already visible on a public Airbnb listing or search page, scoped to whatever locationQueries or startUrls you provide.
π₯ Product and SaaS development
Build a dynamic-pricing input feed, a "best current deals" product, or a directory/monitoring tool on top of the flattened price and rating fields β pricePerNight, pricePerGuest, ratingAverage, and amenitiesCount are ready to rank or filter on without any transformation step.
π Input Parameters
All 31 input parameters are optional β the schema has no required fields, but the Actor needs at least one of locationQueries or startUrls filled in at runtime or it logs a warning and exits without scraping.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
locationQueries | No | array | Cities/neighborhoods to search. For US cities add the state like Austin--TX so the right area is matched. | ["paris", "Austin--TX"] |
startUrls | No | array | Direct room URLs (https://www.airbnb.com/rooms/12345), numeric room IDs (12345), or full search URLs. Room URLs/IDs are scraped directly (no search). | ["29774978", "https://www.airbnb.com/rooms/12345"] |
checkin | No | string, default "30 days" | When the stay starts β calendar date YYYY-MM-DD or relative (14 days, 2 weeks). Future dates give live prices. | "2026-09-01" |
checkout | No | string, default "34 days" | When the stay ends β must be after check-in. Same calendar/relative format. | "2026-09-05" |
adults | No | integer, default 2, min 1, max 16 | Number of adult guests. | 2 |
children | No | integer, default 0, min 0, max 15 | Number of children (ages 2β12). | 0 |
infants | No | integer, default 0, min 0, max 5 | Number of infants (under 2). | 0 |
pets | No | integer, default 0, min 0, max 5 | Number of pets. | 0 |
maxItems | No | integer, default 10, min 1, max 5000 | Stop after this many listings that match your search and area. Reviews do NOT count toward this. | 10 |
maxPages | No | integer, min 1, max 500 | Advanced: cap how many search result pages to walk. Leave empty for an automatic sensible cap. | 10 |
strictGeo | No | boolean, default true | When ON, only keep listings whose coordinates fall in the resolved area. When OFF, more nearby/similar-name results may appear. | true |
includeDetails | No | boolean, default true | When ON each listing gets host profile, amenities, full photo gallery, sleeping arrangements, description and itemized fees. When OFF, only search-page fields are emitted. | true |
includeReviews | No | boolean, default false | When ON, fetch individual guest reviews as child rows (type=review, isChild=true), linked via parentId. Also mirrored to a per-run reviews-<runId> dataset. | false |
maxReviewsPerListing | No | integer, default 20, min 0, max 2000 | Cap reviews fetched per listing (0 = unlimited). Only applies when reviews are enabled. | 20 |
minPrice | No | integer, default 0, min 0 | Only keep listings whose per-night price is at least this. 0 = no minimum. | 0 |
maxPrice | No | integer, default 0, min 0 | Only keep listings whose per-night price is at most this. 0 = no maximum. | 0 |
roomType | No | string, default "any", enum: any, entire_home, private_room, shared_room, hotel_room | Keep only this room type. any = no filter. | "entire_home" |
superhostOnly | No | boolean, default false | Keep only listings whose host is a Superhost. | false |
guestFavoriteOnly | No | boolean, default false | Keep only listings badged as a Guest Favorite. | false |
minRating | No | number, default 0, min 0, max 5 | Keep only listings with an overall rating at least this value. 0 = no minimum. | 0 |
minReviews | No | integer, default 0, min 0 | Keep only listings with at least this many reviews. 0 = no minimum. | 0 |
keywords | No | array | Keep only listings whose title/description contains at least one of these (case-insensitive). | ["pool", "downtown"] |
excludeKeywords | No | array | Drop listings whose title/description contains any of these. | ["shared", "hostel"] |
currency | No | string, default "USD", 39-value enum | Currency for all prices (USD, EUR, GBP, JPY, AUD, CAD, CHF, CNY, INR, BRL, MXN, SEK, NOK, DKK, PLN, NZD, SGD, HKD, KRW, TRY, ZAR, AED, THB, MYR, PHP, IDR, CZK, HUF, ILS, SAR, CLP, ARS, COP, PEN, RON, BGN, HRK, ISK, TWD, VND). | "USD" |
locale | No | string, default "en-US", 48-value enum | Language/region Airbnb uses for labels and text (en-US, en-GB, fr-FR, de-DE, es-ES, ja-JP, and 42 more). | "en-US" |
state | No | string, default "" | Optional region name to disambiguate (e.g. Texas). Leave empty if your search is already specific. | "Texas" |
country | No | string, default "" | Optional country to disambiguate (e.g. United States). Leave empty if you are sure. | "United States" |
aiEnhancement | No | boolean, default false | When ON, each fetched review gets aiSentiment, aiTopics and aiLanguage. Requires reviews enabled and an API key. | false |
aiModel | No | string, default "claude-haiku-4-5", enum: claude-haiku-4-5, claude-sonnet-5, claude-opus-4-8, gpt-4o-mini, gpt-4o, gpt-4.1-mini, o3-mini, gemini-2.0-flash-lite, gemini-2.0-flash, gemini-2.5-flash, grok-3-mini, deepseek-chat, sonar, mistral-small-latest | Provider is auto-detected from the model name prefix (claude-*=Anthropic, gpt-*/o3-*=OpenAI, gemini-*=Google, grok-*=xAI, deepseek-*=DeepSeek, sonar*=Perplexity, mistral-*=Mistral). | "claude-haiku-4-5" |
aiApiKey | No | string (secret) | API key for the selected provider. Falls back to the provider's env var (ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY / XAI_API_KEY / DEEPSEEK_API_KEY / PERPLEXITY_API_KEY / MISTRAL_API_KEY) if left empty. | β |
proxyConfiguration | No | object, prefill {"useApifyProxy": false} | Configure Apify Proxy if needed; otherwise the Actor connects directly and escalates automatically on a block. | {"useApifyProxy": true} |
{"locationQueries": ["Austin--TX"],"checkin": "30 days","checkout": "34 days","adults": 2,"maxItems": 25,"strictGeo": true,"includeDetails": true,"includeReviews": true,"maxReviewsPerListing": 10,"roomType": "entire_home","superhostOnly": false,"currency": "USD","locale": "en-US","aiEnhancement": false,"proxyConfiguration": { "useApifyProxy": true }}
Supported URL types and input formats
startUrls accepts three distinct formats, and the Actor's own parser classifies each entry:
- A direct room URL β
https://www.airbnb.com/rooms/29774978. The numeric ID is extracted with a/rooms/(\d+)match and fetched directly, no search page involved. - A bare numeric room ID β
"29774978". Detected withs.isdigit()and treated the same as a room URL. - An Airbnb search URL β anything containing
airbnb.and/s/. The location slug is read out of the URL path and re-run as alocationQueries-style search, so filters (checkin,roomType, price range, etc.) still apply.
Any other string is treated as a location keyword, same as an entry in locationQueries. locationQueries itself accepts a bare place name ("Paris") or a US city with a state suffix ("Austin--TX") β the --ST suffix is parsed against a full 55-entry US state/territory abbreviation table before being used to narrow the geocoder result.
π¦ Output Format
Every run produces one Apify Dataset of typed JSON rows, distinguished by a type field (listing or review). The dataset's default view (33 columns) is a subset of what's actually pushed β a listing row carries 51 top-level keys, several of them nested objects and arrays with their own fields. Export as JSON, CSV, or Excel from the Dataset tab, or stream results via the Apify API as the run progresses.
Output for a listing (type: "listing")
{"id": "29774978","type": "listing","isChild": false,"url": "https://www.airbnb.com/rooms/29774978","title": "Sunny loft with skyline view","subtitle": "Entire rental unit in Austin, Texas","scrapedAt": "2026-07-26T14:02:11Z","checkin": "2026-08-25","checkout": "2026-08-29","nights": 4,"currency": "USD","locale": "en-US","roomType": "entire_home","propertyType": "Entire rental unit","bedrooms": 1,"beds": 1,"bathrooms": 1,"maxGuests": 4,"isSuperhost": true,"isGuestFavorite": true,"badges": ["GUEST_FAVORITE", "SUPERHOST"],"ratingAverage": 4.92,"reviewsCount": 318,"rating": {"guestSatisfaction": 4.92,"accuracy": 4.9,"checkin": 4.95,"cleanliness": 4.9,"communication": 4.95,"location": 4.85,"value": 4.8},"description": "Bright top-floor loft a short walk from downtown, with a full kitchen and a private balcony.","highlights": ["Self check-in", "Great location", "Sparkling clean"],"host": {"id": "12345678","name": "Jordan","url": "https://www.airbnb.com/users/show/12345678","isSuperhost": true,"isVerified": true,"profilePictureUrl": "https://a0.muscache.com/im/pictures/user/host.jpg","ratingAverage": 4.93,"ratingCount": 950,"reviewsCount": 950,"yearsHosting": 6,"responseRate": "100%","responseTime": "within an hour","about": "Host of five properties across Austin."},"hostName": "Jordan","amenities": ["Wifi", "Kitchen", "Air conditioning", "Self check-in", "Free parking"],"amenityGroups": [{ "group": "Bathroom", "amenities": [{ "title": "Hair dryer", "available": true, "subtitle": null }] }],"amenitiesCount": 5,"photos": [{ "url": "https://a0.muscache.com/im/pictures/miso/photo1.jpg", "caption": "Living room" }],"photoCount": 24,"thumbnail": "https://a0.muscache.com/im/pictures/miso/photo1.jpg","sleepingArrangements": [{ "title": "Bedroom 1", "subtitle": "1 queen bed" }],"latitude": 30.2672,"longitude": -97.7431,"coordinates": { "latitude": 30.2672, "longitude": -97.7431 },"pricePerNight": 142.5,"basePriceSubtotal": 570.0,"totalStayPrice": 648.0,"priceOriginal": null,"cleaningFee": 45.0,"serviceFee": 33.0,"taxes": 0.0,"priceQualifier": "for 4 nights","priceCurrency": "USD","discountPercent": null,"pricePerGuest": 162.0,"distanceKm": 2.104,"registrationNumber": null}
Output for a review (type: "review", isChild: true)
{"id": "998877665544","type": "review","isChild": true,"parentId": "29774978","listingId": "29774978","url": "https://www.airbnb.com/rooms/29774978","title": "Sunny loft with skyline view","reviewerName": "Alex","reviewerId": "55667788","reviewerLocation": "Denver, Colorado","reviewRating": 5,"reviewText": "Great location, spotless, and the host responded within minutes.","reviewDate": "2026-05-12","reviewLanguage": "en","hostResponse": "Thanks so much for staying with us, Alex!","reviewPhotos": [],"scrapedAt": "2026-07-26T14:02:19Z","aiSentiment": "positive","aiTopics": ["location", "cleanliness", "host responsiveness"],"aiLanguage": "en"}
aiSentiment, aiTopics, and aiLanguage are only present when aiEnhancement is on, reviews are enabled, and a working API key is available β otherwise the review row stops at scrapedAt. aiLanguage is pushed to the dataset but is not one of the 33 columns in the default table view; open the row in JSON/CSV export to see it.
Schema stability and export options
Field names stay stable across runs because they're assigned by name in the Actor's own row-builder, not passed through from Airbnb's raw GraphQL response β if Airbnb renames an internal API field, the row-builder's parsing logic needs an update, but your downstream schema (pricePerNight, hostName, etc.) doesn't change. Values that Airbnb doesn't return for a given listing or date range are emitted as null, never omitted or fabricated β for example, taxes is null whenever Airbnb's price breakdown for that stay has no separate tax line. Export the finished dataset as JSON, CSV, or Excel directly from the Apify Console, or pull it programmatically through the Apify API or apify-client while the run is still in progress.
π‘ Airbnb Scraper β Listings, Fees, Host & Reviews Strategy Guide
π― Strategy 1: Real-time enrichment pipeline
Trigger a run from your app whenever a user pastes an Airbnb URL or a new comp needs pricing: pass the URL in startUrls with includeDetails: true, wait for the run to finish, and read back pricePerNight, cleaningFee, serviceFee, taxes, and host.responseRate for that single listing. Append those fields to the record in your own system β a CRM row, a pricing-tool comp, or a lead card β using the Apify API's synchronous run-and-get-dataset endpoint so the enrichment completes inline with your request.
π― Strategy 2: Scheduled monitoring and alerting
Set an Apify Schedule to re-run the same locationQueries or startUrls daily or weekly, and diff the new dataset against the previous run on pricePerNight, isGuestFavorite, and reviewsCount (there is no built-in diff/incremental mode in this Actor β the comparison happens on your side, e.g. in the destination database). Alert when pricePerNight moves outside a threshold band, or when reviewsCount jumps, signalling a listing picked up a new review since the last check.
π― Strategy 3: Bulk dataset build
Pass a large locationQueries array (multiple neighborhoods/cities in one run) or a long startUrls list, raise maxItems up to its schema maximum of 5000, and let the run's own semaphore-limited concurrency (6 detail requests in flight at a time) and automatic proxy escalation handle throughput. Export the finished dataset straight to CSV or push it to a warehouse via the Apify API once the run completes β no separate pagination step is needed since one run covers the whole target list.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | Single-URL lookups triggered by user action | Synchronous run-and-wait via Apify API | JSON, read inline |
| Scheduled monitoring | Recurring price/review tracking for a fixed set of listings | Apify Schedule, diffed externally | JSON/CSV, compared run-over-run |
| Bulk dataset build | Large one-off research or training datasets | Single run, high maxItems, multi-location input | CSV or warehouse export |
π΄ Related Airbnb Scrapers & Tools
| Scraper | What it extracts |
|---|---|
| ../Airbnb-Host-Contact-%26-Lead-Scraper (Scrapio) | Host names and contact details from Airbnb host profiles, for lead-generation use cases β a narrower, contact-focused counterpart to this Actor's listing/review data. |
How to integrate Airbnb Scraper β Listings, Fees, Host & Reviews with your stack
Airbnb Scraper β Listings, Fees, Host & Reviews works with any language or tool that can make an HTTP request through the Apify API β the examples below use the official apify-client SDKs.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("YOUR_APIFY_TOKEN")run_input = {"locationQueries": ["Austin--TX", "Denver--CO"],"maxItems": 50,"includeDetails": True,"includeReviews": False,"roomType": "entire_home","currency": "USD",}run = client.actor("airbnb-scraper-listings-fees-host-reviews").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())listings = [r for r in rows if r.get("type") == "listing"]with open("airbnb_listings.csv", "w", newline="", encoding="utf-8") as f:fields = ["id", "title", "pricePerNight", "cleaningFee", "serviceFee","ratingAverage", "isSuperhost", "url"]writer = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore")writer.writeheader()writer.writerows(listings)print(f"Saved {len(listings)} listings to airbnb_listings.csv")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('airbnb-scraper-listings-fees-host-reviews').call({locationQueries: ['Miami Beach--FL'],maxItems: 30,includeDetails: true,includeReviews: true,maxReviewsPerListing: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const listings = items.filter((r) => r.type === 'listing');console.table(listings.map((l) => ({title: l.title,perNight: l.pricePerNight,rating: l.ratingAverage,superhost: l.isSuperhost,})));
Async and scheduled pipelines
For large jobs, start the run with the Apify API's async start endpoint and poll client.run(runId).get() (or subscribe to run-status webhooks in the Apify Console) instead of waiting synchronously. For recurring collection, create an Apify Schedule against this Actor with a fixed input β the schedule re-triggers the run on a cron interval, and each run lands in a fresh dataset you can diff or aggregate on your side.
π― Who Needs Airbnb Scraper β Listings, Fees, Host & Reviews? (Use Cases & Industries)
π’ STR investors and property managers
An investor evaluating a new market pulls pricePerNight, totalStayPrice, bedrooms, and ratingAverage for every listing in locationQueries: ["Nashville--TN"], filtered to roomType: "entire_home", to build a comp set and estimate achievable nightly rates before making an offer.
π AI / RAG teams
A property-search assistant indexes title, description, amenities, and highlights per listing into a vector store, then answers "find me a Superhost listing with a pool near downtown" by retrieving matches and checking isSuperhost and amenities directly β no live scrape needed at query time.
π± Revenue management and pricing tools
A dynamic-pricing product runs this Actor nightly against a host's own listing plus a fixed set of competitor startUrls, and feeds pricePerNight and discountPercent into its rate-recommendation model as the comp-set input.
π¬ Researchers
A housing-policy researcher scrapes a metro area's locationQueries on a schedule to build a longitudinal dataset of short-term-rental supply and pricing, using only publicly visible listing data with no login or private API access.
π₯ Travel and relocation products
A relocation-assistance or corporate-housing product searches locationQueries for a target neighborhood with minRating, superhostOnly, and keywords filters, and surfaces the matching title, photos, and pricePerNight to a client within the product's own UI.
Is it legal to scrape Airbnb?
Scraping publicly accessible web pages is generally lawful in the United States β in hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985 (9th Cir. 2019), the Ninth Circuit held that scraping data a website makes publicly visible, without logging in, does not violate the Computer Fraud and Abuse Act. That precedent concerns public-data access, not a website's terms of service: Airbnb's Terms of Service separately restrict automated data collection, and violating a site's ToS is a contractual/civil matter between you and Airbnb, not a criminal one, but it can still carry consequences such as account or access restriction. This Actor also returns some personal data β host display names, reviewer display names and rough locations, and host profile photos β all of it already public on the listing or review page a browser would show; storing or reusing that personal data may still trigger GDPR, CCPA, or similar obligations depending on your jurisdiction and use case. Airbnb Scraper β Listings, Fees, Host & Reviews returns only publicly accessible data. What you do with that data is your responsibility β consult legal counsel for commercial applications involving personal data.
β Frequently asked questions
Does Airbnb Scraper β Listings, Fees, Host & Reviews work without an Airbnb account?
Yes. It calls Airbnb's public search HTML and persisted-query GraphQL endpoints without any login, cookie, or session token β the same anonymous requests a browser makes when you open airbnb.com. No Airbnb credentials are ever requested by the Actor.
How does it handle Airbnb's anti-scraping measures?
It impersonates a real Chrome browser's TLS/JA3 fingerprint on every request (Airbnb sits behind Akamai, which serves an "Access Denied" page to a plain HTTP client), retries failed requests with backoff, and detects blocked responses by status code (403/429/503) or by anti-bot page markers in the HTML. On a detected block it automatically escalates the connection from direct, to Apify's datacenter proxy, to residential proxy β and once it escalates to residential it stays there for the rest of the run.
Can I run it at scale without getting blocked?
The Actor runs up to 6 listing-detail requests concurrently and automatically escalates proxy tier on a block, but no uptime or block-avoidance rate is published or guaranteed β very large or aggressive runs are more likely to trigger the escalation path. maxPages lets you cap search-page depth explicitly; left empty, the Actor computes an automatic page cap based on your maxItems target and whether strictGeo is on.
How fresh is the data it returns?
Live. Every run fetches Airbnb's current search results and, when includeDetails is on, a live price quote for your specified checkin/checkout dates β nothing is cached between runs.
Which fields work best for AI training and RAG indexing?
For RAG, index title, description, highlights, and amenities per listing β these are the host-written, high-information text fields. For training data, reviewText paired with reviewRating gives a consistently structured sentiment-labeled dataset across every listing. All fields return as typed primitives (strings, numbers, booleans, or arrays) β no HTML stripping or price-string parsing required before use.
Does scraping Airbnb raise data-protection questions?
It can, for the personal-data fields specifically β host display names, reviewer display names/locations, and profile photos are personal data even though they're publicly displayed on Airbnb. The Actor returns only what's already publicly visible on the listing/review page; the lawful basis for storing, processing, or reusing that personal data (e.g. under GDPR or CCPA) sits with you as the user, not with the Actor.
Does it work with Claude, ChatGPT, and other AI agent tools?
It's not currently exposed through an MCP server, but every response is typed JSON returned via the standard Apify API, so any agent framework that can call an HTTP endpoint (or the apify-client SDK) can trigger a run and read the dataset back into its context window without any parsing step.
How does it compare to other Airbnb scrapers?
blackfalcondata/airbnb-scraper documents an incremental/diff mode (NEW/UPDATED/EXPIRED tracking) and Apify MCP connector export that this Actor doesn't have, as observed on the Apify Store on 2026-07-26 β if scheduled diffing matters more to you than itemized fees or reviews, that's worth a look. makework36/fast-airbnb-price-scraper is narrower and, per its own FAQ, defers per-listing reviews and full host profiles to its roadmap (as observed on the Apify Store on 2026-07-26) β this Actor already returns both today, plus the itemized fee breakdown neither competitor documents as separate numeric fields.
βΉοΈ Disclaimer
Airbnb Scraper β Listings, Fees, Host & Reviews extracts only publicly available data from Airbnb. This tool is intended for lawful use cases only. Users are responsible for complying with Airbnb's terms of service and applicable data protection laws in their jurisdiction.
