Airbnb Scraper: Full Listing Details Breakdown avatar

Airbnb Scraper: Full Listing Details Breakdown

Pricing

Pay per usage

Go to Apify Store
Airbnb Scraper: Full Listing Details Breakdown

Airbnb Scraper: Full Listing Details Breakdown

Easily pull Airbnb data without coding. This scraper gets you listing titles, prices, descriptions, and more—perfect for automating dashboards, workflows, or data reports using clean, structured output.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

6 days ago

Last modified

Share

Airbnb Scraper — Full Listing Details and License Numbers

Airbnb Scraper: Full Listing Details Breakdown turns a city search, an Airbnb search URL, or a direct /rooms/ link into a complete listing profile — property type, capacity, amenities, photo gallery, house rules, cancellation policy, host details, ratings, a structured price breakdown, and the listing's license/registration number where local law requires one. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. Point it at a place or a listing and get back current listing data.

What is Airbnb Scraper: Full Listing Details Breakdown?

Airbnb Scraper: Full Listing Details Breakdown is a query-driven Actor that accepts city or neighborhood keywords, full Airbnb search URLs, or direct /rooms/ links and IDs, and returns one full listing profile per stay. Alongside the standard property, amenity, and pricing fields, it parses and returns the listing's license/registration number — a field a competitor sweep of top Airbnb Store scrapers found several either omit or don't document. No Airbnb account or login is required: the Actor reads Airbnb's public search and listing pages using a Chrome TLS fingerprint, so it works entirely against logged-out, publicly visible pages.

  • Search by place or keyword (paris, Austin--TX) across one or more locations in a single run
  • Paste full Airbnb search URLs directly — the area is resolved automatically
  • Scrape a single listing by /rooms/{id} URL or bare numeric ID, skipping search entirely
  • Full profile per stay — property type, room type, capacity, amenities, photo gallery, house rules, cancellation policy, highlights, host name and Superhost flag, license number, ratings, and price
  • Control the pricing quote window (check-in/check-out), currency, and content locale per run
  • Disambiguate ambiguous place names with an optional region and country filter

What data can you get with Airbnb Scraper: Full Listing Details Breakdown?

Every run returns one JSON row per listing, covering seven groups of fields pulled from the listing's own page and its embedded sections payload:

Result TypeExtracted FieldsPrimary Use Case
Listing profileid, title, description, propertyType, roomType, homeTier, personCapacity, bedrooms, beds, bathrooms, urlCatalog and compare inventory by size and type
Amenities & photosamenities (grouped), photos, photosCountAmenity coverage analysis, gallery review
House rules & policieshouseRules, cancellationPolicies, highlightsGuest-policy and badge comparison
Host & compliancehostName, hostId, isSuperhost, licenseNumberSuperhost screening, registration compliance checks
Ratingsrating (accuracy, checking, cleanliness, communication, location, value, guestSatisfaction, reviewsCount)Quality benchmarking across a market
Price breakdownprice (label, qualifier, price, originalPrice, discountedPrice, breakDown)Rate and fee analysis for the dates you quote
Location & metadatacoordinates, thumbnail, locationDescriptions, metaDescription, androidLink, iosLink, currency, locale, scrapedAtMapping, SEO context, run auditing

License and registration number

Many cities now require Airbnb hosts to display a license or registration number on the listing page; Airbnb does not expose this as a dedicated field on its own public API surface, and it's absent from the docs of several Airbnb scrapers checked on the Apify Store (2026-07-26). This Actor parses licenseNumber from the listing's own payload — a direct key when Airbnb exposes one, or a label-based scan of the description text ("Registration Details…") when it doesn't. The field is never fabricated: where a city has no such requirement, or a host hasn't listed one, the field returns null rather than a guess.

{ "id": "53611676", "title": "Studio near Le Marais", "licenseNumber": "7511012368794" }
{ "id": "9182734", "title": "Suburban guest suite", "licenseNumber": null }

Price breakdown

Instead of a single total, price carries a breakDown object: basePrice (nightly rate × nights), basePriceBreakdown (itemized line items), cleaningFee, serviceFee, taxes, total, and totalBeforeTaxes, plus top-level originalPrice/discountedPrice when Airbnb is running a promotion. Values are merged from the search-results price card and the listing page's own pricing payload, so a fee genuinely missing from one source is filled from the other rather than left blank without cause.

Why not build this yourself?

