Airbnb Scraper avatar

Airbnb Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Airbnb Scraper

Airbnb Scraper

Scrape Airbnb listings by city, keyword, or filter. Collect pricing, reviews, ratings, amenities, and host data. Ideal for analyzing rental trends, planning expansion, or benchmarking competitors in any location.

Pricing

$19.99/month + usage

Rating

5.0

(1)

Developer

Scraper Engine

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

26

Total users

1

Monthly active users

6 days ago

Last modified

Share

Airbnb Listing Scraper — Prices, Ratings and Coordinates

Airbnb Scraper pulls live Airbnb stay data — nightly price and full fee breakdown, guest rating scores, coordinates, and photos — for any city, neighborhood, or search URL you give it. Every stay comes back as clean, structured JSON, with no HTML to parse yourself. Set your dates and location, hit Start, and watch results land in your dataset in real time.

What is Airbnb Scraper?

Airbnb Scraper is an Apify Actor that searches Airbnb by location (or a pasted search URL) and returns each matching stay as a structured JSON record — title, description, price breakdown, ratings, and coordinates. It reads only Airbnb's public, logged-out search and listing pages: no Airbnb account, login, or session cookie is used anywhere in the Actor. It's built for developers, market researchers, and AI engineers who need Airbnb pricing and listing data without writing and maintaining their own scraper.

What Airbnb listing data is publicly available to scrape?

Everything Airbnb Scraper returns is visible to any visitor browsing Airbnb without an account.

Data CategoryPublicly AvailableRestricted behind login/booking
Listing title, description, photosYes
Nightly price, fees, and total for your chosen datesYes
Aggregate rating and 6-axis sub-ratings, review countYesIndividual written reviews' full text
Approximate listing coordinatesYesExact street address (shown only after booking)
Search results by city, neighborhood, or keywordYes
Host name and profilePartial (public display name)Direct contact details, messaging

Airbnb Scraper only returns publicly visible data — what any visitor sees. Nothing behind a login wall.

What data can I extract with Airbnb Scraper?

Airbnb Scraper returns identifying listing details, a full pricing breakdown, and guest rating scores for every stay.

Field NameDescription
idAirbnb listing ID, taken from the /rooms/{id} URL
urlFull URL of the listing's room page, including your search dates
titleListing title
descriptionFull listing description, converted from HTML to plain text
thumbnailPrimary/hero photo URL
coordinates.latitudeListing latitude
coordinates.longitudeListing longitude
currencyCurrency code used for this run's prices
localeLocale/language code used for this run
price.priceDisplayed price for the search dates
price.labelFull accessibility label describing the price
price.qualifierPrice qualifier text (e.g. total, per night)
price.originalPricePre-discount price, when Airbnb shows one
price.discountedPriceDiscounted price, when Airbnb shows one
price.breakDown.basePriceNights × per-night description and price
price.breakDown.basePriceBreakdownList of individual base-price line items
price.breakDown.serviceFeeAirbnb service fee
price.breakDown.cleaningFeeCleaning fee
price.breakDown.taxesTaxes charged
price.breakDown.totalTotal price and its description
price.breakDown.totalBeforeTaxesTotal before taxes
price.breakDown.specialOfferSpecial offer/discount amount, if any
price.breakDown.earlyBirdDiscountEarly-bird discount flag
rating.guestSatisfactionOverall aggregate guest rating
rating.reviewsCountNumber of reviews
rating.accuracyAccuracy sub-rating
rating.checkingCheck-in sub-rating
rating.cleanlinessCleanliness sub-rating
rating.communicationCommunication sub-rating
rating.locationLocation sub-rating
rating.valueValue sub-rating

Listing details

id, url, title, description, thumbnail, coordinates.latitude, coordinates.longitude, currency, locale — everything that identifies the stay and where it is.

Pricing & availability

price.price, price.label, price.qualifier, price.originalPrice, price.discountedPrice, and the full price.breakDown object (base price, service fee, cleaning fee, taxes, total, discounts) for your searched check-in/check-out dates.

Ratings & reviews

rating.guestSatisfaction, rating.reviewsCount, and the 6-axis sub-ratings (accuracy, checking, cleanliness, communication, location, value).

🤖 Add-on: Need additional Airbnb data?

Pair this scraper with the ../airbnb-full-year-price-tracker-scraper-cheapest-most-expensive-dates for date-by-date pricing across a full year on a specific listing, or the ../airbnb-occupancy-scraper-with-booking-rate-percentage for booking-rate percentages and open-date gaps. Need a host's publicly indexed contact info instead of listing data? See the ../airbnb-phone-number-scraper.

