Airbnb Occupancy, Availability & Dynamic-Pricing Scraper avatar

Airbnb Occupancy, Availability & Dynamic-Pricing Scraper

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Airbnb Occupancy, Availability & Dynamic-Pricing Scraper

Airbnb Occupancy, Availability & Dynamic-Pricing Scraper

Derive per-listing occupancy %, available/booked nights, min-nights and booking-pace from Airbnb's forward availability calendar — short-term-rental revenue intelligence (the AirDNA / AllTheRooms signal). By listing ID or search area.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

xtractoo

xtractoo

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Airbnb Occupancy & Availability Scraper

Turn any Airbnb listing's forward calendar into occupancy %, booked vs. available nights, minimum-stay, and booking pace — the short-term-rental revenue signal that subscription tools sell. One result = one listing's calendar (plus an optional profile record).

Why use this actor

  • No account, no login, and no API key required
  • Per-listing occupancy for the next 30 / 60 / 90 / 365 days, plus available-nights and minimum-stay
  • Booking pace: how many nights got booked (or freed) since your last run
  • Works from a list of listings or from a whole search area
  • Optional listing profile (title, room type, location, rating, capacity) at no extra cost
  • Stable JSON output suitable for pipelines, market analysis, or revenue modeling

How it works

  1. Give the actor either specific Airbnb listing IDs, or a search area (e.g. Bali--Indonesia).
  2. For each listing it reads the forward availability calendar and works out the occupancy and pace metrics.
  3. Results stream into your dataset, ready to download as JSON, CSV, or Excel.

You don't manage scrapers, browsers, or retries — the actor handles all of that.

Input

{
"mode": "listing",
"listingIds": ["983207483398233150"],
"location": "Bali--Indonesia",
"currency": "USD",
"calendarMonths": 12,
"computeOccupancy": true,
"includeProfile": true,
"maxListings": 500,
"concurrency": 3,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
FieldTypeDescription
modestringlisting — scrape specific listing IDs. searchArea — find listings in an area first, then scrape them.
listingIdsarrayListing IDs (the number in /rooms/<id>) or full room URLs. Used in listing mode.
locationstringSearch area slug as in /s/<location>/homes, e.g. Bali--Indonesia. Used in searchArea mode.
currencystringCurrency code for any returned prices. Default USD.
calendarMonthsintegerForward months of availability to read (1–12). Default 12.
computeOccupancybooleanAdd occupancy / booked-nights / pace metrics. Turn off for just the raw calendar. Default true.
includeProfilebooleanAlso output a listing profile record. Default true.
maxListingsintegerHard cap on listings processed per run. Default 500.
concurrencyintegerHow many listings to process in parallel. Default 3.
proxyConfigurationobjectProxy settings. A residential pool is recommended.

Output

Calendar + occupancy record (recordType: "LISTING_CALENDAR"):

{
"_input": "983207483398233150",
"_source": "S1-graphql-calendar",
"_scrapedAt": "2026-06-03T10:00:00Z",
"recordType": "LISTING_CALENDAR",
"listing_id": "983207483398233150",
"currency": "USD",
"days": [
{ "calendarDate": "2026-06-10", "available": true, "bookable": true,
"availableForCheckin": true, "minNights": 2, "maxNights": 365 }
],
"occupancy_30d": 0.40, "booked_nights_30d": 12, "nights_counted_30d": 30,
"occupancy_90d": 0.24, "occupancy_365d": 0.49,
"available_nights_horizon": 184, "horizon_days": 364,
"min_nights_mode": 1,
"adr": null, "adr_source": null,
"calendar_start": "2026-06-03", "calendar_end": "2027-05-31",
"booking_pace": { "newly_booked_nights": 6, "newly_freed_nights": 1 }
}

Profile record (recordType: "LISTING_PROFILE"): title, room_type, lat, lng, rating, reviews_count, person_capacity, bedrooms, listing_url. Missing fields are omitted, never guessed.

FieldTypeDescription
listing_idstringAirbnb listing ID.
daysarrayThe raw forward calendar (date, available, bookable, min/max nights).
occupancy_30d / _90d / _365dnumberShare of upcoming nights that are unavailable, per window (0–1).
booked_nights_30d / nights_counted_30dnumberUnavailable and total counted nights in the 30-day window.
available_nights_horizonnumberBookable nights across the whole calendar horizon.
min_nights_modenumberMost common minimum-stay across upcoming nights.
booking_paceobjectNights booked / freed since the previous run for this listing.
adrnumberAverage nightly price, when Airbnb exposes it (usually null for anonymous reads).

A listing that can't be read returns an _error record instead of being dropped.

How occupancy is calculated (please read)

  • Occupancy = unavailable upcoming nights ÷ counted upcoming nights in each window (30 / 60 / 90 / 365 days). Only dates from today forward are counted.
  • Airbnb does not say why a night is unavailable, so a night blocked by the host reads the same as a booked night. Occupancy here is therefore an estimate — the same limitation every calendar-based occupancy product has.
  • Booking pace compares this run to your previous run for the same listing, so the first run has no pace yet.
  • Per-night prices come back empty for anonymous reads, so adr and revenue are usually unavailable. Occupancy never depends on price.

Notes

  • A residential proxy is recommended for reliable results.
  • In searchArea mode, coverage is roughly one page of listings per area — give specific areas (or use listing mode) for breadth.
  • Availability and pace are point-in-time and change continuously.