Airbnb Occupancy Scraper avatar

Airbnb Occupancy Scraper

Pricing

Pay per usage

Go to Apify Store
Airbnb Occupancy Scraper

Airbnb Occupancy Scraper

Gather real-time Airbnb occupancy metrics like availability, reservation gaps, pricing updates, and booking frequency. Ideal for property managers optimizing revenue or evaluating new markets.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

a day ago

Last modified

Share

Airbnb Occupancy Scraper — Extract Availability, Calendar & Status

Airbnb Occupancy Scraper extracts the day-by-day availability calendar for any Airbnb listing, returning one JSON row per calendar date with its booking status. Give it one or more Airbnb room IDs and it pulls a 12-month window of per-date data — the room identifier, the calendar date, and whether that date is available, blocked, or unreported. Every response is typed, normalized JSON — no HTML, no selectors, no parsing required. After a run, you have a clean per-date availability feed ready to load into a spreadsheet, database, or occupancy-monitoring pipeline.

What is Airbnb Occupancy Scraper?

Airbnb Occupancy Scraper is a focused Actor that reads Airbnb's own public availability-calendar endpoint for one or more listings and returns a flat, per-date dataset. It targets Airbnb's PdpAvailabilityCalendar data — the same calendar shown on a listing page — and normalizes it into structured rows instead of a nested calendar object. No Airbnb account or login is required: the Actor extracts what it needs from the listing's public page.

  • Scrape the availability calendar for one or many room IDs in a single run
  • Scrape a 12-month forward window of per-date booking status starting from any month/year
  • Export results as JSON, CSV, or Excel directly from the Apify dataset
  • Automatic proxy fallback — no manual proxy management required
  • No Airbnb account, login, or API key of your own needed

What data does Airbnb Occupancy Scraper collect?

The Actor returns a single row per calendar date, built from three real data points pulled out of Airbnb's calendar response for each room:

Data TypeKey FieldsJSON Field Names
Room identifierThe Airbnb listing/room ID each row belongs toroom_id
Calendar dateThe specific day within the 12-month window, in YYYY-MM-DD formatdate
Availability / booking statusWhether that date is bookable, blocked, or not reported by Airbnbavailable

This Actor is intentionally scoped to availability only — it does not collect nightly prices, reviews, host details, amenities, or listing photos.

Why not build this yourself?

Airbnb has no public, self-serve API for pulling a listing's availability calendar as a third-party developer. Building this yourself means reverse-engineering a GraphQL endpoint, extracting a rotating API key from page HTML, and finding the current operation hash from Airbnb's minified JavaScript bundles — all of which can shift without notice. On top of that, you need to build and maintain your own retry logic and proxy escalation (direct → datacenter → residential) to keep working once Airbnb starts blocking a given IP pattern, plus the ongoing proxy cost that comes with it. Airbnb Occupancy Scraper already handles the key extraction, operation-hash discovery, retries, and proxy fallback, so you consume clean rows instead of maintaining a scraper.

Why do developers and teams scrape Airbnb?

Availability data serves a few distinct groups, each pulling the same three fields into different workflows.

For property managers and hosts

Multi-listing hosts and property managers use roomIds to pull the calendar for every unit they manage in one run, comparing available values across listings to spot gaps in a portfolio's booking calendar. Feeding room_id and date into a spreadsheet or internal dashboard turns scattered listing pages into one table showing which units are open on which dates, without logging into each listing individually to check.

For market and investment researchers

Researchers studying short-term rental markets use availability patterns as a public proxy for demand: tracking how the ratio of available: true to available: false dates shifts across a set of room IDs over a season. Because the Actor only reads publicly viewable calendar data, this fits research scoped to public-data-only analysis of neighborhood or market-level occupancy trends, without touching pricing or guest information.

For AI engineers and agent builders

Agent workflows call the Actor with a list of roomIds and get back typed JSON rows with no HTML to parse — an agent can pass date and available directly into a scheduling or availability-check tool, or index the rows into a data store the agent queries at run time to answer "is this listing free on this date" without re-scraping on every question.

For developers building data products

Teams building rental-market dashboards or booking-comparison tools schedule runs against a fixed set of roomIds and treat the dataset as a feed: each run's rows refresh the available status for the tracked window, which a product then renders as a calendar view or availability alert without the product team maintaining any scraping code themselves.

How to scrape Airbnb (step by step)

  1. Open Airbnb Occupancy Scraper on its Apify Store page and click Try for free (or find it in your Apify Console if already added).
  2. Provide the required input parameter, roomIds — a list of one or more Airbnb room IDs, found in a listing URL as airbnb.com/rooms/{ROOM_ID}.
  3. Optionally set month and year to choose the starting point of the 12-month calendar window, and configure proxyConfiguration if you want proxies enabled from the start.
  4. Click Start and watch the run log; each room is processed sequentially and rows are saved to the dataset in real time.
  5. Open the Dataset tab and export the results as JSON, CSV, or Excel.

What to do when Airbnb changes its structure

Airbnb Occupancy Scraper is maintained, and its output schema — room_id, date, available — stays stable, so downstream integrations keep working even when Airbnb changes internal details like its API key location or GraphQL operation hash. No specific fix turnaround time is promised.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
roomIdsYesarray of stringsList one or more Airbnb room IDs to scrape occupancy data for (e.g., 35329051, 769824007018240779).["35329051", "769824007018240779"]
monthNo (default 12)integer (1–12)Month to fetch occupancy data for (1-12).12
yearNo (default 2026)integerYear to fetch occupancy data for.2026
proxyConfigurationNoobjectChoose which proxies to use. If Airbnb rejects the proxy, fallback to residential proxy will be used automatically.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}