Airbnb has no public, official third-party API for listing search or listing detail data — there is no documented endpoint a developer can register for and call directly. Building your own pipeline means reverse-engineering Airbnb's internal search and PDP GraphQL calls, staying ahead of the persisted-query hashes those calls depend on, and handling Airbnb's Akamai-based TLS/JA3 fingerprinting, which blocks plain HTTP clients from datacenter and residential IPs alike before a request ever reaches the app. This Actor already does that work: it impersonates a genuine Chrome TLS fingerprint and escalates through a direct → datacenter-proxy → residential-proxy ladder when a request is blocked, so you get a stable JSON feed without maintaining anti-bot logic or proxy infrastructure yourself.

How to scrape Airbnb with Airbnb Scraper: Full Listing Details Breakdown?

  1. Open Airbnb Scraper: Full Listing Details Breakdown on Apify and go to the Input tab.
  2. Enter one or more place keywords in listingSearchTerms (e.g. paris), or paste room links, IDs, or search URLs into listingUrlsOrIds — no field is strictly required, but you need at least one to get results.
  3. Set pricingCheckIn / pricingCheckOut for the quote window, and optionally priceCurrency, contentLocale, regionFilter, or countryFilter to disambiguate the area.
  4. Click Start and watch listings land in the Dataset tab as they're collected.
  5. Export the dataset as JSON or CSV, or pull it through the Apify API.
{
"listingSearchTerms": ["paris"],
"pricingCheckIn": "2026-08-01",
"pricingCheckOut": "2026-08-05",
"priceCurrency": "USD",
"maxListings": 25
}

How to run multiple queries in one job

listingSearchTerms and listingUrlsOrIds both accept arrays — add one place, link, or ID per line and every entry is processed within the same run, with maxListings applied per entry. You can mix the two: search a city in listingSearchTerms while also profiling specific /rooms/ links in listingUrlsOrIds, and both sets land in the same dataset.

⬇️ Input

All 15 input fields are optional — provide at least one of listingSearchTerms or listingUrlsOrIds to get results.

ParameterRequiredTypeDescriptionExample Value
listingSearchTermsNoarray of stringsCities, neighborhoods, or keywords to search — e.g. london, Austin--TX. One per entry.["paris"]
listingUrlsOrIdsNoarray of stringsDirect /rooms/ links, bare listing IDs, or full Airbnb search URLs.["https://www.airbnb.com/rooms/12345678"]
pricingCheckInNostring (date)Start of the pricing window — calendar date or relative (14 days, 2 weeks)."2026-06-01"
pricingCheckOutNostring (date)End of the pricing window — must be after check-in."2026-06-08"
priceCurrencyNostring (enum, 39 currencies)Currency for every listing's price breakdown and total quote."USD"
contentLocaleNostring (enum, 47 locales)Language/region Airbnb uses to label listing details, amenities, and prices."en-US"
sortOrderNostring (enum: relevance, price_asc, price_desc)Order search results are collected in. Default relevance. Ignored for direct /rooms/ links."price_asc"
includeAmenitiesNobooleanCollect the full grouped amenities list per listing. Default true.true
maxPhotosNointeger (0–200)Cap gallery image URLs kept per listing. 0 keeps the entire gallery. Default 0.10
maxListingsNointeger (1–5000)Stop after this many full listing profiles matching your search.25
maxSearchPagesNointeger (1–500)Advanced: cap how many search-result pages to scroll. Leave empty for an auto cap. Ignored for direct links.20
includeNearbyMatchesNobooleanAlso profile nearby or similar-named places, not just exact area matches.false
regionFilterNostring (enum, ~95 regions)Region/state/province to disambiguate the search area."Île-de-France"
countryFilterNostring (enum, ~76 countries)Country to disambiguate the search area."France"
proxyConfigurationNoobjectApify Proxy configuration. Starts direct and escalates automatically if blocked.{"useApifyProxy": true}

Example JSON input

{
"listingSearchTerms": ["paris", "Austin--TX"],
"listingUrlsOrIds": [],
"pricingCheckIn": "2026-08-01",
"pricingCheckOut": "2026-08-05",
"priceCurrency": "USD",
"contentLocale": "en-US",
"sortOrder": "relevance",
"includeAmenities": true,
"maxPhotos": 0,
"maxListings": 20,
"includeNearbyMatches": false,
"proxyConfiguration": { "useApifyProxy": true }
}

