Airbnb Listings Scraper - Stays, Prices & Ratings avatar

Airbnb Listings Scraper - Stays, Prices & Ratings

Pricing

from $1.50 / 1,000 listings

Go to Apify Store
Airbnb Listings Scraper - Stays, Prices & Ratings

Airbnb Listings Scraper - Stays, Prices & Ratings

Scrape Airbnb vacation rentals by city across global markets. Extract stay prices, ratings, review counts, images, and listing URLs. Filter by room type, category tags, and property type for Excel, CSV, or JSON.

Pricing

from $1.50 / 1,000 listings

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

19 hours ago

Last modified

Share

Airbnb Listings Scraper — Stays, Prices & Ratings

Scrape Airbnb vacation rentals by destination across global storefronts — prices, ratings, images, listing URLs, public host identity, locality, and geo leads. No login, no Airbnb API key.

  • Search any city or destination on 90+ Airbnb market domains (www.airbnb.com, www.airbnb.jp, www.airbnb.co.uk, …)
  • Filter Stays by room type, category rail tags (Amazing views, Cabins, …), and property type
  • Export name, nightly/total price, currency, rating, review count, image, and URL to JSON, CSV, or Excel
  • Enrich a bounded number of rows from their public listing pages: host identity, locality, approximate geo, amenities, and optional reviews, policies, price breakdown, or host profile
  • Paste a filtered browser URL into startUrls when you need UI-only filters
  • Pay per event: $0.005 per run start + $2.00 per 1,000 results (platform usage included; Gold+ Store tiers $1.50 / 1,000)

Airbnb does not offer a public listings API for third-party apps. This Actor opens the same public Airbnb search pages people browse and returns structured rows you can schedule, webhook, or pipe into Sheets, Make, n8n, Zapier, and AI agents.


What does the Airbnb Listings Scraper do?

This Actor is an Airbnb scraper for Stays search results. Enter a destination (or paste search URLs), optionally pick a market/currency and filters, and get a clean dataset of vacation rental cards — ready for pricing research, competitive monitoring, or travel content workflows.

It is useful when you need:

  • Nightly and stay-total price snapshots for a city or neighborhood
  • Rating and review-count signals across competing listings
  • Multi-country storefront coverage (Japan, UK, Singapore, EU, …) with matching currency
  • Category-rail scans (Amazing views, Beachfront, Cabins, …) without hand-copying pages
  • An Airbnb API alternative for Excel / CSV / JSON pipelines

Who is it for?

Short-term rental hosts and property managers

  • Benchmark nightly rates against nearby stays
  • Watch new inventory and rating trends in your market

Real estate and market analysts

  • Compare supply and pricing across cities and Airbnb domains
  • Schedule recurring scrapes for time-series pricing

Travel product and content teams

  • Build destination pages and rental guides from structured stay data
  • Feed listings into CMS, BI, or affiliate workflows

Developers and data scientists

  • Automate Airbnb search extraction via Apify API, webhooks, or integrations
  • Combine with your own enrichment for dashboards and ML features

What data can you extract from Airbnb?

Each dataset item is one Airbnb stay. Search supplies the card-level fields; bounded listing-page enrichment adds public lead fields when available:

Data pointDescription
Listing name & URLStay title and canonical /rooms/… link
PriceAmount from the card's main price line (rows from detailUrls: the dated stay total); priceIsTotal identifies stay totals
Price qualifierCard text such as total, au total, or night, plus the dated stay's nights count
Total priceStay total when Airbnb shows one
CurrencyISO code from the card or your configured currency
Rating & reviewsGuest score and review count when shown; ratingText is the card's rating text, and on rows that read the listing page without card text, the page's overall rating line (e.g. Rated 4.53 out of 5 from 1,028 reviews.)
Property typeType line from the card or listing page (e.g. Entire rental unit in Paris, France); listing-page rows add Airbnb's room type code in roomType (ENTIRE_HOME, PRIVATE_ROOM, …)
LocationLocation line from the card when present
ImagePrimary card image URL
Market / domainStorefront used for the search
Filters appliedcategoryTag, roomTypesApplied, propertyTypeIdsApplied
AmenitiesAmenity names from the Detail page (enrichDetails)
Guest capacitypersonCapacity — maximum guests from Detail
Bedrooms / bedsbedrooms and beds counts from Detail
Guest favoriteisGuestFavorite badge flag from Detail
Descriptiondescription summary text from Detail
ReviewsPublic reviews, newest first, up to reviewsLimit; reviewCount holds the listing total. Reviews stay as a reviews list on the listing row and are charged with that row, not as separate rows
PoliciesCancellation policy and house rules when selected in detailExtras
Price breakdownTotal, original price before discount, itemized nights/fees/taxes, disclaimers, availability, and currency for your checkin/checkout; Airbnb shows no price without dates
Host profileWith hostProfile, the public host profile fills org: profile prompts, time hosting, verification date and types, listing count
Extra failuresdetailExtrasFailed lists extras that returned nothing, with the reason in detailExtrasErrors; the listing row is still saved

Searches with a placeId use Airbnb's app search API; other searches and startUrls read the data embedded in Airbnb's search page. With enrichDetails=true, the worker reads at most detailEnrichLimit public listing pages, and in a search only while row budget is left after the search rows: when the search rows already fill maxResults, no listing page is read and the run notes detailSkipped:rowBudget:<n>. The public host profile is read only when detailExtras includes hostProfile. It does not log in, send a message, or scrape private booking/contact data.

If Airbnb does not recognise the destination, it shows featured homes from elsewhere. The run then fails with a clear message instead of saving those unrelated homes. A recognised destination with no matching stays finishes as an empty, successful run.

Lead and contact fields

Every row contains the complete ten-key lead shape. Empty values remain explicit and are paired with a field-specific reason in leadAbsences.

FieldTypeAirbnb meaning
phones[{value, type, e164?}]Host phone numbers. Airbnb does not publish them before booking, so this is [] with not_on_platform.
emails[{value, type}]Host email addresses. Not published before booking: [] with not_on_platform.
address{street, unit, locality, region, postalCode, country, full}Listing location from the listing page: locality, country, and Airbnb's location line in full. Street and door number are not published before booking (address.street: not_on_platform).
geo{lat, lng, exact?} or nullSearch rows carry the card coordinate (exact: false). Rows that read the listing page use the page coordinates and its exact flag; the card coordinate stays when the page has none. exact: false means Airbnb blurred them to the neighbourhood.
personnullAirbnb shows a host display name (in org), not a separately named person: not_on_platform.
orgobject or nullHost identity from the listing page: name, profile id, profileUrl, picture, superhost and verified flags, response rate and time, rating, review count, years hosting, highlights.
web{website, socials[]}website is always null: an Airbnb profile is not a host website (the profile link is in org.profileUrl). Host social accounts are not published (not_on_platform); Airbnb's own footer accounts are never attributed to the host.
leadSourcestring enumdetail when the listing page was read; search when the row was not enriched.
leadRevealstring enumvisible when the listing page showed the host, locality, or coordinates; absent otherwise.
leadAbsencesobject/mapPer-field reason: not_on_platform when Airbnb does not publish the field on public pages, not_extracted when the listing page was read but the field was missing, not_verified when the listing page was not read (row beyond detailEnrichLimit, enrichDetails=false, or the request failed).

Reveal cost

  • enrichDetails defaults to true; detailEnrichLimit defaults to 3 and is capped at 10.
  • Each enriched row costs one public listing-page request. Each detailExtras entry adds one Airbnb API request per enriched row.
  • No phone/email reveal click is performed. Message host is a communication/login action, not a contact reveal control, and the Actor never submits it.
  • Rows outside the limit still keep all lead keys, with not_verified reasons.