Why not build this yourself?

Airbnb does not publish a public API for third-party developers to query live search results or listing pricing — its only public integrations are for connected partner property-management systems, not for scraping search or room pages. Building this in-house means solving Akamai's TLS/JA3 fingerprinting yourself (plain HTTP clients get served empty, soft-blocked page shells instead of real content), replaying Airbnb's internal GraphQL persisted-query hashes when they rotate, and paying for residential proxy bandwidth once datacenter IPs get blocked. Airbnb Scraper already handles the Chrome-TLS impersonation, the proxy escalation ladder, and the GraphQL fallback for you, and keeps a stable JSON output schema even as Airbnb's page markup changes underneath it.

How to use Airbnb Scraper

Airbnb Scraper runs entirely inside Apify — there's no separate signup or API key needed to start a run from the Console.

  1. Open Airbnb Scraper's Apify Store listing and click Start, or create a saved task.
  2. Add one or more entries to locationQueries (city, neighborhood, or keyword) or paste full Airbnb search URLs into startItems — no login required for either.
  3. Set checkin and checkout, plus currency and locale; optionally add state/country to disambiguate an ambiguous place name, and leave strictGeo on to keep results inside the area you meant.
  4. Set maxItems for how many stays you want (and maxPages if you want to cap how many search pages get scanned).
  5. Start the run and open the Dataset tab — rows appear as each stay is scraped, not just at the end.
  6. Export the results as JSON, CSV, or any other format the Apify dataset export supports.

How to scale to bulk Airbnb listing extraction

locationQueries and startItems are both arrays, so a single run can cover many places at once: list every city, neighborhood, or search URL you want, and the Actor works through each one in turn, applying maxItems as a per-location target. There's no separate "bulk" toggle beyond that — for very large jobs, split your locations across a few parallel runs, or point startItems at multiple paginated search URLs for the same city.

What can you do with Airbnb listing data?

  • A short-term rental market analyst comparing cities uses price.price and rating.guestSatisfaction across searches to spot underpriced, well-rated markets before investing.
  • A pricing strategist for a competing host uses price.breakDown.basePrice and price.breakDown.cleaningFee to benchmark nightly rates and fee structures against nearby listings.
  • A travel-planning app uses coordinates.latitude/coordinates.longitude alongside title and thumbnail to plot nearby stays on a map for a given trip window.
  • A data analyst tracking guest sentiment uses rating.cleanliness, rating.communication, and rating.reviewsCount to flag listings or neighborhoods with declining host quality over time.
  • An AI engineer building a travel-recommendation RAG assistant feeds title, description, and price.label in as typed JSON context, so the assistant can answer "find me a highly-rated stay in Paris under $150 a night" without scraping or parsing HTML itself.

How does Airbnb Scraper handle rate limits and blocking?

Airbnb Scraper fetches pages with a Chrome-TLS-impersonating HTTP client (curl_cffi, impersonating Chrome 131) so requests present a genuine browser fingerprint rather than being fingerprinted as a bot. It starts every run with no proxy, and automatically escalates — first to an Apify datacenter proxy, then to a residential proxy — the moment it sees a block (HTTP 403/429/503, or a page that looks like a soft-block shell); once it reaches residential, it stays there for the rest of the run. Soft blocks are detected by checking for known block phrases and by requiring an expected content marker on a genuine page. Failed requests retry with a jittered backoff, up to a bounded number of attempts; if a specific listing page still fails after retries, that listing is skipped and logged as an error rather than failing the whole run, and a search page that stops returning new results simply ends that location's pagination.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
locationQueriesNoarray (string list)City, neighborhood, or keyword searches, one per entry. For US places use City--ST (e.g. Austin--TX) to disambiguate.["paris", "Austin--TX"]
startItemsNoarray (string list)Full Airbnb search URLs (or other start links) to use instead of, or alongside, locationQueries.["https://www.airbnb.com/s/london/homes"]
checkinNostringStay start date — absolute YYYY-MM-DD or relative (14 days, 2 weeks). Default 2026-06-01."2026-06-01"
checkoutNostringStay end date — must resolve after checkin. Default 2026-06-08."2026-06-08"
currencyNostring (enum)Currency code prices are shown in. Default USD."USD"
localeNostring (enum)Language/region Airbnb uses for labels and prices. Default en-US."en-US"
maxItemsNointegerMaximum matching stays to collect (1–5000). Default 10.20
maxPagesNointegerAdvanced cap on search pages to scroll (1–500). Leave empty to let the Actor pick automatically.40
strictGeoNobooleanWhen true, only keeps stays that actually belong to the searched area (reverse-geocode check). Default true.true
stateNostring (enum)Optional region/state/province to disambiguate an ambiguous place name. Default "" (none)."Texas"
countryNostring (enum)Optional country to disambiguate an ambiguous place name. Default "" (none)."United States"
proxyConfigurationNoobjectApify Proxy configuration. The Actor connects directly by default and escalates automatically if blocked.{"useApifyProxy": false}

