Airbnb Market Intel Scraper | Listings, Occupancy & Revenue
Pricing
from $2.80 / 1,000 listing (search data)s
Airbnb Market Intel Scraper | Listings, Occupancy & Revenue
Scrape any Airbnb market: nightly price, rating, reviews, bedrooms + 12-month calendar turned into occupancy 30/60/90, est. monthly revenue, RevPAR, superhost & host stats, plus a free market-summary row. AirDNA-style comps for STR investors & hosts. HTTP-only, pay per result, MCP-ready.
Pricing
from $2.80 / 1,000 listing (search data)s
Rating
0.0
(0)
Developer
Mr Zack
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share
Airbnb Market Intel Scraper — Listings, ADR, Occupancy & Revenue Estimate
Answer "what does a 2-bedroom in this market actually earn?" in one run. Scrape any Airbnb search (city, neighborhood, region or a pasted Airbnb URL with your filters) and get every listing's nightly price, rating, reviews, bedrooms/beds/baths, badges and coordinates — plus, per listing, the 12-month availability calendar turned into occupancy 30/60/90/365, estimated monthly revenue and RevPAR, superhost status, guest capacity, sub-ratings and host stats. A free market-summary row rolls it up: median / p25 / p75 nightly price, share of superhosts and guest favorites, median occupancy & revenue, and a breakdown by bedroom count.
HTTP-only (server-rendered pages + Airbnb's public calendar endpoint), no login, no proxy, no cookies. Pay per result: $4 per 1,000 listings, $6 per 1,000 enriched listings (calendar + details). Duplicates, failed listings and the summary row are never charged.
Who uses this
- Short-term-rental investors comparing markets before buying — ADR, occupancy and revenue estimates per bedroom count, without a $100+/month AirDNA seat.
- Hosts & property managers pricing against the competition: who charges what, who is booked out, who is superhost, minimum nights.
- Real-estate agents & lenders building STR underwriting comps for a specific address or neighborhood.
- Analysts & AI agents that need a clean, structured snapshot of an Airbnb market on a schedule.
Input
| Field | Default | What it does |
|---|---|---|
location | Austin, TX | Anything you would type into Airbnb search. |
locations | [] | Several markets in one run (one per line). |
searchUrls | [] | Advanced: full airbnb.com/s/... URLs with your own filters (map area, amenities, instant book…). |
checkIn / checkOut | 4 weeks out, 3 nights | Stay dates drive the nightly price Airbnb shows. |
adults | 2 | Guest count. |
children / infants / pets | 0 | New in 0.0.3. Party details — same effect on price/availability as on airbnb.com; pets = pet-friendly listings only. |
roomType | any | entire_home or private_room to filter. |
minBedrooms | 0 | Minimum bedrooms. |
minBeds / minBathrooms | 0 | New in 0.0.3. Airbnb min_beds / min_bathrooms. |
minRating / minReviews / guestFavoriteOnly | 0 / 0 / false | New in 0.0.3. Post-filters on the search card (rating, review count, Guest Favorite badge) — dropped listings are never charged. Use minReviews: 20 to keep only proven earners. |
priceMin / priceMax | 0 | Nightly price filter in currency. |
maxListings | 54 | Charged listings per location (18 per page, Airbnb caps a search at 270). |
enrichCalendar | true | Add calendar KPIs + detail fields (2 extra requests per listing). |
maxEnrich | 30 | Enrich only the first N listings; 270 = all. |
currency | USD | Any ISO code (EUR, GBP, AUD, IDR…). |
marketSummary | true | Append the free roll-up row (also saved as key-value record MARKET_SUMMARY). |
Output — listing row
| Field | Example | Notes |
|---|---|---|
listingId, url | 547878270470501768 | Airbnb listing |
title, name | Guest suite in Austin, Serene & Sunny SoCo Sanctuary… | |
propertyTypeShort, area | Guest suite, Austin | parsed from title |
rating, reviewsCount, isNewListing | 4.99, 114, false | |
isGuestFavorite, isTopGuestFavorite, badges | true, true, ["Guest favorite"] | |
bedrooms, beds, baths | 1, 1, 1 | studio = 0 bedrooms |
nightlyPrice, nights, totalPrice, originalTotalPrice, discountPct, currency | 274.33, 3, 823, null, null, USD | price for the searched dates, before taxes |
checkIn, checkOut, freeCancellation | 2026-10-09, 2026-10-12, true | |
latitude, longitude, pictureUrl, rank, searchLocation, scrapedAt | ||
Enriched (enriched: true) | ||
roomType, propertyType, personCapacity | Entire home/apt, Entire guest suite, 2 | |
isSuperhost, hostName, hostRating, hostReviewCount, hostYears, hostIsVerified | true, Mary, 4.99, 114, 4.5, true | |
ratingCleanliness, ratingAccuracy, ratingCheckin, ratingCommunication, ratingLocation, ratingValue | 5, 4.99, 4.98, 5, 4.97, 4.95 | |
occupancy30, occupancy60, occupancy90, occupancy365 | 0.367, 0.417, 0.311, 0.269 | share of calendar nights unavailable |
bookedNights30/60/90/365, availableNights30/90/365 | 11, 25, 28, 97 … | |
estRevenue30, estRevenue90, estRevenue365 | 3018, 7681, 26610 | nightlyPrice × unavailable nights |
revPar30, revPar90 | 100.59, 85.35 | nightlyPrice × occupancy |
minNights, maxNights, nextAvailableDate, calendarFrom, calendarTo | 2, 1125, 2026-09-13, … |
How to read occupancy: Airbnb only exposes availability, so an unavailable night is either booked or blocked by the host. That is the same public-data proxy every STR analytics tool starts from — treat it as an upper bound and compare listings against each other rather than as an audited P&L.
Output — market-summary row (free)
type: "market-summary", listings, listingsEnriched, medianNightlyPrice, avgNightlyPrice, p25NightlyPrice, p75NightlyPrice, minNightlyPrice, maxNightlyPrice, avgRating, medianReviews, totalReviews, shareGuestFavorite, shareNewListings, shareSuperhost, medianOccupancy30, medianOccupancy90, medianEstRevenue30, medianRevPar30, medianMinNights, medianPersonCapacity, bedroomBreakdown[] (bedrooms, listings, medianNightlyPrice, medianOccupancy30, medianEstRevenue30, avgRating).
Example output (one real enriched row, 6 Sep 2026, "Austin, TX")
{"listingId": "547878270470501768","url": "https://www.airbnb.com/rooms/547878270470501768","title": "Guest suite in Austin","name": "Serene & Sunny SoCo Sanctuary with Farmhouse Feel","rating": 4.99, "reviewsCount": 114, "isGuestFavorite": true,"bedrooms": 1, "beds": 1, "baths": 1,"nightlyPrice": 274.33, "nights": 3, "totalPrice": 823, "currency": "USD","roomType": "Entire home/apt", "personCapacity": 2, "isSuperhost": true,"hostName": "Mary", "hostRating": 4.99, "hostYears": 4.5,"occupancy30": 0.367, "occupancy90": 0.311, "occupancy365": 0.269,"estRevenue30": 3018, "estRevenue90": 7681, "revPar30": 100.59,"minNights": 2, "nextAvailableDate": "2026-09-13", "enriched": true}
Default input (Austin, 54 listings, 30 enriched) costs about $0.28 and runs in under a minute.
Pricing
| Event | Price |
|---|---|
| Listing (search data) | $0.004 ($4 / 1,000) |
| Listing enriched (calendar + details) | $0.006 ($6 / 1,000) — replaces the listing fee for that row |
| Actor start | $0.001 |
Compute is included. Duplicates across pages/locations, listings that fail to parse and the market-summary row are never charged. A failed enrichment falls back to the plain listing fee.
Schedule it
Markets move weekly. In Apify Console open the Actor → Schedules → e.g. every Monday 06:00 with your locations, then connect the dataset to Google Sheets, Airtable, Slack or a webhook via Integrations. Compare MARKET_SUMMARY records week over week to spot price drops and occupancy shifts before your competitors do.
Use it from code or AI agents (MCP)
curl -X POST "https://api.apify.com/v2/acts/tactful_anvil~airbnb-market-intel-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"location":"Canggu, Bali","roomType":"entire_home","minBedrooms":2,"maxListings":90,"maxEnrich":90,"currency":"USD"}'
Works out of the box with the Apify MCP server (https://mcp.apify.com) — add this Actor to your Claude, Cursor, ChatGPT or custom agent and ask "compare Airbnb occupancy and ADR for 2-bedroom homes in Austin vs Nashville". Python: ApifyClient(token).actor("tactful_anvil/airbnb-market-intel-scraper").call(run_input={...}).
Why this Actor
- Market intelligence, not just listings — occupancy, revenue estimate and RevPAR per listing plus a market roll-up; competitors stop at price and rating.
- HTTP-only & fast — ~1 s per page, ~0.7 s per enriched listing, no browser, no proxies to pay for.
- Fail-loud — if Airbnb changes its layout the run fails with a clear message instead of "succeeding" with 0 rows.
- Fair pricing — flat per-result fees, nothing charged for duplicates, failures or the summary.
Related Actors
- Google Ads Transparency Scraper — see which property managers and hosts advertise.
- Brand Ads Cross-Network Spy — ad creatives across Google and Meta for any brand.
- Contact Details Scraper — emails, phones and socials from any website.
- Kalshi Weather Markets Scraper — prediction-market weather odds for demand forecasting.
Found this useful? Bookmark & review
A bookmark or a short review on this page helps other hosts and investors find it — and tells me which fields to add next (reviews text, amenities, price history?). Issues tab is open.
Changelog
- 0.0.4 (13 Sep 2026) —
bedroomsfill: Airbnb search cards sometimes omit the bedroom line (≈10–20 % of cards, mostly studios). When the listing name says “studio” the row now getsbedrooms: 0instead ofnull; other cards without the line staynulluntil the room page fills it (fetchDetails). No other field changed. - 0.0.3 (8 Sep 2026) — billing hardening: a charging hiccup can no longer abort a run that already returned listings (rows are delivered either way).
- 0.0.3 (8 Sep 2026) — party details (
children,infants,pets),minBeds/minBathrooms, quality post-filtersminRating/minReviews/guestFavoriteOnly(never charged when dropped). No existing field changed. - 0.1 (6 Sep 2026) — launch: search pagination (15 pages), room details, 12-month calendar KPIs, market-summary row, multi-location, pasted search URLs.