Airbnb Occupancy, Availability & Dynamic-Pricing Scraper
Pricing
from $2.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
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
- Give the actor either specific Airbnb listing IDs, or a search area (e.g.
Bali--Indonesia). - For each listing it reads the forward availability calendar and works out the occupancy and pace metrics.
- 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"] }}
| Field | Type | Description |
|---|---|---|
mode | string | listing — scrape specific listing IDs. searchArea — find listings in an area first, then scrape them. |
listingIds | array | Listing IDs (the number in /rooms/<id>) or full room URLs. Used in listing mode. |
location | string | Search area slug as in /s/<location>/homes, e.g. Bali--Indonesia. Used in searchArea mode. |
currency | string | Currency code for any returned prices. Default USD. |
calendarMonths | integer | Forward months of availability to read (1–12). Default 12. |
computeOccupancy | boolean | Add occupancy / booked-nights / pace metrics. Turn off for just the raw calendar. Default true. |
includeProfile | boolean | Also output a listing profile record. Default true. |
maxListings | integer | Hard cap on listings processed per run. Default 500. |
concurrency | integer | How many listings to process in parallel. Default 3. |
proxyConfiguration | object | Proxy 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.
| Field | Type | Description |
|---|---|---|
listing_id | string | Airbnb listing ID. |
days | array | The raw forward calendar (date, available, bookable, min/max nights). |
occupancy_30d / _90d / _365d | number | Share of upcoming nights that are unavailable, per window (0–1). |
booked_nights_30d / nights_counted_30d | number | Unavailable and total counted nights in the 30-day window. |
available_nights_horizon | number | Bookable nights across the whole calendar horizon. |
min_nights_mode | number | Most common minimum-stay across upcoming nights. |
booking_pace | object | Nights booked / freed since the previous run for this listing. |
adr | number | Average 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
adrand revenue are usually unavailable. Occupancy never depends on price.
Notes
- A residential proxy is recommended for reliable results.
- In
searchAreamode, 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.