<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ayoub El Haddad</title>
    <description>The latest articles on DEV Community by Ayoub El Haddad (@eaub).</description>
    <link>https://dev.to/eaub</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4105396%2Fc256cd1f-9d39-4756-9947-0ce4d62981d7.jpg</url>
      <title>DEV Community: Ayoub El Haddad</title>
      <link>https://dev.to/eaub</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eaub"/>
    <language>en</language>
    <item>
      <title>Airbnb shows 12 months of availability. Past five months, most of it isn't bookings.</title>
      <dc:creator>Ayoub El Haddad</dc:creator>
      <pubDate>Wed, 02 Sep 2026 04:26:56 +0000</pubDate>
      <link>https://dev.to/eaub/airbnb-shows-12-months-of-availability-past-five-months-most-of-it-isnt-bookings-4pjk</link>
      <guid>https://dev.to/eaub/airbnb-shows-12-months-of-availability-past-five-months-most-of-it-isnt-bookings-4pjk</guid>
      <description>&lt;p&gt;Airbnb publishes a full year of forward calendar on every listing. Which nights are free,&lt;br&gt;
minimum stay, maximum stay, one entry per night, public on every property.&lt;/p&gt;

&lt;p&gt;It is the only forward-looking signal in short-term rentals that anyone can read, and if&lt;br&gt;
you take it at face value it will tell you something false.&lt;/p&gt;

&lt;p&gt;On 2 September 2026 I pulled 365 nights of calendar for 2,218 listings across ten cities:&lt;br&gt;
Paris, London, Barcelona, Rome, Amsterdam, Berlin, Lisbon, New York, Tokyo and Sydney.&lt;br&gt;
809,570 listing-nights.&lt;/p&gt;

&lt;p&gt;Here is the trap.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is Airbnb forward availability?
&lt;/h2&gt;

&lt;p&gt;Forward availability is the share of future nights a listing is not accepting bookings&lt;br&gt;
for, read from the public calendar rather than inferred from past data. It covers up to&lt;br&gt;
twelve months ahead. It is a ceiling on occupancy rather than occupancy itself, because&lt;br&gt;
a night a host blocked and a night a guest booked look identical from outside.&lt;/p&gt;
&lt;h2&gt;
  
  
  The naive read says demand rises with distance
&lt;/h2&gt;

&lt;p&gt;Pooled across all ten cities, the share of nights marked unavailable:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Month&lt;/th&gt;
&lt;th&gt;Unavailable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;September 2026&lt;/td&gt;
&lt;td&gt;52.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 2026&lt;/td&gt;
&lt;td&gt;28.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;November 2026&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21.2%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;December 2026&lt;/td&gt;
&lt;td&gt;25.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;March 2027&lt;/td&gt;
&lt;td&gt;30.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 2027&lt;/td&gt;
&lt;td&gt;42.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;August 2027&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;45.9%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read that literally and next August is twice as committed as this November. Twelve months&lt;br&gt;
out is tighter than two months out.&lt;/p&gt;

&lt;p&gt;That cannot be true, so I went looking for what it actually was.&lt;/p&gt;
&lt;h2&gt;
  
  
  Nobody books a whole month
&lt;/h2&gt;

&lt;p&gt;Split each listing by whether its calendar for a given month is open at all:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Month&lt;/th&gt;
&lt;th&gt;Listings with the whole month blocked&lt;/th&gt;
&lt;th&gt;Listings partially booked&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;October 2026&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,651&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;December 2026&lt;/td&gt;
&lt;td&gt;323&lt;/td&gt;
&lt;td&gt;864&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;February 2027&lt;/td&gt;
&lt;td&gt;481&lt;/td&gt;
&lt;td&gt;289&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;August 2027&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;974&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;185&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In October, not one listing of 2,218 has its entire month blocked. By next August, 974 do,&lt;br&gt;
and the partially-booked group has collapsed to 185.&lt;/p&gt;

&lt;p&gt;The signature is the giveaway. Real bookings are scattered: a weekend here, a week there,&lt;br&gt;
which shows up as &lt;em&gt;partial&lt;/em&gt;. A wholly blocked month is not demand. It is a host who has&lt;br&gt;
not opened that month yet.&lt;/p&gt;

