Skip to content

Airbnb Scraping: How to Get Listings, Prices and Reviews

Airbnb scraping, step by step: pull listings by city with prices for your dates, ratings, hosts and amenities, then every guest review. Two real runs, their exact cost, and code for curl, Python, Node.js and AI agents.

Published
Reading time
10 min read
Pixel-art robot with an orange >_ on its terminal head pulls a stay listing card with a house icon and a star off a house at night, beside a yard sign with the pink Airbnb logo, and drops it into a crate
In this article
  1. What data you can get from Airbnb
  2. Airbnb scraping without code
  3. How to scrape Airbnb with the API
  4. A real run: 2-bedroom stays in Lisbon
  5. What it costs
  6. What to watch out for
  7. Is it legal to scrape Airbnb?
  8. Why Scrape.ly for Airbnb data
  9. FAQ
  10. Can you scrape Airbnb for free?
  11. Does Airbnb have a public API?
  12. How do I scrape Airbnb prices for specific dates?
  13. How do I scrape all reviews of an Airbnb listing?
  14. How many Airbnb listings can I scrape per city?
  15. Can I compare Airbnb with hotels?

Airbnb scraping means collecting the public data Airbnb shows for a search or a listing (title, price for your dates, rating, host, amenities, photos) and, separately, the guest reviews of each listing, as structured rows you can analyze. The fastest way to do it is with two ready-made Actors on Scrape.ly: the Airbnb Scraper returns listings at $2.20 per 1,000, and the Airbnb Reviews Scraper returns reviews at $3.00 per 1,000, with no Airbnb account, API approval or proxy of your own.

This guide covers the no-code steps, the API (curl, Python, Node.js and AI agents over MCP), the cost and the pitfalls. Everything below comes from two real runs on 23 October 2026: ten 2-bedroom stays in Lisbon and ten reviews of one New York listing, with the exact inputs, outputs, logs and charges.

What data you can get from Airbnb

The Airbnb Scraper writes one row per listing, from a city search, an Airbnb search URL or a listing URL:

Field What it holds
id, title, url Listing ID, name and link (with your dates and currency)
propertyType, roomType, personCapacity "Entire rental unit", "Entire home/apt", maximum guests
subDescription Guests, bedrooms, beds and baths as Airbnb lists them
price Total for your dates, the original price when discounted, and a breakdown when Airbnb returns one
rating Overall score, review count and the six category scores (accuracy, check-in, cleanliness, communication, location, value)
host, coHosts Public host name, Superhost and verified flags
amenities, highlights, houseRules Amenity groups, badges such as "Top 1% of homes", and rules
coordinates, location, breadcrumbs Approximate position and the place hierarchy
images, thumbnail, description Photos with captions, the cover image and the listing text

The Airbnb Reviews Scraper writes one row per guest review: rating (1 to 5), createdAt, text as written, localizedText in your locale, language, reviewHighlight (for example "Stayed a few nights"), the host's response, reviewPhotoUrls, and the reviewer and host as Airbnb shows them publicly.

Fields come back empty when Airbnb has nothing to show: a new listing has no rating yet, and most reviews have no host reply.

Airbnb scraping without code

  1. Open the Airbnb Scraper in the Scrape.ly Store.
  2. Pick a ready-made input. We used the preset 2+ bedroom stays in Lisbon, 10 results. "Try this input" opens it in the console.
  3. Change the city and filters to yours. This is the exact input of our run:
json
{
  "locationQueries": ["Lisbon"],
  "maxResults": 10,
  "priceMin": 40,
  "priceMax": 400,
  "minBedrooms": 2,
  "adults": 2,
  "currency": "USD"
}
  1. Click Start. Ten listings take a few seconds.
  2. Export the rows as JSON, CSV or Excel.

The fields that matter most:

  • locationQueries: cities or areas as you'd type them into Airbnb. Several at once is fine.
  • startUrls: an Airbnb search URL keeps its own filters; a listing URL such as https://www.airbnb.com/rooms/15152603 returns that one stay, as in the preset One listing by URL, 1 result.
  • maxResults: listings for the whole run, across all locations and URLs. Default 10.
  • checkIn, checkOut: dates in YYYY-MM-DD. Prices are for this stay; without dates, Airbnb picks one.
  • priceMin, priceMax, minBedrooms, minBeds, minBathrooms, adults, children, pets: the same filters as Airbnb's search bar. Prices are per night in your currency.
  • locale: the language of the text that comes back, such as fr-FR.

