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
- Open the Airbnb Scraper in the Scrape.ly Store.
- Pick a ready-made input. We used the preset 2+ bedroom stays in Lisbon, 10 results. "Try this input" opens it in the console.
- Change the city and filters to yours. This is the exact input of our run:
{
"locationQueries": ["Lisbon"],
"maxResults": 10,
"priceMin": 40,
"priceMax": 400,
"minBedrooms": 2,
"adults": 2,
"currency": "USD"
}- Click Start. Ten listings take a few seconds.
- 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 ashttps://www.airbnb.com/rooms/15152603returns 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 inYYYY-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 yourcurrency.locale: the language of the text that comes back, such asfr-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:
{
"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.
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:
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):
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:
{
"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:
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=falseUnder 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
checkInandcheckOutwhen you compare listings or track prices over time, or you compare Airbnb's default stays. - Totals, not nightly rates.
price.labelis 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
localizedDatevalues like "2 weeks ago" follow the day you scrape. StorecreatedAtinstead. - 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.
Is it legal to scrape Airbnb?
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
urlfrom 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.