Pitfall: the run exits with zero rows and a warning log if both listingSearchTerms and listingUrlsOrIds are left empty, and it aborts entirely if pricingCheckOut isn't strictly after pricingCheckIn — double-check both before starting a batch of runs.

⬆️ Output

Results are typed, normalized JSON with a consistent field set on every row, streamed to the dataset as each listing finishes. Export as JSON, CSV, Excel, or read rows through the Apify API. The default dataset view surfaces 25 columns; a handful of additional fields (description, homeTier, hostId, locationDescriptions, metaDescription, androidLink, iosLink) are written on every row but hidden from the default table — pull them via JSON/API export or a custom view.

Scraped results

[
{
"id": "53611676",
"title": "Studio near Le Marais",
"propertyType": "Rental unit",
"roomType": "Entire home/apt",
"personCapacity": 2,
"bedrooms": 1,
"beds": 1,
"bathrooms": 1,
"rating": { "guestSatisfaction": 4.85, "cleanliness": 4.9, "location": 4.95, "reviewsCount": 214 },
"price": {
"price": "$142",
"breakDown": {
"basePrice": { "description": "4 nights x $142", "price": "$568" },
"cleaningFee": "$45",
"serviceFee": "$88",
"taxes": "$32",
"total": { "price": "$733", "description": "Total" }
}
},
"amenities": [{ "title": "Bathroom", "values": [{ "title": "Hair dryer", "available": true }] }],
"photosCount": 28,
"photos": [{ "imageUrl": "https://a0.muscache.com/im/pictures/example1.jpg", "orientation": "LANDSCAPE" }],
"houseRules": [{ "title": "During your stay", "values": [{ "title": "Check-in after 3:00 PM" }] }],
"cancellationPolicies": [{ "title": "Free cancellation", "policyName": "Flexible", "policyId": 1 }],
"highlights": [{ "title": "Self check-in", "subtitle": "Check yourself in with a lockbox" }],
"licenseNumber": "7511012368794",
"hostName": "Camille",
"isSuperhost": true,
"coordinates": { "latitude": 48.8606, "longitude": 2.3622 },
"thumbnail": "https://a0.muscache.com/im/pictures/thumb1.jpg",
"currency": "USD",
"locale": "en-US",
"url": "https://www.airbnb.com/rooms/53611676?locale=en-US&currency=USD&check_in=2026-08-01&check_out=2026-08-05",
"scrapedAt": "2026-07-26T09:12:44Z"
},
{
"id": "9182734",
"title": "Sunny 2BR near Zilker Park",
"propertyType": "Home",
"roomType": "Entire home/apt",
"personCapacity": 5,
"bedrooms": 2,
"beds": 3,
"bathrooms": 2,
"rating": { "guestSatisfaction": 4.72, "cleanliness": 4.7, "location": 4.6, "reviewsCount": 58 },
"price": {
"price": "$210",
"breakDown": {
"basePrice": { "description": "4 nights x $210", "price": "$840" },
"cleaningFee": "$60",
"serviceFee": "$112",
"taxes": "$71",
"total": { "price": "$1,083", "description": "Total" }
}
},
"amenities": [{ "title": "Kitchen", "values": [{ "title": "Dishwasher", "available": true }] }],
"photosCount": 19,
"photos": [{ "imageUrl": "https://a0.muscache.com/im/pictures/example2.jpg", "orientation": "LANDSCAPE" }],
"houseRules": [{ "title": "During your stay", "values": [{ "title": "No smoking" }] }],
"cancellationPolicies": [{ "title": "Moderate", "policyName": "Moderate", "policyId": 2 }],
"highlights": [{ "title": "Great location", "subtitle": "95% of guests rated the location 5 stars" }],
"licenseNumber": null,
"hostName": "Derek",
"isSuperhost": false,
"coordinates": { "latitude": 30.2648, "longitude": -97.7717 },
"thumbnail": "https://a0.muscache.com/im/pictures/thumb2.jpg",
"currency": "USD",
"locale": "en-US",
"url": "https://www.airbnb.com/rooms/9182734?locale=en-US&currency=USD&check_in=2026-08-01&check_out=2026-08-05",
"scrapedAt": "2026-07-26T09:13:02Z"
},
{
"id": "31029448",
"title": "Loft with river view, Southbank",
"propertyType": "Loft",
"roomType": "Entire home/apt",
"personCapacity": 3,
"bedrooms": 1,
"beds": 2,
"bathrooms": 1,
"rating": { "guestSatisfaction": 4.91, "cleanliness": 4.88, "location": 4.97, "reviewsCount": 341 },
"price": {
"price": "£165",
"breakDown": {
"basePrice": { "description": "4 nights x £165", "price": "£660" },
"cleaningFee": "£35",
"serviceFee": "£71",
"taxes": "£0",
"total": { "price": "£766", "description": "Total" }
}
},
"amenities": [{ "title": "Safety", "values": [{ "title": "Smoke alarm", "available": true }] }],
"photosCount": 41,
"photos": [{ "imageUrl": "https://a0.muscache.com/im/pictures/example3.jpg", "orientation": "PORTRAIT" }],
"houseRules": [{ "title": "Before you leave", "values": [{ "title": "Turn things off" }] }],
"cancellationPolicies": [{ "title": "Strict", "policyName": "Strict", "policyId": 3 }],
"highlights": [{ "title": "Superhost", "subtitle": "Superhosts are experienced, highly rated hosts" }],
"licenseNumber": "24/05678/R",
"hostName": "Priya",
"isSuperhost": true,
"coordinates": { "latitude": 51.5045, "longitude": -0.1097 },
"thumbnail": "https://a0.muscache.com/im/pictures/thumb3.jpg",
"currency": "GBP",
"locale": "en-GB",
"url": "https://www.airbnb.com/rooms/31029448?locale=en-GB&currency=GBP&check_in=2026-08-01&check_out=2026-08-05",
"scrapedAt": "2026-07-26T09:13:19Z"
}
]