To get the reviews of any listing, paste its URL into the reviews Actor. We used the preset Highest-rated reviews of a listing, 10 reviews:

json
{
  "startUrls": [{ "url": "https://www.airbnb.com/rooms/12937" }],
  "sortBy": "highest-rated",
  "sinceDate": "2026-06-01",
  "maxReviewsPerListing": 10,
  "locale": "en-US"
}

maxReviewsPerListing: 0 returns every review; sortBy takes most-recent, most-relevant, highest-rated or lowest-rated; sinceDate and untilDate set a window.

How to scrape Airbnb with the API

Create an API token under Settings → API & Integrations and export it as SCRAPELY_TOKEN.

Our listing run finished in 8 seconds, so the synchronous endpoint fits: it starts the run, waits up to 45 seconds and returns the listings as a JSON array. Add ?format=csv for CSV.

shell
curl -X POST "https://api.scrape.ly/v2/actors/roamandroof~airbnb-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $SCRAPELY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"locationQueries": ["Lisbon"], "maxResults": 10, "checkIn": "2026-12-01", "checkOut": "2026-12-06", "adults": 2, "minBedrooms": 2, "currency": "USD"}'

If you ask for hundreds of listings and a run takes longer than 45 seconds, the call answers 408 while the run keeps going. Don't call it again (that starts a second run); use a client instead, which waits as long as the run takes.

Python (pip install scrapely-client-python). This example works out a nightly price for each listing, keeps Superhosts, and then pulls the five newest reviews of each:

python
import os
from scrapely_client import ScrapelyClient

client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")

run = client.actor("roamandroof/airbnb-scraper").call(
    run_input={"locationQueries": ["Lisbon"], "maxResults": 20, "checkIn": "2026-12-01",
               "checkOut": "2026-12-06", "adults": 2, "minBedrooms": 2, "currency": "USD"}
)
print(run.status)  # SUCCEEDED, FAILED, ABORTED or TIMED-OUT
listings = list(client.dataset(run.default_dataset_id).iterate_items())
superhosts = [l for l in listings if (l.get("host") or {}).get("isSuperHost")]
for l in superhosts:
    total = float(l["price"]["price"].replace("$", "").replace(",", ""))
    print(f'{total / 5:7.2f}/night  {(l.get("rating") or {}).get("guestSatisfaction")}  {l["title"][:50]}')

reviews = client.actor("roamandroof/airbnb-reviews-scraper").call(
    run_input={"startUrls": [{"url": l["url"]} for l in superhosts], "maxReviewsPerListing": 5, "sortBy": "most-recent"}
)
for r in client.dataset(reviews.default_dataset_id).iterate_items():
    print(r["listingId"], r["rating"], r["createdAt"][:10], (r.get("text") or "")[:80])

Node.js (npm install scrapely-client):

javascript
import { ScrapelyClient } from 'scrapely-client';

const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });

