Airbnb Occupancy Scraper with Booking Rate Percentage avatar

Airbnb Occupancy Scraper with Booking Rate Percentage

Pricing

$19.99/month + usage

Go to Apify Store
Airbnb Occupancy Scraper with Booking Rate Percentage

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

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

2

Monthly active users

21 hours ago

Last modified

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 NameDescription
roomIdAirbnb's numeric room/listing ID, taken from the input ID or URL.
room_idLegacy-preserved duplicate of roomId, kept for compatibility with the base Airbnb availability schema.
rowTypeWhich kind of row this is: date (one per calendar day), listing (one per-listing summary), or gap (one per open date range).
roomUrlFull Airbnb listing URL, e.g. https://www.airbnb.com/rooms/35329051.
scrapedAtUTC ISO 8601 timestamp of when the row was generated.
dateCalendar 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 NameDescription
availableWhether the date is open/bookable — true, false, or null, passed through from Airbnb as-is and never fabricated.
nextAvailableDateEarliest open date found inside the scanned window (null if fully booked).
earliestBookableDateEarliest date flagged bookable by Airbnb (falls back to the first available date if bookable is absent).
windowStartFirst calendar date actually scanned.
windowEndLast calendar date actually scanned.
daysScannedTotal number of calendar days scanned in the window.
minGapNightsThe minGapNights filter value used for the run, echoed back on the row.

Open-date gap metrics

Field NameDescription
openRangeCountNumber of open-date gaps (≥ minGapNights) found for the listing.
longestOpenStretchNightsLongest unbroken run of open nights across the whole window, regardless of the minGapNights filter.
totalOpenNightsTotal count of open nights across the scanned window — the raw figure a booking rate is calculated from.
gapStartDateStart date of an open-date gap (populated on gap rows).
gapEndDateEnd date of an open-date gap (populated on gap rows).
lengthNightsNumber of consecutive open nights in a gap.
gapIndex1-based position of the gap within the listing's list of open ranges (gap rows only).
openGapsFull 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.

  1. Open the Actor's page on the Apify Store and start a run in Apify Console.
  2. Provide the required stayListings input — one or more Airbnb room IDs or full room URLs.
  3. Optionally set searchFromMonth, searchFromYear, monthsToScan, minGapNights, and includeGapRanges to narrow the scan window and gap size.
  4. Start the run.
  5. 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 nextAvailableDate and openRangeCount to spot listings with unsold stretches coming up and promote them before they go empty.
  • An investment analyst comparing comparable listings uses totalOpenNights and daysScanned across a set of properties to benchmark relative occupancy in a market.
  • A market researcher studying seasonality uses longestOpenStretchNights and gapStartDate/gapEndDate across many listings to spot when soft patches cluster.
  • A co-hosting tool builder uses openGaps to automatically flag bookable last-minute stretches and trigger guest outreach.
  • An AI agent builder feeds nextAvailableDate and openGaps into 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

ParameterRequiredTypeDescriptionExample Value
stayListingsYesarray of stringsAirbnb room IDs or full room URLs to scan for open dates. Accepts the legacy roomIds key too.["35329051", "https://www.airbnb.com/rooms/769824007018240779"]
searchFromMonthNointeger (1-12)First month of the availability window to scan for open dates. Accepts the legacy month key.12
searchFromYearNointegerYear of the first month in the scan window. Accepts the legacy year key.2026
monthsToScanNointeger (1-12, default 12)How many consecutive months to scan forward from the start month.3
minGapNightsNointeger (min 1, default 1)Only return open date ranges with at least this many consecutive open nights.3
includeGapRangesNoboolean (default true)Emit one detail row per open date range in addition to the per-listing summary row.true
proxyConfigurationNoobjectProxy 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 ApifyClient
client = 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.

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.

Scraper NameWhat it extracts
Airbnb ScraperDiscovers Airbnb stays by location and dates — prices, photos, ratings, map locations.
Airbnb Full Year Price Tracker: Cheapest & Most Expensive DatesTrue nightly price, availability, and minimum-nights per calendar date.
Airbnb Phone Number ScraperIndexed Google (site:airbnb.com) results for a listing, with any public contact details in the snippet.
Google Hotels ScraperHotel 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.