How can I use the data extracted with Airbnb Scraper: Full Listing Details Breakdown?

  • Travel planning and OTA analysis: compare stays across a shortlisted city by capacity, amenities, ratings, and price.breakDown.total, and surface Superhost, license, and cancellation-policy fields to build a filtered shortlist beyond Airbnb's own search filters.
  • Revenue management and hosts: pull price, amenities, and highlights for a competitive set of listings in your area to benchmark your own rate, fee structure, and amenity coverage against comparable stays.
  • AI engineers and LLM developers: have an agent issue a place or listing query, receive structured listing JSON back, and pass it as grounded context so the model answers stay questions from real, current data instead of memorized text.
  • Market researchers: aggregate propertyType, roomType, personCapacity, and rating across hundreds of listings in a region to track inventory mix, quality distribution, and price positioning by neighborhood.

How do you monitor Airbnb listing prices over time?

Price and availability monitoring means re-running the same set of listings or search terms on a schedule and comparing each new row against the last one you saved, rather than trusting a single snapshot. Because pricingCheckIn/pricingCheckOut drive a live quote, re-running the same listingUrlsOrIds with a rolling check-in window (e.g. always "30 days out") captures how a listing's rate for that lead time moves week to week — useful for both a host tracking a competitive set and a guest watching for a price drop.

The fields worth diffing between runs are price.price (headline nightly rate), price.breakDown.total.price (full stay cost including fees and taxes), price.breakDown.cleaningFee/serviceFee/taxes (fee-structure changes independent of the nightly rate), and rating.guestSatisfaction/rating.reviewsCount (quality drift). A listing returning an empty price for dates it previously quoted is itself a signal — it usually means those dates are no longer available.

A practical loop: schedule a run across your tracked listingUrlsOrIds or listingSearchTerms (e.g. daily or weekly), store each run's dataset, and alert when price.breakDown.total.price moves beyond a threshold you set, or when licenseNumber changes on a listing you're tracking for compliance. This Actor has no built-in scheduler of its own — use the Apify platform's Schedules feature to trigger runs on a cron interval and read each run's dataset from your own pipeline or via webhook.

Integrate Airbnb Scraper: Full Listing Details Breakdown and automate your workflow

Airbnb Scraper: Full Listing Details Breakdown works with any language or tool that can send an HTTP request.

REST API with Python

import requests
TOKEN = "<YOUR_APIFY_TOKEN>"
url = f"https://api.apify.com/v2/acts/scrapier~airbnb-scraper-full-listing-details-breakdown/run-sync-get-dataset-items?token={TOKEN}"
payload = {
"listingSearchTerms": ["paris"],
"pricingCheckIn": "2026-08-01",
"pricingCheckOut": "2026-08-05",
"maxListings": 20,
}
resp = requests.post(url, json=payload, timeout=300)
listings = resp.json()
for item in listings:
print(item["title"], item["price"]["price"], item["licenseNumber"])

