Airbnb Listings Scraper & Competitor Analysis avatar

Airbnb Listings Scraper & Competitor Analysis

Pricing

from $2.00 / 1,000 listings

Go to Apify Store
Airbnb Listings Scraper & Competitor Analysis

Airbnb Listings Scraper & Competitor Analysis

Scrape dated Airbnb listings, compare market prices, analyze competitors, and benchmark an optional target property against comparable listings.

Pricing

from $2.00 / 1,000 listings

Rating

0.0

(0)

Developer

Zapticx

Zapticx

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

11 days ago

Last modified

Share

Scrape Airbnb listings and turn them into practical competitor insights. Get normalized nightly and total pricing, comparable-market statistics, price positioning, confidence metrics, and optional target-listing benchmarking in one run.

This Actor combines Airbnb listings extraction with competitor and comparable analysis. It keeps observed source data separate from Actor-derived market intelligence, so you receive usable benchmarks without opaque claims about bookings, occupancy, or revenue.

What this Actor does

Airbnb search → comparable listings → normalized prices → market benchmark → optional target comparison

Provide a location or Airbnb search-results URL, exact stay dates, guest details, and optional comparable filters. The Actor collects up to 240 unique listings, preserves nightly-versus-total price semantics, scores eligible listings relative to relevant comparables, and writes a market summary after the listing records. Add a public Airbnb room URL to receive a target benchmark too.

Why use it?

Many Airbnb scrapers stop at rows of listing data. This Actor also answers practical questions:

  • What is the median nightly price for this exact stay?
  • Is a listing priced below, near, or above its comparable sample?
  • How large and specific was that sample?
  • Does the available data support low, medium, or high confidence?
  • How does one target listing compare with the market median and quartiles?

The methodology is deterministic and documented. Missing evidence stays null and includes reason codes instead of being guessed.

Target listing benchmarking

Add targetListingUrl to compare one listing with its best available collected segment. For example, a result might show: “My property is $114/night versus a $152 comparable median, approximately 25% below the market sample.” The output also reports quartiles, percentile, price position, review strength, value score when confidence permits, and sample quality.

If the target already appears in search results, the Actor reuses it. Otherwise it requests the public listing page once and reports whether reuse occurred.

Key features

  • Dated searches by location or Airbnb search-results URL
  • Normalized listing, property-type, rating, review, and pricing fields
  • Separate nightlyPrice and totalPrice with source provenance
  • Geographic scope reporting so widened Airbnb searches are visible, not hidden
  • Market median, P25, P75, distributions, and coverage
  • Tie-aware price percentile and price delta from the comparable median
  • Plain-language price position: budget, below market, market, above market, or premium
  • Transparent review strength and value score
  • Comparable tiers based on property category and bedrooms
  • Per-listing and market confidence with reason codes
  • Optional benchmark for one public target listing
  • Explicit limitations and transparent null handling
  • Apify datasets ready for JSON, CSV, Excel, APIs, and automation workflows

Who is it for?

Airbnb hosts, property managers, short-term rental analysts, investors doing comparable research, hospitality consultants, researchers, and agencies building market or client reports.

Common uses include dated rate benchmarking, competitor-set research, target-listing reviews, market snapshots, portfolio pricing checks, research datasets, and automated reporting pipelines.

Input

Market and stay

FieldRequiredDescription
locationOne market inputCity, neighborhood, or region. Use this or searchUrl, not both.
searchUrlOne market inputHTTPS Airbnb search-results URL used instead of location.
checkInYesFuture arrival date (YYYY-MM-DD) or relative date such as 30 days.
checkOutYesDeparture date after check-in, absolute or relative. Dates are required because Airbnb prices are stay-specific.

Guests and comparable filters

FieldRequiredDescription
adultsNoAdult guests; default 2.
childrenNoChild guests; default 0.
infantsNoInfant guests; default 0.
petsNoPets; default 0.
bedroomsNoExact bedroom filter. Missing or different bedroom counts are excluded when set.
roomTypesNoAny of entire_place, private_room, shared_room, or hotel_room.
priceMinNoMinimum normalized nightly price in the selected currency.
priceMaxNoMaximum normalized nightly price in the selected currency.
currencyNoRequested ISO currency; default USD.
maxResultsNoUnique listing cap from 1–240. The Store form starts at 30; the API default is 100.

Benchmark and proxy

