Airbnb Listings Scraper & Competitor Analysis
Pricing
from $2.00 / 1,000 listings
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
11 days ago
Last modified
Categories
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
nightlyPriceandtotalPricewith 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
| Field | Required | Description |
|---|---|---|
location | One market input | City, neighborhood, or region. Use this or searchUrl, not both. |
searchUrl | One market input | HTTPS Airbnb search-results URL used instead of location. |
checkIn | Yes | Future arrival date (YYYY-MM-DD) or relative date such as 30 days. |
checkOut | Yes | Departure date after check-in, absolute or relative. Dates are required because Airbnb prices are stay-specific. |
Guests and comparable filters
| Field | Required | Description |
|---|---|---|
adults | No | Adult guests; default 2. |
children | No | Child guests; default 0. |
infants | No | Infant guests; default 0. |
pets | No | Pets; default 0. |
bedrooms | No | Exact bedroom filter. Missing or different bedroom counts are excluded when set. |
roomTypes | No | Any of entire_place, private_room, shared_room, or hotel_room. |
priceMin | No | Minimum normalized nightly price in the selected currency. |
priceMax | No | Maximum normalized nightly price in the selected currency. |
currency | No | Requested ISO currency; default USD. |
maxResults | No | Unique listing cap from 1–240. The Store form starts at 30; the API default is 100. |
Benchmark and proxy
| Field | Required | Description |
|---|---|---|
targetListingUrl | No | Public Airbnb room URL to benchmark against the collected market. |
proxyConfiguration | No | Apify 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:
listing— one normalized listing plus pricing provenance and relative intelligence.target_benchmark— written only when a target URL is supplied and acquired successfully.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 asnightlyPriceSource: "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, andlongitude. Coordinates are present for essentially every listing.areaLabelisnullfor 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, andgeographicScope.areaLabelCoveragePercentreports how many listings carried a label.dominantAreaLabelSharePercentis a share of the labelled listings, not of all listings. - The market summary carries
geographicScopewith 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. limitationsgainsresults_include_nearby_areaswhenever more than one Airbnb area label is present, andresults_geographically_dispersedwhen 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
budgettopremium. - 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
geographicScopein the market summary and theareaLabel,latitude, andlongitudeon each listing before treating the statistics as a single-city market. - Search-card fields such as bedrooms, bathrooms, ratings, or reviews can be absent.
areaLabelandlocationarenullfor hotel-brand listings (see Geographic scope).roomTypeandguestsare 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. UsenormalizedPropertyType,bedrooms, andbeds.- 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.checkOutwithdateSource: "response", and excludes those rows from market pricing analysis with the reasonincompatible_stay_context. nightlyPriceandtotalPriceare 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
unavailableReasonsandlimitations. - 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.
