Airbnb Experiences Scraper
Pricing
from $2.99 / 1,000 experiences
Airbnb Experiences Scraper
Scrape public Airbnb Experiences with pricing, ratings, duration, category, identifiers, badges, image metadata, and fail-closed access diagnostics.
Pricing
from $2.99 / 1,000 experiences
Rating
0.0
(0)
Developer
w3crawler
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
What does Airbnb Experiences Scraper do?
Airbnb Experiences Scraper collects rich, public activity listings from Airbnb Experiences. It is an Airbnb Experiences API alternative for search-result harvesting, pagination, filtering, sorting, and optional detail-page enrichment.
The Actor reads Airbnb's server-rendered data first, uses stable DOM selectors as a fallback, and can enrich selected records from public experience pages. It does not log in, solve CAPTCHAs, cross paywalls, or collect private profile data.
Why use Airbnb Experiences Scraper?
Use the Actor to build experience catalogs, destination research datasets, travel recommendation systems, price and rating comparisons, tourism reports, or monitoring workflows.
Main capabilities:
- Rich search records with title, description, location, category, price breakdowns, currency, rating, review count, duration, badges, image IDs, image URLs, and page metadata.
- Public detail enrichment with host information, meeting point, structured location, gallery media metadata, highlights, agenda, guest requirements, policies, accessibility, ticketing, related activities, reviews, and availability.
- Multiple Airbnb search URLs in one run, global
maxItemsenforcement, and optional deduplication across pages and locations. - Cursor-aware pagination with a safe offset fallback. Custom URL query parameters are preserved when the next page is requested.
- Keyword, price, rating, review-count, duration, and ticketed-only filters.
- Stable sorting by price, rating, reviews, or duration. Non-recommended sorting is performed across the complete fetched page set before the top records are selected.
- Fail-closed diagnostics when a public page is blocked or unavailable, including a run summary and optional debug HTML/screenshot artifacts.
- Apify scheduling, API access, integrations, run history, monitoring, and optional Apify proxy routing for browser requests. Proxy routing does not bypass access controls; the HTTP fallback remains direct.
What data can Airbnb Experiences Scraper extract?
The most useful fields are shown below. Fields are omitted when Airbnb does not expose a value, and nullable fields are supported in the dataset schema.
| Field | Type | Description |
|---|---|---|
experienceId | string | Airbnb experience identifier. |
url | string | Public experience detail URL. |
title | string | Public experience title. |
description | string | Search-card byline or description. |
location | string | Activity location shown in search results. |
price | number | Parsed per-guest price. |
priceFormatted | string | Visible formatted price label. |
currency | string | Requested or parsed currency code. |
rating | number | Average public rating. |
reviewCount | integer | Public review count. |
durationMinutes | integer | Parsed experience duration. |
category | string | Public primary theme or category. |
thumbnailUrl | string | Primary image URL. |
imageUrls | array | Search-card image URLs. |
detailMedia | array | Detail gallery records with URLs, dimensions, tags, and aspect ratios. |
hostName | string | Public host or activity-provider name. |
locationDetails | object | Structured public country, region, locality, and address data. |
highlights / agenda | arrays | Public highlights and activity steps. |
reviews | array | Bounded public review sample. |
availability | array | Currently exposed public time slots and capacity. |
recordId / recordType | string / string | Stable row identity and experience or diagnostic record kind. |
searchUrl / searchPage | string / integer | Source search page and one-based page number. |
How to scrape Airbnb Experiences
- Open the Actor's Input tab.
- Enter a
location, or provide one or more Airbnb Experiences search URLs instartUrls. - Select the currency, locale, date range, filters, sort order, page limit, and item limit.
- Decide whether to enrich detail pages and whether to include public reviews and availability.
- Start the Actor and open the Dataset tab when the run completes.
- Download the results or use the Actor's API tab to integrate the dataset into an application, workflow, or scheduled job.
How much will it cost to scrape Airbnb Experiences?
The Actor is compute-based. A small search-only run normally uses less compute than a multi-page run with detail enrichment, reviews, and availability. The main cost controls are maxItems, maxPages, includeDetails, maxDetailItems, maxReviews, maxConcurrency, and requestTimeoutSecs.
Filters are applied while pages are fetched. With a non-recommended sort, the Actor may fetch every allowed page before selecting the best maxItems records, so a larger maxPages can increase both coverage and compute usage. Current run cost and platform pricing are shown in the Apify Console for your account.
Input
See the Input tab for the complete validated configuration. All fields are optional; the default generated search is London, in USD, with up to 50 records and detail enrichment enabled for up to 20 records.
Search configuration and input sources
| Field | Type | Default | Description |
|---|---|---|---|
location | string | London | City, region, or country used to build the search URL when startUrls is empty. |
category | enum | "" | Optional category: art, cooking, entertainment, fitness, history, nature, social, sports, or tours. An empty value searches all categories. |
currency | enum | USD | Price currency: USD, EUR, GBP, CAD, AUD, INR, JPY, or SGD. |
locale | string | en | Airbnb locale such as en or fr-FR. Valid format is xx or xx-YY. |
startDate | YYYY-MM-DD string | not set | Optional experience start date. |
endDate | YYYY-MM-DD string | not set | Optional experience end date. Must be on or after startDate. |
startUrls | array of objects | not set | Custom Airbnb Experiences search URLs. Each entry must be { "url": "https://..." }. These URLs take precedence over generated location, category, and date parameters, while result filters still apply. |
startUrls supports multiple locations in one run. Duplicate URLs are removed before crawling, and the URL path is used to derive the source search location for each record.
Result filters
| Field | Type | Default | Description |
|---|---|---|---|
keyword | string | "" | Case-insensitive match against title, description, location, and category. Maximum 200 characters. |
minPrice | number | not set | Keep records at or above this per-guest price. Range: 0β100000. |
maxPrice | number | not set | Keep records at or below this per-guest price. Range: 0β100000; 0 means no upper bound. |
minRating | number | not set | Minimum public rating from 0 to 5. Records without a rating do not pass when this filter is set. |
minReviewCount | integer | not set | Minimum public review count. Range: 0β10000000. |
minDurationMinutes | integer | not set | Minimum duration in minutes. Range: 0β10080. |
maxDurationMinutes | integer | not set | Maximum duration in minutes. Range: 0β10080; 0 means no upper bound. |
ticketedOnly | boolean | false | Keep only records Airbnb marks as ticketed. |
Sorting
sortBy value | Meaning |
|---|---|
recommended | Preserve Airbnb/source order and stop when the global item limit is reached. |
price_asc | Lowest parsed price first. |
price_desc | Highest parsed price first. |
rating_desc | Highest rating first. |
reviews_desc | Highest review count first. |
duration_asc | Shortest duration first. |
duration_desc | Longest duration first. |
Missing numeric values sort after records with values. Ties retain source order.
Pagination and result limits
| Field | Type | Default | Description |
|---|---|---|---|
maxItems | integer | 50 | Maximum records emitted across all start URLs. Range: 1β1000. |
maxPages | integer | 0 | Maximum pages per start URL. Range: 0β100; 0 continues until maxItems or Airbnb has no next page, with a hard 100-page safety cap. |
deduplicate | boolean | true | Remove repeated experienceId values across pages and start URLs. |
The Actor follows Airbnb's exposed next-page cursor when possible and otherwise advances the items_offset safely. It preserves existing query parameters such as currency, locale, dates, and custom filters. Page-level filtering does not stop pagination just because a page has few matches; the next page is requested while the configured limits and source pagination allow it.
Detail enrichment
| Field | Type | Default | Description |
|---|---|---|---|
includeDetails | boolean | true | Open public detail pages and merge structured detail data into selected records. |
maxDetailItems | integer | 20 | Maximum records to enrich. Range: 0β100; 0 disables detail requests. |
includeReviews | boolean | true | Include public review objects on enriched records when exposed. |
maxReviews | integer | 5 | Maximum review entries per enriched record. Range: 1β20. |
includeAvailability | boolean | true | Include currently exposed public time slots and capacity metadata when available. |
includeDiagnostics | boolean | true | Emit explicit diagnostic rows for blocked, empty, or unavailable public pages. Set to false to keep diagnostics out of the dataset; OUTPUT_SUMMARY still records counts. |
Detail extraction uses public activity payloads first, then JSON-LD/DOM fallback data. If a detail request fails, the original search record is still emitted with detailEnriched: false and bounded detail error fields.
Developer options
These controls are grouped under Developer Options in the input schema.
| Field | Type | Default | Valid range | Description |
|---|---|---|---|---|
requestDelayMs | integer | 2000 | 0β15000 | Delay before each browser/HTTP request. Use a respectful production value. |
maxConcurrency | integer | 2 | 1β5 | Maximum Playwright pages processed in parallel. Higher values use more memory and may increase blocking risk. |
maxRequestRetries | integer | 3 | 0β10 | Maximum retries for failed browser requests. |
requestTimeoutSecs | integer | 120 | 30β300 | Per-page browser and fallback HTTP timeout. |
requestHandlerTimeoutSecs | integer | 300 | 60β900 | Maximum time for one crawler handler, including extraction and queued detail work. Must be at least requestTimeoutSecs. |
proxyConfiguration | object | not set | β | Apify proxy configuration for browser requests. The fallback HTTP transport remains direct when browser startup fails. |
Input examples
1. Quick rich search
This uses the generated London search, one page, and one enriched detail record. It is a good smoke-test input.
{"location": "London","currency": "GBP","maxItems": 5,"maxPages": 1,"includeDetails": true,"maxDetailItems": 1,"includeReviews": true,"maxReviews": 3,"includeAvailability": true,"requestDelayMs": 2000,"maxConcurrency": 1,"maxRequestRetries": 2,"requestTimeoutSecs": 90}
2. Filtered food experiences with global rating sort
Non-recommended sorting considers all matched records from the fetched pages before selecting the top three.
{"location": "London","keyword": "food","minPrice": 20,"maxPrice": 150,"minRating": 4,"minReviewCount": 5,"minDurationMinutes": 30,"maxDurationMinutes": 240,"sortBy": "rating_desc","maxItems": 3,"maxPages": 2,"includeDetails": false}
3. Multiple cities from custom search URLs
Each startUrls item is an object with a required url property. The global maxItems limit and deduplication apply across both locations.
{"startUrls": [{ "url": "https://www.airbnb.com/s/London/experiences?currency=USD&locale=en" },{ "url": "https://www.airbnb.com/s/Paris/experiences?currency=EUR&locale=fr-FR" }],"maxItems": 25,"maxPages": 2,"deduplicate": true,"includeDetails": true,"maxDetailItems": 5}
4. Ticketed attractions in a date range
{"location": "London","category": "tours","currency": "USD","locale": "en","startDate": "2026-10-01","endDate": "2026-10-07","ticketedOnly": true,"minRating": 4.5,"sortBy": "price_asc","maxItems": 10,"maxPages": 3,"includeDetails": true,"maxDetailItems": 3,"includeReviews": false,"includeAvailability": true}
5. Developer-controlled search-only run
Use this shape for a low-concurrency run when you only need search-card data.
{"location": "New York","maxItems": 20,"maxPages": 1,"includeDetails": false,"requestDelayMs": 3000,"maxConcurrency": 1,"maxRequestRetries": 1,"requestTimeoutSecs": 60,"requestHandlerTimeoutSecs": 120,"includeDiagnostics": false}
For browser routing on the Apify platform, add a standard proxy configuration such as { "proxyConfiguration": { "useApifyProxy": true } }. The configuration is applied to browser requests; the bounded direct HTTP fallback is used only when browser startup or access fails.
Output
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. The default dataset contains one record per extracted experience, or an explicit diagnostic record when Airbnb does not provide usable public data.
Search and run-trace fields
The current implementation can emit these normalized top-level fields:
| Group | Fields |
|---|---|
| Identity | experienceId, listingId, pictureId, url, recordId, recordType |
| Request trace | requestedUrl, finalUrl, status, ok, dataAvailable, accessStatus, sourceDomain, locale, searchLocation, searchUrl, searchPage, pageNum, source, scrapedAt |
| Search content | title, description, location, category, durationMinutes, durationText, rating, reviewCount |
| Search pricing | price, priceOriginal, priceMin, priceMax, priceFormatted, currency, priceQualifier, priceLeadingText, isFromPrice, priceDetails, priceDiscountText |
| Search media | thumbnailUrl, thumbnailAspectRatio, imageUrls, imageIds, imageCount, imageAspectRatios, badges, badgeTypes |
| Search status | isTicketed, timeLeftToBook, pageType, found, targetKind, runStatus, error, errorCode, extractionMethod, fallbackMode |
thumbnailUrl, imageUrls, and detailImageUrls are selected from the experience/listing media payload or semantic gallery elements. Airbnb platform icons, search-bar assets, badges, logos, and avatars are excluded from listing media. Reviewer profile pictures, when public, remain available only as the explicit reviews[].reviewerProfilePictureUrl field.
Detail fields
When includeDetails is enabled and a detail page is available, the record may also include:
| Group | Fields |
|---|---|
| Detail status | detailEnriched, detailExtractionMethod, detailError, detailErrorCode, detailScrapedAt |
| Detail content | detailTitle, detailDescription, detailIntro, detailActivityId, detailCategory, detailPriceFormatted, detailRating, detailReviewCount |
| Host and location | hostName, hostUrl, hostDescription, hostOtherReviewCount, meetingPoint, locationDetails |
| Media | detailImageUrls, detailImageCount, detailImageAspectRatios, detailMedia |
| Itinerary and requirements | highlights, agenda, thingsToKnow, guestRequirements, meetingTypes, policies, accessibilityFeatures |
| Product and links | productType, isTicketed, supportsLimitedInventory, isUpgraded, ticketing, shareUrl, publishedOfferingId, helpCenterUrls |
| Related and social proof | suggestedActivities, reviews, availability |
Nested output structures
The normalized nested objects commonly contain the following keys. Airbnb may add source-specific keys over time.
| Field | Common nested keys |
|---|---|
priceDetails[] | label, price, priceFormatted |
detailMedia[] | id, uri, altText, caption, tags, originalWidth, originalHeight, aspectRatio, orientation |
locationDetails | country, region, locality, displayLabel, formattedAddress |
guestRequirements | minAge, childrenAllowed, infantsAllowed; each may contain isEnabled, minAge, and maxAge |
highlights[] | type, name, description, imageUrl |
agenda[] | id, title, description, imageUrl |
thingsToKnow[] | type, title, description, icon |
accessibilityFeatures[] | type, name, description, isEnabled, icon |
policies | guestRequirements, activityLevel, whatIsIncluded, whatYouNeed, accessibility, cancellationPolicy, termsOfService, ticketDisclaimer |
ticketing | isFlexibleEntry, guestNameCollectionRequired, isTicketed |
helpCenterUrls | accessibility, preScreening, ticketDisclaimer |
suggestedActivities[] | experienceId, title, location, priceFormatted, rating, reviewCount, thumbnailUrl, category |
reviews[] | reviewId, rating, comment, highlightedComment, date, reviewerName, reviewerId, reviewerLocation, reviewerProfilePictureUrl, paidPromotionDisclaimer |
availability[] | id, bookingStartTime, instanceDay, instanceStartTime, instanceStartTimeWithOffset, instanceStartTimeUtc, instanceDuration, availabilityDescription, isAvailable, lowRemainingAvailability, remainingCapacity, maximumCapacity |
Representative rich dataset item
The following is a valid, shortened example of the shape returned after detail enrichment. Array lengths vary by listing and by the input limits.
{"position": 1,"pageNum": 1,"searchLocation": "London","searchUrl": "https://www.airbnb.com/s/London/experiences?currency=USD&locale=en","source": "Airbnb Experiences","url": "https://www.airbnb.com/experiences/1234567","experienceId": "1234567","listingId": "RXhwbG9yZUFjdGl2aXR5TGlzdGluZzoxMjM0NTY3","pictureId": "UGljdHVyZToyNTEzOTU1MjY3","title": "Example Historic Walking Tour","description": "Explore a historic district with a local guide.","location": "Example City","price": 45,"priceOriginal": 50,"priceMin": 45,"priceMax": 50,"priceFormatted": "From $45 USD per guest","currency": "USD","priceQualifier": "/ guest","priceLeadingText": "From","isFromPrice": true,"priceDetails": [{ "label": "Adults", "price": 45, "priceFormatted": "$45 USD per guest" }],"rating": 4.9,"reviewCount": 128,"durationMinutes": 150,"durationText": "2.5 hours","category": "Cultural tours","thumbnailUrl": "https://a0.muscache.com/im/pictures/example-cover.jpg","thumbnailAspectRatio": 1.5,"imageUrls": ["https://a0.muscache.com/im/pictures/example-cover.jpg"],"imageIds": ["UGljdHVyZTpleGFtcGxl"],"imageCount": 1,"imageAspectRatios": [1.5],"badges": ["Popular"],"badgeTypes": ["BEST_SELLER"],"isTicketed": false,"detailEnriched": true,"detailExtractionMethod": "browser_activity_listing","detailScrapedAt": "2026-09-05T12:00:00.000Z","detailTitle": "Example Historic Walking Tour","detailDescription": "A guided tour through an example historic district.","detailIntro": "Meet a local guide and discover the city's history.","detailActivityId": "QWN0aXZpdHlMaXN0aW5nOjEyMzQ1Njc=","detailPriceFormatted": "From $45 USD per guest","detailCategory": "History","hostName": "Example Host","hostUrl": "https://www.airbnb.com/users/show/12345","hostDescription": "A local guide with several years of experience.","hostOtherReviewCount": 850,"meetingPoint": "Meet near Example Square.","locationDetails": {"country": "Example Country","region": "Example Region","locality": "Example City","displayLabel": "Example City, Example Region","formattedAddress": "Example Square, Example City"},"detailImageUrls": ["https://a0.muscache.com/im/pictures/example-detail.jpg"],"detailImageCount": 1,"detailImageAspectRatios": [1.3333],"detailMedia": [{"id": "SW1hZ2VFbnRpdHk6ZXhhbXBsZQ==","uri": "https://a0.muscache.com/im/pictures/example-detail.jpg","altText": "View from the tour","caption": "Historic district","tags": [{ "name": "cover" }],"originalWidth": 1200,"originalHeight": 900,"aspectRatio": 1.3333,"orientation": "LANDSCAPE"}],"highlights": [{ "type": "LOCATION", "name": "Example Square", "description": "Meet in the historic center." }],"agenda": [{ "title": "Welcome", "description": "Meet the host and start the walk." }],"thingsToKnow": [{ "type": "GUEST_REQUIREMENTS", "title": "Guest requirements", "description": "Guests aged 12 and over can attend." }],"guestRequirements": {"minAge": { "isEnabled": true, "minAge": 12 },"childrenAllowed": { "isEnabled": true, "minAge": 12, "maxAge": 17 }},"meetingTypes": ["IN_PERSON"],"policies": {"whatIsIncluded": "Local guide","cancellationPolicy": "Cancel according to the public listing policy."},"accessibilityFeatures": [{ "type": "WHEELCHAIR_ACCESSIBLE", "name": "Wheelchair accessible", "isEnabled": true }],"productType": "EXPERIENCE","supportsLimitedInventory": true,"isUpgraded": true,"ticketing": { "isFlexibleEntry": false, "guestNameCollectionRequired": false, "isTicketed": false },"shareUrl": "https://www.airbnb.com/experiences/1234567","publishedOfferingId": "QWN0aXZpdHlPZmZlcmluZzo2MjE0MTUz","helpCenterUrls": { "accessibility": "https://www.airbnb.com/help/article/2166" },"suggestedActivities": [{ "experienceId": "7654321", "title": "Related public experience", "location": "Example City", "rating": 4.8 }],"reviews": [{"reviewId": "review-123","rating": 5,"comment": "An excellent experience.","date": "July 2026","reviewerName": "Example Guest","reviewerLocation": "Example City"}],"availability": [{"id": "slot-123","instanceDay": "2026-10-01","instanceStartTime": "10:00 am","instanceStartTimeUtc": "2026-10-01T09:00:00Z","instanceDuration": 150,"availabilityDescription": "4 spots available","isAvailable": true,"remainingCapacity": 4,"maximumCapacity": 8}],"scrapedAt": "2026-09-05T12:00:00.000Z"}
Detail fallback record
If a detail page cannot be enriched, the base search result remains available:
{"experienceId": "1234567","title": "Example Historic Walking Tour","url": "https://www.airbnb.com/experiences/1234567","detailEnriched": false,"detailExtractionMethod": "browser_detail","detailError": "Detail response unavailable","detailErrorCode": "DETAIL_EXTRACTION_FAILED","detailScrapedAt": "2026-09-05T12:00:00.000Z"}
Run summary and diagnostics
At the end of every run, the Actor writes OUTPUT_SUMMARY to the default key-value store:
{"status": "SUCCEEDED","itemCount": 25,"successfulCount": 25,"diagnosticCount": 0,"blockedCount": 0,"scheduledCount": 25,"detailRequested": 3,"startUrlCount": 1,"searchPagesProcessed": 2,"filteredOutCount": 0,"dataAvailable": true,"fallbackUsed": false,"source": "airbnb_experiences_public_pages","completedAt": "2026-09-05T12:00:00.000Z"}
The summary fields are status, itemCount, successfulCount, diagnosticCount, blockedCount, scheduledCount, detailRequested, detailEnriched, detailFailed, failedRequestCount, startUrlCount, searchPagesProcessed, filteredOutCount, paginationStoppedReason, dataAvailable, fallbackUsed, source, and completedAt.
When a public search page is blocked or returns no usable records, the Actor stops that access path fail-closed and can emit a diagnostic record such as:
{"pageType": "run_diagnostic","recordId": "airbnb_experience_diagnostic_aHR0cHM6Ly93d3cuYWlyYm5iLmNvbQ","recordType": "diagnostic","requestedUrl": "https://www.airbnb.com/s/London/experiences","finalUrl": "https://www.airbnb.com/s/London/experiences","status": "error","ok": false,"dataAvailable": false,"accessStatus": "blocked","targetKind": "search","sourceDomain": "airbnb.com","runStatus": "BLOCKED_FAIL_CLOSED","error": "HTTP 403","errorCode": "HTTP_403","fallbackMode": "http","source": "Airbnb Experiences","scrapedAt": "2026-09-05T12:00:00.000Z"}
The key-value store may also contain debug_html and debug_screenshot for a blocked or empty browser page. These artifacts help explain why a run produced diagnostics instead of experience rows.
Tips and advanced options
- Start with
maxItems: 5,maxPages: 1,includeDetails: false, andmaxConcurrency: 1while testing a new URL. - Increase
maxPageswhen filters are selective. A page with zero matches does not necessarily mean the source has no later matches. - Use
sortBy: "recommended"for the fastest path. Price, rating, review, and duration sorts may fetch all allowed pages before choosing the final records. - Keep
requestDelayMsandmaxConcurrencyconservative for production runs. - Set
maxDetailItemslower thanmaxItemswhen you need a broad search dataset but only a sample of rich detail pages. - Set
includeReviewsorincludeAvailabilitytofalsewhen those nested arrays are not needed. - If a custom URL already contains Airbnb search parameters, use
startUrls; pagination will preserve those parameters while changing only the page offset.
FAQ, support, and responsible use
Why did I receive fewer records than maxItems?
The source may have fewer public results, filters may exclude records, pagination may be limited by maxPages, or Airbnb may have blocked the request. Check OUTPUT_SUMMARY, especially filteredOutCount, searchPagesProcessed, dataAvailable, fallbackUsed, and the diagnostic fields.
Why are detail fields missing?
Detail enrichment is bounded by maxDetailItems and only runs when includeDetails is true. Airbnb may also omit a field, expose it only for some products, or temporarily block the detail request. A failed enrichment keeps the base search record and adds detailError fields.
Can I use a proxy with this Actor?
Yes. Supply a standard Apify proxyConfiguration object to route browser requests through the configured Apify proxy. If the browser cannot launch and the bounded HTTP fallback is used, those direct requests do not inherit browser proxy routing. Proxying does not solve CAPTCHAs or bypass access controls.
Where can I report a problem?
Use the Actor's Issues tab for bug reports and feature requests. Include the input JSON, run ID, OUTPUT_SUMMARY, and the relevant error code when possible. For programmatic use, use the Actor's API tab and the dataset download links in the run details.
Disclaimer
This Actor is not affiliated with Airbnb. Use it only for lawful, ethical purposes and respect Airbnb's terms, robots rules, rate limits, and applicable privacy laws.
Our Actors are ethical and do not extract private user data such as email addresses, gender, or private location. They only extract information that is publicly available on the requested pages. Results can still contain personal data that a public host or reviewer chose to display. Personal data is protected by the GDPR in the European Union and by other regulations around the world. Do not scrape personal data unless you have a legitimate reason to do so; consult qualified legal counsel if you are unsure.