Airbnb Calendar Availability Scraper
Pricing
from $2.00 / 1,000 calendar day returneds
Airbnb Calendar Availability Scraper
Read an authorized Airbnb iCalendar export to return date-level blocked and inferred-open availability. Use for host operations and STR workflows, not public listing scraping. Returns one row per date with availability and block count. $0.002/day plus a $0.00005 start fee; platform usage extra.
Pricing
from $2.00 / 1,000 calendar day returneds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Parse an Airbnb calendar that you are authorized to access and return one clean availability row per date. Built for hosts, co-hosts, property managers, and STR operations teams that need a machine-readable view of blocked dates without collecting guest details.
What it does
The Actor reads an Airbnb iCalendar (.ics) export URL supplied by the listing owner or an authorized co-host, or it accepts the iCalendar text directly. Airbnb supports calendar export for host calendar syncing. This Actor translates the event ranges in that feed into date-level records for dashboards, cleaner scheduling, channel-management checks, and occupancy analysis.
It does not access Airbnb accounts, does not accept account credentials, and does not scrape public listing pages. An iCalendar export URL contains a token, so the Actor treats it as secret input and never writes that URL to the dataset, key-value store, or logs.
When to use it
Use it when you own, manage, or have been expressly granted access to an Airbnb listing calendar and want a safe automation step after the calendar export. Typical workflows include:
- Feeding blocked and inferred-open dates to a cleaner or turnover workflow.
- Checking calendar coverage across several authorized listings.
- Producing an occupancy input for a spreadsheet or BI dashboard.
- Comparing the date blocks in a host-provided Airbnb feed with another authorized channel feed.
Do not use it to discover, probe, or monitor public Airbnb listings you do not manage. It does not confirm that an apparently open date can be booked: Airbnb may apply minimum stays, advance notice, check-in restrictions, price rules, or other conditions that an iCalendar feed does not represent.
Input
| Field | Purpose |
|---|---|
calendarUrls | Up to 20 authorized Airbnb calendar-export URLs in the form https://www.airbnb.com/calendar/ical/<listing-id>.ics?s=<token>. This secret field is the preferred input. |
icalText | An authorized, complete BEGIN:VCALENDAR document. Use this only when sending a calendar URL is unsuitable. |
startDate / endDate | Optional inclusive ISO date window. Leaving both blank starts today and spans maxDaysPerCalendar. |
maxDaysPerCalendar | Inclusive date cap per source, 1–731; default 366. |
At least one of calendarUrls or icalText is required by the runtime. The Actor rejects public room URLs, non-Airbnb hosts, non-HTTPS URLs, and calendar URLs without an export token. It also validates every redirect so a supplied calendar URL cannot turn this Actor into a general-purpose network fetcher.
Find an authorized Airbnb calendar export
In Airbnb hosting tools, open Calendar, select the listing, choose Availability, then use Connect to another website to copy the exported calendar URL. Share that URL only with systems and people permitted to see the listing's booking pattern; anyone with the token can read the calendar feed. You can regenerate the export URL in Airbnb if it is exposed.
Example input
{"calendarUrls": ["https://www.airbnb.com/calendar/ical/12345678.ics?s=REDACTED"],"startDate": "2026-08-01","endDate": "2026-08-31","maxDaysPerCalendar": 366}
Output
The default dataset contains one record per requested calendar date per source. It deliberately omits event summaries, descriptions, guest names, guest counts, and all calendar URLs.
| Field | Meaning |
|---|---|
sourceId | Listing ID parsed from an export URL, or a generated ID for pasted calendar text. |
date | ISO calendar day. |
available | true when no supplied iCalendar event covers the day. This is an inference, not a booking guarantee. |
blocked | true when at least one supplied event covers the day. |
bookingStatus | blocked or open_inferred. |
blockedByEvents | Number of source events covering the day, without revealing the events themselves. |
availabilitySource | Always authorized_ical. |
availabilityNote | Explains the availability inference boundary. |
scrapedAt | ISO timestamp for the parsed row. |
{"sourceId": "12345678","sourceLabel": "Authorized Airbnb calendar 1","date": "2026-08-06","available": false,"blocked": true,"bookingStatus": "blocked","blockedByEvents": 1,"availabilitySource": "authorized_ical","availabilityNote": "A supplied iCalendar event covers this date.","scrapedAt": "2026-07-15T12:00:00.000Z"}
The Actor writes an OUTPUT record and a detailed RUN_SUMMARY record to the default key-value store on every terminal path. Successful parse runs use COMPLETE or PARTIAL; input problems use INVALID_INPUT; a valid authorized input that yields no usable source fails honestly as UPSTREAM_FAILED.
Pricing
This Actor uses Pay per event + usage:
| Event | Price |
|---|---|
| Actor start | $0.00005 per run |
| Calendar day returned | $0.002 per validated dataset row |
For example, one 90-day calendar window costs at most $0.18005 in event charges; Apify platform usage is billed separately. Apify charges the Actor start event automatically. Before fetching a source, the Actor logs and sets a status message with the maximum event-charge estimate for the requested range. A row is charged only when its full validated record is persisted.
API and automation examples
Apify API
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~airbnb-calendar-availability-scraper/runs?token=$APIFY_TOKEN" \-H 'content-type: application/json' \-d '{"calendarUrls": ["https://www.airbnb.com/calendar/ical/12345678.ics?s=REDACTED"],"startDate": "2026-08-01","endDate": "2026-08-31"}'
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('khadinakbar/airbnb-calendar-availability-scraper').call({calendarUrls: [process.env.AIRBNB_ICAL_URL],maxDaysPerCalendar: 90,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("khadinakbar/airbnb-calendar-availability-scraper").call(run_input={"calendarUrls": [os.environ["AIRBNB_ICAL_URL"]], "maxDaysPerCalendar": 90})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["date"], row["bookingStatus"])
Reliability and limits
- Event start/end dates are parsed from RFC 5545 iCalendar events. All-day
DTENDis treated as exclusive, as defined by the format. - Cancelled events are ignored. Recurring events are reported as a warning and treated as one occurrence; Airbnb export feeds normally use individual reservation/block events.
- The Actor allows at most 20 sources, 731 dates per source, 2 MB per feed, three validated redirects, and 20 seconds per source request.
- If some sources work and others fail, persisted rows are retained and the run ends as
PARTIAL. If no source yields usable data, it ends asUPSTREAM_FAILEDwith diagnostics. - The source feed may lag Airbnb's current state. Treat it as operational calendar data, not a real-time booking engine.
Legal and privacy scope
Use this Actor only with calendars you own or are authorized to process. It processes only the date ranges necessary to derive availability and intentionally does not persist personal information from calendar events. Airbnb's terms restrict automated access to its public platform; this Actor avoids public-listing scraping and relies on Airbnb's host calendar-export mechanism.
FAQ
Why does an open date say open_inferred rather than bookable? The absence of an event means the supplied feed does not mark the date blocked. It cannot prove that Airbnb would permit a specific stay after minimum-night, availability-window, pricing, and other booking rules.
Can I paste a public airbnb.com/rooms/... URL? No. The Actor accepts only an authorized calendar/ical/<id>.ics?s=<token> export URL or the calendar text itself.
Does it expose guest names or reservation notes? No. The parser discards event summaries, descriptions, and attendee data before constructing output rows.
Can it combine multiple listings? Yes. Supply up to 20 authorized export URLs. The output remains one row per source and date so downstream systems can group by sourceId.