# Changelog of Airbnb Scraper — Prices, Availability Calendar & Occupancy (`kestrel/airbnb-prices-calendar`) Actor

- **URL**: https://apify.com/kestrel/airbnb-prices-calendar/changelog.md
- **Full Actor documentation**: https://apify.com/kestrel/airbnb-prices-calendar.md

## Changelog

### 2026-08-30

- Reliability: a run that cannot act on its input — a URL from the wrong site, a name nothing resolves to, an empty target list, a number outside the documented range — now ends cleanly with the reason on the run card instead of as a failed run. Nothing is charged in either case; a blocked or throttled source still fails loudly.
- Store listing: moved into the categories buyers actually browse (the old `Business` category has no Store page).

### 1.1 — 2026-08-26

Dataset consistency and billing fixes.

- **One listing shape for the whole dataset.** Rows produced from `listingIds` omitted every field Airbnb had not answered, while rows from `locationQueries` carried the full column set — so a mixed run exported ragged CSVs with columns appearing and disappearing. Every `listing` row now carries the same columns, with `null` where there is no value. `available`, `cancellation_policy` and `unavailable_message` now appear on all listing rows as documented.
- **Calendars bill for exactly the months delivered.** When a run's spending limit was reached part-way through a calendar, the full 12- or 24-month row was still delivered against a partial charge. The row is now trimmed to the months actually billed and its occupancy summary recomputed for them.
- **A failed calendar or review no longer marks a listing job failed.** For `listingIds` inputs an add-on error flipped the job's `status` to `error` even though the listing row had been delivered and billed. Add-on failures are now counted in `calendar_errors`/`review_errors` on both paths, as they already were for searches.
- **A malformed listing id now says so.** It previously reported "give at least one place…", hiding which id was wrong.
- **Bad input fails the run cleanly instead of crashing it.** Non-numeric `adults`, `calendarMonths`, `maxListingsPerQuery`, `maxReviewsPerListing`, `sessions` or `perIp` raised an unhandled error mid-run; out-of-range values were accepted silently. All numeric inputs are now checked against the ranges this page documents, `reviewsSort` and `roomTypes` must be listed values, `locale` must be a real code, and `priceMax` must be at least `priceMin`.
- `maxListingsPerQuery: 0` was silently treated as 40 and billed for 40 listings. Values outside 1–280 are now rejected before anything is fetched.

### 1.0 — 2026-08-26

First public release.

- Airbnb prices for your dates and guests in any currency and language: search any place, paste Airbnb search or listing URLs, or give listing ids.
- `listing` rows: total for the stay, base nightly rate and effective per-night price, discounts, rating and review count, bedrooms/beds/baths, coordinates, badges (Guest favorite, Superhost), free cancellation, pictures — paged up to Airbnb's ~280-result cap per search.
- `calendar` rows: up to 24 months of day-by-day availability per listing with occupancy for the next 30/90/365 nights, next available date and typical minimum stay.
- Listing details on request: description, amenities, house rules, cancellation policy, category ratings, host, capacity, sleeping arrangement and the exact price breakdown for the dates (including "not available" for the dates).
- Reviews: newest, highest, lowest or most relevant first, with reviewer, date and host reply.
- Honest billing: pay per listing row that carries a price, per calendar month and per review; unknown places (Airbnb would otherwise return listings from all over the world), empty searches and status rows cost nothing; each listing and stay is billed once per run.
- No login, no cookies: the same public API the airbnb.com front-end uses, with automatic refresh of Airbnb's query hashes when they change.
- Relative dates for schedules; Console views for listings, calendar, reviews and run status.