&lt;p&gt;The crossover lands between January and February 2027, about five months out. Past that&lt;br&gt;
point, more listings have a closed month than a booked one.&lt;/p&gt;
&lt;h2&gt;
  
  
  The corrected curve decays, in all ten cities
&lt;/h2&gt;

&lt;p&gt;Count only listings whose calendar for that month is actually open, and the inversion&lt;br&gt;
disappears:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Month&lt;/th&gt;
&lt;th&gt;Raw&lt;/th&gt;
&lt;th&gt;Open calendars only&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;September 2026&lt;/td&gt;
&lt;td&gt;52.2%&lt;/td&gt;
&lt;td&gt;50.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;October 2026&lt;/td&gt;
&lt;td&gt;28.8%&lt;/td&gt;
&lt;td&gt;28.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;November 2026&lt;/td&gt;
&lt;td&gt;21.2%&lt;/td&gt;
&lt;td&gt;14.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;December 2026&lt;/td&gt;
&lt;td&gt;25.7%&lt;/td&gt;
&lt;td&gt;13.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;January 2027&lt;/td&gt;
&lt;td&gt;25.7%&lt;/td&gt;
&lt;td&gt;7.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;February 2027&lt;/td&gt;
&lt;td&gt;25.5%&lt;/td&gt;
&lt;td&gt;4.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 2027&lt;/td&gt;
&lt;td&gt;42.7%&lt;/td&gt;
&lt;td&gt;3.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;August 2027&lt;/td&gt;
&lt;td&gt;45.9%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is the shape a booking curve is supposed to have, and it holds in every one of the&lt;br&gt;
ten cities individually. The raw series says the opposite in every one of the ten.&lt;/p&gt;

&lt;p&gt;The share of listings with an open calendar is what drives it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Oct 2026&lt;/th&gt;
&lt;th&gt;Aug 2027&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;London&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;44%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokyo&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paris&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;49%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berlin&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;59%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New York&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you compute occupancy from Airbnb calendars at a twelve-month horizon, roughly half&lt;br&gt;
your denominator is properties that were never on sale.&lt;/p&gt;
&lt;h2&gt;
  
  
  Which night of the week goes first?
&lt;/h2&gt;

&lt;p&gt;Pooled, inside 120 days, open calendars only:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Night&lt;/th&gt;
&lt;th&gt;Unavailable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Saturday&lt;/td&gt;
&lt;td&gt;36.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friday&lt;/td&gt;
&lt;td&gt;32.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thursday&lt;/td&gt;
&lt;td&gt;31.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wednesday&lt;/td&gt;
&lt;td&gt;31.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunday&lt;/td&gt;
&lt;td&gt;29.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tuesday&lt;/td&gt;
&lt;td&gt;29.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monday&lt;/td&gt;
&lt;td&gt;28.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Saturday first, Monday last. Unremarkable, and that is the point: when I ran this on one&lt;br&gt;
city over four months I got Tuesday beating Friday and spent a while trying to explain&lt;br&gt;
business travel. It was noise. Ten cities and a clean denominator make it go away.&lt;/p&gt;
&lt;h2&gt;
  
  
  Two things worth knowing about specific markets
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tokyo books far earlier than anywhere else.&lt;/strong&gt; Among open calendars in October it sits at&lt;br&gt;
51.0%, against a 28.8% pooled average. Three months out it is at 26.7% while Amsterdam is&lt;br&gt;
at 8.3%. Whatever drives booking lead time, it is not uniform across markets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New York is the emptiest market here.&lt;/strong&gt; 10.4% in October, and 0.4% by April. A tenth of&lt;br&gt;
Tokyo's forward commitment.&lt;/p&gt;
&lt;h2&gt;
  
  
  Does anything spike at New Year?
&lt;/h2&gt;

&lt;p&gt;In four of the ten cities, December sits above November among open calendars:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;December bump&lt;/th&gt;
&lt;th&gt;No bump&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sydney (11.9% → 16.7%), Paris (14.6% → 16.5%), New York (5.4% → 7.2%), Barcelona (6.5% → 7.8%)&lt;/td&gt;
&lt;td&gt;London, Rome, Amsterdam, Berlin, Lisbon, Tokyo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sydney's is the largest, which fits: it is peak summer there and the harbour fireworks are&lt;br&gt;
a global draw. Three of the four are famous New Year's Eve cities, which is a tidy story&lt;br&gt;
until you notice London is one too and does not bump at all. Four out of ten. I would call&lt;br&gt;
it suggestive and leave it there.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I got wrong first
&lt;/h2&gt;