const run = await client.actor('roamandroof/airbnb-scraper').call({
  locationQueries: ['Lisbon'],
  maxResults: 10,
  priceMin: 40,
  priceMax: 400,
  minBedrooms: 2,
  adults: 2,
  currency: 'USD',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((l) => [l.title, l.price.label, l.rating?.guestSatisfaction, l.url]));

For AI agents, add the Scrape.ly MCP server. In Cursor, put this in ~/.cursor/mcp.json:

json
{
  "mcpServers": {
    "scrapely": {
      "url": "https://api.scrape.ly/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}

In Claude Code, run claude mcp add --transport http scrapely https://api.scrape.ly/mcp and sign in with /mcp. Then ask: "Use scrapely to run roamandroof/airbnb-scraper for 2-bedroom stays in Lisbon from 1 to 6 December, 20 listings, and give me a table of nightly price, rating and review count." See the MCP docs for other clients. If you'd rather call a ready endpoint, the Airbnb API page shows the same data as an API product.

A real run: 2-bedroom stays in Lisbon

We ran the "2+ bedroom stays in Lisbon, 10 results" preset on 23 October 2026. It returned 10 listings in 8 seconds and was charged $0.0236. The input set no dates, so Airbnb priced its default stay, 30 November to 5 December (five nights). The first five rows:

Listing Type Guests Price for 5 nights Rating Reviews Host
LUXURIOUS, BRIGHT & LARGE TERRACE WITH GREAT VIEW Entire rental unit 4 $1,856, originally $2,538 5.0 131 [host 1]
Chic Principe Real Penthouse on the park Entire rental unit 4 $1,404 5.0 59 [host 2]
Spacious Central Flat \ AC, Free Parking & Balcony Entire condo 4 $1,317 4.99 137 [host 3]
Elegant River View Corpo Santo Apartment Entire rental unit 6 $1,283, originally $1,426 4.98 64 [host 4]
MY LX FLAT Luxury Design Gem in Rossio Entire rental unit 4 $1,706, originally $2,747 4.93 246 [host 5]

Hosts on Airbnb are often private people, so we show them as [host 1] to [host 5]. What the full ten show:

  • The filters held. Every listing was a whole home with 2 or 3 bedrooms for 4 to 6 guests, priced $1,229 to $1,964 for five nights, about $246 to $393 a night, inside the $40 to $400 nightly range.
  • Discounts are visible. Five of the ten showed a lower price with the original next to it; the largest cut was from $2,747 to $1,706.
  • Quality is high in this slice. Ratings ran from 4.92 to 5.0 on 18 to 349 reviews, nine hosts were Superhosts, and nine listings carried a "Top 1% of homes" or "Top 5% of homes" badge.
  • Rich detail per row. Each listing came with 34 to 57 amenities, house rules, the neighborhood ("In the heart of Alfama", "Steps from Cais do Sodré") and up to 104 photos.

Then we ran the reviews preset on listing 12937 in New York. It returned 10 reviews in 7 seconds and was charged $0.0301:

Written Stars Review (start) Host reply
2026-10-15 5 "[host] was a kind and responsive host -- his home was warm and inviting, super clean…" yes
2026-10-09 5 "Best location for seeing lots of Broadway shows! This is super easy place to access manhattan…" yes
2026-10-04 5 "We had a great stay with [host]! It was fun, a beautiful space, and we felt very safe…" yes
2026-09-30 5 "The architecture and the property itself are steeped in history and cultural heritage…" no
2026-09-27 5 "We loved staying at [host]'s place. Beautiful house close to Manhattan with everything we needed…" yes

Guests and the host are private people, so reviewer names are left out and the host's name in review text appears as [host]. All ten reviews were five stars (the preset sorts highest-rated first), written between 10 September and 15 October 2026, all in English, and the host replied to five of them.

The two logs, without the platform's start-up lines:

Text
2026-10-23T03:03:01.355Z [Scrapely] Container started (setup 2.1 s)
2026-10-23T03:03:02.729Z [scrapely.proxy_configuration] INFO  Platform proxy access check succeeded.
2026-10-23T03:03:07.393Z [scrapely.actor] INFO  [Status message]: Saved 10 listings.
2026-10-23T03:03:07.905Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=false
2026-10-23T03:04:21.481Z [scrapely.proxy_configuration] INFO  Platform proxy access check succeeded.
2026-10-23T03:04:22.881Z [scrapely.actor] INFO  [Status message]: Saved 10 reviews from 1 listings.
2026-10-23T03:04:23.390Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=false

Under five seconds for ten full listings, and 1.4 seconds for ten reviews: both Actors read Airbnb's own data feeds through the default datacenter proxy, with no browser to start.

What it costs

The Airbnb Scraper charges $0.0022 per listing saved ($2.20 per 1,000); the Airbnb Reviews Scraper charges $0.003 per review saved ($3.00 per 1,000). Platform usage is billed on top.

  • Listings: 10 × $0.0022 = $0.022 in listing fees. The run was charged $0.0236: $0.0011 of compute, $0.0004 of datacenter proxy traffic and $0.0001 of storage writes on top.
  • Reviews: 10 × $0.003 = $0.03 in review fees. The run was charged $0.0301, with about $0.0001 of compute and proxy.

A 1,000-listing market snapshot costs $2.20 in listing fees, and 1,000 reviews $3.00. The Free plan's $5 of monthly credit covers about 2,200 listings or 1,600 reviews in event fees. Set Max cost per run in the run options and the run stops cleanly when it reaches the cap.

What to watch out for

  • One search shows a few hundred listings. The README notes that a single Airbnb search tops out at about 200 to 270 listings, and the run says so in its status when that happens. Cover a whole city with several locationQueries (neighborhoods) or narrower price bands.
  • Prices belong to dates. A listing has no single price; it has a price for a stay. Always set checkIn and checkOut when you compare listings or track prices over time, or you compare Airbnb's default stays.
  • Totals, not nightly rates. price.label is the figure from the search result, such as "$1,856 for 5 nights". Divide by the nights yourself, and expect tax and fee lines only where Airbnb returns them.
  • Relative dates drift. Review localizedDate values like "2 weeks ago" follow the day you scrape. Store createdAt instead.
  • Fewer reviews than the counter. Airbnb's count can include hidden or removed reviews; the run message tells you when it returned fewer.
  • Personal data. Host first names, guest names, photos and hometowns identify private people. Keep only the fields you need.

Both Actors read public listing and review data that anyone can see without logging in, and they never sign in or book. That doesn't settle every question. Airbnb's Terms of Service (last updated February 5, 2026) say: "Do not use bots, crawlers, scrapers, or other automated means to access or collect data or other content from or otherwise interact with the Airbnb Platform." How those terms bind you depends on where you are and how you use the data.

Privacy law applies to hosts and guests. Many hosts are individuals renting out their own home, and reviews carry guests' first names and hometowns, so treat both as personal data under the GDPR and the CCPA. Collect only what you need, keep it secure, have a lawful basis for processing it, and don't publish exact addresses of private homes. This is not legal advice: if Airbnb data drives a product, ask a lawyer about your case.

Why Scrape.ly for Airbnb data

  • There is no public API for market data. Airbnb's API Terms of Service describe API programs for "property management, channel management, operations management" and similar host tools, with requirements that include a mutual nondisclosure agreement and Airbnb's "data security review." The Actors return public listing and review data for any city, today.
  • No browser to maintain. Both Actors read Airbnb's data feeds directly, which is why ten listings took under five seconds of work and ten reviews 1.4 seconds.
  • Listings and reviews in one pipeline. Pass each listing's url from the first Actor into the second, as in the Python example, and you have prices, ratings and guest sentiment for a whole neighborhood.
  • Built for price tracking. Schedule the same search with fixed future dates every day, send the rows to Google Sheets or a webhook with automations, and watch prices and discounts move toward the stay.

FAQ

Can you scrape Airbnb for free?

The Scrape.ly Free plan includes $5 of usage credit every month with no credit card, which covers about 2,200 listings at $2.20 per 1,000 in listing fees. Our 10-listing run cost $0.0236 in total.

Does Airbnb have a public API?

Not for market data. Airbnb's API Terms describe partner programs for host software such as property and channel management, with an NDA and a security review. To collect public listings and reviews, scrape them with the Actors above.

How do I scrape Airbnb prices for specific dates?

Set checkIn and checkOut in YYYY-MM-DD format, plus adults and any filters. Each row's price then holds the total for that stay, the original price when discounted, and a breakdown when Airbnb returns one.

How do I scrape all reviews of an Airbnb listing?

Paste the listing URL into the Airbnb Reviews Scraper and set maxReviewsPerListing to 0. Reviews come in pages of 50; the README measured about 3,200 reviews from one listing in under a minute.

How many Airbnb listings can I scrape per city?

One search shows about 200 to 270 listings. For a whole city, add several neighborhoods to locationQueries or split by price band, and set maxResults to the total you want.

Can I compare Airbnb with hotels?

Yes. Scrape the same city with the Tripadvisor Actors from our guide on how to scrape Tripadvisor, or long-term rentals with our Zillow guide, and compare prices per night or per month.

  • airbnb
  • travel
  • short-term rentals
  • reviews
  • python
  • api

About the author

Actor publisher on the Scrape.ly Store

Homes, stays, trips and cars: listings from 40+ property portals, the big travel and booking sites and the main car marketplaces. For agents, investors, travel analysts and dealers. A Scrapely studio.

//Keep reading\\

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.