Example input

{
"locationQueries": ["paris", "Austin--TX"],
"startItems": ["https://www.airbnb.com/s/london/homes"],
"checkin": "2026-06-01",
"checkout": "2026-06-08",
"currency": "USD",
"locale": "en-US",
"maxItems": 20,
"maxPages": 40,
"strictGeo": true,
"state": "",
"country": "",
"proxyConfiguration": { "useApifyProxy": false }
}

⬆️ Output

Every run pushes one typed, normalized JSON record per stay to the Actor's default dataset, with the same field names on every row regardless of which fields Airbnb happened to show on the page. Download results as JSON, CSV, Excel, or any other format Apify's dataset export supports.

Example output

{
"id": "12345678",
"url": "https://www.airbnb.com/rooms/12345678?locale=en-US&currency=USD&check_in=2026-06-01&check_out=2026-06-08",
"title": "Charming Loft near Eiffel Tower",
"description": "Sunlit 1-bedroom loft in the heart of the 7th arrondissement.\n\nWalking distance to cafes, the Seine, and the Champ de Mars.",
"thumbnail": "https://a0.muscache.com/im/pictures/example-hero.jpg",
"coordinates": {
"latitude": 48.8566,
"longitude": 2.321
},
"currency": "USD",
"locale": "en-US",
"price": {
"label": "$182 total for 7 nights",
"qualifier": "for 7 nights",
"price": "$182",
"originalPrice": "$210",
"discountedPrice": "$182",
"breakDown": {
"basePrice": { "description": "7 nights x $110", "price": "$770" },
"basePriceBreakdown": [
{ "description": "7 nights x $110", "price": "$770" }
],
"serviceFee": "$98",
"taxes": "$54",
"total": { "price": "$1,274", "description": "Total" },
"totalBeforeTaxes": "$1,220",
"cleaningFee": "$65",
"specialOffer": false,
"earlyBirdDiscount": false
}
},
"rating": {
"accuracy": 4.9,
"checking": 4.8,
"cleanliness": 4.9,
"communication": 5.0,
"location": 4.9,
"value": 4.7,
"guestSatisfaction": 4.87,
"reviewsCount": 236
}
}

How does it work?

Airbnb Scraper fetches Airbnb's public search and room pages directly, using a Chrome-TLS-impersonating HTTP client so requests present a genuine browser fingerprint instead of being soft-blocked by Airbnb's Akamai protection. Requests start with no proxy and automatically escalate through Apify's datacenter and then residential proxy pools if a page comes back blocked, staying on residential once that happens. For each listing, the Actor also reads the same pre-hydrated data Airbnb's own web app loads (an embedded page payload, with a GraphQL fallback) to fill in ratings, coordinates, and titles that the logged-out HTML sometimes leaves blank — it only fills gaps, never overwrites a value it already found, and never invents one. Everything returned is data any visitor could see on the public listing or search page, and the output schema — id, price, rating, coordinates, and the rest — stays the same even when Airbnb changes its page layout.

Integrations

Airbnb Scraper runs on Apify, so it works anywhere you can call an HTTP API or an Apify client library — no proprietary SDK required.

Calling Airbnb Scraper programmatically

