Airbnb Host Portfolio Scraper · Map Host Listings avatar

Airbnb Host Portfolio Scraper · Map Host Listings

Pricing

from $5.49 / 1,000 results

Go to Apify Store
Airbnb Host Portfolio Scraper · Map Host Listings

Airbnb Host Portfolio Scraper · Map Host Listings

Paste Airbnb host profile URLs and map each host's portfolio — listing count, ratings, superhost flags, and export-ready listing rows. No login. No API key.

Pricing

from $5.49 / 1,000 results

Rating

0.0

(0)

Developer

Corentin Robert

Corentin Robert

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

3 days ago

Last modified

Share

Airbnb Host Portfolio Scraper

Paste Airbnb host profile URLs and map each host's portfolio — listing counts, ratings, superhost flags, and export-ready listing rows for STR research and outbound.

No login. No API key. No Airbnb account.

Who is this for?

You are…Typical goalSuggested setup
STR outbound / SDR teamSize a host before cold outreachDiscover with Airbnb Pro Host Scraper, then paste hostProfileUrl here
Conciergerie / PM operatorBenchmark competitor portfolio depthBulk 10–50 profile URLs; keep Include listing rows ON
Market analystCount listings and average ratings by hostHost overview view; filter extractionStatus; use cities / countries on host rows
Reputation / review researchSample guest sentiment before full review exportKeep Include review rows ON; enable Fetch all profile reviews for complete history
Investor / acquisition scoutShortlist multi-listing operatorsCombine with Pro Host city search → Portfolio bulk → Pro Host contact pull

What you get by default: host name, company/work label, location, bio snippet, verification flags, reported listing count, returned listing cards, host rating, review count, superhost / pro flags, languages, canonical listing URLs, listing rows with city / region / country (when detail enrichment is ON), and a review sample (~5 per tab).

When counts differ: With Fetch full portfolio ON (default), the Actor keeps loading until the reported listing total is reached when the profile page only shows a preview. Disable includeFullPortfolio to skip via API (see Input). For amenities, pricing, calendar, and GPS, chain listing URLs to the Airbnb Property Details Scraper.

Part of the Airbnb Actors suite — see linked Actors below for discovery, listing depth, and review export.

What you get

Host row (recordType: host)

FieldDescription
hostId, hostProfileUrl, hostNameHost identity
profilePictureUrlAvatar from profile
companyNameWork / company label from profile prompts
companyLegalName, companyEmail, companyPhone, companyAddress, companyRegister, companyRCSLegal business contact (optional — see Pull business contact input)
emailDomain, contactStatus, contactSourceListingUrlContact metadata when enrichment is enabled
hostLocationLocation from profile or prompts
about, aboutShortFull bio and 300-char export snippet
listingCountListings returned in this run
listingCountReportedTotal shown on Airbnb profile
averageRating, totalReviews, reviewsFromHostsCountHost-level reputation
isProHost, isSuperhost, hasBusinessBadgeTrust flags (isProHost uses work label, business badge, and multi-listing heuristics)
hasIdentityBadge, identityVerifiedSince, identityVerificationTypesIdentity verification
guestType, isServiceHost, isExperienceHostHost program flags
yearsHosting, languagesHost metadata
cities, countriesUnique cities and countries from enriched listing rows
listingUrlsRoom URLs for downstream scrapers
extractionStatussuccess, partial, or failed

Listing row (recordType: listing)

FieldDescription
listingId, listingUrl, titleListing identity
city, region, countryListing location (filled when Fill bedrooms, bathrooms, beds, and location is ON)
rating, reviewCountListing reputation
roomType, propertyType, bedrooms, bathrooms, bedsProperty summary
pictureUrl, isSuperhostListingCard metadata

Review row (recordType: review)

FieldDescription
reviewSourceguest (from travelers about this host) or host (from other hosts when profile user was a guest)
rating, comment, commentTranslated, commentLanguage, createdAtReview content
reviewerName, reviewerLocation, reviewerCity, reviewerRegion, reviewerCountry, reviewerIsSuperhostWho wrote the review — location is the reviewer's city, not the listing
listingUrlLinked listing when present on the review

