Airbnb Occupancy & Pricing Scraper
Pricing
from $6.00 / 1,000 occupancy reports
Airbnb Occupancy & Pricing Scraper
Scrape Airbnb occupancy and pricing from public listing calendars. Use for STR comps, occupancy upper bound, ADR, and RevPAR. Do not use for host iCal exports — see airbnb-calendar-availability-scraper. Returns one occupancy report per listing. Charged $0.006 per listing report.
Pricing
from $6.00 / 1,000 occupancy reports
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Airbnb occupancy and pricing reports
Turn a public Airbnb listing URL, listing ID, or city search into one occupancy report per listing. The Actor reads Airbnb's public forward calendar and returns occupancy upper bound, available vs unavailable nights, typical minimum stay, next available date, and ADR / RevPAR when Airbnb exposes a price. No Airbnb login and no host iCal token.
This Actor is for STR investors, property managers, and agents that need a listing-level occupancy snapshot before they model revenue.
Best fit for this Actor
- Analyze a known listing URL or ID for the next 30/60/90/365 days of public availability.
- Sample a city search (for example Austin, TX) when listing IDs still need discovery.
- Keep
includeDailyCalendaroff unless you need the raw day array for a downstream model.
For listing cards without a calendar (name, snapshot nightly, ratings, host), use Airbnb Scraper. For authorized host iCal exports you manage, use Airbnb Calendar Availability Scraper. For review text, use Airbnb Reviews Scraper.
Practical scenario
An analyst pastes https://www.airbnb.com/rooms/12937, sets calendarMonths to 3, and leaves maxListings at 1. The run returns one row: occupancy upper bound over the forward calendar, available/unavailable night counts, typical min nights, next available date, and listing profile fields (title, rating, capacity). If Airbnb omits anonymous calendar prices, adr is null and occupancy is still billed. A later city-search run on Austin can fill adr from the search stay quote.
Quick start input
{"listingIds": ["12937"],"startUrls": [{ "url": "https://www.airbnb.com/rooms/12937" }],"calendarMonths": 3,"maxListings": 1,"includeProfile": true}
Listing IDs and room URLs are merged and deduped before any HTTP call. When both listing IDs and location are set, listing IDs win.
Input reference
| Field | Type | What it controls |
|---|---|---|
listingIds | array | Numeric Airbnb IDs such as 12937. |
startUrls | array | Public /rooms/{id} URLs. |
location | string | City search used only when no listings are provided. Example: Austin, TX. |
calendarMonths | integer | Forward months 1–12. Prefill 3, default 12. |
maxListings | integer | Cap after dedupe. Default 50, prefill 1. |
includeProfile | boolean | Attach title, rating, capacity, bedrooms. Default true. |
includeDailyCalendar | boolean | Attach day-level days[]. Default false. |
currency / locale | string | Price label currency and GraphQL locale. Occupancy does not depend on them. |
proxyConfiguration | object | Apify Residential recommended. |
What data you receive
One dataset item is one listing occupancy report.
{"listingId": "12937","listingUrl": "https://www.airbnb.com/rooms/12937","title": "1 Stop to Midtown! Private Bedroom, Landmark House","roomType": "Private room","city": "New York","occupancyPctUpperBound": 72.5,"occupancy30dPct": 80.0,"availableNights": 24,"unavailableNights": 66,"typicalMinNights": 3,"nextAvailableDate": "YYYY-MM-DD","adr": null,"adrSource": null,"revpar": null,"occupancyMethodology": "Unavailable nights on the public forward calendar include both guest bookings and host blocks. occupancyPctUpperBound is therefore an occupancy upper bound, not confirmed booked nights.","source": "listing","scrapedAt": "ISO-8601 timestamp"}
| Field | Meaning |
|---|---|
occupancyPctUpperBound | Unavailable nights / counted nights. Host blocks count as unavailable. |
occupancy30dPct / 90d / 365d | Same upper bound on rolling windows. |
adr | Mean calendar nightly price, or search stay total / nights. Often null on anonymous listing-ID runs. |
revpar | ADR × occupancy upper bound. |
estimatedRevenue30d / 365d | ADR × unavailable nights in that window. Estimate only. |
source | listing or search. |
Download JSON, CSV, or Excel from the run dataset.
Use through the API
curl "https://api.apify.com/v2/acts/khadinakbar~airbnb-occupancy-pricing-scraper/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"listingIds":["12937"],"calendarMonths":3,"maxListings":1}'
Read rows from the run defaultDatasetId after status is SUCCEEDED. Check key-value OUTPUT.outcome for COMPLETE, PARTIAL, VALID_EMPTY, or INVALID_INPUT.
Use with AI agents through Apify MCP
Analyze occupancy for Airbnb listing 12937 over the next 3 months. Return occupancy upper bound, available nights, next available date, and ADR only if Airbnb exposed a price. Treat unavailable nights as an occupancy upper bound that includes host blocks.
Inspect OUTPUT.outcome, keep listingUrl as provenance, and keep maxListings small. Client setup: https://mcp.apify.com.
Connect the workflow
- Listing discovery → occupancy: start with Airbnb Scraper
listing_id, then pass it here. - Host-owned calendars: Airbnb Calendar Availability Scraper accepts authorized iCal URLs this Actor rejects.
- After occupancy, continue to guest-review text with Airbnb Reviews Scraper when you need comment-level sentiment.
Pricing
This Actor uses Pay per event plus Apify platform usage. Open the live Pricing tab for current event details, and use Apify's run cost controls to keep the workflow aligned with your budget.
apify-actor-start: $0.00005 per runoccupancy-report: $0.006 per saved listing report
Invalid input, empty city searches, and calendars Airbnb does not return are not charged the listing event. Typical one-listing quality run: one start event + one occupancy report.
Best results
- Use a real
/rooms/{id}URL or numeric ID. iCal export URLs are rejected on purpose. - Start with
calendarMonths: 3andmaxListings: 1before a city sample. - Enable Apify Residential if Airbnb returns HTTP 403/429.
- Treat occupancy as an upper bound. Hosts block dates that are not guest bookings.
Design note
In my testing, Airbnb's anonymous calendar GraphQL returned availability, min nights, and check-in flags, while localPriceFormatted was usually empty. I found search-mode stay quotes ($1,832 for 5 nights) were the reliable ADR path. That is why listing-ID runs can have occupancy without ADR, and why the field is named occupancyPctUpperBound instead of booked occupancy.
Responsible use
Use public listing data for research, comps, and your own market analysis. Respect Airbnb's terms of service and applicable law. This Actor is for public calendar reports only. Airbnb is a trademark of Airbnb, Inc. This independent Actor is not affiliated with, associated with, or endorsed by Airbnb, Inc.