Honest limitations

  • Airbnb withholds street, door number, host phone, host email, and host social accounts on public pre-booking pages. Those fields are not_on_platform, not a scraping gap.
  • Listing coordinates are usually approximate (geo.exact: false).
  • Help Contact and Message host are login/communication gates. The Actor does not log in, send messages, make bookings, or claim gated data is publicly available.
  • Rows whose listing page was not read use not_verified; that is not evidence that a field is absent on Airbnb.

More Actors like this

Need a similar travel or listings Actor? Start with these peers, then browse curated picks by category:

ActorBest for
Booking.com & Airbnb ScraperBooking.com + Airbnb stays, prices, and listing URLs
Booking.com Hotel ScraperHotels, prices, ratings, and availability on Booking.com
Agoda Hotel ScraperAgoda hotels with prices, ratings, and listing URLs
Trip.com Hotel ScraperTrip.com hotels, prices, and listing details
Expedia Hotel ScraperExpedia hotels and stay search data

Browse by category

See the full catalog in Related Actors below.

How to scrape Airbnb listings

  1. Open this Actor in Apify Console.
  2. Enter a destination (for example Osaka, London, Bali) or paste Airbnb search URLs into startUrls.
  3. Optionally set market, currency, dates, guests, room types, category tags, and property types.
  4. Keep the first run small (maxResults 5–20) to validate fields and cost.
  5. Click Start, then download JSON, CSV, or Excel.

Markets and storefronts

Pick a market code (or override domain / locale / currency). The Actor builds:

https://{host}/s/{destination}/homes?…&currency={currency}, with the destination in Airbnb's own form (Lyon, France → Lyon--France).

Examples: US, GB, JP, SG, DE, FR, AU, BR, CA, CA_FR, …

Language-specific hosts use dedicated codes (e.g. CA_FR → fr.airbnb.ca) so the input enum maps 1:1 to a domain. Requests leave from the market's country (US_ES and US both from the United States). domain accepts Airbnb storefront hosts only.


Stays filters

InputAirbnb paramNotes
roomTypesroom_types[]Entire home/apt, Private room, Shared room, Hotel room (OR)
categoryTagscategory_tagCategory rail (Amazing views → Tag:8536, …). Each tag runs a separate search; results merge and dedupe by listing URL
propertyTypeIdsproperty_type_id[]Cabin, House, Villa, … (labels or numeric IDs)
startUrls—Full search URLs from the Airbnb UI (best escape hatch for rare filters)
placeIdplace_idOptional Airbnb place id when you already have one

Multiple roomTypes / propertyTypeIds go on the same URL. Each categoryTag, startUrl, or detailUrl gets its own maxResults row allowance; the whole run still stops at your maximum total charge.


Input

FieldTypeDefaultDescription
destinationstring—City or place to search (required unless startUrls is set)
marketstringUSAirbnb storefront / market code
domainstring—Optional host override (e.g. www.airbnb.co.uk)
localestringmarket defaultStorefront language sent with HTTP requests
currencystringmarket defaultdisplay_currency (USD, EUR, JPY, …)
placeIdstring—Optional Airbnb place id
checkin / checkoutstring—YYYY-MM-DD trip dates for priced availability
adultsinteger2Guest count
roomTypesstring[][]Room type filters
categoryTagsstring[][]Category labels or Tag:id values
propertyTypeIds(string|integer)[][]Property type labels or IDs
startUrlsstring[] / {url}[][]Ready-made Airbnb search URLs
detailUrlsURL[][]Optional genuine Airbnb /rooms/{listingId} URLs; skips destination search and requires enrichDetails=true
enrichDetailsbooleantrueRead public listing pages for host, location, and amenity fields; in a search, skipped (noted detailSkipped:rowBudget) when the search rows already fill maxResults
detailEnrichLimitinteger3Maximum listing pages read per run, 1–10
reviewsLimitinteger0Reviews per enriched listing, 0–50; zero disables reviews unless detailExtras includes reviews (then up to 24)
detailExtrasstring[][]Optional detailApi, reviews, policies, priceBreakdown, hostProfile datasets
maxResultsinteger70Most rows for each destination, category tag, start URL, or detail URL (1–500). Values above 70 are collected in parts of 70; all row types count together, and the run stops at your maximum total charge.

