Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Airbnb Calendar Scraper icon

Airbnb Calendar Scraper

Read any Airbnb listing's calendar: free and taken nights for up to 12 months, minimum stays and monthly totals. One row per listing, no login needed.

18 runs on Apify $0.00075 per calendar ($0.75 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust listings, months, startMonth (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00075 per calendar = $0.75 per 1,000

You are charged forWhenPrice
CalendarOne listing's availability calendar returned in the dataset, whatever the number of months. Listings that are gone and notes are not charged.$0.00075

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-10-03, and they are what you are actually charged.

Inputs

FieldWhat it doesType
listingsAirbnb listing links (any country site, for example https://www.airbnb.com/rooms/26939959 or https://www.airbnb.fr/rooms/26939959) or just the listing number. One per line, up to 2,000 per run. Duplicates are read once. Short links and /h/ links can't be read: open the listing and copy the link with /rooms/ in it.array
monthsHow many calendar months to read for each listing, from 1 to 12. Leave it empty for 12. The price per listing is the same whatever you pick.integer
startMonthThe month the calendar starts, written like 2027-06. Leave it empty to start today. It can be at most 11 months ahead. A month already in the past is moved to the current month. Days before today are never included.string
includeDaysOn: each row carries the full day-by-day list. Off: each row carries only the totals and the month-by-month summary, which keeps the rows small for market-wide work. The price is the same either way.boolean

What you get

A structured dataset — each result includes fields like:

listingIdstartDateendDatetotalDaysavailableDaysunavailableDaysunavailableSharebookableDaysfirstAvailableDatelastAvailableDatelistingUrlerrorCodemessagemonths

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

Paste Airbnb listing links or listing numbers and get one row per listing with its day-by-day availability calendar: every night for up to 12 months marked free or taken, the minimum stay, the days a stay can start or end, and a month-by-month summary.

One thing to know before you build on it: a taken night can be a booking or a night the host blocked, and Airbnb's calendar does not say which.

InputAirbnb listing links from any country site, or listing numbers
OutputOne row per listing: totals, a month-by-month summary and every day
Ceiling2,000 listings per run, up to 12 months each
SpeedAbout 115 to 120 calendars a minute, so 2,000 listings take about 17 minutes
Account neededNone from you
Price$0.75 per 1,000 listing calendars, flat on every plan. The free plan's $5 a month covers about 6,500

🔍 What Airbnb Calendar Scraper does

It reads the same calendar a guest sees on a listing page, for each listing you give it, and turns it into a row you can sort and count. Each night says whether it is free, whether a stay can begin or end there, and the minimum and maximum stay the host set for it. On top of that every row carries the totals: free nights, taken nights, the share taken, the first and last free night, and the same counts month by month.

It reads the calendar as it is at the moment of the run. Run it on a schedule and you get a history.

The calendar never starts before today, by the UTC date, even if you pick the current month: a night that has already passed says nothing about bookings. A startMonth already in the past is moved to the current month and the run tells you so in a free note row.

📋 What data you get from each Airbnb calendar

What you getField
Airbnb's listing number, the link, and the line you gave for itlistingId, listingUrl, input
First and last night read, and how many nights that isstartDate, endDate, totalDays
Free nights and taken nightsavailableDays, unavailableDays
Taken nights divided by nights read, 0 to 1unavailableShare
Nights a stay could start on, by Airbnb's own rulesbookableDays
First and last free night, null when nothing is freefirstAvailableDate, lastAvailableDate
Per month: nights, free, taken, bookable and the share takenmonths
Per night: free or taken, bookable, check-in and check-out allowed, minimum and maximum staydays
When the calendar was readscrapedAt

▶️ How to scrape Airbnb calendars

1. Open Airbnb Calendar Scraper and click Try for free. 2. Paste your links into Listings, one per line. 3. Set Number of months, and First month if you want a later start. 4. Click Start. 5. When it finishes, open the Output tab and download JSON, CSV or Excel.

Start it with no listings at all and you get one free sample row, a note rather than data.

💰 How much does it cost to scrape Airbnb calendars?

$0.75 per 1,000 listing calendars. Flat on every Apify plan, no volume tiers. On the free plan, the $5 Apify gives you each month covers about 6,500 calendars. A calendar costs the same whether you read 1 month or 12, with or without the day list.

You are not charged for the sample row, for any diagnostic row, for listings that were not found, for duplicates in your list, or for listings a run never reached. To cap a run's spend, set a maximum cost when you start it: the run stops at that limit and lists the listings it did not read.

📥 What you give it

{
  "listings": [
    "https://www.airbnb.com/rooms/26939959",
    "https://www.airbnb.co.uk/rooms/4054044?adults=2",
    "913978009878067640"
  ],
  "months": 3
}
FieldDefaultWhat it is
listingsnoneListing links (airbnb.com, airbnb.co.uk, airbnb.fr and the rest) or bare listing numbers. One per line, up to 2,000. Duplicates are read once.
months12 when emptyHow many months to read for each listing, 1 to 12.
startMonthtoday when emptyThe first month, written like 2027-06. At most 11 months ahead.
includeDaysonKeep the full day list on each row. Turn it off for totals and months only.

📤 What you get back

A real row from run rISM4I1QygW0LpATI, three months read, with the day list cut to three days:

{
  "recordType": "calendar",
  "listingId": "26939959",
  "listingUrl": "https://www.airbnb.com/rooms/26939959",
  "input": "https://www.airbnb.com/rooms/26939959",
  "startDate": "2026-10-03",
  "endDate": "2026-12-31",
  "totalDays": 90,
  "availableDays": 39,
  "unavailableDays": 51,
  "unavailableShare": 0.567,
  "bookableDays": 39,
  "firstAvailableDate": "2026-10-04",
  "lastAvailableDate": "2026-12-28",
  "months": [
    { "month": "2026-10", "totalDays": 29, "availableDays": 10, "unavailableDays": 19, "bookableDays": 10, "unavailableShare": 0.655 },
    { "month": "2026-11", "totalDays": 30, "availableDays": 13, "unavailableDays": 17, "bookableDays": 13, "unavailableShare": 0.567 },
    { "month": "2026-12", "totalDays": 31, "availableDays": 16, "unavailableDays": 15, "bookableDays": 16, "unavailableShare": 0.484 }
  ],
  "scrapedAt": "2026-10-03T05:13:32.955Z",
  "days": [
    { "date": "2026-10-03", "available": false, "bookable": false, "availableForCheckIn": false, "availableForCheckOut": false, "minNights": 1, "maxNights": 30 },
    { "date": "2026-10-04", "available": true, "bookable": true, "availableForCheckIn": true, "availableForCheckOut": false, "minNights": 1, "maxNights": 30 },
    { "date": "2026-10-05", "available": true, "bookable": true, "availableForCheckIn": true, "availableForCheckOut": true, "minNights": 1, "maxNights": 30 }
  ]
}
FieldHow to read it
unavailableShareAn upper bound on occupancy, since a taken night may be one the host blocked.
bookableDaysNights a stay could start on, by Airbnb's own rules, which need not match the free nights one for one.
days[].availableForCheckIn, days[].availableForCheckOutWhether a stay may begin or end that day. A host can allow one and not the other, as on 4 October above.
days[].minNights, days[].maxNightsThe minimum and maximum stay the host set for that night.

A flag Airbnb leaves out comes back as null rather than a guess.

🧾 Reading the output

Every row has a recordType. To keep only the calendars you paid for, filter on recordType equal to calendar.

  • calendar: a listing's calendar. These are the only billed rows.
  • sample: one free row with _sample: true, written when the input has no listings at all. It is a note, not data.
  • diagnostic: a free row with _diagnostic: true, charged: false, an errorCode and a message.
errorCodeWhat happened
BAD_LISTINGThat line is not an Airbnb listing link or number.
LISTING_NOT_FOUNDAirbnb shows no calendar for that listing: removed, unlisted, or a wrong number.
LISTING_UNREADABLEAirbnb answered with an error for that listing.
UNEXPECTED_ANSWERAirbnb answered, but not with that listing's calendar.
FETCH_FAILEDNo answer for that listing after three tries.
WINDOW_ADJUSTEDYour startMonth was in the past and moved to this month.
BAD_INPUTmonths or startMonth out of range; nothing was read.
TOO_MANY_LISTINGSOver 2,000 listings; the rest are listed in the row.
STOPPED_EARLYThe run ended early: Airbnb stopped answering, or 100 listings in a row had no calendar. The unread listings are in unreadListingIds.
DEADLINE_REACHEDThe run hit its time limit; the unread listings are in unreadListingIds.
COST_LIMIT_REACHEDThe run hit the maximum cost you set; the unread listings are in unreadListingIds.
CALENDAR_UNAVAILABLEAirbnb returned no calendars at all on this run.
UNEXPECTED_ERRORThe run hit an unexpected error; the unread listings are in unreadListingIds.

unreadListingIds is there so you can paste those numbers straight into the next run.

Want one row per night in a spreadsheet? Download the dataset through the Apify API with unwind=days added, for example GET /v2/datasets/<dataset id>/items?format=csv&unwind=days. Each night then becomes its own line with the listing's fields beside it. The Month by month view in the Output tab does the same for months.

💡 What people use it for

  • A host deciding what to charge for a holiday weekend, who wants to see how fast the neighbours' calendars are filling.
  • Someone weighing up a flat as a short-let investment, checking how full the listings in the same building look across a year.
  • A property manager who keeps a daily snapshot of every listing they run in one sheet, instead of clicking through calendars.
  • Anyone studying a market's seasonality: which months open up late, and where minimum stays jump around holidays.

From a place to how full it is, in three steps:

1. Run Airbnb Listings Scraper on the place and copy the listingId column. 2. Paste those numbers into Listings here and run it with Number of months at 3. 3. Sort on unavailableShare, and read months to see which weeks are filling first.

🚧 What it does not do

  • No nightly prices. Airbnb's calendar does not carry them.
  • It cannot tell a booking from a night the host blocked. Both read as taken.
  • Nights past the host's booking window read as taken too. A calendar that is taken from some date to the end often just means the host has not opened those dates.
  • At most 12 months per listing, starting no more than 11 months ahead.
  • It does not search Airbnb by place. You need the listing links or numbers.
  • No listing details such as title, photos or rating.
  • Short links and /h/ links can't be read. Open the listing and copy the link with /rooms/ in it.

🧭 Which travel scraper do you need?

If you wantUse
A listing's day-by-day calendar for up to 12 monthsThis one
Airbnb listings with prices, ratings and coordinates for a placeAirbnb Listings Scraper
Hotels on Booking.com with live prices and scores for your datesBooking.com Hotels Scraper
Guest reviews with stay dates for a Booking.com propertyBooking.com Reviews Scraper
Live hotel prices for your dates, as Google Hotels shows themGoogle Hotels Scraper
Reviews of a hotel, restaurant or attraction on TripadvisorTripadvisor Reviews Scraper
Flight fares for your routes and datesSkyscanner Flights Scraper

❓ Questions people ask

Does a taken night mean it was booked?

Not always. Airbnb shows booked nights and nights the host blocked the same way. Treat unavailableShare as an upper bound on occupancy.

Where do I get listing numbers for a place?

Run the Airbnb Listings Scraper for it, up to 20 listings per place in a run, and paste its listingId values here. Or copy the links from Airbnb's own search page.

How do I see changes over time?

Schedule the run daily or weekly. Each row has scrapedAt, so you can compare the same listing between runs.

Do I need an Airbnb account?

No. It reads what any visitor sees on a listing page, without logging in.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/airbnb-calendar-scraper. Either way the run happens on your Apify account at the same price.

Is it legal to scrape Airbnb calendars?

This reads public calendar information that anyone can see without logging in. Apify explains the general picture in its write-up on the legality of web scraping, and we are not lawyers.

🆘 If something breaks

Open an issue on the actor's Issues tab with the run link and two or three of the listing numbers involved. Diagnostic rows carry an errorCode, so including it helps.