MCP for query-grounded AI agents

The Actor is callable through Apify's hosted MCP server at https://mcp.apify.com, which exposes any Apify Actor as an MCP tool — add scrapier/airbnb-scraper-full-listing-details-breakdown to the tool scope in the Apify UI (or via the --actors flag on a self-hosted MCP server). An agent then calls the tool with a place or listing query, receives the structured listing JSON back, and generates an answer grounded in current Airbnb data. Works with Claude Desktop, Claude Code, and other MCP-compatible clients.

Scheduled monitoring and delivery

Use the Apify platform's Schedules to trigger runs on a cron interval without any code, and webhooks to push a notification (or the dataset) to your own endpoint when a run finishes. There is no Actor-specific push mechanism beyond these platform features — polling the dataset via the API on your own interval works equally well.

Scraping publicly accessible Airbnb listing and search pages is generally lawful — this Actor retrieves only what any visitor to airbnb.com can already see without logging in. Listing data (property details, amenities, prices, host names) is business/product data rather than private personal data in most jurisdictions, but Airbnb's Terms of Service restrict automated data collection, so compliance is a contractual question, not just a legal one. Scraping for one-off research carries a different risk profile than scraping to build a stored, redistributed, or AI-training dataset at scale. Consult your legal team before any commercial use involving bulk data storage or redistribution.

Frequently asked questions

Does this Actor require an Airbnb account or login?

No. It reads Airbnb's public search and listing pages using a Chrome TLS fingerprint — no Airbnb account, cookie, or login is used or required.

Which languages and regions does it support?

contentLocale covers 47 locale codes (e.g. en-US, fr-FR, ja-JP) that control the language of amenities, titles, and descriptions, and priceCurrency covers 39 currencies for the price quote. regionFilter and countryFilter narrow ambiguous place names to a specific state/province or country.

Can I control the order search results are collected in?

Yes — sortOrder accepts relevance (default), price_asc, or price_desc. It only affects listingSearchTerms/search-URL runs; it's ignored for direct /rooms/ links since there's no search to order.

How does this Actor handle Airbnb's anti-bot measures?

It fetches pages with a genuine Chrome TLS fingerprint (via curl_cffi impersonation) rather than a plain HTTP client, since Airbnb's Akamai edge blocks unfingerprinted requests before they reach the app. If a request is still blocked, it escalates automatically through a direct → datacenter-proxy → residential-proxy ladder and retries.

Does this Actor extract the license/registration number?

Yes — licenseNumber is parsed from the listing's own payload (a direct key, or a label-based scan of the description text) and returned on every row. It is null when the listing's city has no registration requirement or the host hasn't published one; it is never guessed.

How many results does this Actor return per query?

Up to maxListings (default 10, maximum 5000) matching stays per location or search entry. For search-driven queries the Actor also walks up to maxSearchPages result pages (or an internal auto-cap when left empty) to find that many matches.

How do I monitor Airbnb listing prices over time with this Actor?

Schedule a run across the same listingUrlsOrIds or listingSearchTerms on a recurring cadence using Apify's Schedules feature, store each run's dataset, and compare price.breakDown.total.price and rating fields between runs to alert on the change that matters to you.

Does this Actor work with Claude, ChatGPT, and AI agent frameworks?

Yes. It's callable as an HTTP endpoint by any agent framework, and it's reachable through Apify's hosted MCP server (https://mcp.apify.com) for MCP-compatible clients like Claude Desktop and Claude Code — either path lets an agent retrieve live listing data before answering.

How does this Actor compare to other Airbnb scrapers?

As observed on their public Apify Store listings on 2026-07-26, several competing Airbnb scrapers already return a structured price breakdown and grouped amenities, but do not document extracting a listing's license/registration number — a field this Actor returns on every row where Airbnb's own page exposes one.

Can I use this Actor without managing proxies or Airbnb credentials?

Yes. It handles the Chrome TLS fingerprinting and proxy escalation internally — you only need to supply your query (place, search URL, or room link) and, optionally, an Apify Proxy configuration if your workspace uses one.

Your feedback

Found a bug or missing a field? Let us know through the Actor's Issues tab on Apify Console so we can take a look. Feedback like this directly shapes what gets fixed and added next.