FieldRequiredDescription
targetListingUrlNoPublic Airbnb room URL to benchmark against the collected market.
proxyConfigurationNoApify Proxy or custom proxy fallback. Direct access is attempted first.

Example inputs

Basic Miami market analysis

{
"location": "Miami Beach, United States",
"checkIn": "2027-03-10",
"checkOut": "2027-03-14",
"adults": 2,
"currency": "USD",
"maxResults": 100
}

Dubai one-bedroom market

{
"location": "Dubai, United Arab Emirates",
"checkIn": "2027-02-08",
"checkOut": "2027-02-12",
"adults": 2,
"bedrooms": 1,
"roomTypes": ["entire_place"],
"currency": "AED",
"maxResults": 100
}

Target listing benchmark

{
"location": "Miami Beach, United States",
"checkIn": "2027-03-10",
"checkOut": "2027-03-14",
"adults": 2,
"bedrooms": 1,
"currency": "USD",
"maxResults": 100,
"targetListingUrl": "https://www.airbnb.com/rooms/12345678"
}

Output

The default dataset contains three self-identifying record types:

  1. listing — one normalized listing plus pricing provenance and relative intelligence.
  2. target_benchmark — written only when a target URL is supplied and acquired successfully.
  3. market_summary — written last, with pricing, reviews, distributions, coverage, confidence, exclusions, and limitations.

Every field below is shown with its real observed value or an explicit null.

{
"recordType": "listing",
"listingId": "20746206",
"title": "Glorious 1 bed 1 Bath apartment near the Beach",
"listingUrl": "https://www.airbnb.com/rooms/20746206",
"areaLabel": "Ocean Front",
"location": "Ocean Front",
"roomType": null,
"guests": null,
"normalizedPropertyType": "condo",
"bedrooms": 1.0,
"beds": 1.0,
"bathrooms": 1.0,
"rating": 4.88,
"reviewCount": 232,
"latitude": 25.80356,
"longitude": -80.12639,
"pricing": {
"nightlyPrice": 110.25,
"totalPrice": 441.0,
"originalPrice": 653.0,
"currency": "USD",
"nights": 4,
"checkIn": "2026-10-15",
"checkOut": "2026-10-19",
"dateSource": "requested",
"displayedPriceType": "total",
"nightlyPriceSource": "derived_from_total",
"totalPriceSource": "response",
"currencySource": "requested"
},
"intelligence": {
"pricePercentile": 55.88,
"priceDeltaFromMedianPercent": 4.75,
"pricePosition": "market",
"reviewStrength": 88.95,
"valueScore": 71.02,
"comparableSampleSize": 17,
"marketComparableSampleSize": 20,
"comparableTier": "bedrooms",
"confidence": "medium",
"unavailableReasons": []
}
}

What the price fields mean

Airbnb's dated search results display a stay total, not a nightly rate. Every row therefore reports:

  • totalPrice — the stay total exactly as Airbnb displayed it (totalPriceSource: "response").
  • nightlyPrice — derived: totalPrice ÷ nights, recorded as nightlyPriceSource: "derived_from_total".
  • nights, checkIn, checkOut, dateSource — the stay the price actually refers to.
  • originalPrice — Airbnb's struck-through price when a discount is shown.

nightlyPrice is an average per-night figure for the stay Airbnb quoted. It is not a booking quote and not a host's advertised list rate.

What the displayed total contains. Airbnb publishes a price breakdown alongside each search result. Across 202 live listings checked in two markets and two currencies (Miami Beach in USD, Barcelona in EUR), every breakdown decomposed into exactly two kinds of line: N nights × <rate>, and, where applicable, a discount (Early booking discount, Long stay discount, Special offer) followed by Price after discount. No cleaning fee, Airbnb service fee, or tax line appeared in any of them.

So the displayed total is the accommodation subtotal for the stay after discounts, and before cleaning fees, service fees and taxes. nightlyPrice is therefore a discount-adjusted nightly accommodation rate excluding fees and taxes, which is a consistent basis for comparing listings with each other. The amount a guest finally pays at checkout will be higher.

No fee or tax fields are emitted because Airbnb's public search response does not contain them. This composition is Airbnb's behaviour, not a guarantee from this Actor: Airbnb can change what its search total includes, and fee or tax display can vary by market and by regulation. Always read totalPrice as "what Airbnb displayed for this stay".

