Airbnb Scraper — Search & Public Listing Details avatar

Airbnb Scraper — Search & Public Listing Details

Pricing

Pay per event

Go to Apify Store
Airbnb Scraper — Search & Public Listing Details

Airbnb Scraper — Search & Public Listing Details

Search Airbnb by destination or direct room URL. Get prices from search results plus ratings, hosts, amenities, rules and images. $1/1K basic or $1.50/1K detailed listings. No login or cookies; pay only for delivered unique listings.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Meka.im

Meka.im

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

Search Airbnb by destination or scrape direct room URLs, without a login.

  • Search destinations or scrape direct Airbnb room URLs — use either, or both in one run
  • Public listing details, ratings, hosts, amenities, rules and images
  • Search-result pricing when available
  • No login or cookies
  • Pay only for successfully delivered unique listings

Quick start

{
"locationQueries": ["Lisbon, Portugal"],
"checkIn": "2026-11-10",
"checkOut": "2026-11-14",
"adults": 2,
"includeDetails": true
}

Or point it at specific rooms:

{
"startUrls": [
"https://www.airbnb.com/rooms/24173768",
"1747015303004071355"
],
"enrichUserProfiles": true
}

Both inputs can be used in the same run. A listing that appears in both is delivered and charged once.

Input

FieldTypeDefaultNotes
locationQueriesarrayOne destination per line. A comma is normalised for you, see Notes
startUrlsarrayRoom links or plain numeric room IDs. Order is preserved
includeDetailsbooleanfalseFetch the public detail page for search results
maxResultsinteger100Per destination. See Limits
checkIn / checkOutstringYYYY-MM-DD. Give both or neither
adults / children / infants / petsinteger1 / 0 / 0 / 0
currencystringUSD
localestringen-US
priceMin / priceMaxintegerAirbnb filters on the nightly price
enrichUserProfilesbooleanfalseOne extra public request per host

At least one of locationQueries or startUrls is required. Invalid room URLs are skipped, reported in the run summary, and never charged.

Output

One row per unique listing. URL inputs come first in the order you gave them, then search results by destination, page and position on the page.

Every row carries sourceMode and priceSource so you can tell where its data came from:

FieldMeaning
sourceModesearch or direct_url
priceSourcesearch_result when a price is present, null when there is none
hasDetailsWhether the detail page was fetched
hostEnrichedWhether host enrichment ran and succeeded
detailError / hostErrorSet when that step failed; the row is still delivered

Core fields: listingId, url, name, title, price, stayWindow, checkIn, checkOut, rating, reviewsCount, ratingText, coordinates, badges, paymentMessages, details, images.

With includeDetails or a direct URL you also get: propertyType, roomType, personCapacity, homeTier, subDescription, description, htmlDescription, descriptionOriginalLanguage, seoTitle, metaDescription, locationDescriptions, breadcrumbs, amenities, houseRules, highlights, ratingDetails (six sub-ratings), host, coHosts, androidLink, iosLink.

With enrichUserProfiles the host object also carries about, timeAsHost, ratingAverage, reviewCount, listingsCount, verifiedSince, hasVerificationBadge and highlights such as languages and where the host lives.

Pricing

EventPriceWhen
listing-delivered$0.001A search result delivered without details
detailed-listing-delivered$0.0015A search result with details, or a direct room URL

Host enrichment does not add a third rate.

Not charged: invalid URLs, destinations that return nothing, failed fetches, and any listing already delivered in this run or a previous one. A listing whose detail fetch failed falls back to search data and is charged at the lower rate.

Limits

Stated here rather than discovered later.

URL-only rows have no price and no availability. Airbnb does not expose booking prices or availability on anonymous direct-URL listing pages, so these fields may be null for URL-only inputs. Prices are available for destination search results. We verified this across 60 anonymous calls covering 10 listings, 3 date ranges, 2 guest configurations and 4 regions: the price field came back empty every time.

Airbnb changes its own search results. The same destination searched twice returns a somewhat different set of listings. Measured across three destinations, two runs of the same query overlap about 76% with dates and about 63% without. This Actor cannot promise that a repeated run returns an identical result set.

About 220 unique listings per destination. Airbnb caps a search at 15 pages, and pages overlap by roughly 20%. To cover a city, use several destinations or tighter areas.

Without dates, prices are not comparable between rows. Airbnb picks its own stay window per listing, and each row is priced for a different window. stayWindow, checkIn and checkOut tell you which window a row used.

Neighbourhood text is titles only. locationDescriptions carries section titles; Airbnb does not expose the body text to anonymous pages, so content is usually null.

Some listings simply have less. New listings show no rating, many have no description or highlights, and sub-ratings need enough reviews to exist. Those rows report null rather than a made-up value.

Not included: full availability calendars, review lists, revenue or occupancy estimates.

Notes

Commas in destinations are handled. Airbnb geocodes a raw comma badly — Paris, France resolves to Paris, Tennessee. This Actor converts the separator to Airbnb's own form, so Paris, France reaches Paris in France. Country names are never stripped, because Paris, TX must stay in Texas.

Price filters work on the nightly rate. priceMin and priceMax filter Airbnb's nightly price, while the price on each row is the total for the stay. A row's own number will not fall inside the range you set; this is how Airbnb's filter works, not a bug.

API and automation

curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&clean=true" \
-H "Authorization: Bearer APIFY_TOKEN"

Each run writes an OUTPUT record with how many destinations and URLs were requested and deduplicated, and how many listings were delivered, charged at each rate, skipped as duplicates, or failed.

A run that is interrupted and restarted picks up where it stopped. The Dataset is the source of truth for what was already delivered, so nothing is written or charged twice.

FAQ

Why is price null on my rows? Those rows came from direct room URLs. Airbnb does not expose booking prices on anonymous listing pages. Add the destination to locationQueries instead, and the search result carries a price.

Why did two runs of the same destination return different listings? Airbnb changes its own search results between requests. Measured overlap between two runs of the same query is about 76% with dates and 63% without. De-duplicate by listingId and run more than once if you need a wider set.

Why did I get fewer listings than maxResults? Airbnb caps a single search at 15 pages and its pages overlap, so a destination yields roughly 220 unique listings at most. Use more destinations or tighter areas.

A row has detailError set. Was I charged the higher rate? No. A listing whose detail fetch failed falls back to search data and is charged as listing-delivered.

hostEnriched is false on some rows. The host profile page failed for that host. The listing itself is delivered normally and hostError says what happened.

My run stopped early. If stoppedOnBudget is true in the run summary, the run hit the maximum charge you allowed. Raise the limit and start it again; listings already delivered are not refetched or recharged.

Why are prices for different rows not comparable? You ran without dates. Airbnb then picks its own stay window per listing, so each row is priced for different nights. stayWindow tells you which window a row used. Set checkIn and checkOut to compare like with like.

Can I get the availability calendar or reviews? Not from this Actor. See Limits.

This Actor is independently developed and is not affiliated with, endorsed by, or sponsored by Airbnb.

It reads public pages. It does not sign in, does not use cookies or credentials, and does not reach anything behind a login. You are responsible for how you use the data, including any applicable terms and data-protection rules.