Airbnb Scraper With Price & Availability
Pricing
Pay per usage
Airbnb Scraper With Price & Availability
Use this Airbnb Scraper to collect host details and property info. Great for tools or services targeting Airbnb owners, co-hosting platforms, or cleaning and property management outreach.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
11
Total users
0
Monthly active users
6 days ago
Last modified
Categories
Share
Airbnb Scraper — Extract Listings, Prices and Availability as JSON
Airbnb Scraper With Price & Availability pulls Airbnb listing details, a per-day availability calendar, and derived pricing analytics into structured JSON in one run. Search by city or neighborhood, or track individual stays by room ID or listing URL, and get occupancy rate, nights booked, next available date, and nightly price stats (min, max, average, median, weekend premium) alongside the base listing data. Every response is typed, normalized JSON — no HTML, no selectors, no parsing — so results load straight into a spreadsheet, database, or AI pipeline.
What is Airbnb Scraper With Price & Availability?
Airbnb Scraper With Price & Availability is an Apify Actor that collects Airbnb stay listings together with a per-day availability calendar (up to 12 months forward) and the occupancy and pricing analytics derived from it. It targets Airbnb's public search, listing, and calendar pages — no Airbnb account, login, or partner API access is required. You can point it at a market (a city or neighborhood keyword) to sample multiple listings, or at a specific /rooms/<id> link or room ID to track one property directly.
- Scrape listings by market keyword, search URL, or direct room ID/link
- Collect a per-day availability calendar for up to 12 months forward
- Compute occupancy rate, nights available/booked, and next available date per listing
- Compute nightly price statistics (min, max, average, median, weekend premium)
- Export results as JSON, CSV, Excel, or XML — no proxy management required by default
What data does Airbnb Scraper With Price & Availability collect?
Every run can return four kinds of data: the base listing record, occupancy/availability analytics, nightly price statistics, and — in a separate child dataset — the raw per-day calendar itself.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Listing details | title, description, thumbnail, rating breakdown, map coordinates | title, description, thumbnail, rating.guestSatisfaction, rating.reviewsCount, coordinates |
| Nightly price breakdown | quoted stay price, service fee, taxes, cleaning fee | price.price, price.breakDown.serviceFee, price.breakDown.taxes, price.breakDown.cleaningFee |
| Occupancy & availability analytics | occupancy rate, nights available/booked, next open date | occupancyRatePct, nightsAvailable, nightsBooked, nextAvailableDate |
| Nightly price statistics | min/max/average/median nightly rate, weekend premium | priceStats.min, priceStats.avg, priceStats.median, priceStats.weekendPremium |
| Per-day availability calendar (child dataset) | calendar date, open/booked flag, minimum-stay rule, per-date price | date, available, minNights, price, priceAmount |
Need more Airbnb data?
If you need occupancy analytics without the full listing payload, the Airbnb Occupancy Scraper focuses specifically on per-listing occupancy from room IDs. If your priority is a total-cost-of-stay view across a full year rather than a per-day calendar, the Airbnb Full Year Price Tracker Scraper: Total Cost Breakdown is built for that comparison instead.
Why not build this yourself?
Airbnb does not publish a listings, pricing, or availability API for third-party developers to query arbitrary properties — its official partner integrations are built for professional hosts and property-management systems managing their own listings, not for sampling public market data. Building this in-house means solving several problems this Actor already handles: Airbnb's Akamai edge fingerprints plain HTTP clients and serves an "Access Denied" shell instead of data, which this Actor works around with Chrome-TLS (curl_cffi) impersonation on every request. The per-day calendar is served through a GraphQL persisted query whose operation hash isn't documented and changes across Airbnb's JS bundles, so it has to be discovered and validated dynamically rather than hard-coded. Area matching for city searches also needs reverse-geocoding against listing coordinates to avoid mixing up same-named places in different countries, and blocked requests need an escalation path (direct connection → datacenter proxy → residential proxy) rather than a hard failure. None of this is exotic engineering, but it is ongoing maintenance work every time Airbnb changes a bundle hash or tightens its bot defenses — work this Actor already absorbs.
Why do developers and teams scrape Airbnb?
Airbnb's own numbers aren't the point for most of these use cases — the value is in occupancy, pricing, and availability patterns aggregated across a market.
For real estate investors and STR analysts
Short-term-rental investors use per-market samples to gauge how a neighborhood actually performs before buying: pulling occupancyRatePct and priceStats across a set of comparable listings in a target city gives a rough occupancy and nightly-rate benchmark that a single listing's page never shows. Because the calendar-derived occupancy figure comes from public availability rather than confirmed bookings, it works best as a directional signal — comparing several similar properties in the same market — rather than an exact revenue forecast for one address.
For travel and pricing analysts
Teams tracking seasonality and pricing power monitor priceStats.weekendPremium and the min/max/median spread across a market over time, watching how nightly rates shift as check-in dates approach. Setting rateCheckinDate/rateCheckoutDate to a rolling future window and re-running the Actor on a schedule turns this into a simple price-tracking pipeline without writing a single HTML parser, since every field — from the base listing price to the per-day calendar rate — arrives as typed JSON rather than a page you'd otherwise have to render and parse yourself.
For AI engineers and agent builders
An agent that answers "find me a place in Lisbon under $150/night with at least 60% recent availability" needs structured fields, not scraped HTML — priceStats.avg, occupancyRatePct, and availabilityCalendar[].available map directly onto filterable tool-call parameters. Because the Actor is reachable as a plain HTTP endpoint (and through Apify's MCP server), an agent framework can call it, get back typed JSON, and reason over the result without a parsing step in the loop, whether it's answering a one-off query or indexing a market into a RAG store for later retrieval.
For developers building data products
Vacation-rental dashboards, revenue-management tools, and BI pipelines need a stable, versioned schema more than they need any single clever field — occupancyRatePct, priceStats, and the per-day <runId>-calendar child dataset can be scheduled on a recurring Apify run and loaded straight into a warehouse or spreadsheet, with calendar rows already separated from listing rows for easy joins. Because listing and calendar rows share a stable id/listingId key, building a join between the two datasets takes one query, not a custom reconciliation step.
How to scrape Airbnb (step by step)
- Open Airbnb Scraper With Price & Availability on its Apify Store page (or call it through the Apify API).
- Provide at least one market keyword in
marketLocations(e.g.paris) or a listing URL/room ID inlistingUrlsOrIds— a run with both left empty collects nothing. - Set your priced-stay window (
rateCheckinDate/rateCheckoutDate) and the calendar scope (includeCalendar,calendarMonths) to match the window you want analyzed. - Start the run from the Console or via the API.
- Open the Dataset tab to browse listing rows live as they're collected, then open the
<runId>-calendarchild dataset for per-day rows; export either as JSON, CSV, Excel, or XML.
What to do when Airbnb changes its structure
The Actor is actively maintained and its output schema stays stable, so downstream integrations keep working even after an Airbnb-side change. Under the hood it already re-discovers the calendar API's operation hash and falls back to a public static key rather than hard-coding values that Airbnb rotates. No specific fix turnaround time is guaranteed.
⬇️ Input
None of the 16 parameters are required — a run with no input at all still executes using the schema's built-in prefills and code defaults.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
marketLocations | No | Array of strings | Rental markets (cities/neighborhoods) to sample for price & availability, one per line; use City--ST to pin a US state. | ["paris", "Austin--TX"] |
listingUrlsOrIds | No | Array of strings | Airbnb search URLs (the market is resolved automatically) or direct listing links/room IDs (/rooms/<id> or a bare numeric ID) to track one property's calendar and rates. | ["https://www.airbnb.com/rooms/20669368"] |
sortOrder | No | String (select) | How Airbnb sorts search results before collection: relevance (default), price_asc, or price_desc. | "price_asc" |
rateCheckinDate | No | String (datepicker) | First night of the priced stay — absolute YYYY-MM-DD or relative (14 days, 2 weeks). | "2026-06-01" |
rateCheckoutDate | No | String (datepicker) | Last night + 1 of the priced stay; must be after check-in. | "2026-06-08" |
priceCurrency | No | String (select) | Currency for nightly rates, price stats, and per-day prices (39 supported currencies). | "USD" |
languageRegion | No | String (select) | Language/region locale Airbnb uses to label listings and prices (47 supported locales). | "en-US" |
maxListings | No | Integer | Listings to collect per market/search entry that match the area filters (1-5000). | 10 |
maxSearchPages | No | Integer | Optional cap on search-result pages walked per market (1-500); auto-picked when left empty. | 20 |
includeNearbyAreaMatches | No | Boolean | Off (default) keeps only listings that strictly match the named market; on also allows nearby/similarly-named places. | false |
regionFilter | No | String (select) | Optional region/state/province to disambiguate an ambiguous market name. | "Île-de-France" |
countryFilter | No | String (select) | Optional country to disambiguate a market name shared by multiple countries. | "France" |
includeCalendar | No | Boolean | On (default) fetches each listing's availability calendar plus occupancy/price analytics; off returns listings only. | true |
calendarMonths | No | Integer | Months of forward availability to collect per listing (1-12; Airbnb exposes at most 12). | 12 |
maxCalendarDays | No | Integer | Optional cap on calendar-day rows kept per listing; 0 (default) keeps every day in the window. | 0 |
proxyConfiguration | No | Object | Apify Proxy configuration; omit to connect directly. | {"useApifyProxy": false} |
Example JSON input
{"marketLocations": ["paris"],"listingUrlsOrIds": ["https://www.airbnb.com/rooms/20669368"],"sortOrder": "relevance","rateCheckinDate": "2026-06-01","rateCheckoutDate": "2026-06-08","priceCurrency": "USD","languageRegion": "en-US","maxListings": 10,"maxSearchPages": 20,"includeNearbyAreaMatches": false,"regionFilter": "","countryFilter": "","includeCalendar": true,"calendarMonths": 12,"maxCalendarDays": 0,"proxyConfiguration": { "useApifyProxy": false }}
The most common mistake is leaving both marketLocations and listingUrlsOrIds empty — the run exits immediately with nothing collected, since maxListings only caps the sample size and can't generate a market on its own.
⬆️ Output
Results are written as typed, normalized JSON to two datasets: the default dataset holds one row per listing (with availability/price analytics embedded), and a <runId>-calendar child dataset holds one row per calendar day. Both export as JSON, CSV, Excel, or XML from the Apify Console.
Scraped Listing
{"id": "20669368","type": "listing","isChild": false,"title": "Rental unit in Lisbon · 2 bedrooms · 3 beds","description": "Charming apartment near the historic center, steps from cafes and the tram line...","thumbnail": "https://a0.muscache.com/im/pictures/example.jpg","url": "https://www.airbnb.com/rooms/20669368","rating": {"guestSatisfaction": 4.92,"reviewsCount": 311,"accuracy": 4.9,"checking": 4.9,"cleanliness": 4.8,"communication": 5.0,"location": 4.9,"value": 4.7},"price": {"label": "USD 1,218 total","qualifier": "for 7 nights","price": "USD 1,218","originalPrice": "","discountedPrice": "USD 1,218","breakDown": {"basePrice": { "description": "7 nights x USD 150.00", "price": "USD 1,050.00" },"basePriceBreakdown": [],"serviceFee": "USD 120","taxes": "USD 48","total": { "price": "USD 1,218", "description": "Total" },"totalBeforeTaxes": "USD 1,170","cleaningFee": "","specialOffer": false,"earlyBirdDiscount": false}},"coordinates": { "latitude": 38.7169, "longitude": -9.1399 },"currency": "USD","locale": "en-US","occupancyRatePct": 62.5,"nightsAvailable": 137,"nightsBooked": 228,"nextAvailableDate": "2026-07-19","calendarWindowMonths": 12,"calendarDaysCollected": 365,"priceStats": {"currency": "USD","datesWithPrice": 96,"min": 118,"max": 240,"avg": 156.3,"median": 149,"weekdayAvg": 145.2,"weekendAvg": 167.7,"weekendPremium": 22.5},"availabilityCalendar": [{ "date": "2026-07-06", "available": false, "minNights": 2, "maxNights": 30, "availableForCheckin": false, "availableForCheckout": true, "bookable": false, "price": null, "priceAmount": null }],"scrapedAt": "2026-07-25T14:02:11Z"}
Availability Calendar Day
{"type": "calendarDay","isChild": true,"parentId": "20669368","listingId": "20669368","listingUrl": "https://www.airbnb.com/rooms/20669368","date": "2026-07-19","available": true,"minNights": 2,"maxNights": 30,"availableForCheckin": true,"availableForCheckout": true,"bookable": true,"price": "USD 145","priceAmount": 145,"scrapedAt": "2026-07-25T14:02:11Z"}
Per-date price/priceAmount reflect only what Airbnb's calendar endpoint exposes for that listing — many listings never expose a per-day price, in which case those fields (and the corresponding priceStats) are null rather than estimated.
How many results can you scrape with Airbnb Scraper With Price & Availability?
maxListings caps how many listings are collected per market keyword or search-URL entry, from 1 up to 5000 — there's no separate run-wide ceiling, so a run with several markets can return several times that number in total. A direct /rooms/<id> entry in listingUrlsOrIds always yields exactly one listing row, regardless of maxListings. If maxSearchPages is left empty, the Actor picks its own page-walk cap based on sample size and area strictness — up to 500 pages per market when strict area matching is on, up to 300 otherwise. For the calendar, calendarMonths tops out at 12 because that's the forward window Airbnb itself exposes; maxCalendarDays is uncapped (0) by default and can be set lower to cap how many per-day rows land in the child dataset per listing.
Integrate Airbnb Scraper With Price & Availability and automate your workflow
Airbnb Scraper With Price & Availability works with any language or tool that can send an HTTP request.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("airbnb-scraper-with-price-availability").call(run_input={"marketLocations": ["paris"],"maxListings": 10,"includeCalendar": True,"calendarMonths": 12,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["id"], item["occupancyRatePct"], item["priceStats"]["avg"])
Works in Python, Node.js, Go, Ruby, cURL — any client that can call the Apify API with your token.
MCP for AI agents
Apify's MCP server (mcp.apify.com) exposes Apify Actors — including this one — as callable tools for MCP-compatible clients such as Claude Desktop, Cursor, and Windsurf. Add the Actor's name (airbnb-scraper-with-price-availability, as shown on its Apify Store page) to the server's actor list to make it callable as an agent tool without writing custom integration code.
Automation platforms (n8n, Make, LangChain)
In n8n, the community Apify node's "Run Actor" operation can call Airbnb Scraper With Price & Availability by Actor ID and pass marketLocations/listingUrlsOrIds as JSON, then feed the resulting dataset items into downstream nodes. In Make, the Apify app's "Run an Actor or Task" module runs the same Actor and lets you map each returned listing's price and occupancy fields into another scenario step, such as a spreadsheet row or a Slack alert. Any LangChain agent that can call an HTTP tool can invoke the Actor through the Apify API and consume its dataset items directly as typed JSON, without a parsing step.
Is it legal to scrape Airbnb?
Scraping publicly accessible Airbnb listing and pricing data is generally lawful, and Airbnb Scraper With Price & Availability only returns what a logged-out visitor can see on a listing, search, or calendar page — no login-gated content, and no host or guest contact details. The output is overwhelmingly business/product data — listing descriptions, nightly prices, availability calendars, and aggregate rating scores (no reviewer names are collected) — so it's governed primarily by Airbnb's Terms of Service and database-rights considerations rather than personal-data law. If your use combines this data with other sources in a way that makes it personally identifiable, GDPR/CCPA-style rules on lawful basis for storage and use may still apply. Consult legal counsel for commercial use cases involving bulk personal data.
Frequently asked questions
Does Airbnb Scraper With Price & Availability work without an Airbnb account?
Yes. No Airbnb login, cookies, or partner API credentials are required — the Actor reads the same public listing, search, and calendar data a logged-out browser can load, using a long-standing public web API key embedded on Airbnb's own homepage.
How often is the scraped data updated?
Each run fetches live data directly from Airbnb at run time; nothing is served from a cache, so results reflect whatever is publicly visible — including current availability and prices — at the moment the run executes.
What happens if a listing's availability calendar can't be loaded?
The listing row is still saved with its base fields (title, price, rating, coordinates, and so on), but availabilityCalendar is emitted as an empty array and occupancyRatePct, nightsAvailable, nightsBooked, nextAvailableDate, and priceStats are all set to null rather than a fabricated value.
Can I scrape private or restricted Airbnb content?
No. Only listings, search results, and calendar data visible to a logged-out visitor are returned — there's no way to access unlisted, delisted, or login-gated stays through this Actor.
Which dataset rows count toward usage?
Only listing rows in the default dataset are billed, as a row_result charged event. Per-day rows mirrored to the <runId>-calendar child dataset are pushed without a charged event, so they don't add to run cost.
Does Airbnb Scraper With Price & Availability work for AI agent workflows and LLM pipelines?
Yes. It's callable as an HTTP endpoint through the Apify API from any agent framework, and it's reachable through Apify's MCP server as a callable tool — every response is typed JSON with stable field names, so no parsing step is needed before passing results to an LLM.
How does Airbnb Scraper With Price & Availability handle Airbnb's anti-bot system?
It fetches every airbnb.com page and API call with Chrome-TLS (chrome131) impersonation, so Airbnb's Akamai edge serves real data instead of a JA3-fingerprint soft-block, and it escalates automatically through a direct → datacenter-proxy → residential-proxy ladder whenever a request comes back blocked (HTTP 403/429/503 or an HTML deny page).
Does Airbnb Scraper With Price & Availability return data in a format LLMs can use directly?
Yes. Output is typed, normalized JSON with stable field names, so it can be passed directly into an LLM context window, indexed into a vector store, or routed through an agent tool without extra parsing.
Can I use Airbnb Scraper With Price & Availability without managing proxies?
Yes. The Actor connects directly by default and only escalates to Apify Proxy automatically if a request is blocked; supplying your own proxyConfiguration is optional.
What happens when Airbnb changes its structure or blocks the scraper?
The Actor is actively maintained, and its output schema stays stable — field names and types don't change on your end because of an Airbnb-side update. No specific turnaround time is guaranteed for fixes.
Your feedback
Found a bug, or a field that's missing from your results? We want to know. Report it through the Issues tab on this Actor's Apify Store page, or reach out to API-Empire through Apify Console — active reports directly shape what gets fixed and maintained next.
