# Changelog of Airbnb Host Portfolio · Listings by Profile (`corent1robert/airbnb-host-portfolio-scraper`) Actor

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

## Changelog

### 1.14 — 2026-09-07

#### Added

- **Actor Standby:** HTTP lookup `GET`/`POST /lookup` — **one** host profile (`hostUrl` / `hostProfileUrl` / `hostId` / `hostUrls`). Skips contact enrichment, full reviews, and listing-detail crawl. Host card + listings from the first profile HTML (max 5). Console **Start** still writes the dataset as before.
- OpenAPI spec for the Standby tab (`web_server_openapi.json`).

### 1.14 — 2026-09-01

#### Changed

- End-of-run log: next step back to Airbnb Pro Host (city search).
- Full-portfolio Beehive pages after the first HTML preview (~10 cards) now fetch remaining offsets in parallel (pool of 5). Listing-detail enrichment uses its own pool of 12 (was tied to host concurrency, hard-capped at 10). Default host concurrency 8 (was 5, hard cap 16). Full-review guest and host tabs fetch together.
- Console: input form names Pro Host as the source of `hostProfileUrl` and links the bulk Examples task.

### 1.13 — 2026-08-24

#### Changed

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

### 1.11 — 2026-08-19

#### Changed

- README **Also available** (Airbnb suite) at the top.

### 1.10 — 2026-08-17

#### Added

- README legality section (public profiles, GDPR).

### 1.9 — 2026-08-17

#### Added

- **Published tasks kit** — 4 Examples (single host, bulk from Pro Host, contact pull, full reviews).
- README: start-from-Pro-Host CTA and Examples table.

#### Changed

- Store categories: `LEAD_GENERATION` instead of `DATA_EXTRACTION` so the listing sits next to Pro Host.

### 1.8 — 2026-05-28

#### Added

- **Console:** **Fetch all profile reviews** and **Max reviews per tab** — expose existing full-review pagination without API-only JSON.
- README: profile reviews vs Listing Reviews Scraper table, updated cost examples.

### 1.7 — 2026-05-28

#### Changed

- **Billing:** single pay-per-result model — `Actor.pushData()` without custom event names. Matches Console pricing on `apify-default-dataset-item` (~$0.007/result). Removed `actor-start`, `host-portfolio-*`, and contact `chargeEvent` hooks (no unknown-event warnings).
- README Pricing section and Console input copy updated (contact merged into host row, not a separate charge).

### 1.6 — 2026-05-28

#### Changed

- **Console-minimal input:** Apify form shows only **host profile URLs** and optional **Pull business contact**. Full portfolio, listing rows, listing details, and review sample run by default via code — not exposed as toggles.
- README Input split into Console vs API-only fields.

### 1.5 — 2026-05-28

#### Added

- **Host CSV geo:** `cities` and `countries` on `output-hosts.csv` (semicolon-separated arrays).
- **Host overview view:** `cities` and `countries` columns in Apify Console.
- **README:** Typical fill rates, How it works pipeline, Performance and cost table, PPE Console setup checklist.
- **`npm run start:scale-lodgewell`** — scale smoke input (36 listings + 30 reviews per tab cap).

#### Changed

- **Run logs:** benefit-first startup (Active / Run limits), buyer-safe error lines, `Debug:` prefix when `verboseLogs` is ON.
- **Listing location parser:** English `for Rent in …` titles and filtered location subtitles (fixes bilingual title edge cases).
- **Review rows:** `reviewerCity`, `reviewerRegion`, `reviewerCountry` parsed from `reviewerLocation`.
- **Listing enrichment:** city / region / country on listing rows via the same listing-page fetch as room stats.
- **Console input schema:** benefit-first copy (no Beehive/API jargon); `verboseLogs` exposed under Advanced.

### 1.4 — 2026-05-28

#### Added

- **Review rows** (`includeReviewRows`, default ON): export profile reviews as `recordType: review` with `reviewSource: guest | host`.
  - **guest** = “De la part des voyageurs” (`RECEIVED_FROM_GUESTS`)
  - **host** = “De la part des hôtes” (`RECEIVED_FROM_HOSTS`)
- Embedded HTML sample (~5 reviews per tab) with no extra requests by default.
- **Full review pagination** (`includeFullReviews`) via `GetUserProfileReviewsQuery` API (10 reviews/page).
- `maxReviewsPerSource` cap when full pagination is enabled.
- Dataset view **Reviews**, local `output-reviews.csv`, PPE hook `host-portfolio-review`.

#### Internals