Key-value store artifacts:

  • INPUT_ECHO — normalized public input
  • RUN_SUMMARY — query counts, scraped/pushed totals, billing stop flag
  • ERROR_SUMMARY — written on invalid input or scrape failure

Pricing

This Actor uses pay-per-event pricing. Platform usage costs are included — you do not pay separate Apify compute on top of the event prices below (User pays platform usage costs: No).

EventPrice
Actor Start (apify-actor-start)$0.005 per start
Result (apify-default-dataset-item)$2.00 / 1,000 listings ($0.002 each) on FREE–SILVER; $1.50 / 1,000 ($0.0015 each) on GOLD–DIAMOND

Every dataset row is billed as one result.

Store discount tiers

Tier$/1,000per result
FREE*$2.000$0.002
BRONZE$2.000$0.002
SILVER$2.000$0.002
GOLD$1.500$0.0015
PLATINUM$1.500$0.0015
DIAMOND$1.500$0.0015

*FREE is the list price before any Store volume discount. GOLD, PLATINUM, and DIAMOND pay $1.50 / 1,000.

Example cost estimates

ListingsFREE–SILVERGOLD–DIAMOND
20~$0.045~$0.035
1,000~$2.005~$1.505
10,000~$20.005~$15.005

*Assumes one Actor start plus the tier result price. Exact start billing can scale with allocated memory (one start event per GB, minimum one). This Actor defaults to 512 MB, so a typical run is one start event.

Set a Maximum charge per run in Console if you want a hard PPE budget ceiling — the Actor stops pushing when the remaining dataset-item budget is exhausted.


Free Apify plan limits (set by this Actor's developer)

LimitFree Apify planPaid Apify plan
Runs of this Actor10 runs totalUnlimited
Rows per runUp to 200Limited by your maximum total charge

When the run cap is hit, the run finishes with a clear status message — not an Apify platform error. Upgrade to a paid Apify plan for unlimited runs.

Tips for better Airbnb stay data

  • Start with maxResults 5–20 before city-wide runs.
  • Keep detailEnrichLimit small when you need lead enrichment without opening every listing Detail.
  • Leave dates empty for flexible search; set both check-in and check-out for trip-specific pricing.
  • Prefer one categoryTag first; multiple tags multiply search rounds.
  • If a category or property-type ID drifts, copy the filtered UI URL into startUrls.
  • Schedule weekly runs on the same destination to build a pricing time series.

FAQ

Can I scrape Airbnb without an API key or login?

Yes. The Actor uses public Airbnb search pages. You do not need an Airbnb developer key or account.

Does this scrape Experiences or Services?

No. Scope is Stays (/homes) only — room types, category rail, and property types.

Why did I get fewer listings than maxResults?

Airbnb availability, dates, filters, captchas, or empty markets can shrink the result set. Broaden the destination or clear dates and filters.

How do I get prices in JPY / EUR / GBP?

Set market (and/or currency) so the search uses display_currency. Card currency can still vary by locale; the Actor falls back to your configured currency when parsing.

Can I use my own Airbnb search URL?

Yes. Put one or more URLs in startUrls. Each URL can return up to maxResults rows; values above 70 are collected in parts of 70, and the whole run still stops at your maximum total charge.


Standby / Live View

  • GET / — service metadata
  • GET /health — health check
  • GET /input-example — sample input
  • GET /openapi.json — OpenAPI document

Standby is for live-view metadata. Use normal Actor runs for scraping.


Disclaimer

This Actor is not affiliated with Airbnb. Use it only on publicly available pages, respect Airbnb’s terms and applicable law, and keep request volume reasonable. You are responsible for how you use the data.

All 77 public Actors from [lentic_clockss]. Click a name to open the Store detail page.

Jobs & Freelance

Real Estate

E-commerce

Travel & Stays

Social & Content

Ads Intelligence

Local & Maps

General Tools

→ Browse the full profile: apify.com/lentic_clockss