Airbnb Listing Details - Amenities, Host & Ratings
Pricing
from $1.00 / 1,000 listings
Airbnb Listing Details - Amenities, Host & Ratings
Extract public Airbnb listing details with amenities, photos, host profile information and six numeric category ratings. One consistent schema with star distribution and plain-text descriptions. No prices, guest review texts or host contact data.
Pricing
from $1.00 / 1,000 listings
Rating
0.0
(0)
Developer
Sumitr Mardy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share
Airbnb Listing Details Scraper
Export public Airbnb listing details: amenities, photos, host profile fields, six category ratings and the star distribution. Pass listing ids or room URLs and receive one consistent, never-null row per unique listing.
This independent actor is not affiliated with or endorsed by Airbnb.
No prices are returned. The public server-rendered room page does not contain the booking-box price. Currency, dates and guest inputs do not change this. Use Airbnb Search Scraper for search prices, then pass its listingId values here to enrich those results.
Quick start
{"listings":["27349246","7743405"],"language":"en","currency":"USD"}
Country domains and subdomains work, for example https://www.airbnb.co.uk/rooms/27349246. Inputs are normalized to the canonical Airbnb.com room URL. Query strings in pasted room URLs are ignored.
Input
| Field | Default | Behavior |
|---|---|---|
| listings | Required | Numeric id strings or public Airbnb room URLs. Up to 5,000, deduplicated by id. Use strings for long ids to avoid JavaScript number rounding. |
| currency | USD | Passed through to the public page; does not add prices. |
| language | en | Sent as accept-language. English is recommended for parsing overview counts. |
| checkIn, checkOut | Empty | Optional YYYY-MM-DD pair, check-out after check-in. Passed through; no price output. |
| adults | Empty | Optional 1–16 adults, passed through; no price output. |
The daily Store example requests only two Lisbon listings. Two listings are fetched concurrently. Writes and charges are serialized to honor the global event spending cap.
Output
One row per unique listing, including one free row when it fails. All keys are present, never null. Missing strings are "", numbers 0, booleans false and arrays []. Missing numeric values do not imply a verified zero.
| Fields | Meaning |
|---|---|
| inputIndex, input, listingId, url | Original position/value, normalized id and canonical room URL. |
| name, propertyType, summaryTitle | Listing title, sharing/property type and public overview title. |
| guests, bedrooms, beds, baths | Public capacity and parsed overview counts; baths can be fractional. |
| latitude, longitude, isExactLocation | Public coordinates and precision flag. Respect approximate locations. |
| city, breadcrumbs | Public localized location and SEO breadcrumb labels joined with >. |
| rating, reviewsCount | Overall numeric rating and listing rating count. |
| ratingCleanliness, ratingAccuracy, ratingCheckin | Numeric category ratings. |
| ratingCommunication, ratingLocation, ratingValue | Remaining numeric category ratings. |
| ratingDistribution | Object with all five keys, "1" through "5". Fractions from 0 to 1, not percentages or review counts. Missing data uses five zeros. |
| isGuestFavorite, isNew | Public quality flags. New listings can lack category ratings/distribution even if they have one overall rating. |
| hostName, hostId, isSuperhost, hostPhoto | Public host profile fields. hostId is decoded from DemandUser, not an unrelated contextual id. |
| hostRatingCount | Host rating count supplied by the page; distinct from listing reviewsCount. |
| description | Plain text with line breaks; HTML tags removed and entities decoded. |
| amenities, amenitiesUnavailable | Available and explicitly unavailable amenity titles. |
| houseRules, safety, highlights | Public labels from those sections. |
| photos | Deduplicated media-tour URLs, falling back to hero media if needed. |
| status, subStatus, error, scrapedAt | Result status, machine-readable reason, error and UTC ISO timestamp. |
Pricing and statuses
One listing event per saved successful detail row. FREE $0.002, BRONZE $0.0015, SILVER $0.0012, GOLD and above $0.001 ($2 / $1.50 / $1.20 / $1 per 1,000 listings). Standard Actor start fee is $0.00005 per GB, minimum one event.
Failed rows have no listing charge; the start fee still applies. No extra dataset-item event. The actor saves each row before charging and respects your event spending cap.
| status / subStatus | Listing charge |
|---|---|
| ok / listing | Yes |
| failed / invalid_input | No |
| failed / not_found | No; HTTP 404 or 410 |
| failed / redirected | No; any 3xx, not followed |
| failed / http_CODE, blocked, parse_error, network_error | No |
| failed / free_work_limit | No; internal unpaid-work guard |
| failed / cost_limit_reached | No; event spending cap reached |
Honest limits
- No prices, calendars, guest review texts or host contact data. Only public listing-page fields.
- No login, cookies, API key extraction or private booking API. Collection uses plain HTTP, not a browser or fingerprint spoofing.
- Field layout and availability depend on Airbnb's public page. Missing fields keep stable sentinels; absent pdpPresentation yields a free parse_error.
- English overview labels are used for bed/bath/guest count parsing. Other languages can return those counts as 0 when labels differ; explicit personCapacity still supplies guests when present.
- A listing can be unavailable, removed or redirected. Redirects are intentionally not followed.
- A 403/429 gets one direct retry after backoff, then at most one Apify datacenter proxy attempt if available. Never residential.
- Requests have hard deadlines. An internal loss guard limits unproductive requests; large lists can stop with free_work_limit.
- Public coordinates may be approximate. The actor does not infer a street address or host contact information.
Pair it with Search
- Run Airbnb Search Scraper for a city, dates and currency.
- Keep the successful rows and collect their listingId strings.
- Send those ids here; join both datasets by listingId to combine search prices with amenities, host fields and category ratings.
Search prices and room details are collected at different times and may change. For recurring work, configure your own Apify tasks/schedule.
API examples
curl -X POST \"https://api.apify.com/v2/acts/sumitr_mardy~airbnb-listing-details/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"listings":["27349246","7743405"],"language":"en"}'
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("sumitr_mardy/airbnb-listing-details").call(run_input={"listings": ["27349246", "7743405"]})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["name"], listing["ratingCleanliness"], listing["amenities"])
Use it from AI agents (MCP)
Hosted OAuth clients can connect to Apify MCP:
{"mcpServers":{"airbnb-details":{"url":"https://mcp.apify.com/?tools=sumitr_mardy/airbnb-listing-details"}}}
Bearer clients can supply their own token through local secret configuration:
{"mcpServers":{"airbnb-details":{"url":"https://mcp.apify.com/?tools=sumitr_mardy/airbnb-listing-details","headers":{"Authorization":"Bearer <YOUR_APIFY_TOKEN>"}}}}
For stdio clients with Node.js:
{"mcpServers":{"airbnb-details":{"command":"npx","args":["-y","@apify/actors-mcp-server","--actors","sumitr_mardy/airbnb-listing-details"],"env":{"APIFY_TOKEN":"<YOUR_APIFY_TOKEN>"}}}}
Agent tips: start with two ids, inspect status before analysis, distinguish listing and host rating counts, treat distribution as fractions, and use the Search actor for prices.
Support: Actor issues.