- Review API hash `1a522fcad9c8bf05249a26e79d9e2bc7dd4a82149e9e3265dc77edcd16096f6a`, variables `{ userId: base64(User:id), reviewsType, limit, offset }`.

### 1.3 — 2026-05-28

#### Added

- **Full portfolio pagination** (`includeFullPortfolio`, default ON): when profile HTML returns fewer listing cards than `listingCountReported`, the Actor paginates Airbnb's `UserProfileBeehiveListingQuery` GraphQL API (12 listings per page) and merges results with HTML cards.
- HTML listing cards keep richer fields (bedrooms, bathrooms) when IDs overlap; Beehive fills missing listings.

#### Changed

- Lodgewell-scale hosts (e.g. 36 reported) now return `extractionStatus: success` instead of `partial` when pagination succeeds.
- Run logs note pagination merge counts per host when verbose logging is enabled.

#### Internals

- Beehive persisted query hash `0bf3642fdce551c34013ff63d2920a08ca1fb2e41b72c4eb5715ef40368d719b`, variables `{ userId, limit, offset }`.
- Spike validated: `15782486` → 36/36, `192427142` → 3/3.

### 1.2 — 2026-05-28

#### Added

- Optional **business contact enrichment** (`includeContactEnrichment`): fetches one listing page per host via EU disclosure domain and extracts legal email, phone, address, and registry fields from `PROFESSIONAL_HOST_DETAILS` blocks.
- New host fields: `companyLegalName`, `companyEmail`, `companyPhone`, `companyAddress`, `companyRegister`, `companyRCS`, `emailDomain`, `contactStatus`, `contactSourceListingUrl`.
- Pay-per-event hook: `host-portfolio-contact` (charged only when email or phone is found).
- HTTP-only contact path reuses Pro Host extraction patterns (`proHostExtraction.js`).

#### Changed

- Run logs report contact outcome per host when enrichment is enabled.
- Host overview dataset view includes email, phone, and contact status columns.

### 1.1 — 2026-05-28

#### Added

- **Host qualification fields** from the same profile HTML request (no extra calls): `companyName`, `hostLocation`, `about` / `aboutShort`, `hasIdentityBadge`, `identityVerifiedSince`, `identityVerificationTypes`, `guestType`, `reviewsFromHostsCount`, `isServiceHost`, `isExperienceHost`, `profilePictureUrl`.
- Improved **`isProHost`** detection: work/company prompt, business verification badge, `BUSINESS_VERIFIED` prompt, and multi-listing heuristic (fixes false negatives for property managers when `showBusinessLabel` is null).
- Dataset **Host overview** view: company, location, verification, guest type, and bio snippet columns.
- Premium run log banners and per-host qualification hints in `RUN_LOG`.

#### Changed

- Local CSV export (`output-hosts.csv`) includes qualification columns.

### 1.0 — 2026-05-28

#### Added

- Initial release: bulk **Airbnb host profile URL** input (`/users/show/{id}`).
- **Host overview** rows: name, superhost / pro flags, reported vs returned listing counts, ratings, reviews, languages, listing URL list.
- **Listing rows** (default ON): title, room type, bedrooms, ratings, picture URL per listing card on the profile page.
- HTTP-only extraction from embedded **`UserProfileLegacyQuery`** Apollo payload (no browser, no proxy required in v1).
- Pay-per-event hooks: `actor-start`, `host-portfolio-summary`, `host-portfolio-listing`.
- `RUN_LOG` key-value store progress file.

#### Internals

- Profile HTML parser locates `UserProfileLegacyQuery:` → `",{"data":` JSON blob → `presentation.userProfileContainer.userProfile.managedListings`.
- Spike (2026-05-28): HTTP 200 without proxy on hosts `192427142` (3/3 listings), `15782486` (36/36 with Beehive pagination), `107434423` (3956 reported — pagination available, large PM runs may take longer).
- **Pagination (v1.3):** `UserProfileBeehiveListingQuery` via `/api/v3/` with offset/limit when HTML embeds ~10 cards but `managedListingsTotalCount` is higher.
- **Geo fields:** `city`, `country`, `cities`, `countries` are not present on profile listing cards — left null/empty in v1.

#### Known limitations

- **Very large portfolios** (thousands of listings) require many Beehive API pages — use `maxListingsPerHost` to cap output rows while still checking full counts when pagination completes.
- City/country per listing requires chaining [Airbnb Property Details Scraper](../airbnb-property-details-scraper).
- B2B contact enrichment belongs in [Airbnb Professional Host Scraper](../airbnb-professional-host-scraper).
