Airbnb Occupancy Scraper with Booking Rate Percentage
Pricing
$19.99/month + usage
Airbnb Occupancy Scraper with Booking Rate Percentage
Scrape Airbnb occupancy data for any listing or region. Get availability, booked dates, calendar insights, and pricing trends to support market research, revenue planning, and competitive analysis. Outputs clean, structured data.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
2
Monthly active users
21 hours ago
Last modified
Categories
Share
Airbnb Occupancy Scraper — Open Dates, Gaps and Booking Rate
Airbnb Occupancy Scraper with Booking Rate Percentage returns next-available dates, open-date gaps, and open/booked-night counts for any Airbnb listing as structured JSON. Give it room IDs or URLs and get nextAvailableDate, openRangeCount, totalOpenNights, and daysScanned for each listing, plus every open date range filtered by a minimum gap length. No login, no HTML parsing, no manual calendar-clicking. Run it directly on Apify.
What is Airbnb Occupancy Scraper with Booking Rate Percentage?
Airbnb Occupancy Scraper with Booking Rate Percentage is an Apify Actor that reads Airbnb's public per-day availability calendar for any listing and converts it into structured JSON: the next open date, every open-date gap, and the open/booked night counts needed to work out a booking rate. It does not require an Airbnb account or login — it only reads the same calendar a visitor sees on the listing page. It's built for short-term-rental hosts, revenue managers, and market researchers who need machine-readable occupancy data instead of manually checking calendars.
What data can I extract with Airbnb Occupancy Scraper with Booking Rate Percentage?
The Actor returns three row types per listing — a per-date calendar row, a per-listing summary row, and a per-gap detail row — covering listing identity, availability/window fields, and open-date gap metrics.
| Field Name | Description |
|---|---|
roomId | Airbnb's numeric room/listing ID, taken from the input ID or URL. |
room_id | Legacy-preserved duplicate of roomId, kept for compatibility with the base Airbnb availability schema. |
rowType | Which kind of row this is: date (one per calendar day), listing (one per-listing summary), or gap (one per open date range). |
roomUrl | Full Airbnb listing URL, e.g. https://www.airbnb.com/rooms/35329051. |
scrapedAt | UTC ISO 8601 timestamp of when the row was generated. |
date | Calendar date for a date row; the listing's next open date for a listing row; the gap's start date for a gap row. |
Availability & scan-window fields
| Field Name | Description |
|---|---|
available | Whether the date is open/bookable — true, false, or null, passed through from Airbnb as-is and never fabricated. |
nextAvailableDate | Earliest open date found inside the scanned window (null if fully booked). |
earliestBookableDate | Earliest date flagged bookable by Airbnb (falls back to the first available date if bookable is absent). |
windowStart | First calendar date actually scanned. |
windowEnd | Last calendar date actually scanned. |
daysScanned | Total number of calendar days scanned in the window. |
minGapNights | The minGapNights filter value used for the run, echoed back on the row. |
Open-date gap metrics
| Field Name | Description |
|---|---|
openRangeCount | Number of open-date gaps (≥ minGapNights) found for the listing. |
longestOpenStretchNights | Longest unbroken run of open nights across the whole window, regardless of the minGapNights filter. |
totalOpenNights | Total count of open nights across the scanned window — the raw figure a booking rate is calculated from. |
gapStartDate | Start date of an open-date gap (populated on gap rows). |
gapEndDate | End date of an open-date gap (populated on gap rows). |
lengthNights | Number of consecutive open nights in a gap. |
gapIndex | 1-based position of the gap within the listing's list of open ranges (gap rows only). |
openGaps | Full array of {startDate, endDate, lengthNights} objects for the listing, attached to the listing row when includeGapRanges is on. |
🤖 Add-on: Need additional Airbnb data?
Pair this Actor with Airbnb Scraper if you need to discover new listings by location and dates before tracking their occupancy. For actual nightly prices per date (this Actor reports availability, not price), use Airbnb Full Year Price Tracker: Cheapest & Most Expensive Dates. If you need any indexed contact details tied to a listing, Airbnb Phone Number Scraper searches Google's indexed site:airbnb.com results.
Why not build this yourself?
Airbnb has no public official API for third-party access to listing availability, so any DIY approach means reverse-engineering Airbnb's own private endpoints. This Actor calls Airbnb's internal PdpAvailabilityCalendar GraphQL operation directly — the same one Airbnb's own front end uses — which requires a rotating operationId hash and an x-airbnb-api-key pulled out of inline JSON on the listing page (the layout-init.api_config.key structure in the page HTML). Both are undocumented, unofficial, and can shift whenever Airbnb ships a front-end deploy — maintaining that extraction logic yourself is an ongoing job, not a one-time script. On top of that, sustained calendar scraping needs proxy rotation to avoid IP-based blocking; this Actor already escalates through datacenter and residential Apify Proxy tiers automatically, which is otherwise its own infrastructure cost and maintenance burden to build and keep working.
How to use Airbnb Occupancy Scraper with Booking Rate Percentage
Airbnb Occupancy Scraper with Booking Rate Percentage runs like any other Apify Actor — no separate signup with Airbnb is needed.
- Open the Actor's page on the Apify Store and start a run in Apify Console.
- Provide the required
stayListingsinput — one or more Airbnb room IDs or full room URLs. - Optionally set
searchFromMonth,searchFromYear,monthsToScan,minGapNights, andincludeGapRangesto narrow the scan window and gap size. - Start the run.
- Download results as JSON or CSV from the Dataset tab, or pull them through the Apify API.
How to scale to bulk Airbnb occupancy extraction
stayListings accepts an array, so pasting in many room IDs or URLs scans them all in a single run — there's no need to start a separate run per listing. The input schema has no separate batch-file or spreadsheet-upload field; for portfolios too large for one comfortable run, split the list across a few runs instead.
What can you do with Airbnb occupancy data?
- A revenue manager repricing a portfolio uses
nextAvailableDateandopenRangeCountto spot listings with unsold stretches coming up and promote them before they go empty. - An investment analyst comparing comparable listings uses
totalOpenNightsanddaysScannedacross a set of properties to benchmark relative occupancy in a market. - A market researcher studying seasonality uses
longestOpenStretchNightsandgapStartDate/gapEndDateacross many listings to spot when soft patches cluster. - A co-hosting tool builder uses
openGapsto automatically flag bookable last-minute stretches and trigger guest outreach. - An AI agent builder feeds
nextAvailableDateandopenGapsinto a booking assistant so it can answer "when is this listing free for 5+ nights" as structured context, without re-scraping or parsing HTML.
How does Airbnb Occupancy Scraper with Booking Rate Percentage handle rate limits and blocking?
The Actor rotates connections instead of hammering Airbnb from one IP: it starts with no proxy, escalates to a datacenter proxy, then a residential proxy, and finally sticks with residential once a request has failed at every earlier tier. The proxyConfiguration input is pre-filled to use Apify's residential proxy group, which is the recommended setting for reliable access. Both the calendar-fetch request and the page/JS requests used to obtain the API key and operation ID retry up to 3 times with exponential backoff before escalating to the next proxy tier. If a listing still fails after all retries and proxy fallbacks are exhausted, that room ID is logged as failed and the run continues to the next listing instead of aborting — failed IDs are listed in the final run summary log. The Actor does not solve CAPTCHAs; it relies on proxy rotation and retries to avoid triggering blocks in the first place.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
stayListings | Yes | array of strings | Airbnb room IDs or full room URLs to scan for open dates. Accepts the legacy roomIds key too. | ["35329051", "https://www.airbnb.com/rooms/769824007018240779"] |
searchFromMonth | No | integer (1-12) | First month of the availability window to scan for open dates. Accepts the legacy month key. | 12 |
searchFromYear | No | integer | Year of the first month in the scan window. Accepts the legacy year key. | 2026 |
monthsToScan | No | integer (1-12, default 12) | How many consecutive months to scan forward from the start month. | 3 |
minGapNights | No | integer (min 1, default 1) | Only return open date ranges with at least this many consecutive open nights. | 3 |
includeGapRanges | No | boolean (default true) | Emit one detail row per open date range in addition to the per-listing summary row. | true |
proxyConfiguration | No | object | Proxy settings. Residential proxies are strongly recommended; the Actor auto-falls back to residential on blocks. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example input
{"stayListings": ["35329051", "https://www.airbnb.com/rooms/769824007018240779"],"searchFromMonth": 12,"searchFromYear": 2026,"monthsToScan": 3,"minGapNights": 3,"includeGapRanges": true,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
⬆️ Output
Results are written to the Actor's dataset as typed JSON — one entry per calendar date, per listing, and per open-date gap — and can be exported as JSON, CSV, Excel, or XML directly from Apify Console or the API.
Example output
[{"roomId": "35329051","room_id": "35329051","rowType": "date","date": "2026-12-01","available": false,"roomUrl": "https://www.airbnb.com/rooms/35329051","scrapedAt": "2026-07-25T00:00:00+00:00"},{"roomId": "35329051","room_id": "35329051","rowType": "listing","date": "2026-12-14","available": true,"roomUrl": "https://www.airbnb.com/rooms/35329051","nextAvailableDate": "2026-12-14","earliestBookableDate": "2026-12-14","openRangeCount": 5,"longestOpenStretchNights": 9,"totalOpenNights": 41,"daysScanned": 90,"windowStart": "2026-12-01","windowEnd": "2027-02-28","minGapNights": 3,"gapStartDate": null,"gapEndDate": null,"lengthNights": null,"openGaps": [{ "startDate": "2026-12-14", "endDate": "2026-12-22", "lengthNights": 9 }],"scrapedAt": "2026-07-25T00:00:00+00:00"},{"roomId": "35329051","room_id": "35329051","rowType": "gap","date": "2026-12-14","available": true,"roomUrl": "https://www.airbnb.com/rooms/35329051","gapIndex": 1,"gapStartDate": "2026-12-14","gapEndDate": "2026-12-22","lengthNights": 9,"nextAvailableDate": "2026-12-14","minGapNights": 3,"scrapedAt": "2026-07-25T00:00:00+00:00"}]
How does it work?
Airbnb Occupancy Scraper with Booking Rate Percentage talks to Airbnb the same way its own website does — no headless browser is involved. It first requests the public listing page to read a public API key embedded in that page's inline JSON, then locates the operation ID Airbnb's front end uses for its PdpAvailabilityCalendar endpoint. With those two values, it calls that endpoint directly — over Apify Proxy, escalating to residential proxies if blocked — and receives the same day-by-day open/blocked calendar shown to any visitor. The Actor parses the returned calendar months into per-day records, computes the next open date and every consecutive-night gap, and writes a date row, a listing-summary row, and one row per open gap to the dataset. Only publicly visible data is returned, and output field names stay stable even if Airbnb changes its page layout.
Integrations
Airbnb Occupancy Scraper with Booking Rate Percentage works with the tools you already use for automation and data pipelines, through Apify's standard integration surface.
Calling Airbnb Occupancy Scraper with Booking Rate Percentage programmatically
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("airbnb-occupancy-booking-rate-percentage-scraper").call(run_input={"stayListings": ["35329051"],"monthsToScan": 3,"minGapNights": 3,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
No-code tools (n8n, Make, LangChain)
In n8n, point the Apify app or a plain HTTP Request node at this Actor's run endpoint to trigger occupancy scans from a workflow. In Make, the Apify app's "Run Actor" module does the same, feeding stayListings from an earlier module's output. For Python pipelines and LangChain-based agents, the apify-client package can call the Actor and load its dataset directly into a chain, agent tool, or vector store.
Is it legal to scrape Airbnb occupancy data?
Scraping Airbnb's publicly available availability calendar — the same open/blocked dates any visitor sees on a listing page — is generally legal in most jurisdictions, since this is business/product data rather than personal data. Airbnb Occupancy Scraper with Booking Rate Percentage returns only calendar and gap-summary data visible without logging in; it does not access guest identities, payment details, or any account-gated information. Because it targets published availability rather than personal data, this falls under general business-data and website Terms-of-Service considerations rather than GDPR/CCPA-style personal-data rules — though Airbnb's own Terms of Service restrict automated access, so review them against your use case. Consult legal counsel if your use case involves bulk storage or commercial redistribution of this data.
Frequently asked questions
What Airbnb occupancy fields does this scraper return?
The core fields are nextAvailableDate, openRangeCount, totalOpenNights, daysScanned, and openGaps — see the full fields table above for every field across all three row types.
Does this scraper require an Airbnb account or login?
No. It only reads the public listing page and Airbnb's own public calendar endpoint — the same data any visitor sees without signing in.
How many listings can I extract in one run?
stayListings accepts an array of any length, so you can scan many room IDs or URLs in one run. Per listing, the scan window itself is capped at 1-12 months by the monthsToScan parameter.
How is the booking rate percentage actually calculated?
The Actor does not output a single bookingRatePercentage field — it outputs totalOpenNights and daysScanned per listing, and a booking rate is (daysScanned − totalOpenNights) / daysScanned. This is a real number you can compute from the returned fields, not a value Airbnb publishes itself; it also reflects blocked/open calendar status, not confirmed paid bookings or revenue.
What happens if a listing is removed, delisted, or returns no calendar data?
If Airbnb returns no calendar payload for a room ID (delisted, invalid, or restricted), the Actor logs a warning and treats it as zero scanned days — nextAvailableDate and earliestBookableDate come back null and totalOpenNights is 0. If the request itself fails after all retries and proxy fallbacks, that room ID is added to a failed list, logged in the run summary, and the run continues with the remaining listings.
Can I scrape multiple Airbnb listings at once?
Yes. Pass multiple room IDs or URLs in the stayListings array and the Actor processes each one in turn within the same run.
Does it work with Claude, ChatGPT, and other AI agent tools, and is the output LLM-ready?
The Actor is callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make an HTTP call can trigger a run and read back the dataset. Output is typed, normalized JSON with consistent field names across runs, so it can be passed directly to an LLM or indexed into a vector store without HTML parsing.
How is this different from other Scraper-Engine Airbnb scrapers?
This Actor only covers availability: next open date, open-date gaps, and open/booked-night counts. Airbnb Scraper covers listing discovery (search by location and dates, prices, photos, ratings); Airbnb Full Year Price Tracker returns the true nightly price for each date instead of open/booked status; Airbnb Phone Number Scraper searches indexed Google results for any public contact details tied to a listing.
What happens when Airbnb changes its layout or anti-bot system?
This Actor is maintained, and its output field names are designed to stay stable across Airbnb site changes. No specific update turnaround time is published or guaranteed.
Can I use this Actor without managing proxies or browser infrastructure?
Yes. There's no browser involved at all — requests go out over plain HTTP — and proxy rotation (datacenter to residential) is handled automatically through Apify Proxy; you only need to leave proxyConfiguration on its default.
Which fields work best for AI training data and RAG indexing?
For RAG-style context, nextAvailableDate, roomUrl, and openGaps give an agent the structured facts needed to answer availability questions. For training or analytics data, totalOpenNights, daysScanned, and longestOpenStretchNights return as consistent typed numbers across every listing and run.
Related scrapers
| Scraper Name | What it extracts |
|---|---|
| Airbnb Scraper | Discovers Airbnb stays by location and dates — prices, photos, ratings, map locations. |
| Airbnb Full Year Price Tracker: Cheapest & Most Expensive Dates | True nightly price, availability, and minimum-nights per calendar date. |
| Airbnb Phone Number Scraper | Indexed Google (site:airbnb.com) results for a listing, with any public contact details in the snippet. |
| Google Hotels Scraper | Hotel prices, ratings, reviews, amenities, and photos from Google Travel — for comparing against hotel alternatives. |
Your feedback
Found a bug or missing a field in Airbnb Occupancy Scraper with Booking Rate Percentage? Let us know through the Issues tab on this Actor's Apify Store page, or reach out to Scraper Engine support directly. We actively maintain this Actor as Airbnb's site and calendar API evolve.