Review location vs listing location: reviewerLocation (e.g. Olympia, Washington) is where the guest lives. Listing geo lives on listing rows (city, region, country).

Typical fill rates

Honest coverage from a reference run (May 2026): 2 public hosts — Sylviane (FR, 3 listings) and Lodgewell (US PM, 36 listings). Input: default options with Fetch full portfolio, Fill bedrooms, bathrooms, beds, and location, Include review rows, and Pull business contact ON.

AreaField / outcomeTypical fillNotes
HosthostName, listingCountReported, ratings100%From profile HTML
HostFull portfolio (listingCount = reported)100%3/3 and 36/36 in reference run
HosthostLocation (profile)~50%Depends on what the host filled in
HostcompanyName / work label~100%Both reference hosts had a label
HostBusiness email or phone (contact ON)~50%1/2 in reference run — FR legal block found; US PM row empty
Hostcities / countries (aggregated)100% when listing details ONHost row + CSV — e.g. 1 city / FR vs 7 cities / US for Lodgewell
Listingtitle, roomType, beds / bedrooms / bathrooms100%39/39 with detail enrichment ON
Listingcity, region, country~100%39/39 after listing-page enrichment — not on profile cards alone
Listingrating, reviewCount~95%Empty when Airbnb shows 0 reviews on new listings
Review samplecomment100%Embedded ~5 guest + ~5 host reviews per profile (when present)
Review samplereviewerLocation (+ parsed city/region)~65–70%10/15 in reference run — many guests hide location
Review samplelistingUrl on review row~0%Profile review cards rarely expose a listing link

How options change these numbers:

  • Fetch full portfolio OFF — large PMs often stop at ~10 listing rows → extractionStatus: partial.
  • Fill bedrooms… OFFbedrooms / beds may stay empty on Beehive-only cards; no listing geo.
  • Pull business contact OFFcompanyEmail / companyPhone stay empty (no extra fetch).
  • Fetch all profile reviews ON — review row count scales to full history (e.g. 7,520 guest reviews for Lodgewell); fill rates for reviewerLocation stay similar, sample bias drops.

Local output-hosts.csv now includes cities and countries (semicolon-separated). For array fields in the Apify dataset JSON, use the Host overview view.

How it works

  1. Parse input — normalize host profile URLs or numeric IDs.
  2. Load each profile — one HTTP request per host; extract host qualification fields and embedded listing cards + review samples from public profile HTML.
  3. Expand portfolio (optional, default ON) — when the profile preview shows fewer listings than reported, keep loading until the full list is returned.
  4. Enrich listing details (optional, default ON) — for each listing missing rooms or geo, open the public listing page once and fill bedrooms, bathrooms, beds, city, region, and country.
  5. Business contact (optional) — one listing page per host on the EU disclosure domain for legal email and phone.
  6. Reviews (optional) — save embedded samples (~5 per tab) or paginate all guest/host profile reviews when enabled.
  7. Export — host summary row, listing rows, review rows to the Apify dataset (and local CSV when running offline).

All steps are HTTP-only — no browser, no Airbnb login.

Performance and cost

Reference timings on a 36-listing US PM (Lodgewell, May 2026, local run, 1024 MB class):

ScenarioHostsListing rowsReview rowsWall timeNotes
Default sample23915 (embedded)~14–16 sFull portfolio + listing details + review sample
Lodgewell scale13643 (30 guest + 13 host, capped)~16 sincludeFullReviews ON, maxReviewsPerSource: 30 — measured May 2026
Full guest history1367,520+ guest10–30+ minNot recommended without maxReviewsPerSource; use review sample for qualification

Compute: defaultRunOptions.memoryMbytes: 1024 in actor.json — sufficient for parallel host batches (≤10) and listing detail enrichment (≤10 concurrent listing fetches).

Airbnb Actors suite (Outreacher / corent1robert)

Five Actors cover the STR outbound stack — from city discovery to full listing and review export. All built by corent1robert on Apify.

