Airbnb Calendar Availability Scraper avatar

Airbnb Calendar Availability Scraper

Pricing

from $2.00 / 1,000 calendar day returneds

Go to Apify Store
Airbnb Calendar Availability Scraper

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

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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

FieldPurpose
calendarUrlsUp 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.
icalTextAn authorized, complete BEGIN:VCALENDAR document. Use this only when sending a calendar URL is unsuitable.
startDate / endDateOptional inclusive ISO date window. Leaving both blank starts today and spans maxDaysPerCalendar.
maxDaysPerCalendarInclusive 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.

FieldMeaning
sourceIdListing ID parsed from an export URL, or a generated ID for pasted calendar text.
dateISO calendar day.
availabletrue when no supplied iCalendar event covers the day. This is an inference, not a booking guarantee.
blockedtrue when at least one supplied event covers the day.
bookingStatusblocked or open_inferred.
blockedByEventsNumber of source events covering the day, without revealing the events themselves.
availabilitySourceAlways authorized_ical.
availabilityNoteExplains the availability inference boundary.
scrapedAtISO 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:

EventPrice
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 os
from apify_client import ApifyClient
client = 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 DTEND is 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 as UPSTREAM_FAILED with diagnostics.
  • The source feed may lag Airbnb's current state. Treat it as operational calendar data, not a real-time booking engine.

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.