Airbnb Review Scraper With Full Coverage & Date Filters avatar

Airbnb Review Scraper With Full Coverage & Date Filters

Pricing

from $4.99 / 1,000 results

Go to Apify Store
Airbnb Review Scraper With Full Coverage & Date Filters

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

API Empire

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

3 days ago

Last modified

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 TypeKey FieldsJSON Field Names
Reviewsrating, review text, written date, language, review highlightrating, text, localizedText, createdAt, language, localizedDate, reviewHighlight
Reviewer & host identityreviewer name, reviewer profile link, host name, host replyreviewerName, reviewerProfileUrl, hostName, hostProfileUrl, hostRepliedAtLocalized, response
Listing coverage ledgerthe listing's own review total, reviews collected, coverage %, duplicates skippedlistingReviewTotal, 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)

  1. Open Airbnb Review Scraper With Full Coverage & Date Filters on its Apify Store listing and start a run from the Apify Console.
  2. Add at least one listing to Listings To Sweep (reviewSources) โ€” a full URL like https://www.airbnb.com/rooms/12937 or a bare room ID like 12937. No field is marked required by the input schema, but the run stops immediately with an error if the list is empty.
  3. Set the review order and coverage โ€” pick pagingSort, set reviewCap (0 for every review), and optionally fill in reviewsSince / reviewsUntil to narrow the sweep to a date window.
  4. Start the run.
  5. 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.

ParameterRequiredTypeDescriptionExample Value
reviewSourcesNoarray of stringsAirbnb 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"]
startUrlsNoarray of stringsSame 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"]
reviewsSinceNostring (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"
reviewsUntilNostring (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"
stopEarlyOutsideWindowNobooleanDefault 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
reviewCapNointegerMinimum 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
pagingSortNostring (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"
emitCoverageRowNobooleanDefault 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
maxCommentsNointegerMinimum 1, maximum 10000, default 10. Compatibility field with the same meaning as reviewCap; used only when reviewCap is absent from the input.10
sortOrderNostring (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"
localeNostring (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"
proxyConfigurationNoobject (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?

FeatureAirbnb Review Scraper With Full Coverage & Date FiltersGeneric 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 ApifyClient
client = 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.

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.