· 5 min read · by the Devil Scrapes team

Airbnb Scraper: Get Listing and Price Data at Scale

An Airbnb scraper for structured listing and price data, with a Python snippet, honest field limitations, and Pay-Per-Event pricing.

web-scrapingapify

Quick answer: An airbnb scraper turns Airbnb’s search-results pages into structured rows — price, currency, rating, host, bedrooms, and location — because Airbnb has no public API for this data. Our Airbnb Listings & Pricing Scraper reads the listing data already embedded in the search page, at $0.20 per run plus $0.0029 per result (about $3.10 per 1,000 listings), with amenities available as an optional detail-page pass.

Who actually needs Airbnb price data

Nobody scrapes Airbnb for fun. The people who need this data have a specific number to defend.

STR investors comping a market before buying want live nightly rates and occupancy signals — ratings, review counts, superhost density — for every listing within a few blocks of the property they’re underwriting. A spreadsheet built from a handful of manually-checked listings doesn’t hold up in an investment committee meeting; a dataset of a few hundred comparable listings does.

Dynamic-pricing and revenue-management tool builders need a live competitor-rate feed as an input signal, not a one-time snapshot. If your pricing model recommends $180/night for a two-bedroom in a neighborhood, it needs to know what the twenty other two-bedrooms in that neighborhood are actually charging tonight, not last quarter.

Property managers benchmarking their own listings want the same comparison at a smaller scale — how does my rating, price, and amenity list stack up against the three Superhosts within a mile.

Researchers studying short-term-rental density, housing-policy impact, or seasonal price movement need structured, reproducible pulls they can re-run on a schedule, not a one-off manual export.

None of these use cases are served by Airbnb’s own site, because Airbnb doesn’t publish a data API for search results. It publishes web pages, and the listing data happens to be embedded in them.

What the Airbnb Scraper returns

The Actor walks a search-results page — either a place name like “Austin, TX” or a full search URL with your own filters already applied — and reads each listing’s data straight out of the page’s embedded JSON:

listing_id, url, title, listing_type, room_type, city, country, lat, lng, price_per_night, currency, total_price, rating, review_count, host_id, host_name, is_superhost, bedrooms, beds, bathrooms, max_guests, amenities, image_urls, and a scraped_at timestamp.

Set checkIn and checkOut and the Actor appends them to the search and populates total_price for that exact stay. Leave them off and you get each listing’s base nightly rate. Flip on enableDetailEnrichment and the Actor also opens each listing’s own /rooms/<id> page for its amenities list — off by default, because it roughly doubles the request volume for a field most comps don’t need.

Running it in Python

from apify_client import ApifyClient

client = ApifyClient("<APIFY_API_TOKEN>")

run_input = {
    "location": "Austin, TX",
    "maxResults": 50,
    "enableDetailEnrichment": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

run = client.actor("DevilScrapes/airbnb-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price_per_night"], item["currency"], item["rating"])

Run it on Apify to try the same input with the free trial credit — no card required.

What it costs

Pay-Per-Event, no subscription: a $0.20 warm-up charge per run, then $0.0029 per listing that lands in your dataset. A run that finds nothing costs only the $0.20. A run of 1,000 listings comes to roughly $3.10 total — $0.20 + (1,000 × $0.0029).

What this doesn’t do

Airbnb’s search-results payload carries a lot, but not everything, and we’d rather tell you that up front than have you find a null and wonder if the Actor missed something:

  • Amenities are empty unless enableDetailEnrichment is on — the base search payload rarely carries them, and we don’t invent a field that isn’t there.
  • No currency conversion. price_per_night and currency are passed through exactly as Airbnb reports them for that market; if you need everything normalized to USD, convert downstream.
  • No review text, calendar/availability data, or Experiences/Luxe listings. This Actor covers homes search and aggregate rating/review count — nothing more.
  • Any field Airbnb’s own page doesn’t populate for a given listing comes back null, not a guessed value.

A word on why this market needs a second option

The largest Airbnb scraper on the Apify Store today carries a 2.5-star rating from 13 reviews, and its own last-30-days run statistics show 1,122 failed runs and 211 aborted runs out of 17,595 total — roughly one run in thirteen not completing successfully. We’re not naming it to score a point; it’s a public number anyone can pull from the Apify API, and it’s the reason we treat retries and session rotation as a first-class requirement instead of an afterthought. Airbnb fronts its search pages with anti-bot defenses, not a documented rate limit, so a scraper built for that reality rotates its browser fingerprint and residential proxy session on every block and backs off instead of failing the whole run over one blocked page.

FAQ

Do I need an Airbnb account or API key to use this scraper?

No. Airbnb doesn’t publish a public API for search-results data, so there’s no key to request. This Actor reads public search-results pages directly.

Can I scrape a specific Airbnb search with my own filters?

Yes. Apply your filters — dates, price range, amenities — on airbnb.com, copy the resulting search URL, and paste it into the searchUrl field. It takes priority over location if both are set.

Why is amenities empty on some listings?

Because enableDetailEnrichment was off for that run. The base search page rarely carries amenities; turning on detail enrichment fetches each listing’s own page for that field, at roughly double the request volume.

Does the price include cleaning fees and taxes?

price_per_night is Airbnb’s displayed nightly rate as observed. total_price is only populated when both checkIn and checkOut are set, and reflects what Airbnb’s search page shows for that exact stay — we don’t recompute or estimate fees separately from what the page reports.

Run it on Apify and pull your first 50 listings on the free trial credit.

Want this data without the engineering?

Every Actor in the fleet is pay per result and maintained daily. If the one you need doesn't exist, we'll build it.