Airbnb Occupancy Scraper
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
a day ago
Last modified
Categories
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 Type | Key Fields | JSON Field Names |
|---|---|---|
| Room identifier | The Airbnb listing/room ID each row belongs to | room_id |
| Calendar date | The specific day within the 12-month window, in YYYY-MM-DD format | date |
| Availability / booking status | Whether that date is bookable, blocked, or not reported by Airbnb | available |
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)
- Open Airbnb Occupancy Scraper on its Apify Store page and click Try for free (or find it in your Apify Console if already added).
- Provide the required input parameter,
roomIds— a list of one or more Airbnb room IDs, found in a listing URL asairbnb.com/rooms/{ROOM_ID}. - Optionally set
monthandyearto choose the starting point of the 12-month calendar window, and configureproxyConfigurationif you want proxies enabled from the start. - Click Start and watch the run log; each room is processed sequentially and rows are saved to the dataset in real time.
- 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
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
roomIds | Yes | array of strings | List one or more Airbnb room IDs to scrape occupancy data for (e.g., 35329051, 769824007018240779). | ["35329051", "769824007018240779"] |
month | No (default 12) | integer (1–12) | Month to fetch occupancy data for (1-12). | 12 |
year | No (default 2026) | integer | Year to fetch occupancy data for. | 2026 |
proxyConfiguration | No | object | Choose 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 ApifyClientclient = 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.
Is it legal to scrape Airbnb?
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.