&lt;p&gt;I ran this on Paris alone, four months forward, before any of the above. That version had&lt;br&gt;
a headline finding: the booking curve reverses around three months out.&lt;/p&gt;

&lt;p&gt;It does not. Four months forward stops exactly where the closed-calendar artifact starts&lt;br&gt;
biting, so I measured the artifact and explained it as New Year demand. The December&lt;br&gt;
effect is real in Paris, but it is a small part of what I was pointing at, and it does not&lt;br&gt;
generalise. A single city and a short window produced a confident, wrong answer.&lt;/p&gt;

&lt;p&gt;Two changes fixed it: reading twelve months instead of four, which costs the same single&lt;br&gt;
request per listing, and separating closed calendars from booked ones.&lt;/p&gt;
&lt;h2&gt;
  
  
  What this does not tell you
&lt;/h2&gt;

&lt;p&gt;The calendar says a night is unavailable. It never says why. Among open calendars a&lt;br&gt;
blocked night could still be an owner's own stay rather than a guest's booking, so every&lt;br&gt;
number here is a ceiling on occupancy, not occupancy.&lt;/p&gt;

&lt;p&gt;What makes them useful anyway is that the ceiling is measured identically across 2,218&lt;br&gt;
listings on the same dates from the same source. The shape holds even where the level is&lt;br&gt;
soft.&lt;/p&gt;

&lt;p&gt;One snapshot, ten cities, one day. Enough to kill a methodological error. Not enough to&lt;br&gt;
price a portfolio on.&lt;/p&gt;
&lt;h2&gt;
  
  
  Run it on your own market
&lt;/h2&gt;

&lt;p&gt;Everything above came from one run per city of an &lt;a href="https://apify.com/datapipe/airbnb-scraper" rel="noopener noreferrer"&gt;Airbnb scraper I maintain&lt;/a&gt;.&lt;br&gt;
217 listings for Paris took 97 seconds. Twelve months of calendar costs the same single&lt;br&gt;
request per listing as one month, so there is no reason to ask for less.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;datapipe/airbnb-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;locationQueries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Paris, France&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxListings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calendarMonths&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;includeReviews&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="n"&gt;nights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;availability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;availability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;nights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;month&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_period&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;M&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# a listing-month is "open" unless every night in it is blocked
&lt;/span&gt;&lt;span class="n"&gt;blocked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;month&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;open_only&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blocked&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;blocked&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;raw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blocked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;month&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open_only&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;open_only&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;month&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open_share&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blocked&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;month&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your market's raw and corrected columns agree, I would like to see it. In ten cities&lt;br&gt;
they never did.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How far in advance do Airbnb guests book?&lt;/strong&gt;&lt;br&gt;
Pooled across ten cities in September 2026, 50.5% of nights in the current month were&lt;br&gt;
unavailable, falling to 14.9% two months out and under 8% beyond four months, counting&lt;br&gt;
only listings with open calendars. Most booking happens inside 90 days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you see Airbnb availability in advance?&lt;/strong&gt;&lt;br&gt;
Yes. Airbnb publishes up to twelve months of forward calendar on every listing page, one&lt;br&gt;
entry per night, with minimum and maximum stay length.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Airbnb calendar data the same as occupancy?&lt;/strong&gt;&lt;br&gt;
No, and the gap is larger than most people assume. Beyond about five months out, more&lt;br&gt;
listings have a wholly unopened calendar than a partially booked one, so calendar-derived&lt;br&gt;
occupancy at long horizons mostly measures whether hosts have opened their calendars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How far ahead can you trust Airbnb calendar data?&lt;/strong&gt;&lt;br&gt;
About four to five months in these ten cities. Inside that window, blocked nights are&lt;br&gt;
scattered and behave like bookings. Past it, whole-month blocks dominate and the raw&lt;br&gt;
series inverts.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;2,218 listings across 10 cities, 809,570 listing-nights, collected 2 September 2026,&lt;br&gt;
covering 1 September 2026 to 31 August 2027. Every figure recomputed from the raw runs&lt;br&gt;
before publishing. Last updated: 2 September 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>data</category>
      <category>analytics</category>
      <category>api</category>
      <category>webscraping</category>
    </item>
  </channel>
</rss>