StepActorApify linkBest for
1 — Discover hostsAirbnb Pro Host Business Email ScraperStore →City search, pro host contacts (email, phone, company, RCS/SIRET), hostProfileUrl in export
2 — Size portfoliosAirbnb Host Portfolio Scraper (this Actor)Console → · Store →Paste profile URLs → listing count, geo, room counts, review sample, optional business contact
3 — Full listing rowsAirbnb Property Details ScraperStore →30+ fields per listing: amenities, GPS, photos, pricing context, host card
4 — Atypical / niche staysAirbnb Atypical Stays ScraperStore →Castles, treehouses, boats… city + category filters, same depth as Property Details
5 — All guest reviewsAirbnb Reviews ScraperStore →Every review on a listing URL — rating, comment, date, host reply
  1. Discover — run Pro Host Scraper on a city; export hostProfileUrl.
  2. Qualify — run this Actor on those URLs; sort by listingCountReported, cities, isProHost.
  3. Contact — enable Pull business contact here, or use emails already from Pro Host.
  4. Deep-dive — pass listingUrl values to Property Details or Reviews.

Reviews on this Actor vs Reviews Scraper: default run saves a profile review sample (~5 guest). Enable Fetch all profile reviews in Console for the full host history. For every review on one listing, use Airbnb Reviews Scraper.

Also from the same developer

ActorLink
Booking Pro Host Scraperapify.com/corent1robert/booking-pro-host-scraper

