Airbnb Listings Scraper - Stays, Prices & Ratings
Pricing
from $1.50 / 1,000 listings
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
19 hours ago
Last modified
Categories
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
startUrlswhen 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 point | Description |
|---|---|
| Listing name & URL | Stay title and canonical /rooms/… link |
| Price | Amount from the card's main price line (rows from detailUrls: the dated stay total); priceIsTotal identifies stay totals |
| Price qualifier | Card text such as total, au total, or night, plus the dated stay's nights count |
| Total price | Stay total when Airbnb shows one |
| Currency | ISO code from the card or your configured currency |
| Rating & reviews | Guest 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 type | Type 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, …) |
| Location | Location line from the card when present |
| Image | Primary card image URL |
| Market / domain | Storefront used for the search |
| Filters applied | categoryTag, roomTypesApplied, propertyTypeIdsApplied |
| Amenities | Amenity names from the Detail page (enrichDetails) |
| Guest capacity | personCapacity — maximum guests from Detail |
| Bedrooms / beds | bedrooms and beds counts from Detail |
| Guest favorite | isGuestFavorite badge flag from Detail |
| Description | description summary text from Detail |
| Reviews | Public 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 |
| Policies | Cancellation policy and house rules when selected in detailExtras |
| Price breakdown | Total, original price before discount, itemized nights/fees/taxes, disclaimers, availability, and currency for your checkin/checkout; Airbnb shows no price without dates |
| Host profile | With hostProfile, the public host profile fills org: profile prompts, time hosting, verification date and types, listing count |
| Extra failures | detailExtrasFailed lists extras that returned nothing, with the reason in detailExtrasErrors; the listing row is still saved |
Searches with a
placeIduse Airbnb's app search API; other searches andstartUrlsread the data embedded in Airbnb's search page. WithenrichDetails=true, the worker reads at mostdetailEnrichLimitpublic listing pages, and in a search only while row budget is left after the search rows: when the search rows already fillmaxResults, no listing page is read and the run notesdetailSkipped:rowBudget:<n>. The public host profile is read only whendetailExtrasincludeshostProfile. 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.
| Field | Type | Airbnb 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 null | Search 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. |
person | null | Airbnb shows a host display name (in org), not a separately named person: not_on_platform. |
org | object or null | Host 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. |
leadSource | string enum | detail when the listing page was read; search when the row was not enriched. |
leadReveal | string enum | visible when the listing page showed the host, locality, or coordinates; absent otherwise. |
leadAbsences | object/map | Per-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
enrichDetailsdefaults totrue;detailEnrichLimitdefaults to3and is capped at10.- Each enriched row costs one public listing-page request. Each
detailExtrasentry adds one Airbnb API request per enriched row. - No phone/email reveal click is performed.
Message hostis 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_verifiedreasons.
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 hostare 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:
| Actor | Best for |
|---|---|
| Booking.com & Airbnb Scraper | Booking.com + Airbnb stays, prices, and listing URLs |
| Booking.com Hotel Scraper | Hotels, prices, ratings, and availability on Booking.com |
| Agoda Hotel Scraper | Agoda hotels with prices, ratings, and listing URLs |
| Trip.com Hotel Scraper | Trip.com hotels, prices, and listing details |
| Expedia Hotel Scraper | Expedia hotels and stay search data |
Browse by category
- Travel: Agoda Hotel Scraper · Trip.com Hotel Scraper · Hotels.com Scraper
- Real estate: Zillow Group Scraper · Realtor.com Scraper · Redfin Scraper
- E-commerce: Amazon Product Scraper · Walmart Product Scraper · eBay Product Scraper
- Jobs: Indeed Job Scraper · LinkedIn Jobs Scraper · Glassdoor Jobs Scraper
- Universal: Stealth Web Scraper · Universal Web Scraper
See the full catalog in Related Actors below.
How to scrape Airbnb listings
- Open this Actor in Apify Console.
- Enter a destination (for example
Osaka,London,Bali) or paste Airbnb search URLs intostartUrls. - Optionally set market, currency, dates, guests, room types, category tags, and property types.
- Keep the first run small (
maxResults5–20) to validate fields and cost. - 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?…¤cy={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
| Input | Airbnb param | Notes |
|---|---|---|
roomTypes | room_types[] | Entire home/apt, Private room, Shared room, Hotel room (OR) |
categoryTags | category_tag | Category rail (Amazing views → Tag:8536, …). Each tag runs a separate search; results merge and dedupe by listing URL |
propertyTypeIds | property_type_id[] | Cabin, House, Villa, … (labels or numeric IDs) |
startUrls | — | Full search URLs from the Airbnb UI (best escape hatch for rare filters) |
placeId | place_id | Optional 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
| Field | Type | Default | Description |
|---|---|---|---|
destination | string | — | City or place to search (required unless startUrls is set) |
market | string | US | Airbnb storefront / market code |
domain | string | — | Optional host override (e.g. www.airbnb.co.uk) |
locale | string | market default | Storefront language sent with HTTP requests |
currency | string | market default | display_currency (USD, EUR, JPY, …) |
placeId | string | — | Optional Airbnb place id |
checkin / checkout | string | — | YYYY-MM-DD trip dates for priced availability |
adults | integer | 2 | Guest count |
roomTypes | string[] | [] | Room type filters |
categoryTags | string[] | [] | Category labels or Tag:id values |
propertyTypeIds | (string|integer)[] | [] | Property type labels or IDs |
startUrls | string[] / {url}[] | [] | Ready-made Airbnb search URLs |
detailUrls | URL[] | [] | Optional genuine Airbnb /rooms/{listingId} URLs; skips destination search and requires enrichDetails=true |
enrichDetails | boolean | true | Read public listing pages for host, location, and amenity fields; in a search, skipped (noted detailSkipped:rowBudget) when the search rows already fill maxResults |
detailEnrichLimit | integer | 3 | Maximum listing pages read per run, 1–10 |
reviewsLimit | integer | 0 | Reviews per enriched listing, 0–50; zero disables reviews unless detailExtras includes reviews (then up to 24) |
detailExtras | string[] | [] | Optional detailApi, reviews, policies, priceBreakdown, hostProfile datasets |
maxResults | integer | 70 | Most 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 inputRUN_SUMMARY— query counts, scraped/pushed totals, billing stop flagERROR_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).
| Event | Price |
|---|---|
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,000 | per 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
| Listings | FREE–SILVER | GOLD–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)
| Limit | Free Apify plan | Paid Apify plan |
|---|---|---|
| Runs of this Actor | 10 runs total | Unlimited |
| Rows per run | Up to 200 | Limited 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
maxResults5–20 before city-wide runs. - Keep
detailEnrichLimitsmall 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
categoryTagfirst; 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 metadataGET /health— health checkGET /input-example— sample inputGET /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.
Related Actors
All 77 public Actors from [lentic_clockss]. Click a name to open the Store detail page.
Jobs & Freelance
- LinkedIn Jobs Scraper
- Bayt Jobs Scraper
- Fiverr Gigs Scraper
- Freelancer.com Scraper
- Glassdoor Scraper
- Himalayas Jobs Scraper
- Indeed Jobs Scraper
- Jobicy Remote Jobs Scraper
- RemoteOK Jobs Scraper
- SEEK Jobs Scraper
- Upwork Jobs Scraper
Real Estate
- Zillow & Zumper Scraper
- Realtor.com Scraper
- 99.co Scraper
- Realtor.com Agents Scraper
- Apartments.com Rental Scraper
- Bayut Scraper
- Craigslist Housing Scraper
- Daft.ie Scraper
- Dot Property Scraper
- FINN.no Scraper
- Funda Scraper
- Hepsiemlak Scraper
- Idealista Scraper
- Immobiliare.it Scraper
- ImmoScout24 Scraper
- Naver Land Scraper
- OpenSooq Scraper
- Otodom Scraper
- Property Finder Scraper
- PropertyGuru Scraper
- realestate.com.au Scraper
- Realtor.ca Scraper
- Rightmove Scraper
- SeLoger Scraper
- SUUMO Scraper
- Zillow Group Scraper
E-commerce
- Shopee Search Scraper
- E-commerce Scraper
- 1688 Global Product Search Scraper
- Allegro Scraper
- Amazon Search Scraper
- ASOS Product Scraper
- Cdiscount Product Scraper
- Costco Product Scraper
- Coupang Product Scraper
- Etsy Scraper
- Lazada Scraper
- MercadoLibre Scraper
- Mercari Japan Scraper
- Rakuten Japan Scraper
- SHEIN Product Scraper
- Target Product Scraper
- Temu Product Scraper
- Walmart Product Scraper
Travel & Stays
- Booking.com & Airbnb Scraper
- Agoda Scraper
- Airbnb Listings Scraper
- Booking.com Hotels Scraper
- Despegar Scraper
- Expedia Scraper
- Traveloka Scraper
- Travelstart Flights Scraper
- Trip.com Scraper
- TripAdvisor Scraper
Social & Content
Ads Intelligence
Local & Maps
General Tools
→ Browse the full profile: apify.com/lentic_clockss