Scrape Airbnb Prices, Reviews and Availability: Worked Example with Real Costs (2026)
Short-term rental research dies on three missing fields: nightly rates that are labels instead of numbers, reviews locked in a second dataset, and no availability calendar at all. This post runs the Airbnb Scraper API through a real job: prices, guest reviews and the day-by-day calendar for one market, in a single dataset, with the exact bill at the end.
Every rate below was read from api.apify.com on 2026-10-11 and is the free-plan tier. Paid plans discount the listing event (down to $0.75 per 1,000 at the Business-tier discount).
What one run returns
Set a location, a stay window, and whether you want reviews. Each full-detail listing comes back with 99 fields, and the three that matter most for analysis:
price.amount— the nightly rate for yourcheck_in/check_outwindow as a sortable number, withprice.breakdownmirroring the fee lines Airbnb displays on the page.availability— the day-by-day calendar (bookable flag, min/max nights per date) plusoccupancy_ratefor the window, so occupancy is a field you read instead of a proxy you estimate.reviews— guest reviews in the same run when you switch them on: text, rating, date, reviewer info.
If you are comparing Store options first, the best Airbnb scrapers roundup prices all five per event — including one that costs $0.20 per 1,000 results if its field set is enough for you.
The input
{
"location_queries": ["Gothic Quarter, Barcelona", "El Born, Barcelona"],
"check_in": "2026-11-06",
"check_out": "2026-11-08",
"max_listings": 500,
"include_reviews": true,
"max_reviews_per_listing": 50,
"calendar_months": 3,
"currency": "EUR"
}
Three of these keys decide what you pay:
max_listingsdefaults to 20 — a safety cap so a mistyped location cannot bill thousands of listings. Set it deliberately.include_reviewsdefaults to off. On, each review bills $0.0003.check_in/check_outmust stay fixed across scheduled runs, or the nightly rates in your time series are not comparable.
Multiple location_queries merge into one dataset, so a city sweep is one run, not one per neighbourhood.
Run it from Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("codepoetry/airbnb-scraper").call(run_input={
"location_queries": ["Gothic Quarter, Barcelona", "El Born, Barcelona"],
"check_in": "2026-11-06",
"check_out": "2026-11-08",
"max_listings": 500,
"include_reviews": True,
"max_reviews_per_listing": 50,
"calendar_months": 3,
"currency": "EUR",
})
dataset = client.dataset(run["defaultDatasetId"]).list_items(clean=True).items
records = dataset[0]["records"] if dataset and "records" in dataset[0] else dataset
The output wraps listings in a records array with a summary object (delivered, rejected, failuresDatasetId); failed listings land in the failures dataset as error records and are not billed.
The bill, to the cent
For this exact run — 500 full-detail listings at $0.002 each, 25,000 guest reviews at $0.0003 each (50 per listing), one run start at $0.0001:
| Event | Quantity | Rate | Cost |
|---|---|---|---|
| Full-detail listing | 500 | $0.002 | $1.00 |
| Guest review | 25,000 | $0.0003 | $7.50 |
| Run start | 1 | $0.0001 | $0.0001 |
| Total (free plan) | ≈ $8.50 |
Reviews dominate the bill — that is the shape to internalize. Without them, the same run is $1.00. Halve the review cap to 25 per listing and you pay $3.75 for reviews instead of $7.50. On the free plan's $5 monthly credit, this exact job does not fit; the listings-only version runs five times.
For comparison: putting 25,000 reviews through the most-used alternative's separate reviews Actor costs $125.00 at its $5.00-per-1,000 free-plan rate, before you join the two datasets. Different field sets, different prices — the roundup table has all of them side by side.
Turn the snapshot into a series
A scrape is one point in time. Scheduled runs make it data:
- Fix the inputs. Same queries, same dates, same currency, every run. Put them in an Apify task so nothing drifts.
- Stamp every row. Write the run timestamp onto each record when you store it, or you have a pile of snapshots.
- Compute occupancy from the calendar, not from review counts:
import datetime as dt
window = (dt.date(2026, 11, 6), dt.date(2026, 12, 6))
for r in records:
days = [d for d in r["availability"]
if window[0] <= dt.date.fromisoformat(d["date"]) <= window[1]]
occupied = sum(1 for d in days if not d["bookable"])
monthly_revenue = r["price"]["amount"] * occupied
Nightly rate × occupied nights, with both fields straight off the listing record — no proxies, no estimation.
What to know before you scale
mode=searchreturns card-level fields at $0.0005 each — a quarter of the full-detail price — for market scans where you do not need calendars or reviews.- Currency and locale change the answer. Record which you used; a EUR run and a USD run of the same query are different datasets.
- Terms and law. Collecting public listing data for internal research is common practice; commercial redistribution of Airbnb content is a different question. See the scraping legality guide.
Start with a $0.20 test: cap max_listings at 100 and leave reviews off — that is 100 full-detail listings for $0.20 on the free plan, enough to see the real yield for your market before anything scales. Open the Airbnb Scraper API on Apify →
With the Airbnb Scraper API on the free plan: $0.002 per full-detail listing plus $0.0003 per guest review. A run of 500 listings with 50 reviews each (25,000 reviews) costs about $8.50 total. Without reviews, the same 500 listings cost $1.00. Rates verified against api.apify.com on 2026-10-11; paid plan tiers are lower.
Yes. Every full-detail listing ships a day-by-day availability calendar (bookable flag, min/max nights per date) plus an occupancy_rate for the window, controlled by the calendar_months input. It is included in the $0.002 listing event — there is no separate calendar charge.
Yes. Set include_reviews to true (it defaults to off) and max_reviews_per_listing to cap spend (default 50, 0 for unlimited). Reviews bill at $0.30 per 1,000 on the free plan and land in the same dataset as the listings, so there is no second Actor and no dataset join.
It depends on the fields you need. For card-plus-calendar data, Curious Coder's Airbnb Scraper is flat $0.20 per 1,000 results — cheaper per result than this Actor. For six-category ratings, occupancy rate, line-item price breakdowns and in-run reviews, the Airbnb Scraper API's $2.00 per 1,000 full-detail listings is the rate to compare. The full comparison is in the best Airbnb scrapers roundup.
Multiply the nightly rate (price.amount) by occupied nights from the availability calendar. The calendar is public data and the occupancy_rate field is computed from it, so the estimate comes from observed availability rather than review-count proxies.