Quick Start

  1. Open the Actor in Apify Console.
  2. Paste one or more host profile URLs (https://www.airbnb.com/users/show/{id}).
  3. Click Start — paste URLs, optionally enable Fetch all profile reviews or Pull business contact. Everything else runs with smart defaults.
  4. Open Host overview, Listings, or Reviews dataset views.

Input

Console (Apify UI)

FieldDefaultDescription
hostProfileUrls1 sample URLBulk list of profile URLs
includeFullReviewsfalsePaginate all profile reviews (guest tab + host tab). Off = ~5 guest review sample
maxReviewsPerSource0Cap per tab when full reviews ON (0 = no cap)
includeContactEnrichmentfalseBusiness email and phone on the host row (no extra result row)

Included automatically (no toggle in Console)

FieldDefaultWhat it does
includeListingRowstrueOne dataset row per listing
includeFullPortfoliotrueFull portfolio when profile preview is incomplete
includeListingRoomStatstrueBedrooms, bathrooms, beds, city, region, country
includeReviewRowstrueReview rows ON — sample or full depending on includeFullReviews
maxConcurrency5Parallel host fetches
maxHosts0No host cap
verboseLogsfalseClean run logs

API-only fields (JSON / API runs)

Pass these in input JSON when you need to override defaults — they are not shown in the Console form.

FieldDefaultDescription
hostIdsNumeric host IDs (built into profile URLs)
includeListingRowstrueTurn OFF for host-summary-only export
includeFullPortfoliotrueTurn OFF for ~10-card HTML preview only
includeListingRoomStatstrueTurn OFF to skip per-listing page fetches
includeReviewRowstrueTurn OFF to skip all review rows
maxListingsPerHost0Cap listing rows per host (0 = no cap)
maxConcurrency5Parallel hosts (1–10)
maxHosts0Cap hosts processed (0 = no cap)
disclosureDomainairbnb.frTLD for legal contact block (EU disclosure)
verboseLogsfalseDebug lines in run log

Example JSON — Console-equivalent (full profile reviews, capped)

{
"hostProfileUrls": ["https://www.airbnb.com/users/show/15782486"],
"includeFullReviews": true,
"maxReviewsPerSource": 30
}

Example JSON — full outbound (API)

{
"hostProfileUrls": ["https://www.airbnb.com/users/show/15782486"],
"includeContactEnrichment": true,
"includeFullReviews": true,
"maxReviewsPerSource": 30
}

Output sample

Host summary row:

{
"recordType": "host",
"hostId": "15782486",
"hostName": "Lodgewell",
"listingCount": 36,
"listingCountReported": 36,
"averageRating": 4.8,
"totalReviews": 7520,
"isProHost": true,
"isSuperhost": true,
"cities": ["Austin", "Marble Falls", "West Lake Hills"],
"countries": ["United States"],
"extractionStatus": "success"
}

Listing row (with detail enrichment):

{
"recordType": "listing",
"hostName": "Lodgewell",
"listingId": "24038356",
"title": "The Shorewood | Dog-Friendly Lake Retreat",
"city": "Marble Falls",
"region": "Texas",
"country": "United States",
"bedrooms": 4,
"bathrooms": 3,
"beds": 8,
"rating": 4.66,
"reviewCount": 83
}

Review row (reviewer location ≠ listing location):

{
"recordType": "review",
"reviewSource": "guest",
"rating": 5,
"reviewerName": "Carmen",
"reviewerLocation": "Austin, TX",
"reviewerCity": "Austin",
"reviewerRegion": "TX",
"comment": "This place is absolutely beautiful..."
}

Limitations

  • Very large portfolios: hosts with thousands of listings take longer when the full portfolio and listing detail enrichment are both ON — use maxListingsPerHost to cap exported rows.
  • Listing location: city / region / country come from public listing page metadata, not the profile card. A small share of titles may parse imperfectly; verify critical rows against listingUrl.
  • Review sample vs full export: default run saves ~5 guest reviews embedded on the profile. Enable Fetch all profile reviews in Console for paginated history (use Max reviews per tab to cap cost on large hosts).
  • Public profiles only: private or restricted hosts may fail with extractionStatus: failed.
  • Contacts are optional: enable Pull business contact for legal email and phone from one listing per host. Hard cases (browser modal) still belong in Airbnb Pro Host Scraper.

Pricing (pay-per-result)

Each row saved to the dataset is one result (apify-default-dataset-item). On the Store, results are billed at about $0.007 each (Bronze tier ~$0.00699).

Row typerecordTypeWhen saved
Host summaryhostOne per profile URL (includes contact fields when that option is ON — no extra row)
ListinglistingOne per listing when listing rows are ON (default)
ReviewreviewOne per review when review export is ON (default: sample)

Reviews on this Actor vs Reviews Scraper

This Actor — profile reviewsAirbnb Reviews Scraper
InputHost profile URLListing URL
Default~5 guest review sampleAll listing reviews
Full modeEnable Fetch all profile reviews in ConsoleAlways full export
Best forHost reputation before outreachDeep dive on one property

Examples (at $0.007/result):

  • Qualify only — 20 hosts, listing rows OFF, reviews OFF → 20 results ≈ $0.14
  • Standard run — 1 host, 36 listings, 5 review sample rows → 42 results ≈ $0.29
  • Full profile reviews (capped) — 1 host, 36 listings, 30 guest + 13 host reviews → 80 results ≈ $0.56
  • Outbound — 20 hosts + contacts ON, listing rows OFF → 20 results ≈ $0.14 (contact on host row)

Configure Pay per event in Console with a single priced event: apify-default-dataset-item. No custom event names in code — no unknown-event warnings.

Actor ID (dev): ylqefCXcCvaEHdatW · Full Airbnb suite

Local development

cd airbnb-host-portfolio-scraper
npm install
cp input.json storage/key_value_stores/default/INPUT.json
npm start

After a local run, open:

  • output-hosts.csv — one row per host (counts, ratings, flags, cities/countries)
  • output-listings.csv — one row per listing (when includeListingRows is ON)
  • output-reviews.csv — one row per review (when includeReviewRows is ON)

All CSVs are UTF-8 with BOM for Excel. On Apify Cloud, use the Host overview, Listings, and Reviews dataset views instead.

Local input: apify run validates storage/key_value_stores/default/INPUT.json against the Console schema. Keep that file complete, or pass --input-file=./input.json. Simulated KV input overwrites overlapping keys from repo-root input.json.

Run tests:

npm test
# Scale smoke — Lodgewell only, 30 reviews per tab (timed run for perf docs)
npm run start:scale-lodgewell

Support

Questions or custom workflows: corentin@outreacher.fr