# Changelog of Airbnb Scraper API - Prices, Reviews & Calendar (`codepoetry/airbnb-scraper`) Actor

- **URL**: https://apify.com/codepoetry/airbnb-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/codepoetry/airbnb-scraper.md

## Changelog

### Unreleased

#### Changed — renamed fields, update any code that reads them

- `pageCursors` is now `page_cursors`, like every other field.
- In `co_hosts`, `photoUrl` is now `photo_url` and `isSuperHost` is now `is_super_host`. Both
  are now declared in the dataset schema, beside `id` and `name`.

#### Added

- Search-mode records now carry `thumbnail` and `coordinates`, as full records do.

#### Changed

- A run given both `location_queries` and `start_urls` stops before scraping anything and
  says so. It used to fetch the listings and silently drop the locations.
- A run whose calendar window opens before the current month stops and says so, instead of
  returning a calendar of days that have already happened.
- A run whose `check_out` is not after its `check_in` stops and says so.

#### Fixed

- With only `check_in` given, `check_out` is now the night after it, as documented. It was a
  month from the run, so any `check_in` further out than that priced no listing.
- With `proxy_country` empty, Russian and Chinese browse the United States. They followed the
  language to Russia and China, where Airbnb returns no listings.
- A first listing that has been removed, or whose page cannot be fetched, no longer stops a
  full run; the next listing is used instead.
- When Airbnb rejects the listing request itself, the run stops with Airbnb's message rather
  than returning an error record for every listing.
- A failed search page is no longer counted as a walked search page.
- Search pages no longer drop their listings when Airbnb sends the search results
  inline instead of in a separate script. About one search page in seven came back
  that way and was reported as `search.state_missing`; a full Paris search delivered
  184 listings where it should have delivered about 220.
- A run fetches only the search pages its `max_listings` needs: a 20-listing search
  now makes 3 requests (269 KB) instead of 17 (2.1 MB).
- Page 1 of a search is no longer fetched twice, nor charged as a second search page.

### 1.0.0

First public release.

- Full listing detail: 99 fields per listing, including the price broken down line by
  line, all six rating categories, host details, amenities, house rules, images and
  cancellation terms.
- Day-by-day availability calendar, included rather than sold as a separate tier.
- Guest reviews, paged in `MOST_RECENT` order so a listing's reviews are returned
  once each. Offset paging over Airbnb's default ordering returns duplicates and
  silently drops reviews — a 373-review listing came back as 322 distinct.
- Search by city, or pass room URLs directly with `start_urls`.
- Prices parsed by shape rather than by a locale table, so `$1,291.91` and
  `1.234,56 €` both read correctly without the scraper being told which market it is
  pointed at.
- A missing field is `null`, never `""` or `0`. A listing whose reviews never
  rendered and one with zero reviews are different facts and stay different.
- Per-record `error` array: a listing whose search card was fine, whose availability
  call timed out and whose reviews returned 403 is one record carrying all three
  facts, not a run that failed.
- Failed listings are not billed.
