Airbnb Calendar Availability Scraper
Pricing
from $2.00 / 1,000 calendar day returneds
Airbnb Calendar Availability Scraper
Read an authorized Airbnb iCalendar export and return date-level blocked and inferred-open availability for host operations and short-term rental workflows. Each row is one date with its availability and block count.
Pricing
from $2.00 / 1,000 calendar day returneds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
17 days ago
Last modified
Categories
Share
What is Airbnb Calendar Availability Scraper?
Airbnb Calendar Availability Scraper reads an Airbnb iCalendar export that you are authorized to use and returns one dataset row per date: whether the date is busy or inferred open, how many calendar events cover it, and the source listing ID. Hosts, co-hosts, property managers and short-term rental operations teams use it to feed cleaning schedules, occupancy sheets and channel checks with a clean, date-level view of each calendar, and the rows carry dates and counts only, with guest details left out.
Why hosts and STR operators use it
- One row per date. Each row is a single day with
available,blockedandbookingStatus, ready for a spreadsheet or BI tool. - Privacy by design. Event summaries, guest names and descriptions are dropped;
blockedByEventskeeps only the count of covering events. - Secret-safe input. Calendar export URLs carry a token, so the Actor keeps them out of the dataset, the key-value store and the logs.
- Many listings in one run. Up to 20 authorized calendars, each with its own
sourceId. - Bounded windows.
startDate,endDateandmaxDaysPerCalendarfix exactly which dates come back. - Paste or link. Send the export URL, or paste the calendar text when sharing a URL suits you less.
Best fit for this Actor
- Best fit for owners, co-hosts and managers who can export the Airbnb calendar of the listings they run.
- Designed for Airbnb host calendar exports in the form
https://www.airbnb.com/calendar/ical/<listing-id>.ics?s=<token>, or the pastedBEGIN:VCALENDARtext. - Use the rows for operational planning;
open_inferredmeans the feed has no event on that day, and Airbnb's own booking rules still apply. - When you then want market pricing and occupancy for comparable public listings, continue with Airbnb Occupancy & Pricing Scraper.
Example workflow: a weekly turnover schedule for five apartments
A property manager runs five Lisbon apartments. She starts by copying each listing's calendar export link from Airbnb's hosting calendar into calendarUrls and sets maxDaysPerCalendar to 14. The dataset returns 70 rows, one per apartment per day, with sourceId, date and blocked. She feeds the rows into her cleaning team's sheet, where a busy day followed by an open day marks a turnover. She schedules the run every Monday morning, then exports the next two weeks of turnovers to the cleaners.
Input
{"calendarUrls": ["https://www.airbnb.com/calendar/ical/12345678.ics?s=REDACTED"],"startDate": "2026-11-01","endDate": "2026-11-30","maxDaysPerCalendar": 366}
Paste the calendar text instead of a URL:
{"icalText": "BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nDTSTART;VALUE=DATE:20261105\nDTEND;VALUE=DATE:20261108\nSUMMARY:Reserved\nEND:VEVENT\nEND:VCALENDAR","startDate": "2026-11-01","maxDaysPerCalendar": 30}
| Field | Type | What it controls |
|---|---|---|
calendarUrls | array of strings | Up to 20 authorized Airbnb calendar export URLs with their s= token. Treated as secret input. |
icalText | string | A complete authorized iCalendar document starting with BEGIN:VCALENDAR. |
startDate | string | First date in YYYY-MM-DD. Empty starts today. |
endDate | string | Last date in YYYY-MM-DD. Empty uses startDate plus maxDaysPerCalendar. |
maxDaysPerCalendar | integer | Dates returned per calendar, 1 to 731. Default 366. |
To find the export link in Airbnb, open Calendar, pick the listing, choose Availability, then Connect to another website and copy the exported calendar URL. Anyone with that link can read the calendar, so share it only with trusted systems; Airbnb lets you regenerate it at any time.
Output
One row per calendar per date. This example row follows the Actor's dataset schema:
{"sourceId": "12345678","sourceLabel": "Authorized Airbnb calendar 1","date": "2026-11-06","available": false,"blocked": true,"bookingStatus": "blocked","blockedByEvents": 1,"availabilitySource": "authorized_ical","availabilityNote": "A supplied iCalendar event covers this date.","scrapedAt": "2026-10-04T08:00:00.000Z"}
| Field | What it contains |
|---|---|
sourceId | Listing ID from the export URL, or a generated ID for pasted text |
sourceLabel | A non-secret label for the calendar |
date | The calendar day in YYYY-MM-DD |
available | true when no supplied event covers the day |
blocked | true when at least one supplied event covers the day |
bookingStatus | blocked or open_inferred |
blockedByEvents | How many events cover the day, with event details left out |
availabilitySource | authorized_ical provenance marker |
availabilityNote | Plain-language meaning of the status |
scrapedAt | When the row was written |
Each run also writes OUTPUT and RUN_SUMMARY to the key-value store, with an outcome such as COMPLETE or PARTIAL, row counts and charge counts.
Pricing
This Actor uses Pay per event plus Apify platform usage. You pay one Calendar day returned event for each date row saved and one Actor Start event per run, and Apify platform usage is billed alongside. The live Pricing tab on this page shows the current event prices.
Worked example in words: one calendar over a 30-day window returns 30 rows, so the run costs 30 Calendar day returned events, one start event and a small amount of platform usage. Five calendars over 14 days cost 70 day events. maxDaysPerCalendar sets the ceiling per calendar, and the run logs its maximum event cost before it starts reading.
Use with AI agents (MCP)
Connect the Actor to an MCP client through Apify MCP and ask:
Using my authorized Airbnb calendar export link, list every busy date in November and the open gaps of three nights or more.
Agent checklist:
- Pass the user's export link in
calendarUrlsand setstartDateandendDateto the requested window. - Read rows with
get-dataset-items, group bysourceId, and find runs ofblockedandopen_inferreddays. - Read
OUTPUTfor the run outcome and row count. - Scope note: rows reflect the supplied feed only, and cost scales with the number of dates returned.
API example
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~airbnb-calendar-availability-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"calendarUrls": ["https://www.airbnb.com/calendar/ical/12345678.ics?s=REDACTED"], "maxDaysPerCalendar": 30}'
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"])
Best results
| Starting situation | Helpful action | Expected outcome |
|---|---|---|
| Several listings | Put every export link in calendarUrls | One dataset grouped by sourceId |
| Weekly planning | maxDaysPerCalendar: 14 on a schedule | A rolling two-week view |
| A specific month | Set startDate and endDate | Exactly that month's dates |
| Sharing a link feels sensitive | Paste the calendar into icalText | The same rows, no URL involved |
| A link was exposed | Regenerate it in Airbnb and use the new one | A fresh, private feed |
All-day events are read the iCalendar way, where the end date is exclusive, so a stay ending on the 8th blocks the 5th through the 7th.
Builder's note
I designed this Actor around the host's own calendar export because it gives operators the data they need with permission built in. I chose to keep only event counts per date, never event text, so a dataset can be shared with a cleaning team or a dashboard without carrying guest information.
FAQ
Why does an open day say open_inferred?
The supplied feed has no event on that day. Airbnb can still apply minimum stays, advance notice or price rules that the feed leaves out.
Can I use a public listing link?
The Actor works with the host calendar export link or the calendar text. For public listing research, use the occupancy and pricing Actor linked above.
Does it show guest names?
No. Guest names, summaries and descriptions are dropped before rows are built.
Responsible use
Use this Actor only with calendars you own or are authorized to process, and keep export links private. It stores dates and counts only, which keeps guest information out of your data. Respect Airbnb's terms and the privacy laws that apply to your business. Airbnb is a trademark of its owner; this independent Actor is not affiliated with or endorsed by Airbnb.