Airbnb Scraper
Pricing
$19.99/month + usage
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
Maintained by CommunityActor stats
0
Bookmarked
26
Total users
1
Monthly active users
6 days ago
Last modified
Categories
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 Category | Publicly Available | Restricted behind login/booking |
|---|---|---|
| Listing title, description, photos | Yes | — |
| Nightly price, fees, and total for your chosen dates | Yes | — |
| Aggregate rating and 6-axis sub-ratings, review count | Yes | Individual written reviews' full text |
| Approximate listing coordinates | Yes | Exact street address (shown only after booking) |
| Search results by city, neighborhood, or keyword | Yes | — |
| Host name and profile | Partial (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 Name | Description |
|---|---|
id | Airbnb listing ID, taken from the /rooms/{id} URL |
url | Full URL of the listing's room page, including your search dates |
title | Listing title |
description | Full listing description, converted from HTML to plain text |
thumbnail | Primary/hero photo URL |
coordinates.latitude | Listing latitude |
coordinates.longitude | Listing longitude |
currency | Currency code used for this run's prices |
locale | Locale/language code used for this run |
price.price | Displayed price for the search dates |
price.label | Full accessibility label describing the price |
price.qualifier | Price qualifier text (e.g. total, per night) |
price.originalPrice | Pre-discount price, when Airbnb shows one |
price.discountedPrice | Discounted price, when Airbnb shows one |
price.breakDown.basePrice | Nights × per-night description and price |
price.breakDown.basePriceBreakdown | List of individual base-price line items |
price.breakDown.serviceFee | Airbnb service fee |
price.breakDown.cleaningFee | Cleaning fee |
price.breakDown.taxes | Taxes charged |
price.breakDown.total | Total price and its description |
price.breakDown.totalBeforeTaxes | Total before taxes |
price.breakDown.specialOffer | Special offer/discount amount, if any |
price.breakDown.earlyBirdDiscount | Early-bird discount flag |
rating.guestSatisfaction | Overall aggregate guest rating |
rating.reviewsCount | Number of reviews |
rating.accuracy | Accuracy sub-rating |
rating.checking | Check-in sub-rating |
rating.cleanliness | Cleanliness sub-rating |
rating.communication | Communication sub-rating |
rating.location | Location sub-rating |
rating.value | Value 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.
- Open Airbnb Scraper's Apify Store listing and click Start, or create a saved task.
- Add one or more entries to
locationQueries(city, neighborhood, or keyword) or paste full Airbnb search URLs intostartItems— no login required for either. - Set
checkinandcheckout, pluscurrencyandlocale; optionally addstate/countryto disambiguate an ambiguous place name, and leavestrictGeoon to keep results inside the area you meant. - Set
maxItemsfor how many stays you want (andmaxPagesif you want to cap how many search pages get scanned). - Start the run and open the Dataset tab — rows appear as each stay is scraped, not just at the end.
- 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.priceandrating.guestSatisfactionacross searches to spot underpriced, well-rated markets before investing. - A pricing strategist for a competing host uses
price.breakDown.basePriceandprice.breakDown.cleaningFeeto benchmark nightly rates and fee structures against nearby listings. - A travel-planning app uses
coordinates.latitude/coordinates.longitudealongsidetitleandthumbnailto plot nearby stays on a map for a given trip window. - A data analyst tracking guest sentiment uses
rating.cleanliness,rating.communication, andrating.reviewsCountto flag listings or neighborhoods with declining host quality over time. - An AI engineer building a travel-recommendation RAG assistant feeds
title,description, andprice.labelin 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
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
locationQueries | No | array (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"] |
startItems | No | array (string list) | Full Airbnb search URLs (or other start links) to use instead of, or alongside, locationQueries. | ["https://www.airbnb.com/s/london/homes"] |
checkin | No | string | Stay start date — absolute YYYY-MM-DD or relative (14 days, 2 weeks). Default 2026-06-01. | "2026-06-01" |
checkout | No | string | Stay end date — must resolve after checkin. Default 2026-06-08. | "2026-06-08" |
currency | No | string (enum) | Currency code prices are shown in. Default USD. | "USD" |
locale | No | string (enum) | Language/region Airbnb uses for labels and prices. Default en-US. | "en-US" |
maxItems | No | integer | Maximum matching stays to collect (1–5000). Default 10. | 20 |
maxPages | No | integer | Advanced cap on search pages to scroll (1–500). Leave empty to let the Actor pick automatically. | 40 |
strictGeo | No | boolean | When true, only keeps stays that actually belong to the searched area (reverse-geocode check). Default true. | true |
state | No | string (enum) | Optional region/state/province to disambiguate an ambiguous place name. Default "" (none). | "Texas" |
country | No | string (enum) | Optional country to disambiguate an ambiguous place name. Default "" (none). | "United States" |
proxyConfiguration | No | object | Apify 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¤cy=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 ApifyClientclient = 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.
Is it legal to scrape Airbnb listings?
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.
Related scrapers
| Scraper Name | What it extracts |
|---|---|
| Airbnb Full Year Price Tracker: Cheapest & Most Expensive Dates | Date-by-date nightly price, availability, and minimum-nights for a full year on a given listing |
| Airbnb Occupancy Scraper with Booking Rate Percentage | Booking-rate percentage, next open date, and bookable open-date gaps for specific listings |
| Airbnb Phone Number Scraper | Indexed Airbnb search results (title, snippet, URL) found via Google, with any publicly indexed phone number |
| Google Hotels Scraper | Hotel 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.