# Changelog of Airbnb Calendar · Availability & Occupancy (`corent1robert/airbnb-calendar-availability-scraper`) Actor

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

## Changelog

All notable changes to this Actor are documented here.
Format follows [Keep a Changelog](https://keepachangelog.com/).

### \[1.10] — 2026-09-07

#### Added

- **Actor Standby:** HTTP lookup `GET`/`POST /lookup` — **one** Airbnb `/rooms/` listing URL (`listingUrl` / `url` / `urls`). `monthsAhead` defaults to **1**. City search (`/s/`) is rejected. Console **Start** still supports city scans.
- OpenAPI spec for the Standby tab (`web_server_openapi.json`).

### \[1.10] — 2026-09-01

#### Changed

- End-of-run log: next step to Airbnb Pro Host (host emails).

#### Fixed

- Empty / junk Try input (no URLs) now uses the Console example listing instead of a 0-row quality-check miss.
- Schedule monitor no longer crashes Store Try / LIMITED\_PERMISSIONS runs that cannot create a named key-value store.
- Run no longer hangs after the last listing (RUN\_LOG flush / open sockets) — Store QA needs SUCCEEDED within 5 minutes.

### \[1.9] — 2026-08-27

#### Changed

- Store Try: prefill one listing URL (`/rooms/25497233`), `monthsAhead` 1, `maxPages` 1, `maxListings` 5 — city-wide Paris scans timed out under 5 minutes.
- Workers stop ~40s before the platform timeout so already written rows stay SUCCEEDED.

#### Fixed

- Empty runs still exit 0 (warning only).

### \[1.8] — 2026-08-24

#### Changed

- Store suite: README and listing copy name companion Actors (Pro Host, Price Monitor). Dropped “Store does not cross-sell”.

### \[1.7] — 2026-08-24

#### Fixed

- Empty discovery no longer fails the run — 0 results with a warning (Store success rate).

#### Changed

- Default memory 512 MB (was 256) to reduce OOM aborts on multi-listing Free runs.

### \[1.6] — 2026-08-19

#### Changed

- Store categories: `TRAVEL`, `REAL_ESTATE`. README **Also available** (Airbnb suite) at the top.

### \[1.5] — 2026-08-19

#### Changed

- **Free plan cap:** 20 listings per run (`APIFY_USER_IS_PAYING`). Status: `Free plan: 20 listings. Upgrade for bulk.`
- Anonymous Try-without-account runs disabled (`isAnonymouslyRunnable: false`).

### \[1.4] — 2026-08-18

#### Added

- **12 published tasks** (Barcelona, Amsterdam, Lisbon, Berlin, Rome, London, Nice, 6-month listing calendars).

### \[1.3] — 2026-08-17

#### Added

- **4 published tasks** (Paris, Lyon, listing URLs, flat calendar).
- README: Quick start above the fold, Examples, pricing, legality.

### \[1.2] — 2026-05-30

*Apify actor version: 1.2*

#### Added

- **Listing metadata from search results** — new output fields extracted from Airbnb search JSON without extra API calls: `listingName`, `propertyType`, `city`, `rooms`, `beds`, `bathrooms`, `searchPrice`, `searchPriceQualifier`, `rating`.
- `firstDateScanned` / `lastDateScanned` output fields — explicit calendar window boundaries.
- `sourceUrl` and `searchRank` on all rows from search URL discovery.
- `normalizeSearchUrl()` helper — forces `airbnb.com` domain and `locale=en` so metadata is always in English regardless of input URL locale.

#### Changed

- **Parallel calendar fetch** — Phase 2 now runs 10 listings concurrently (was sequential); typical city scan ~7× faster.
- **Input simplified** — `listingUrls` + `locationQuery` + `maxListings` unified into a single `urls` field that accepts both listing URLs and search URLs. `currency` and `verboseLogs` removed from Console UI (still readable via API/JSON).
- `monthsAhead` is now a `select` dropdown (1, 2, 3, 6, 12 months) instead of a free-number field.
- **ID extraction** — `demandStayListing.id` now decoded from base64; ID regex relaxed to `^\d{7,19}$` to capture 19-digit Airbnb IDs.
- `dataset_schema.json` overview view now includes all metadata fields.
- README fully updated: input table, examples, output sample, performance figures, "What you get" table.

#### Fixed

- Pagination was stuck on page 1 — switched `paginateSearch` from `CheerioCrawler` to direct `fetch` to correctly receive `paginationInfo.pageCursors[]` array (matches `airbnb-professional-host-scraper` approach).
- `searchDiscover.js` syntax error (missing closing brace) that caused `SyntaxError: Unexpected token 'export'` on Node 22.

### \[1.1] — 2026-05-29

*Apify actor version: 1.0 (Store)*

#### Added

- **Location discovery mode** — pass a search URL to discover all listings in a city market across multiple date-range passes; paginate up to 15+ pages per pass.
- `searchDiscover.js` library: HTTP-only discovery, `niobeClientData` JSON parsing, `pageCursors[]` pagination.
- `currencyDetect.js` helper: auto-detect currency from location string.
- `dataset_schema.json` `flat-calendar` view with `flatten: ["calendar"]` — one row per listing × day.
- `output_schema.json` `flatCalendar` entry.

#### Changed

- Input schema: `listingUrls` + `locationQuery` + `maxListings` fields.
- README updated for location mode.

### \[1.0] — 2026-05-29

*Apify actor version: 1.0 (Store)*

#### Added

- Initial release.
- `PdpAvailabilityCalendar` API integration — day-level availability, min/max nights, bookable flag, and optional pricing.
- Auto-heal hash discovery: if the persisted query hash is stale, the Actor fetches the listing page to discover a fresh hash transparently.
- Batched month fetching (up to 12 months per API call, up to 24 months total).
- Summary dataset row per listing: `occupancyRate`, `availableDays`, `blockedDays`, `firstAvailableDate`.
- Dataset views: **Overview** (summary) and **Full export** (with `calendar` array).
- `RUN_LOG` key-value entry (flush every 15 lines, capped at 2000 lines).
- Unit tests for all pure helpers (`calendarParse.js`).
