Airbnb Review Scraper: Category Ratings & Host Replies
Pricing
from $3.99 / 1,000 results
Airbnb Review Scraper: Category Ratings & Host Replies
Airbnb Review Scraper extracts reviews with category ratings and host replies, including review text, ratings, dates, reviewer details, property data, and host responses. Ideal for guest feedback analysis, property research, competitor monitoring, and hospitality insights.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Airbnb Review Scraper โ Extract Reviews, Ratings and Host Replies
Airbnb Review Scraper: Category Ratings & Host Replies pulls a listing's reviews, its own six-category rating scorecard (accuracy, cleanliness, check-in, communication, location, value), and every host reply as a labelled, typed JSON row โ no HTML to parse, no login required. Point it at one Airbnb listing address or a bulk list of listing IDs and it returns review rows, one scorecard row per listing, and host-reply rows linked back to their parent review through parentReviewId. This guide covers every input field, every output key exactly as pushed, and how teams run it for enrichment, monitoring, and dataset building.
๐งญ What Does Airbnb Review Scraper: Category Ratings & Host Replies Do?
It reads an Airbnb listing's public reviews page and the listing page itself, and returns three row types: review, listing (the category-rating scorecard), and hostReply. No Airbnb account or login is used โ the Actor calls Airbnb's own web GraphQL endpoint anonymously, using a public web-client key it recovers from the listing page it already loads for the scorecard.
- ๐ Reads a listing's reviews page by page (30 by default, configurable up to 10,000) and returns each review as a typed row
- โญ Reads the listing's own six-category rating scorecard โ accuracy, cleanliness, check-in, communication, location, value โ plus the overall guest score
- ๐ฌ Attaches the host's reply text and reply date to every review that has one
- ๐งต Can emit each host reply as its own linked row, and mirror those rows into a second, run-scoped dataset
- ๐งฎ Computes the weakest and strongest rating category and the spread between them โ only when every one of the six numbers is unambiguous on the page
- ๐ฏ Reads localized review text and dates in any of 50 supported language/region codes
- ๐ Reads reviews newest-first, highest/lowest-rated-first, or in Airbnb's own ranking order
โก Features & Capabilities
Capabilities split into two groups: what gets extracted and how it's structured, and where a different tool from Scrapio's Airbnb coverage fits better.
Core features
- Returns three distinct, labelled row types in one dataset:
review,listing(scorecard),hostReplyโ filterable by thetypefield - Every review row carries both the cleaned text (
text, line breaks turned into real newlines) and the untouched original (textRaw) - Category scores are read straight off the listing page:
overallRating,ratingAccuracy,ratingCleanliness,ratingCheckin,ratingCommunication,ratingLocation,ratingValue - An ambiguous score โ one that matches more than once on the page โ is left
nullrather than guessed from the first hit - Host replies carry their own
replyLengthChars,hostRepliedAtLocalized, and aparentReviewIdback-reference - Duplicate reviews (which can occur when Airbnb repeats a row across pages under some sort orders) are deduplicated within a run by review
id - Listings that stop answering reviews are reported with
listingStatus: "unavailable"โ never silently reported as "zero reviews" - Inputs that aren't a listing address or ID are reported as a
type: inputSkippedrow with the reason, instead of being matched to an unrelated listing
When another tool might suit you better
This Actor is built for review-level data: reviews, category ratings, and host replies. It does not read the listing's own details โ price, amenities, photos, house rules, or availability calendar โ and it does not run keyword or location search across Airbnb's listing index. If your workflow needs listing details or search-result discovery rather than reviews, you'll need a separate Airbnb listings or search Actor alongside this one.
Airbnb Review Scraper: Category Ratings & Host Replies within the Scrapio data stack
This is currently Scrapio's only Airbnb Actor, and it covers reviews, category ratings and host replies specifically. For review data on other platforms, see Related Scrapers & Tools below.
Why do developers and data teams scrape Airbnb?
๐ข Property managers & vacation rental operators
A manager running several listings feeds their listing URLs into startUrls and reads back ratingAccuracy through ratingValue, weakestCategory, strongestCategory, categorySpread, and hostReplyRatePct for each one. Instead of opening every listing's reviews tab by hand, they get one row per property to sort by weakest category or lowest reply rate, and prioritize which listing needs a cleaning-process fix or faster host responses first. The same run's review rows (text, rating, hasHostReply) supply the supporting detail behind each score.
๐ AI training data and RAG indexing
The text and localizedText fields carry the highest-information content โ full guest reviews in natural language, cleaned of Airbnb's <br/> markup โ which is what makes this data useful for retrieval indexing or fine-tuning. Two concrete uses: (1) RAG enrichment, where review text is chunked and indexed so a support or research agent can answer "what do guests say about check-in at this property?"; (2) training data, where the numeric category fields (ratingAccuracy โฆ ratingValue, all typed floats) and the boolean hasHostReply provide consistently structured labels alongside the free text, with no HTML to strip first.
๐ Competitive and market intelligence
Tracking a set of competing listings over time means watching ratingCleanliness, ratingCommunication, and hostReplyRatePct move โ a competitor's weakestCategory shifting, or their reply rate dropping, is the metric worth alerting on. categorySpread (the gap between a listing's strongest and weakest category) is a fast read on where a competing property is over- or under-performing relative to itself.
๐ฌ Research and academic use
Hospitality and platform-economy researchers use review text and category ratings for sentiment and service-quality studies, or as a public dataset of guest-host interaction patterns. The Actor reads only what Airbnb serves on its public listing and reviews pages โ no account-gated or private data.
๐ฅ Product and SaaS development
Reputation-monitoring and review-aggregation products can run this Actor on a schedule against a portfolio of listing URLs and build an enrichment layer โ category-score history, reply-rate tracking, review-volume trends โ on top of the typed JSON rows, without maintaining an Airbnb page parser themselves.
๐ Input Parameters
All fields below are read directly from .actor/actor.json's input schema, in schema order.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array | ๐ฅ One or more Airbnb listing addresses (e.g. https://www.airbnb.com/rooms/12937) or bare listing IDs (e.g. 12937). Bulk input works too. Anything that is not a listing is reported as skipped rather than silently answered with unrelated listings. | ["https://www.airbnb.com/rooms/12937"] |
scorecardTargets | No | array | ๐ Optional additional listing addresses or listing IDs. They are merged with the list above and de-duplicated. Example: ["20669368", "https://www.airbnb.com/rooms/15335253"]. | ["20669368", "https://www.airbnb.com/rooms/15335253"] |
includeListingScorecard | No | boolean | โ
Emit one type: listing row per listing with overallRating, ratingAccuracy, ratingCleanliness, ratingCheckin, ratingCommunication, ratingLocation, ratingValue, weakestCategory, strongestCategory and categorySpread. A score that cannot be read unambiguously is left empty, never guessed. Default is on. | true |
scorecardOnly | No | boolean | ๐ Return only the per-listing scorecard row and no individual review rows. Useful for comparing many listings quickly. Default is off. | false |
includeHostReplies | No | boolean | โ Attach the host's reply text and reply date to every review that has one, and count the reply rate on the listing row. Default is on. | true |
hostRepliesAsChildRows | No | boolean | โฉ๏ธ Emit an extra type: hostReply / isChild: true row per reply, linked to its review through parentReviewId. Default is on. | true |
mirrorRepliesToChildDataset | No | boolean | ๐ฆ Copy every host reply row into a run-scoped dataset named <runId>-host-replies, in addition to the main dataset. Default is on. | true |
onlyReviewsWithHostReply | No | boolean | ๐ฏ Emit review rows only where the host replied. The listing row still reports the true reply rate over everything that was read. Default is off. | false |
reviewsPerListing | No | integer (min 1, max 10000) | ๐ข Maximum number of reviews to read per listing. Example: 30 listings ร 30 = up to 900 review rows plus their replies. Default is 30. | 30 |
maxComments | No | integer (min 1, max 10000) | ๐ข Same meaning as Reviews Per Listing, kept so an existing input file keeps working. When both are set this one wins. Leave empty to use Reviews Per Listing. | 50 |
sortOrder | No | string, enum: MOST_RECENT (Newest first (recommended)), RATING_DESC (Highest rated first), RATING_ASC (Lowest rated first), BEST_QUALITY (Airbnb's own ranking) | ๐ Which order to read the reviews in. Newest first is the default because it walks a listing without repeating rows; Airbnb's own ranking can return the same review on more than one page. | "MOST_RECENT" |
contentLanguage | No | string, enum (50 language/region codes, e.g. en-US, de-DE, fr-FR, es-ES) | ๐ฃ๏ธ Language used for the localized review text and dates. The language part of the code is what changes the result; the region part is kept in the output so you can see what was requested. | "en-US" |
locale | No | string | ๐ฃ๏ธ Same meaning as Review Language, kept so an existing input file keeps working. When both are set this one wins. Leave empty to use Review Language. | "en-US" |
proxyConfiguration | No | object | ๐ฆ Optional. The run starts on a direct connection and adjusts its route on its own if a listing is slow to answer. | {"useApifyProxy": false} |
Full JSON input example:
{"startUrls": ["https://www.airbnb.com/rooms/12937","20669368"],"includeListingScorecard": true,"scorecardOnly": false,"includeHostReplies": true,"hostRepliesAsChildRows": true,"mirrorRepliesToChildDataset": true,"onlyReviewsWithHostReply": false,"reviewsPerListing": 30,"sortOrder": "MOST_RECENT","contentLanguage": "en-US","proxyConfiguration": {"useApifyProxy": false}}
Supported URL types and input formats
startUrls and scorecardTargets accept the same three formats, resolved in normalize_target():
- Bare listing ID:
12937โ resolved tohttps://www.airbnb.com/rooms/12937 - Full listing URL:
https://www.airbnb.com/rooms/12937 - Protocol-less address:
airbnb.com/rooms/12937orwww.airbnb.com/rooms/12937โhttps://is added automatically
Anything else โ a host's name, a search URL, a free-text phrase โ cannot be resolved to one specific listing on this surface, so it is reported as a type: inputSkipped row with the reason, rather than being matched to an unrelated listing.
๐ฆ Output Format
Every run pushes typed JSON rows to the default dataset. Reviews, listing scorecards, and host replies are billed under the row_result pay-per-event charge; diagnostic rows (type: inputSkipped for unresolved inputs, type: inputError for listings that could not be read) are pushed for visibility but are not charged โ filter them out with type not in ("inputSkipped", "inputError") if you only want billable rows.
Output for a review
{"type": "review","isChild": false,"parentReviewId": null,"roomId": "12937","startUrl": "https://www.airbnb.com/rooms/12937","listingUrl": "https://www.airbnb.com/rooms/12937","reviewUrl": "https://www.airbnb.com/rooms/12937/reviews","listingStatus": "ok","locale": "en-US","id": "1234567890123456789","language": "en","text": "Great stay, very clean and quiet.\nCheck-in was smooth.","textRaw": "Great stay, very clean and quiet.<br/>Check-in was smooth.","localizedText": "Great stay, very clean and quiet.\nCheck-in was smooth.","localizedReview": {"comments": "Great stay, very clean and quiet.<br/>Check-in was smooth."},"localizedDate": "March 2026","localizedReviewerLocation": "Austin, Texas","createdAt": "2026-03-14T10:22:00Z","reviewHighlight": null,"highlightType": null,"rating": 5,"ratingAccessibilityLabel": "5-star rating","hasHostReply": true,"hostReplyText": "Thank you so much for staying with us!","hostRepliedAtLocalized": "March 2026","response": "Thank you so much for staying with us!","reviewer": {"id": "98765432","firstName": "Jamie","hostName": null,"pictureUrl": "https://a0.muscache.com/im/pictures/user/example.jpg","profilePath": "/users/show/98765432","profilePicture": "https://a0.muscache.com/im/pictures/user/example.jpg"},"reviewee": {"id": "11223344","firstName": "Morgan","hostName": "Morgan","pictureUrl": "https://a0.muscache.com/im/pictures/user/host-example.jpg","profilePath": "/users/show/11223344","profilePicture": "https://a0.muscache.com/im/pictures/user/host-example.jpg"},"reviewerName": "Jamie","reviewerId": "98765432","reviewerProfileUrl": "https://www.airbnb.com/users/show/98765432","hostName": "Morgan","hostId": "11223344","hostProfileUrl": "https://www.airbnb.com/users/show/11223344","scrapedAt": "2026-08-15T09:00:00Z"}
localizedReview is passed through as Airbnb sends it; comments is the key this row also reads for localizedText.
Output for a host reply
Pushed as its own row when hostRepliesAsChildRows is on (default).
{"type": "hostReply","isChild": true,"parentReviewId": "1234567890123456789","roomId": "12937","startUrl": "https://www.airbnb.com/rooms/12937","listingUrl": "https://www.airbnb.com/rooms/12937","reviewUrl": "https://www.airbnb.com/rooms/12937/reviews","listingStatus": "ok","id": "1234567890123456789-reply","hostReplyText": "Thank you so much for staying with us!","hostRepliedAtLocalized": "March 2026","replyLengthChars": 39,"hostName": "Morgan","hostId": "11223344","hostProfileUrl": "https://www.airbnb.com/users/show/11223344","language": "en","localizedDate": "March 2026","scrapedAt": "2026-08-15T09:00:00Z"}
Output for a listing scorecard
Pushed once per listing when includeListingScorecard is on (default).
{"type": "listing","isChild": false,"parentReviewId": null,"roomId": "12937","startUrl": "https://www.airbnb.com/rooms/12937","listingUrl": "https://www.airbnb.com/rooms/12937","reviewUrl": "https://www.airbnb.com/rooms/12937/reviews","listingStatus": "ok","locale": "en-US","id": "listing-12937","overallRating": 4.86,"ratingAccuracy": 4.9,"ratingCleanliness": 4.8,"ratingCheckin": 4.95,"ratingCommunication": 4.92,"ratingLocation": 4.7,"ratingValue": 4.75,"weakestCategory": "location","strongestCategory": "checkin","categorySpread": 0.25,"listingReviewTotal": 312,"reviewsCollected": 30,"reviewsScanned": 30,"reviewsWithReply": 18,"reviewsWithoutReply": 12,"hostReplyRatePct": 60.0,"scrapedAt": "2026-08-15T09:00:00Z"}
Any of the six category fields, weakestCategory, strongestCategory, or categorySpread can be null if the listing page didn't expose that number exactly once โ this Actor refuses to guess a score from an ambiguous match rather than report a wrong one.
Schema stability and export options
Field names stay fixed regardless of which of the three row types you're reading โ type, isChild, roomId, and scrapedAt are present on every row, so you can filter and route by type without a schema branch per row kind. Category scores that Airbnb's front end renders ambiguously are omitted as null, never silently dropped from the row shape. Output is delivered through the standard Apify dataset โ export to JSON, CSV, Excel, XML, or RSS from the Apify Console or apify_client, or read it live via the Dataset API.
๐ก Airbnb Review Scraper: Category Ratings & Host Replies Strategy Guide
๐ฏ Strategy 1: Real-time enrichment pipeline
When a new listing address lands in your CRM, property database, or lead list, trigger a run with that address in startUrls and scorecardOnly: true if you only need the score. Read back overallRating, ratingAccuracy through ratingValue, weakestCategory, and hostReplyRatePct from the resulting type: listing row and write them onto the matching record. For a full enrichment including review text, drop scorecardOnly and also read the review and hostReply rows keyed by roomId.
๐ฏ Strategy 2: Scheduled monitoring and alerting
Set up an Apify schedule to re-run the same startUrls weekly or monthly. Diff each listing's ratingCleanliness, ratingCommunication, weakestCategory, and hostReplyRatePct against the previous run's type: listing row, and alert when a category drops or the reply rate falls below a threshold you set. sortOrder: "MOST_RECENT" keeps each run's review rows non-overlapping in the order Airbnb serves them, so new reviews are easy to isolate by createdAt.
๐ฏ Strategy 3: Bulk dataset build
Feed a large startUrls list (bulk input is supported) with reviewsPerListing set as high as 10,000 for a research or training dataset, then export the dataset to CSV or a database. Listings within a single run are processed one after another rather than in parallel, so for very large batches, splitting the input across a few concurrent Actor runs finishes faster than one run with everything in it.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | Appending scores to inbound records | Triggered single-listing run | JSON row per listing/review |
| Scheduled monitoring | Tracking rating and reply-rate drift | Recurring Apify schedule | Diffed type: listing rows over time |
| Bulk dataset build | Research or training datasets | Large startUrls list, optionally split across runs | Dataset export to CSV/JSON |
๐ด Related Airbnb Scrapers & Tools
Airbnb Review Scraper: Category Ratings & Host Replies is Scrapio's only Airbnb Actor today, so there's no second Scrapio Airbnb scraper to pair it with yet. For review data on other platforms within Scrapio's catalogue:
| Scraper Name | What it extracts |
|---|---|
| Facebook Reviews Scraper With Date & Keyword Filters | Facebook page reviews with date, keyword, and recommendation filters |
| Udemy Course Reviews Scraper โ Syllabus, Lectures & Quizzes | Udemy course reviews alongside the course's curriculum outline |
| Walmart Reviews Scraper: Photos & Text Review Filtering | Walmart product reviews with photo and text filtering |
How to integrate Airbnb Review Scraper: Category Ratings & Host Replies with your stack
Airbnb Review Scraper: Category Ratings & Host Replies works with any language or tool that can make an HTTP request through the Apify API, or through Apify's official client libraries.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"startUrls": ["https://www.airbnb.com/rooms/12937","20669368",],"includeListingScorecard": True,"includeHostReplies": True,"reviewsPerListing": 30,"sortOrder": "MOST_RECENT",}run = client.actor("<YOUR_USERNAME>/airbnb-review-scraper-category-ratings-and-host-replies").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())with open("airbnb_reviews.csv", "w", newline="", encoding="utf-8") as f:writer = csv.writer(f)writer.writerow(["type", "roomId", "rating", "text", "hasHostReply", "hostReplyText"])for row in rows:if row.get("type") not in ("inputSkipped", "inputError"):writer.writerow([row.get("type"), row.get("roomId"), row.get("rating"),row.get("text"), row.get("hasHostReply"), row.get("hostReplyText"),])print(f"Wrote {len(rows)} rows to airbnb_reviews.csv")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('<YOUR_USERNAME>/airbnb-review-scraper-category-ratings-and-host-replies').call({startUrls: ['https://www.airbnb.com/rooms/12937'],includeListingScorecard: true,includeHostReplies: true,reviewsPerListing: 30,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const billable = items.filter((row) => !['inputSkipped', 'inputError'].includes(row.type));console.log(`Collected ${billable.length} billable rows`);
Async and scheduled pipelines
For fire-and-forget large jobs, start the run with client.actor(...).start() instead of .call() and poll client.run(runId).get() for status, or configure an Apify webhook to fire when the run finishes. Apify Console schedules handle the recurring case from Strategy 2 above without any code โ set a cron expression against a saved input and each run lands in a fresh dataset.
๐ฏ Who Needs Airbnb Review Scraper: Category Ratings & Host Replies? (Use Cases & Industries)
๐ข Property managers & vacation rental operators
A multi-listing manager pulls weakestCategory and hostReplyRatePct across their whole portfolio in one run, and prioritizes operational fixes โ a cleaning process, a slower host response time โ by which listing's scorecard needs it most.
๐ AI / RAG teams
Teams building a retrieval index or fine-tuning set on guest-experience text pull the cleaned text field per review alongside the typed rating and category fields, with no HTML parsing step between the dataset and the model.
๐ Competitive and market intelligence
Analysts tracking a set of competing listings watch ratingCleanliness, ratingCommunication, and hostReplyRatePct move release over release, using categorySpread to flag where a competitor is weakest relative to itself.
๐ฌ Researchers
Academic and market researchers studying guest-host interaction patterns or platform-economy service quality pull review text and category ratings as a public dataset โ this Actor reads only public listing and review pages.
๐ฅ Product and SaaS development
Teams building reputation-monitoring or review-aggregation products run this Actor on a schedule against a portfolio of listing URLs and layer their own alerting or dashboards on top of the typed rows.
โ๏ธ Is it legal to scrape Airbnb?
Scraping publicly accessible web pages is generally lawful in the United States โ courts have found that accessing data a website makes available without a login is not a violation of the Computer Fraud and Abuse Act (hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985, 9th Cir. 2019). That is a separate question from Airbnb's own Terms of Service, which restricts automated data collection; violating a platform's ToS is a civil contract matter between the user and Airbnb, not a criminal one, but it can still carry consequences like account or access restrictions.
This Actor also returns personal data โ reviewer and host first names and profile URLs alongside review text. If you store or process that data about identifiable people, data protection laws such as the GDPR (EU/UK) or the CCPA (California) may apply to your use, separately from whether the scraping itself was lawful. Airbnb Review Scraper: Category Ratings & Host Replies returns only publicly accessible data. What you do with that data is your responsibility โ consult legal counsel for commercial applications involving personal data.
โ Frequently asked questions
Does Airbnb Review Scraper: Category Ratings & Host Replies work without an Airbnb account?
Yes. No Airbnb login or account is used โ the Actor calls Airbnb's public web GraphQL endpoint anonymously, using a client key it recovers from the listing page itself.
How does Airbnb Review Scraper: Category Ratings & Host Replies handle Airbnb's anti-scraping measures?
It retries a failed request up to 3 times with exponential backoff, and detects a refusal page by status code (401/403/429) or by text indicators such as "verify you are a human" or "rate limit exceeded". The run starts on a direct connection; the first time a block is detected, it switches to a residential proxy route for the rest of the run. A 404 or 410 response is treated as a permanently gone listing and is not retried.
Can I run Airbnb Review Scraper: Category Ratings & Host Replies at scale without getting blocked?
There's no published uptime or success-rate figure. What's documented in the code: listings within one run are processed sequentially, not in parallel, and after two consecutive soft failures on a listing it's reported as listingStatus: "unavailable" rather than retried indefinitely. For very large input lists, running several batches concurrently as separate Actor runs is faster than one run with everything in it.
How fresh is the data Airbnb Review Scraper: Category Ratings & Host Replies returns?
Every run fetches live from Airbnb โ there is no caching layer. Each row carries a scrapedAt timestamp for the exact moment it was read.
What happens when a listing has no reviews or the page won't load?
A listing that stops answering with a real reviews payload is reported with listingStatus: "unavailable" on both its review-collection attempt and its scorecard row โ the Actor deliberately does not report this the same way as "this listing genuinely has zero reviews," since a refusal envelope and an empty-but-valid reviews page are different upstream signals.
What's the difference between Reviews Per Listing and the legacy Max Reviews Per Listing key?
They mean the same thing. maxComments is kept only so an existing input file that used the old key name keeps working; if both reviewsPerListing and maxComments are set, maxComments wins.
Which Airbnb review fields work best for AI training and RAG indexing?
For RAG: text and localizedText carry the cleaned review body โ the highest-information field. For training data: rating and the six category fields (ratingAccuracy through ratingValue) are consistently typed numbers across every row, and hasHostReply is a consistent boolean. All fields return as typed primitives, so no HTML stripping or normalization is needed before use.
Does Airbnb Review Scraper: Category Ratings & Host Replies store or share personal data about hosts and reviewers?
The Actor itself only extracts and returns data that Airbnb already displays publicly on the listing's reviews page โ reviewer and host first names, profile URLs, and review text. It does not store that data beyond the run's dataset or share it anywhere. Lawful basis for any further storage, processing, or use of that personal data sits with you as the user.
Does Airbnb Review Scraper: Category Ratings & Host Replies work with Claude, ChatGPT, and other AI agent tools?
There is no MCP server for this Actor. It is callable as an HTTP endpoint through the Apify API by any agent framework that can make a request โ every row returns as typed JSON, ready to drop into an LLM context window without a parsing step.
โน๏ธ Disclaimer
Airbnb Review Scraper: Category Ratings & Host Replies extracts only publicly available data from Airbnb. This tool is intended for lawful use cases only. Users are responsible for complying with Airbnb's terms of service and applicable data protection laws in their jurisdiction.