Airbnb Availability API — Calendar of Open Nights as JSON
Documentation menu
FetchLayer FetchLayer API

Read a listing’s availability calendar

Which nights one listing is open, closed or booked — night by night, by id or URL. Every night carries `available`, `bookable`, `availableForCheckin`, `availableForCheckout`, and the `minNights`/`maxNights` the host enforces for a stay starting on it, so you get not only which nights are free but how long a stay has to be to take them. Up to a year in one call: `months` goes to 12 — the source's own ceiling per request, and `months: 13` is a 400 saying so — with `-1` meaning that maximum. `from` is any date inside the first month you want and the range snaps to that whole month, so `from: "2027-03-15"` starts the calendar at `2027-03-01`. **The booking-window edge — read this before reading a run of closed nights as a closure.** Every response carries this note verbatim: `"Dates beyond the host's own booking window come back marked unavailable rather than omitted — a long unbroken run of closed nights near the end of this window usually means the window, not a closure."` The source answers every night you ask for. A host who has opened the next four months for booking still returns nights five through twelve when you ask for twelve — marked `available: false`, exactly like a night someone has booked. So a long unbroken run of closed nights at the **far end** of your range is the edge of what the host has opened, not a fully booked property: the calendar simply stops there, and the response fills the rest in rather than truncating. Scattered closed nights in the middle of an otherwise open range are real closures; a solid block running to `endDate` is the window. **A closed night that still allows checkout is the far end of a booked stay.** `available: false` with `availableForCheckout: true` and `availableForCheckin: false` is the last night of somebody else's booking: you cannot start a stay on it, but a stay could end on it. That pairing is how you find where a booking ends — walk the nights and every place `availableForCheckout` flips true inside a closed run marks a departure. Measured: 19 such nights in a 365-night pull on listing `33579922`. **No per-night pricing here.** This route answers which nights are open and how long a stay has to be; it does not price them. For a priced stay, call [`/listing-detail`](/documentation/airbnb/endpoints/listing-detail) with `checkIn` and `checkOut`. Billing: 1 credit per page fetched, reported as `pagesFetched` — and a year of calendar is one page, not twelve. Measured on 17 September 2026: `{"listing":"33579922"}` returned 200 in 0.36s with `pagesFetched: 1` and 91 nights across the three default months; the same listing with `months: -1` returned 365 nights, still `pagesFetched: 1`. An id that names no listing is a 404 with a message, exactly as on /listing-detail.

POST /listing-availability Availability
https://api.fetchlayer.dev/airbnb/listing-availability
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

listing string required

A listing: its `airbnb.com/rooms/…` URL, or its numeric id. The only required field.

from string optional

The first month to read, given as **any date within it**, YYYY-MM-DD — the range snaps to that whole month, so `2027-03-15` and `2027-03-01` both start the calendar on 1 March 2027. Defaults to the current month. (default: the current month)

months integer optional

How many months of calendar to return, up to 12 — that ceiling is the source's own limit per request, not ours, and asking for 13 is a 400 reading "months: Must be -1 (the maximum) or between 1 and 12". Pass -1 for the maximum. (default: 3)

format string optional

Envelope format: json or markdown. (default: json)

Response Fields

listing-availability

Read a listing’s availability calendar

transport string

The source. "airbnb".

notes string[]

Caveats and completeness statements you can act on, in plain words. On /listing-reviews this is where the "10 of the 52" line lives; on the priced routes it is where the stay window used for pricing is stated; on /listing-availability it is where the booking-window warning lives — read it before reading a run of closed nights as a closure.

pagesFetched number

Pages read, and what the request is billed at: 1 credit per page. A page costs the same whether it comes back full or half empty. /resolve-url reports 0 and is free.

listingId string

The listing the calendar belongs to, echoed back — useful when you passed a URL.

startDate string

The first night in the range, YYYY-MM-DD. The first of the month `from` falls in, or of the current month when you gave none.

endDate string

The last night in the range. **Where a run of closed nights ends here, read the booking window before reading a closure** — see the note the response carries.

nights[].date string

The night, YYYY-MM-DD. One entry per night, none skipped: 91 entries for the three default months, 365 for `months: -1`.

nights[].available boolean

Whether the night is open. `false` covers both a night somebody has booked and a night beyond what the host has opened for booking — the two are not distinguished here, which is exactly why the booking-window note matters.

nights[].bookable boolean

Whether the night can actually be booked. Can be `null` where the source published no answer — measured `null` on nights in the current month that have already passed.

nights[].availableForCheckin boolean

Whether a stay may **start** on this night. An open night with this `false` sits inside a gap too short for the host's minimum stay.

nights[].availableForCheckout boolean

**Whether a stay may end on this night — and the field that finds the end of a booking.** `true` on a night that is `available: false` and `availableForCheckin: false` is the far end of somebody else's stay: you could check out on it, you could not check in. Measured on 2026-10-13 of the example response below.

nights[].minNights number

The shortest stay the host allows starting on this night. It varies night to night — 1 on some nights and 2 on others in a single measured calendar — so it is per night, not per listing.

nights[].maxNights number

The longest stay allowed starting on this night. Often a very large number (1125 on the listing measured), which means "no real limit" rather than a considered cap.

Request

curl -X POST "https://api.fetchlayer.dev/airbnb/listing-availability" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"listing":"33579922"}'

Response

{
  "transport": "airbnb",
  "notes": [
    "Dates beyond the host's own booking window come back marked unavailable rather than omitted — a long unbroken run of closed nights near the end of this window usually means the window, not a closure."
  ],
  "pagesFetched": 1,
  "listingId": "33579922",
  "startDate": "2026-09-01",
  "endDate": "2026-11-30",
  "nights": [
    {
      "date": "2026-10-10",
      "available": false,
      "bookable": false,
      "availableForCheckin": false,
      "availableForCheckout": false,
      "minNights": 2,
      "maxNights": 1125
    },
    {
      "date": "2026-10-11",
      "available": true,
      "bookable": true,
      "availableForCheckin": true,
      "availableForCheckout": false,
      "minNights": 2,
      "maxNights": 1125
    },
    {
      "date": "2026-10-12",
      "available": true,
      "bookable": true,
      "availableForCheckin": false,
      "availableForCheckout": true,
      "minNights": 2,
      "maxNights": 1125
    },
    {
      "date": "2026-10-13",
      "available": false,
      "bookable": false,
      "availableForCheckin": false,
      "availableForCheckout": true,
      "minNights": 2,
      "maxNights": 1125
    },
    {
      "date": "2026-10-14",
      "available": false,
      "bookable": false,
      "availableForCheckin": false,
      "availableForCheckout": false,
      "minNights": 2,
      "maxNights": 1125
    },
    {
      "date": "2026-10-15",
      "available": true,
      "bookable": true,
      "availableForCheckin": true,
      "availableForCheckout": false,
      "minNights": 2,
      "maxNights": 1125
    }
  ]
}