Airbnb Scraper: Occupancy Rate, Prices & Market Data
DeprecatedPricing
Pay per usage
Airbnb Scraper: Occupancy Rate, Prices & Market Data
DeprecatedScrape every Airbnb listing in a city or map area (no ~270-result cap) with the price for your dates and an occupancy rate estimate for the next 30/60/90 days from each calendar, plus a market summary. Pay-per-result AirDNA alternative. No personal data.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Miguel Jardim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Share
Scrape every Airbnb listing in a city or map area, with the price for your dates and an Airbnb occupancy rate estimate for the next 30, 60 and 90 days read from each listing's public calendar, plus a ready-made short-term rental market summary (median nightly price, median occupancy, rating, property mix).
Built for short-term-rental investors, Airbnb hosts, property managers and analysts who want AirDNA-style market data for a specific area without a monthly subscription: you pay only for the listings you get.
Why this Actor
- Full coverage, not the first 270 results. Airbnb stops returning results after ~15 pages per search. This Actor splits the map into smaller tiles until each tile fits under that cap, so a whole city is covered. Duplicates are removed.
- Occupancy from the public calendar. For each listing it reads the public availability calendar and reports unavailable nights and an occupancy estimate for the next 30/60/90 days.
- A market summary in one place. The run writes a
SUMMARYrecord to the key-value store: listing count, median nightly price, median occupancy (30 and 90 days), median rating and reviews, share of "Guest favourite" listings and the property-type mix. - No personal data. Output contains listing data only (no host names, profiles or contact details).
Input
| Field | What it does |
|---|---|
location | City or area, e.g. Lisbon, Portugal. The area's boundaries are looked up on OpenStreetMap. |
checkIn / checkOut | Dates for pricing (default: 30 days from today, 3 nights). |
adults | Guests (default 2). |
currency | Price currency (default EUR). |
maxListings | Stop after this many listings (default 500). |
includeOccupancy | Read each listing's calendar for occupancy (default on). |
minPrice / maxPrice, roomTypes | Optional Airbnb filters. |
neLat, neLng, swLat, swLng | Optional custom map area instead of location. |
Output (one row per listing)
listingId, url, name, propertyType, area, latitude, longitude, bedrooms, beds, baths, isStudio, rating, reviewsCount, isNew, isGuestFavorite, hostCategory (e.g. "Individual host"), checkin, checkout, nights, adults, currency, totalPrice (whole stay incl. fees and taxes), nightlyPrice (total ÷ nights, i.e. what a guest really pays per night), listedNightlyRate (the host's nightly rate before discounts, fees and taxes, when shown), freeCancellation, photoUrl, and with occupancy on: unavailableNights30/60/90, occupancyEstimate30/60/90, minNights.
Example row:
{"listingId": "19926030","propertyType": "Apartment","area": "Santa Maria Maior","bedrooms": 1, "beds": 1, "baths": 1,"rating": 4.54, "reviewsCount": 109,"nightlyPrice": 82.33, "totalPrice": 247, "currency": "EUR","occupancyEstimate30": 0.767, "occupancyEstimate90": 0.3, "minNights": 2}
How to read the occupancy numbers
- They are forward-looking ("on the books" today): the share of the next N nights that are not available. Far-away windows are naturally lower because fewer nights are booked yet.
- The public calendar does not distinguish booked nights from nights blocked by the host, so the estimate is an upper bound on real occupancy.
- Listings with incomplete calendar data get
nullrather than a guess.
Tips
- To get a representative market picture, set
maxListingshigh enough to cover the whole area. With a low cap the Actor returns the first tiles it visits, not a random sample. - Prices depend on the dates and number of guests you choose; run the same area for different dates to see seasonality.
Pricing
Pay per event: $1.00 per 1,000 listings saved, plus $1.50 per 1,000 listings whose occupancy was computed (lower on paid Apify plans). For example, 1,000 listings with occupancy cost $2.50. You never pay for listings you don't receive, and you can cap spending per run in Apify Console.
FAQ
How is the Airbnb occupancy rate estimated?
For each listing, the Actor reads the public availability calendar and counts the nights in the next 30, 60 and 90 days that can't be booked. occupancyEstimate30 is that count divided by 30 (same for 60 and 90).
Is it an AirDNA alternative? It covers the core of what people use AirDNA-style tools for in a given area: which listings exist, what they charge for your dates and how booked their calendars are. It does not estimate past revenue, ADR or RevPAR. In exchange there's no subscription, you choose the exact area, and you get the raw per-listing data to analyse yourself.
How many listings can I get?
Airbnb shows at most ~270 results per search. This Actor splits the map into smaller tiles, so you can get every listing in a city (a 1,500-listing Lisbon run with occupancy took about 13 minutes). Set maxListings to how many you need.
Can I use it for any city?
Yes. Type a city, region or neighbourhood in location (e.g. Madrid, Spain, Austin, Texas), or pass a custom map area with neLat/neLng/swLat/swLng.
Can I run it on a schedule? Yes. Save your input as a task and add a schedule in Apify Console to track prices and occupancy over time, or call it through the Apify API.
Notes
This Actor collects publicly visible listing information. You are responsible for using the data in line with applicable laws and Airbnb's terms. Built by Miguel Jardim with the help of AI tools (Claude); every release is tested against live data before publishing.