Example JSON input

{
"roomIds": ["35329051", "769824007018240779"],
"month": 12,
"year": 2026,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

The most common input mistake is pasting a full Airbnb listing URL into roomIds instead of just the numeric ID — the field expects the bare ID from airbnb.com/rooms/{ROOM_ID}, not the URL string.

⬆️ Output

Each run writes one flat JSON record per calendar date to the Actor's dataset — the full row shape, with no nested objects, ready for JSON, CSV, or Excel export. Every row written is billed under the row_result charged event; a room ID that fails to fetch produces no dataset rows for that room and is not charged, since the failure is only logged, not pushed.

Scraped availability calendar row

[
{ "room_id": "35329051", "date": "2026-12-01", "available": false },
{ "room_id": "35329051", "date": "2026-12-02", "available": true },
{ "room_id": "35329051", "date": "2026-12-03", "available": true },
{ "room_id": "35329051", "date": "2026-12-04", "available": null },
{ "room_id": "769824007018240779", "date": "2026-12-01", "available": false },
{ "room_id": "769824007018240779", "date": "2026-12-02", "available": true }
]

available is passed through exactly as Airbnb reports it: true for bookable, false for blocked, and null when Airbnb does not report a status for that date — null is never coerced into false.

How many results can you scrape with Airbnb Occupancy Scraper?

There is no hard cap in the Actor itself on how many room IDs you list in roomIds — the array accepts any number of listings and the Actor works through them one at a time, continuing past any room that fails. For each room, the underlying calendar request always asks Airbnb for a 12-month window, so the number of date rows per room is set by calendar length rather than by an input setting. Room IDs are processed sequentially, so total rows scale directly with how many room IDs you provide.

Integrate Airbnb Occupancy Scraper and automate your workflow

Airbnb Occupancy Scraper works with any language or tool that can send an HTTP request to the Apify API.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_USERNAME>/airbnb-occupancy-scraper").call(run_input={
"roomIds": ["35329051", "769824007018240779"],
"month": 12,
"year": 2026,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["room_id"], item["date"], item["available"])

Works in Python, Node.js, Go, Ruby, cURL, or any language with an HTTP client — call the same Apify API endpoint from your language of choice.

Automation platforms (n8n, Make)

Apify publishes official integrations for both n8n and Make. In either tool, add the Apify node/module, select Run Actor, point it at airbnb-occupancy-scraper, and pass roomIds (plus optional month/year) as the run input — the resulting dataset rows flow into the rest of your automation without custom code.

Yes, scraping publicly available Airbnb availability data is generally permitted. Airbnb Occupancy Scraper only reads calendar data that Airbnb already displays on a listing's public page — it does not access login-gated data, guest information, or personal data such as host or reviewer names. Because the output is availability/booking data tied to a listing rather than personal data, the relevant framework is Airbnb's Terms of Service and database-rights considerations, not GDPR or CCPA. Consult legal counsel before any large-scale commercial use.

Frequently asked questions

Does Airbnb Occupancy Scraper work without an Airbnb account?

Yes. No Airbnb account, login, or personal API key is required — the Actor extracts what it needs from the listing's public page and calls Airbnb's own calendar endpoint directly.

How often is the scraped data updated?

Every run fetches live data directly from Airbnb's calendar endpoint at the time you run it — nothing is served from a cache.

What happens if a room ID is invalid, delisted, or the request fails?

The Actor logs the error for that specific room ID, lists it as failed in the run summary, and continues processing the remaining room IDs. No dataset rows are written for a room that fails.

Can I scrape private or login-gated Airbnb listings?

No. Only calendar data that Airbnb serves on a publicly viewable listing page is returned; delisted or access-restricted listings will not return availability data.

Can I scrape multiple Airbnb listings in a single run?

Yes. Pass an array of room IDs to roomIds and the Actor processes them sequentially, continuing past any listing that fails rather than stopping the whole run.

Does Airbnb Occupancy Scraper work for AI agent workflows and LLM pipelines?

Yes, as an HTTP endpoint callable by any agent framework via the Apify API — every response is typed JSON with stable field names, so there is no HTML or parsing step before passing results to an LLM or agent tool.

How does Airbnb Occupancy Scraper handle Airbnb's anti-bot system?

It extracts the Airbnb API key and GraphQL operation hash dynamically from public page and script content rather than hardcoding them, retries failed requests with exponential backoff, and escalates from a direct connection to a datacenter proxy and then a residential proxy if requests keep failing, sticking with residential once it succeeds.

Does Airbnb Occupancy Scraper return data in a format LLMs can use directly?

Yes. Output is typed, normalized JSON with stable field names (room_id, date, available) — no HTML, no selectors, no parsing step needed before passing it into an LLM context window or vector store.

Can I use Airbnb Occupancy Scraper without managing proxies?

Yes. By default it connects directly with no proxy; if Airbnb starts blocking requests, it automatically escalates to a datacenter proxy and then a residential proxy on its own.

What happens when Airbnb changes its structure or blocks the scraper?

The Actor is maintained, and its output schema stays stable — room_id, date, and available keep the same names and types on your end even when Airbnb's internal endpoints change. No specific numeric turnaround time is promised.

Your feedback

Found a bug or missing a field? We want to know. Leave feedback or report an issue directly from the Actor's page in Apify Console, or open an issue on the Actor's issue tracker if one is linked there — it helps keep this scraper maintained and accurate.