# Changelog of Airbnb Price Monitor · Nightly Rate Tracker (`corent1robert/airbnb-price-monitor`) Actor

- **URL**: https://apify.com/corent1robert/airbnb-price-monitor/changelog.md
- **Full Actor documentation**: https://apify.com/corent1robert/airbnb-price-monitor.md

## Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
Actor Store version: **1.12**

***

### \[1.12] — 2026-09-29

#### Changed

- Free plan cap: **5 listings / run**.
- **Standby off**. Datacenter proxy first; residential only if paying and DC is missing.
- PPE: market listing **$0.004**, calendar listing **$0.04**, actor-start **$0.005**.

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

#### Added

- **Actor Standby:** HTTP lookup `GET`/`POST /lookup` — **one** Airbnb `/rooms/` listing URL (`listingUrl` / `url`). City search is rejected. `detectChanges` is off on HTTP. Console **Start** still supports market scans.
- OpenAPI spec for the Standby tab (`web_server_openapi.json`).

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

#### Fixed

- Store Try no longer dies on an empty / wiped Console example (`helloWorld`). We fall back to one listing URL, cap Try at 1 listing, and `Actor.exit` within 5 seconds so the Actor stays off maintenance.

### \[2026-09-01]

#### Changed

- Free plan cap: 20 rows per run. Anonymous Try off.

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

#### Fixed

- Try Apify (`LIMITED_PERMISSIONS`) no longer crashes on the named `monitor-state` key-value store. Change tracking falls back to the run’s default store so the Actor stays off maintenance.

***

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

#### Changed

- Store suite: README and listing copy name companion Actors (Calendar, Pro Host). Dropped “Store does not cross-sell”.
- Input schema: `detectChanges` now has a description (required by the Store validator).

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

#### Changed

- Store README: `maxListings` in the input table, FAQ, Try = one listing.

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

#### Changed

- Store Try: one listing URL + `maxListings` prefill 5 (city-wide search remains the API default when you omit the cap).

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

#### Changed

- Store categories: `TRAVEL`, `REAL_ESTATE` (drop Automation / Developer Tools).

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

#### Added

- Store **Examples** (published tasks): Paris, Lyon, Nice markets and one listing.

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

#### Changed

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

### \[1.2.0] — 2026-06-01

#### Added

- **Pay-per-event (PPE) pricing** — `airbnb-price-market-listing` ($0.002) for city scan listings with a price, `airbnb-price-calendar-listing` ($0.03) for direct listing URLs with calendar data, `apify-default-dataset-item` ($0) for unpriced rows. Run start is free.

***

### \[1.1.0] — 2026-06-01

#### Added

- **78-window parallel search discovery** — 2n, 5n, and 7n stay lengths × Monday + Friday check-ins × one window per week over the period. Captures listings with high `minNights` that are invisible to 2-night-only searches.
- **Parallel page fetching per window** — first page is fetched to collect all cursor tokens, then all subsequent pages are fetched in parallel (batch of 8), reducing per-window time by ~4×.
- **Bounded pass concurrency** (`PASS_CONCURRENCY = 15`) — limits simultaneous open HTTP connections to prevent OOM on large city scans.
- **Rate-limit retry logic** — blocked search windows are collected and retried once after 3 seconds; persistent failures are counted and logged.
- **`priceByMonth`** — monthly breakdown of avg/min/max nightly rate, deduplicated by check-in week to prevent inflation from overlapping 2n/5n/7n windows.
- **`priceSamples`** — number of distinct price points collected per listing; used to gate `pricingStrategy` reporting (requires ≥ 5 samples).
- **`weeklyDiscountPct` / `monthlyDiscountPct`** — percentage discount for 7-night and 28-night stays vs 2-night baseline.
- **`pricingStrategy`** — classifies listings as `fixed`, `dynamic`, `fixed-with-length-discounts`, or `dynamic-with-length-discounts` when ≥ 5 samples are available.
- **`isBaseline` flag** on price points — 2-night passes are the baseline for discount calculation; 5n/7n are supplementary.
- **`pricePerNight` fallback** — when Airbnb returns a "total" price qualifier without a per-night figure, divides by nights computed from URL check-in/checkout dates. Reduced "0-priced" listings from ~25% to <1%.
- **Fallback to all-price `basePrices`** — when a listing appears only in 5n/7n windows (never a 2n window), all samples are used for `priceSamples` rather than returning 0.
- **GPS coordinate extraction** (`lat`, `lng`) from search result JSON via recursive key search — output ready for mapping workflows.
- **Market Summary** printed to run log after city scans: listings priced, multi-date sample count, sample distribution, and average market price per calendar month.
- **`maxPages: 5`** cap on pages per search window — reduces proxy data transfer by ~4× vs previous `maxPages: 20`.

#### Changed

- Discovery engine rewritten from sequential windows to fully parallel bounded execution.
- `buildPriceRowFromSearch` (city scan mode) replaces Calendar API calls for search-discovered listings — Calendar API returned `null` prices via residential proxies in this context.
- ETA calculation now starts from the processing phase, not the start of the run, for more accurate time estimates.
- Log frequency made dynamic — less verbose for fast runs, more detailed for slow ones.

#### Fixed

- Calendar API enrichment for search-discovered listings reverted — resulted in `localPriceFormatted: null` via proxy; search-price samples are used instead.
- `priceByMonth` aggregation bias — listings appearing in multiple stay-length windows for the same week previously counted multiple times per month; deduplicated by `checkin` date.
- OOM (out-of-memory) on Apify cloud for large city scans — resolved by bounded pass concurrency and batched page fetching.
- JSON syntax error in `input_schema.json` (trailing comma) that blocked local runs.

#### Removed

- Bounding-box (bbox) enrichment for search listings — added per-listing targeted geo-searches, but the runtime cost (~60 extra min for Paris) outweighed the marginal sample gain. Removed in favour of wider stay-length passes.

***

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

#### Added

- Initial release of Airbnb Price Monitor
- City market scan via search URL
- Direct listing URL input for monitoring specific competitors or own properties
- Price stats per listing: avg, min, max, median nightly rate
- Full day-by-day `prices[]` array with `date`, `price`, `available`, `minNights` — calendar mode
- Auto-detection of currency from market location
- Three dataset views: `overview`, `flat-prices`, `full-export`
- Parallel fetch (10 concurrent) with progress % and ETA
- Retry with exponential backoff for 429 responses
- `RUN_LOG` key-value store record
- Proxy support via `proxyConfiguration` input field