Geographic scope

Airbnb decides the search radius. When a market has little matching inventory — often because of a bedroom, price, or room-type filter — Airbnb returns listings from surrounding areas. The Actor makes this visible instead of presenting it as a single-city market:

  • Each listing carries areaLabel (Airbnb's own <type> in <area> wording), latitude, and longitude. Coordinates are present for essentially every listing. areaLabel is null for hotel-brand listings, whose Airbnb title is the hotel name (for example "Pullman Miami Airport") rather than an area; the Actor leaves those null instead of guessing, and geographicScope.areaLabelCoveragePercent reports how many listings carried a label. dominantAreaLabelSharePercent is a share of the labelled listings, not of all listings.
  • The market summary carries geographicScope with coordinate bounds, the centroid of the delivered listings, median/P90/max distance from that centroid, counts beyond 15 km and 25 km, and the full distribution of Airbnb area labels.
  • limitations gains results_include_nearby_areas whenever more than one Airbnb area label is present, and results_geographically_dispersed when the P90 distance exceeds 12 km or the maximum exceeds 25 km.

The Actor does not geocode the requested location and does not check municipal boundaries. Distances are measured from the centroid of the delivered listings, which is the only reference point available without geocoding. geographicScope therefore describes how widely the sample spreads — it does not assert that any listing is inside or outside the requested city. resolvedLocation stays null because Airbnb does not return a canonical resolved place name in this response.

Understanding the intelligence

  • Price percentile shows the listing's midpoint rank from 0 to 100 within its selected comparable sample. Lower means less expensive.
  • Price delta from median shows the money and percentage difference from that sample's median.
  • Price position maps percentile bands to a readable label from budget to premium.
  • Review strength combines observed rating quality with review volume relative to the market.
  • Value score combines review strength and relative affordability. It is a transparent ranking signal—not a revenue, occupancy, or return forecast.
  • Comparable tier says exactly how the sample was selected.
  • Confidence summarizes sample size, segmentation, and coverage. Reason codes explain every label and unavailable metric.
  • Comparable sample size is the size of this listing's comparable set. Market comparable sample size is how many listings qualified market-wide. When a listing is excluded from price comparison — for example because Airbnb quoted it on a different stay window — its reasons say exactly that (listing_excluded_from_price_comparison, incompatible_stay_context) rather than implying the market was too small.

Methodology in brief

Price percentile uses a tie-aware midpoint rank: 100 × (prices below + 0.5 × equal prices) / sample size. Price delta is the subject nightly price minus the comparable median; the percent form divides that delta by a positive median. Price-position bands are 0–20 budget, above 20–40 below market, above 40–60 market, above 60–80 above market, and above 80 premium.

Review strength is 70% rating quality above 4.0 and 30% log-scaled review volume relative to the market review-count P95, clamped to 0–100. Value score is 60% review strength plus 40% relative affordability (100 - pricePercentile), also clamped to 0–100. It is suppressed at low or insufficient confidence. Monetary values are rounded to the currency's normal precision (two decimals for most currencies, zero for JPY, KRW, CLP, and VND) before any statistic is computed, so the market summary reconciles exactly against the emitted listing rows.

How comparable listings are selected

The Actor tries the most specific viable segment first:

category + exact bedrooms → category → exact bedrooms → broader dated market

Each tier needs at least eight eligible records. The target is excluded from its own sample. Price-relative metrics are suppressed below eight comparables. Value score is more conservative: it is suppressed at low or insufficient confidence.

Market summary

The final market_summary includes minimum, maximum, average, median, P25, and P75 prices; rating and review summaries; price, bedroom, and property-type distributions; coverage rates; duplicates removed; truncation; comparison quality; exclusion reasons; and limitations.

Median and quartiles describe the collected eligible sample—not the entire Airbnb market.

Data quality and limitations

  • Results are a collected Airbnb search sample, not complete market coverage.
  • Airbnb may include nearby areas when local inventory is limited. Restrictive filters make this more likely. The Actor never overrides Airbnb's search radius; it reports what came back. Check geographicScope in the market summary and the areaLabel, latitude, and longitude on each listing before treating the statistics as a single-city market.
  • Search-card fields such as bedrooms, bathrooms, ratings, or reviews can be absent.
  • areaLabel and location are null for hotel-brand listings (see Geographic scope).
  • roomType and guests are always null: current Airbnb search responses do not contain a room-type category or a guest capacity. They remain in the schema for backward compatibility only. Use normalizedPropertyType, bedrooms, and beds.
  • Prices are tied to the dates returned by Airbnb. In some cases Airbnb substitutes a different stay window for a listing; the Actor records that row's actual dates in pricing.checkIn/pricing.checkOut with dateSource: "response", and excludes those rows from market pricing analysis with the reason incompatible_stay_context.
  • nightlyPrice and totalPrice are distinct; provenance fields explain observed or derived use.
  • Currency is never inferred from a symbol such as $ alone.
  • Confidence and comparable sample size should accompany every interpretation.
  • Null metrics mean evidence was missing or quality rules suppressed the calculation; inspect unavailableReasons and limitations.
  • The Actor does not claim known bookings, occupancy, revenue, returns, or official Airbnb metrics.
  • Airbnb can change public response structures; resilient parsing, retries, and quality reporting reduce but cannot eliminate that dependency.

Integrations

Use Apify dataset exports and APIs with Make, n8n, Zapier, Google Sheets, Airtable, webhooks, or custom Python and JavaScript workflows. These integrations consume normal Apify datasets; no separate proprietary dashboard is required.

Performance

Measured on the current build at 256 MB: 30 listings in 7.4 s (61 MB peak), 60 listings in 11.8 s (70 MB peak), 25 listings in 8.3 s (54 MB peak). A heavily filtered 20-listing search took 23.2 s. No proxy traffic was required in any of these runs. Actual duration and network usage vary by market, response size, retries, target acquisition, and Airbnb availability. Direct HTTP is attempted first; a configured proxy is a retry fallback.

Pricing

Pricing: $2 per 1,000 successfully returned Airbnb listings, plus a minimal Actor-start charge. Market summaries and target benchmarks are included at no additional event charge.

  • 100 listings: approximately $0.20 total ($0.00005 Actor start + 100 × $0.002)
  • 240 listings: approximately $0.48 total ($0.00005 Actor start + 240 × $0.002)

FAQ

Are check-in and check-out dates required?

Yes. Airbnb pricing changes by stay, and one exact date range is necessary for a meaningful nightly and total-price comparison.

Is nightly price the same as total price?

No. Airbnb's dated search shows a stay total, so totalPrice is the observed figure and nightlyPrice is derived as totalPrice ÷ nights with nightlyPriceSource: "derived_from_total". That derived figure is an average per-night cost for the stay Airbnb quoted — not a host's advertised base nightly rate. See "What the price fields mean".

Does a percentile of 20 mean 20% cheaper than the median?

No. Percentile is a rank. Use priceDeltaFromMedianPercent for the percentage price difference.

Why is value score null?

It requires both price percentile and review strength, and it is deliberately suppressed when comparison confidence is low or insufficient.

Can I benchmark a listing outside the search results?

Yes. Supply its public Airbnb room URL. The Actor will attempt one additional target-page request when the listing was not collected in search.

Why are some listings outside the city I asked for?

Airbnb widens its own search radius when a market has little matching inventory, which is common with a bedroom or price filter. The Actor does not change that behaviour, but it does report it: see geographicScope in the market summary, areaLabel on each listing, and the results_include_nearby_areas limitation.

Why are roomType and guests always empty?

Current Airbnb search responses do not include a room-type category or a guest capacity. Rather than guess them from the requested input or from marketing text, the Actor leaves them null and documents them as unavailable. Use normalizedPropertyType, bedrooms, and beds instead.

What happens if a search returns nothing?

The run succeeds and writes a market summary with zero listings and a status message. No listing events are charged. Airbnb returns an empty search page both for a genuinely empty market and for a destination it did not recognize, and the Actor cannot tell those two cases apart from the response, so the message says so rather than guessing.

Does this estimate occupancy or revenue?

No. It reports observed public listing data and deterministic comparative metrics only.

Can I search without dates?

No. Required dates are a V1 quality rule that prevents mixing ambiguous price contexts.

How many listings should I request?

Eight eligible comparables is the minimum for price-relative metrics, and Airbnb's stay-window substitutions typically remove a further 10–25% of a sample, so very small runs can leave nothing to compare. The Store form therefore starts at 30, which reliably clears that floor for about $0.06. The API default is 100 and 240 is the V1 cap. Larger samples generally improve coverage and confidence.