Airbnb Review Scraper With Full Coverage & Date Filters
Pricing
from $4.99 / 1,000 results
Airbnb Review Scraper With Full Coverage & Date Filters
Airbnb Review Scraper extracts public guest reviews, ratings, reviewer details, review dates, listing information, and review text. Apply date filters to collect targeted feedback for property research, reputation monitoring, competitor analysis, and hospitality insights.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Airbnb Review Scraper โ Reviews, Coverage Ledger & Host Data as JSON
Airbnb Review Scraper With Full Coverage & Date Filters pulls every review, reviewer name, host reply and rating from any public Airbnb listing, then publishes a coverage ledger next to it โ the listing's own posted review total, the number actually collected, the duplicate count, and the coverage percentage. Give it listing URLs or bare room IDs; it pages through Airbnb's review data newest-first, de-duplicates by review ID, and can stop the moment your date window has passed. Every row is typed, normalized JSON โ no HTML, no selectors, no parsing required before you use it.
๐ก What is Airbnb Review Scraper With Full Coverage & Date Filters?
Airbnb Review Scraper With Full Coverage & Date Filters is an Apify Actor that reads the reviews section of any public Airbnb listing page and returns three things: the reviews themselves, the reviewer and host identity attached to each one, and a per-listing coverage ledger that proves how much of the listing was actually read. No Airbnb account or login is used anywhere in the run โ the Actor talks to the same public review endpoint the listing page itself loads, using the public web API key embedded on that page (or Airbnb's long-lived fallback key if the page doesn't expose one).
- ๐ Scrape reviews โ text, rating, written date, language, review highlight
- ๐ Scrape reviewer & host identity โ name, profile link, host reply text and date
- ๐ Scrape a coverage ledger โ the listing's own review total vs. what was collected, duplicates skipped, pages walked
- ๐ค Export as JSON, CSV, Excel, XML or RSS straight from the Apify dataset
- ๐ No proxy management required โ the run manages its own connection and escalates automatically if the source pushes back
๐งฎ What data does Airbnb Review Scraper collect?
Every run returns two row types โ review rows and one coverage-ledger row per listing โ and the review rows carry the reviewer and host identity fields inline.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Reviews | rating, review text, written date, language, review highlight | rating, text, localizedText, createdAt, language, localizedDate, reviewHighlight |
| Reviewer & host identity | reviewer name, reviewer profile link, host name, host reply | reviewerName, reviewerProfileUrl, hostName, hostProfileUrl, hostRepliedAtLocalized, response |
| Listing coverage ledger | the listing's own review total, reviews collected, coverage %, duplicates skipped | listingReviewTotal, reviewsCollected, coveragePct, duplicatesSkipped, coverageComplete |
๐ ๏ธ Why not build this yourself?
Airbnb does not publish a public API for review data. As of 2026, API access is limited to Airbnb's Preferred Software Partner program, which the company approaches directly rather than accepting open applications, and that partner API does not expose reviews (elfsight.com, checked 2026-08-15; stayapi.com, checked 2026-08-15). Building your own sweep means reverse-engineering Airbnb's internal GraphQL review query, resolving a persisted-query operation ID out of a versioned JavaScript bundle, keeping session headers current, handling pagination and de-duplication yourself, and building your own block detection and proxy escalation โ all of which breaks quietly the next time Airbnb ships a front-end build. This Actor already does that work and re-resolves its session details automatically when a listing refuses a request mid-sweep.
๐ฅ Why do developers and teams scrape Airbnb reviews?
๐ค For AI engineers and agent builders
Reviews are unstructured guest feedback with a stable JSON shape โ text, rating, createdAt, reviewerName โ that drops straight into a RAG index or an LLM sentiment pipeline without an HTML-parsing step. An agent can call the Actor with a room ID, wait for reviewsCollected and coveragePct on the coverage row, then only proceed to summarization once coverageComplete is true, guaranteeing the model sees the full review history rather than a partial page.
๐ฌ For researchers and analysts
Academic and market researchers studying guest sentiment, seasonal demand, or host responsiveness need a defensible sample, not a first page. The reviewsSince / reviewsUntil window plus the coverage ledger's oldestReviewDate and newestReviewDate make it possible to state exactly what period a dataset covers and how complete it is โ all of it drawn from data Airbnb already shows publicly on the listing page.
๐ข For property managers and co-hosting agencies
Agencies running many listings, or managing them on behalf of owners, use the sweep to monitor a portfolio's review volume and rating trend over time, or to check what guests are saying about a competing listing in the same market before setting pricing or amenities strategy.
๐ป For developers building data products
Review-trend dashboards, host-reputation scores, and pricing tools built on top of Airbnb data all need a JSON feed that doesn't change shape between runs. The roomId and reviewUrl fields on every row make it straightforward to join reviews back to a listing record in your own schema.
๐ How to scrape Airbnb reviews (step by step)
- Open Airbnb Review Scraper With Full Coverage & Date Filters on its Apify Store listing and start a run from the Apify Console.
- Add at least one listing to Listings To Sweep (
reviewSources) โ a full URL likehttps://www.airbnb.com/rooms/12937or a bare room ID like12937. No field is marked required by the input schema, but the run stops immediately with an error if the list is empty. - Set the review order and coverage โ pick
pagingSort, setreviewCap(0 for every review), and optionally fill inreviewsSince/reviewsUntilto narrow the sweep to a date window. - Start the run.
- Download results as JSON, CSV, Excel, XML or RSS from the dataset, or pull them through the Apify API.
What to do when Airbnb changes its structure
The Actor re-resolves its own session details (the operation ID and API key it needs to call Airbnb's review endpoint) directly from the listing page at the start of every run, and again once mid-sweep if a listing refuses a request. The output schema โ field names and types โ stays stable on your end even when Airbnb changes its internal implementation, so downstream integrations keep working without a numeric turnaround promise attached.
โฌ๏ธ Input
All parameters are optional at the schema level; the run itself requires at least one entry in reviewSources or startUrls, or it raises an error before making any requests.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
reviewSources | No | array of strings | Airbnb listing URLs (e.g. https://www.airbnb.com/rooms/12937) or bare room ids (e.g. 12937). Both this field and startUrls are read and merged, so an existing input built around the older key keeps working. | ["https://www.airbnb.com/rooms/12937"] |
startUrls | No | array of strings | Same meaning as reviewSources, merged with it. Host names and free-text search phrases are not listings and are reported as skipped rather than matched to something else. | ["https://www.airbnb.com/rooms/12937"] |
reviewsSince | No | string (datepicker, absolute or relative) | Keep only reviews written on or after this date. Accepts an absolute date (2025-01-01) or a relative one (e.g. 3 months). Leave empty for no lower bound. | "2025-01-01" |
reviewsUntil | No | string (datepicker, absolute or relative) | Keep only reviews written on or before this date. Accepts an absolute date (2025-12-31) or a relative one (e.g. 1 week). Leave empty for no upper bound. | "2025-12-31" |
stopEarlyOutsideWindow | No | boolean | Default true. With the newest-first order, the sweep ends the moment it walks past reviewsSince instead of reading the rest of the listing; the coverage row reports how many pages that saved. Ignored for the rating-based orders, whose results are not date-sorted. | true |
reviewCap | No | integer | Minimum 0, maximum 10000, prefill 0. Maximum reviews to collect per listing. 0 means every review the listing has, which is what lets coveragePct reach 100%. Wins over maxComments whenever both are present. | 0 |
pagingSort | No | string (enum) | One of MOST_RECENT, RATING_DESC, RATING_ASC, BEST_QUALITY. Prefill MOST_RECENT. Newest first is the only order that is stable while paging and supports the early stop; BEST_QUALITY order is not stable, so a sweep can return the same review twice โ repeats are counted in duplicatesSkipped, not hidden. | "MOST_RECENT" |
emitCoverageRow | No | boolean | Default true. Adds one summary row per listing carrying the listing's own review total, the number collected, the coverage percentage, duplicates skipped, pages walked and the date range covered. Turn off for a reviews-only export. | true |
maxComments | No | integer | Minimum 1, maximum 10000, default 10. Compatibility field with the same meaning as reviewCap; used only when reviewCap is absent from the input. | 10 |
sortOrder | No | string (enum) | One of MOST_RECENT, RATING_DESC, RATING_ASC, BEST_QUALITY. Compatibility field with the same meaning as pagingSort; used only when pagingSort is absent from the input. | "MOST_RECENT" |
locale | No | string (enum, 50 values) | Default "en-US". Language used for the localized review text and the human-readable date. The choice also influences which reviews are returned first, so keep it fixed when comparing two runs. Full list: en-US, az-AZ, id-ID, bs-BA, ca-ES, cs-CZ, sr-ME, da-DK, de-DE, de-AT, de-CH, de-LU, et-EE, en-AU, en-CA, en-GB, en-GY, en-IN, en-IE, en-NZ, en-SG, en-AE, es-AR, es-BZ, es-BO, es-CL, es-CO, es-CR, es-EC, es-SV, es-ES, es-US, es-GT, es-HN, es-419, es-MX, es-NI, es-PA, es-PY, es-PE, es-VE, fr-BE, fr-CA, fr-FR, fr-CH, fr-LU, ga-IE, hr-HR, xh-ZA, zu-ZA. | "en-US" |
proxyConfiguration | No | object (proxy editor) | Default {"useApifyProxy": false}. Connection settings โ sub-fields useApifyProxy (boolean), apifyProxyGroups (array of strings), apifyProxyCountry (ISO-2 string). The run manages its own connection and escalates automatically if the source pushes back, so this is optional unless you need to pin a specific proxy group or country. | {"useApifyProxy": false} |
Example input:
{"reviewSources": ["https://www.airbnb.com/rooms/12937", "20669368"],"startUrls": [],"reviewsSince": "2025-01-01","reviewsUntil": "2025-12-31","stopEarlyOutsideWindow": true,"reviewCap": 0,"pagingSort": "MOST_RECENT","emitCoverageRow": true,"maxComments": 10,"sortOrder": "MOST_RECENT","locale": "en-US","proxyConfiguration": { "useApifyProxy": false }}
โ ๏ธ Common pitfall: stopEarlyOutsideWindow only ever triggers under the default MOST_RECENT order. Setting reviewsSince while pagingSort is RATING_DESC, RATING_ASC, or BEST_QUALITY still filters every review against the date window correctly โ it just can't skip the rest of the listing to save pages, because those orders aren't sorted by date.
โฌ๏ธ Output
Two row shapes land in the same dataset, distinguished by type. Only rows with "type": "review" are billed, under the row_result charged event โ coverage-ledger rows ("type": "listing", including the summary row for a swept listing and the row pushed for an unsupported input) are pushed free of charge. Filter your export on type == "review" to see only the reviews you paid for, or type == "listing" to see the coverage ledger.
Scraped review
{"type": "review","isChild": false,"roomId": "12937","startUrl": "https://www.airbnb.com/rooms/12937","locale": "en-US","id": "1023456789012345678","language": "en","text": "Beautiful apartment, exactly as pictured. The host was quick to respond and check-in was seamless.","localizedText": "Beautiful apartment, exactly as pictured. The host was quick to respond and check-in was seamless.","localizedReview": {"comments": "Beautiful apartment, exactly as pictured. The host was quick to respond and check-in was seamless.","language": "en"},"localizedDate": "October 2025","localizedReviewerLocation": "Austin, Texas","createdAt": "2025-10-14T09:32:00Z","reviewHighlight": "Great communication","highlightType": "positive","rating": 5,"response": "Thank you so much for staying with us, hope to host you again!","ratingAccessibilityLabel": "Rated 5 out of 5 stars","reviewer": {"id": "98765432","firstName": "Sarah","hostName": null,"pictureUrl": "https://a0.muscache.com/im/pictures/user/abc123.jpg","profilePath": "/users/show/98765432","profilePicture": "https://a0.muscache.com/im/pictures/user/abc123.jpg"},"reviewee": {"id": "45612378","firstName": null,"hostName": "Michael","pictureUrl": "https://a0.muscache.com/im/pictures/user/host456.jpg","profilePath": "/users/show/45612378","profilePicture": "https://a0.muscache.com/im/pictures/user/host456.jpg"},"textRaw": "Beautiful apartment, exactly as pictured. The host was quick to respond and check-in was seamless.","reviewDate": "2025-10-14","reviewerName": "Sarah","reviewerProfileUrl": "https://www.airbnb.com/users/show/98765432","hostName": "Michael","hostProfileUrl": "https://www.airbnb.com/users/show/45612378","reviewUrl": "https://www.airbnb.com/rooms/12937/reviews","hostRepliedAtLocalized": "October 2025","pagingSortUsed": "MOST_RECENT","pageIndex": 1,"scrapedAt": "2026-08-15T10:04:22Z"}
Coverage ledger row (one per listing)
{"type": "listing","isChild": false,"roomId": "12937","startUrl": "https://www.airbnb.com/rooms/12937","reviewUrl": "https://www.airbnb.com/rooms/12937/reviews","input": "https://www.airbnb.com/rooms/12937","inputType": "listing","success": true,"error": null,"listingStatus": "ok","listingReviewTotal": 214,"reviewsCollected": 214,"distinctReviewsSeen": 214,"coveragePct": 100.0,"duplicatesSkipped": 0,"rowsOutsideWindow": 0,"rowsFetched": 214,"pagesWalked": 5,"pageSize": 50,"upstreamPagesRequested": 5,"pagingSortUsed": "MOST_RECENT","datesMonotonic": true,"coverageComplete": true,"reviewCapApplied": 0,"stopReason": "listing_exhausted","reviewsSinceApplied": null,"reviewsUntilApplied": null,"reviewsInWindow": null,"oldestReviewDate": "2021-03-02","newestReviewDate": "2025-10-14","earlyStopEligible": false,"earlyStopTriggered": false,"pagesSavedByEarlyStop": 0,"scrapedAt": "2026-08-15T10:04:30Z"}
listingStatus is "ok", "unavailable", or "unsupported" โ Airbnb answers HTTP 200 for a listing it refuses to serve reviews for, and this build classifies that refusal as "unavailable" rather than reporting it as a listing with zero reviews. stopReason explains why the sweep ended: listing_exhausted, cap_reached, date_window_early_stop, listing_unavailable, or interrupted.
๐ How does Airbnb Review Scraper compare to other approaches to Airbnb review data?
| Feature | Airbnb Review Scraper With Full Coverage & Date Filters | Generic alternative |
|---|---|---|
| Coverage proof | โ Measured โ listing's own total vs. rows collected, published on every summary row | โ Not typically reported |
| Refusal vs. empty listing | โ
Classified separately (unavailable vs. zero reviews) | โ Usually treated as the same outcome |
| Date window with early stop | โ
reviewsSince / reviewsUntil, stops paging once passed | โ Not commonly implemented |
| Duplicate handling on unstable orders | โ De-duplicated by review ID, duplicates counted not hidden | โ Varies |
| Output format | โ Typed JSON, stable field names, no HTML | โ Varies by tool |
If you're building an AI agent or RAG pipeline, the output format row is the decision-maker โ parsing HTML inside an agent loop is a reliability failure mode, not a feature. The coverage row lets that same agent decide, programmatically, whether a review dataset is complete enough to summarize.
๐ How many results can you scrape with Airbnb Review Scraper?
The Actor itself does not cap how many listings you can add to reviewSources / startUrls in one run. Per listing, reviewCap (0โ10000, default 0) is the only ceiling: 0 collects every review the listing has, and any other value stops the sweep once that many reviews have been pushed. Pagination pulls 50 reviews per upstream request, so โ per the input schema's own guidance โ a full sweep of a 2,700-review listing takes roughly 55 passes; set a lower reviewCap if you only need a sample. With reviewsSince set and pagingSort left on the default MOST_RECENT, stopEarlyOutsideWindow (on by default) lets the sweep stop as soon as it walks past your date boundary instead of reading the rest of the listing.
๐ Integrate Airbnb Review Scraper and automate your workflow
Airbnb Review Scraper With Full Coverage & Date Filters works with any language or tool that can send an HTTP request, through the Apify API.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("<your-username>/airbnb-review-scraper-with-full-coverage-and-date-filters").call(run_input={"reviewSources": ["https://www.airbnb.com/rooms/12937"],"reviewCap": 0,"pagingSort": "MOST_RECENT",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Works in Python, Node.js, Go, Ruby, cURL.
MCP for AI agents
The Actor is reachable through Apify's official MCP server, which exposes any public Apify Actor as a callable MCP tool. Register it with npx @apify/actors-mcp-server (requires an APIFY_TOKEN environment variable), scoping it to this Actor with --actors <your-username>/airbnb-review-scraper-with-full-coverage-and-date-filters. Compatible with Claude Desktop, Claude Code, and other MCP-aware clients.
Automation platforms (n8n, Make, LangChain)
Apify publishes an official Apify node for n8n and an Apify app on Make, both of which can run any Actor โ including this one โ and pass its dataset output downstream as JSON. For LangChain and similar agent frameworks, the Apify Python or JavaScript client wraps the same REST call shown above into a callable tool.
โ๏ธ Is it legal to scrape Airbnb reviews?
Yes, with normal caveats. Airbnb Review Scraper With Full Coverage & Date Filters only reads reviews and reviewer/host names that Airbnb already publishes on public listing pages โ nothing gated behind a login or a booking. Because individual reviews carry personal data (a reviewer's first name, a host's name, and links to their public Airbnb profile), storing and using that data falls under GDPR in the EU/UK and CCPA in California: you need a lawful basis for collecting and retaining it, and the individuals concerned retain rights over their own personal data regardless of where it was originally published. Scraping also sits alongside Airbnb's own Terms of Service, which this Actor does not evaluate or enforce for you. Consult legal counsel for commercial use cases involving bulk personal data.
โ Frequently asked questions
Does Airbnb Review Scraper work without an Airbnb account?
Yes. The Actor never logs in โ it calls the same public review endpoint the listing page itself loads, using the public web API key embedded on that page (or a long-lived fallback key), so no Airbnb account or credentials are needed.
How often is the scraped data updated?
Every run fetches live โ the Actor calls Airbnb's review endpoint directly each time you start it, with nothing cached between runs. The data you get reflects what Airbnb was serving at the moment your run executed (scrapedAt on every row).
What happens when a listing can't be read?
The row's listingStatus is set to "unavailable" and error explains why, distinct from a listing that genuinely has zero reviews. Airbnb sometimes answers HTTP 200 for a listing it won't serve reviews for; this build classifies that refusal as unavailable rather than reporting it as an empty listing, and retries the session details once before giving up on that listing.
Can I scrape private or restricted Airbnb content?
No. Only reviews visible on a listing's public reviews page are returned. Free-text search phrases and Airbnb host/profile URLs are not listings and are reported with inputType: "unsupported" rather than guessed at.
What's the difference between reviewCap and maxComments, or pagingSort and sortOrder?
reviewCap and pagingSort are the primary fields; maxComments and sortOrder are compatibility fields kept so an older input JSON keeps working unchanged. When both members of a pair are present, reviewCap wins over maxComments and pagingSort wins over sortOrder.
Does Airbnb Review Scraper work for AI agent workflows and LLM pipelines?
Yes. It's callable as a standard HTTP endpoint by any agent framework, or registered as an MCP tool through Apify's official MCP server (see Integrate above). Every response is typed JSON โ reviews and the coverage ledger both โ with no parsing step before passing to an LLM.
How does Airbnb Review Scraper handle Airbnb's anti-bot system?
Connections start direct, with no proxy. If a response looks blocked โ a 401/403/429 status, or a small body containing markers like "verify you are a human" or "rate limit exceeded" โ the request is retried up to 3 times with exponential backoff, and the run automatically escalates to a residential Apify Proxy group after the first detected block, even if proxyConfiguration.useApifyProxy was left off. A large response body is never judged blocked on a stray keyword, and 5xx responses are treated as transient, not a permanent refusal.
Does Airbnb Review Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with stable field names across runs. No HTML, no selectors โ pass it directly to an LLM context window, index it into a vector store, or route it through an agent tool.
Can I use Airbnb Review Scraper without managing proxies?
Yes. By default the run makes direct connections and only escalates to Apify's residential proxy pool automatically if the source pushes back. You can still set proxyConfiguration to pin a specific proxy group or country if you need one.
What happens when Airbnb changes its structure or blocks the scraper?
The Actor is maintained, and the output schema โ field names and types โ stays stable on your end even when Airbnb's internal implementation changes underneath it. No numeric turnaround time is promised for any given structural change.
๐ฌ Your feedback
Found a bug, or missing a field you need on the review or coverage rows? We want to know โ open an issue on this Actor's Issues tab in Apify Console, and it will be reviewed as part of ongoing maintenance.