from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("scraper-engine/airbnb-scraper").call(run_input={
"locationQueries": ["paris"],
"checkin": "2026-06-01",
"checkout": "2026-06-08",
"maxItems": 20,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["price"]["price"])

Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request to the Apify API.

MCP integration for AI agents

Airbnb Scraper is reachable through Apify's Actors MCP Server, which exposes Actors on Apify Store as callable tools for MCP-compatible clients such as Claude Desktop and Claude Code. Register it by connecting from this Actor's page in Apify Console, or by running npx @apify/actors-mcp-server configured with this Actor's store ID.

No-code tools (n8n, Make, LangChain)

In n8n, use the HTTP Request node (or the community Apify node) pointed at this Actor's run endpoint, with your Apify API token in the Authorization header. In Make, use the Apify app's "Run Actor and get dataset items" module and map locationQueries, checkin, and checkout from earlier scenario steps. In LangChain, call the same Apify API endpoint from a custom Tool, or load results with the community Apify dataset loader, so an agent can pull fresh Airbnb listings mid-conversation.

Scraping publicly available Airbnb listing pages is generally lawful when done for legitimate business or research use, though Airbnb's own Terms of Service restrict automated access to its site. Airbnb Scraper only returns data any visitor can already see on a public search or listing page — no login, no bypassing of paywalls or booking flows. Because this is business/product data (prices, ratings, listing descriptions) rather than an individual's personal data, the relevant framework is contract/Terms-of-Service and database-rights law rather than a personal-data regime like GDPR — though a host's public display name may incidentally appear, so handle any personal identifiers with the same care as other public business records. Consult legal counsel if your use case involves bulk storage of personal data or has jurisdiction-specific requirements.

Frequently asked questions

What Airbnb listing fields does Airbnb Scraper return?

Airbnb Scraper returns id, title, price (with a full fee breakdown), rating (guest satisfaction plus 6 sub-scores), and coordinates for every stay, alongside description, thumbnail, currency, and locale. See the full data fields table above for every key.

Does Airbnb Scraper require an Airbnb account or login?

No. Airbnb Scraper reads only the logged-out public search and listing pages — there's no login field in the input, and no session cookies or credentials are used anywhere in the Actor.

How many listings can I extract in one run?

maxItems accepts any value from 1 up to 5000 per run. The actual count returned depends on how many matching stays exist for your search area and dates, and on whether strictGeo filters out stays outside your intended area.

What happens if a search returns no results or a listing page fails to load?

If a search page returns no listing links, the Actor logs a warning and stops that location's pagination instead of retrying indefinitely. If an individual listing page still fails to load after retries, that listing is skipped and logged as an error, and the run continues with the rest of the locations and listings.

Can I scrape multiple Airbnb locations at once?

Yes. locationQueries and startItems both accept arrays — list multiple cities, neighborhoods, or search URLs and the Actor works through each one in the same run, applying maxItems as a per-location target.

Does Airbnb Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes. It's callable as a plain HTTP endpoint through the Apify API from any agent framework, and it's also reachable through Apify's Actors MCP Server for MCP-compatible clients like Claude Desktop and Claude Code.

Does Airbnb Scraper return data in a format LLMs can use directly?

Yes. Output is typed, normalized JSON with consistent field names across every run — no HTML, no CSS selectors to write. Pass it straight into an LLM prompt, index it into a vector store, or feed it to an agent tool.

What happens when Airbnb changes its layout or anti-bot protection?

The Actor is maintained against Airbnb's current page markup and GraphQL contract, and the output schema is designed to stay stable across those changes — field names don't shift even when the extraction method behind them does. No specific update turnaround is guaranteed.

Can I use Airbnb Scraper without managing proxies or browser infrastructure?

Yes. The Actor handles its own proxy escalation (direct, then datacenter, then residential) and TLS-fingerprint impersonation internally — you don't configure a browser or supply your own proxy list unless you want to route through your own Apify Proxy groups.

Does turning off strictGeo return listings from the wrong city?

It can. With strictGeo off, the Actor accepts any stay whose title or description merely mentions your search term, which can pull in a same-named place from a different country. With strictGeo on (the default), each listing's coordinates are reverse-geocoded and only kept if they're confirmed inside your searched area, region, and country.

Which fields work best for AI training data and RAG indexing?

For RAG, index title and description — they're the highest-information free-text fields. For structured features, rating.guestSatisfaction, rating.reviewsCount, and the price.breakDown fields return consistently typed numbers and strings across every listing, since missing values are always empty strings or null rather than absent keys.

Scraper NameWhat it extracts
Airbnb Full Year Price Tracker: Cheapest & Most Expensive DatesDate-by-date nightly price, availability, and minimum-nights for a full year on a given listing
Airbnb Occupancy Scraper with Booking Rate PercentageBooking-rate percentage, next open date, and bookable open-date gaps for specific listings
Airbnb Phone Number ScraperIndexed Airbnb search results (title, snippet, URL) found via Google, with any publicly indexed phone number
Google Hotels ScraperHotel search results and pricing from Google Hotels

Your feedback

Found a bug or missing a field? Let us know so we can take a look — feedback like this is what keeps this Actor accurate as Airbnb's site changes.