If you manage short-term rentals, the numbers you actually care about move every day: nightly prices, forward availability, occupancy, ADR, and RevPAR. A revenue manager does not pull those once. They pull them on a schedule, watch how a market drifts week over week, and price against it. Airbnb is where most of that signal lives, and getting it out cleanly is the hard part.
This guide shows both ways: a runnable Python recipe, and a no-code shortcut with the Airbnb data scraper that skips the hard parts entirely. Schedule it daily to track prices, availability and occupancy over time and feed your revenue-management pipeline, the same job you would otherwise pay AirDNA to do.
What you can pull
- Listings for a whole market by location: nightly price, property details, coordinates, rating, and host, one clean row per listing.
- The forward calendar for a listing: up to 12 months of availability and the real price by date, so you can see how a place is booking and what it charges night to night.
- Occupancy, ADR and RevPAR for a listing, the core revenue-management signals, computed from the forward calendar.
- A market report for a location: one aggregate KPI row (ADR, occupancy, RevPAR, revenue) plus the sampled listings, an AirDNA alternative you pay for only when you run it.
- Reviews with sentiment: the full review history for a listing, with ratings and host replies.
Why scraping Airbnb directly is hard
Airbnb does not hand you prices and availability in simple HTML you can select with CSS. The data comes from Airbnb's internal endpoints, which expect requests to look a very particular way and quietly return nothing when they do not. Prices are quoted per date and per guest count, the forward calendar is paginated and keyed on internal listing tokens, and the occupancy math has to be derived from the calendar rather than read off a field. You can solve all of this, but it is real engineering, and it breaks whenever Airbnb reshapes a response.
That is the whole reason a maintained actor exists: it absorbs the endpoint work and hands you a flat table.
DIY vs actor vs AirDNA
| Write it yourself | Airbnb data scraper (actor) | AirDNA / official API | |
|---|---|---|---|
| Setup | Endpoint work, proxies, response parsing | Paste a location or listing URL | Subscription onboarding |
| Prices and availability | You reverse-engineer it | Included, structured | Included, but locked to their dashboard |
| Occupancy, ADR, RevPAR | You derive it from the calendar | Computed for you | Included |
| Reviews with sentiment | Separate endpoint to solve | Included | Not the focus |
| Cost model | Free but you build it | Free tier, then pay per result | Fixed monthly subscription |
| Access | You own every breakage | Maintained for you | Their data, their platform |
There is no open Airbnb API that lets you pull arbitrary listing prices, availability, and occupancy. AirDNA packages similar numbers, but as a fixed monthly subscription tied to their dashboard. For open collection into your own pipeline, scraping is the route, and the choice is really "build and maintain it", "rent AirDNA", or "call an actor and pay per run".
The no-code way (about a minute)
- Create a free Apify account and open the actor page.
- Click Try for free. The input is pre-filled with an example.
- Pick a mode, then fill the one input it needs (a location, or a listing URL), then click Start.
- Download the results from the Output tab as JSON, CSV, or Excel.
To run it every day, save your input as a Task and attach a Schedule. Each run appends a fresh snapshot, which is exactly the time series a revenue manager wants.
Run it from Python
The actor runs on Apify, so you drive it with the Apify client. Install it with pip install apify-client, grab your token from Apify Settings, then:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
# Market report for a location: one aggregate KPI row plus sampled listings.
run_input = {
"mode": "market",
"location": "Lisbon, Portugal",
"sampleSize": 100,
"marketMonths": 3,
"currency": "USD",
}
run = client.actor("factden/airbnb-data-scraper").call(run_input=run_input)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)
To track one property's forward prices and occupancy instead, switch the mode and pass a listing URL:
run_input = {
"mode": "occupancy",
"startUrls": ["https://www.airbnb.com/rooms/39896685"],
"months": 12,
"currency": "USD",
}
The five modes are discover (listings by location), availability (12-month calendar and price by date), occupancy (occupancy, ADR, RevPAR), reviews (full review history with sentiment), and market (the aggregate KPI report). Only the one input the selected mode needs is used, location for discover and market, startUrls for availability, occupancy, and reviews.
What the output looks like
Trimmed from a real occupancy run for a single listing:
{
"listingId": "39896685",
"url": "https://www.airbnb.com/rooms/39896685",
"currency": "USD",
"months": 12,
"adr": 168.4,
"occupancy": 0.72,
"revpar": 121.2,
"availableNights": 84,
"bookedNights": 216
}
The fields you get depend on the mode you run:
| Mode | What each row carries |
|---|---|
discover |
One row per listing: nightly price, property details, coordinates, rating, host |
availability |
The forward calendar, with the real price for each available date (opt-in) |
occupancy |
Occupancy, ADR, RevPAR and the booked-vs-available night counts |
reviews |
Each review with its rating, text, host reply, and sentiment |
market |
One aggregate KPI row (ADR, occupancy, RevPAR, revenue) plus the sampled listings |
Field names are documented on the listing and in the repo below rather than invented here, so what you build against matches what the actor emits.
Try it on a real dataset first
If you want to see the shape before running anything, there is a free sample Airbnb dataset you can open in the browser, and the input, snippets, and field reference are on GitHub.
FAQ
Do I need an Airbnb API key or login?
No. There is no key and no Airbnb login. You only need an Apify token to run the actor.
How do I track prices and occupancy over time?
Save your input as a Task and attach a daily Schedule. Each run appends a fresh snapshot, so you build a price-and-occupancy time series you can feed straight into a revenue-management model.
Is this really an AirDNA alternative?
For the core numbers, yes. You get ADR, occupancy, RevPAR, forward availability, and a market KPI report, but pay per run instead of a fixed monthly subscription, and the data lands in your own pipeline rather than a dashboard.
How far forward does availability go?
Up to 12 months of the forward calendar. Occupancy is most accurate for the near term, since months far out are still mostly unbooked, which is why the market report samples a shorter forward window.
Which currencies and languages does it support?
Prices can be returned in 20 currencies, and names, review text, and labels in several languages, so you can match a specific market.
Is it legal?
It collects publicly visible data. As with any scraping, use the output responsibly and follow the applicable terms and laws for your use case.
Related
Working travel data across sites? The same team maintains a Google Hotels scraper for live hotel prices and the OTA rate ladder, and an Expedia hotel reviews scraper, so you can line up rates and reviews across Airbnb, Google Hotels, and Expedia in the same format.
Full write-up with more examples: how to scrape Airbnb data, and the Airbnb data hub has the field reference and use cases.
Top comments (0)