Airbnb Listing Details Scraper
Pricing
from $1.50 / 1,000 results
Airbnb Listing Details Scraper
Paste any Airbnb /rooms/<id> URL and get every PDP field: photos, amenities, host info, ratings, house rules, location, pricing, and more. Fast Cheerio scraper, no browser, undercuts the market.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Crikit
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
6
Monthly active users
10 hours ago
Last modified
Categories
Share
Paste any Airbnb /rooms/<id> URL (or just a listing ID) and get back every field on the public PDP: title, description, host info, full photo list, every amenity, ratings + review category breakdown, house rules, location, pricing, availability and more. Fast Cheerio scraper, no headless browser, undercuts the market on price.
What you give it
| Field | Type | Required | Notes |
|---|---|---|---|
startUrls | array of {url} | one of | Airbnb /rooms/<id> URLs. |
listingIds | array of strings | one of | Numeric listing IDs (we'll build the URL). |
maxItems | integer | no | Hard cap. Leave empty for no cap. |
maxConcurrency | integer | no | Default 6. Lower it if your selected proxy pool throttles. |
includeRawPayload | boolean | no | Debug only. Adds ~150KB per item. |
proxyConfiguration | object | no | Defaults to Apify Proxy automatic mode. You can select a proxy group or provide custom proxy URLs. |
What you get back
One thorough JSON record per listing, structured into:
- Core:
id,propertyId,url,canonicalUrl,title,description,descriptionHtml,descriptionSections[](the space / guest access / during your stay / other things to note / registration),propertyType,roomType,homeTier,personCapacity,bedrooms,beds,bathrooms,bathroomShared - Location:
coordinates {lat, lng},locationSubtitle,locationDetails[](neighborhood highlights, getting around),mapMarkerType,mapMarkerRadiusMeters,locationVerification,utcOffset - Host:
host.id,host.name,host.profilePictureUrl,host.isSuperhost,host.isVerified,host.about,host.highlights[],host.responseTime,host.metrics[](years hosting, reviews, rating),host.yearsHosting,host.coHosts[],host.superhostTitle,host.superhostText,host.hostDetails[] - Photos: ordered
photos[]array with{id, url, accessibilityLabel, aspectRatio, orientation, roomCategory, position}, pluscoverImageandpreviewPhotos[].roomCategoryties each photo to "Bedroom" / "Kitchen" / "Bathroom" / etc. - Amenities:
amenities[]flat list with{id, title, subtitle, available, icon, category}, plusamenityGroups[]keeping Airbnb's category structure, plusamenityIds[]from logging context - Highlights:
highlights[](e.g. "Top 5% of homes", "Self check-in") - Sleeping arrangements:
sleepingArrangements[]with per-room title, subtitle, icons, images - Accessibility:
accessibilityFeatures[]grouped by area, each with{title, subtitle, available, images} - House rules:
houseRules[]quick list,houseRulesGrouped[]full breakdown,additionalHouseRulesfree text - Safety & property:
safetyAndProperty[]preview +safetyAndPropertyGrouped[]full breakdown - Policies:
cancellationPolicy {title, forDisplay},propertyLicenses[],importantInformation[] - Reviews:
reviewCount,overallRating,ratingCategories[](cleanliness / accuracy / check-in / communication / location / value),ratingDistribution[](5–1 stars),reviewTags[],isGuestFavorite,qualityScorePercentile,inlineReviews[](first ~6 from the SSR payload — for full pagination use the siblingairbnb-review-scraper) - Pricing & availability (when Airbnb includes it in the listing payload):
available,canInstantBook,petsAllowed,maxGuestCapacity,priceLabel,priceOriginal,priceDiscounted,priceQualifier,priceBreakdown,unavailabilityMessage,priceDisclaimer,currency,minNights,maxNights,availabilityItems[] - SEO:
seoFeatureswithcanonicalUrl,seoTitle,seoMetaDescription,breadcrumbs[],nearbyCities[],otherPropertyTypes[],ogTags,indexInSearchEngines - Meta:
pdpType(MARKETPLACE/LUXE/PLUS/HOTEL_TONIGHT),pdpUrlType,isHotelStay,isLuxe,locale,scrapedAt,finalUrl
If a field is genuinely missing from the listing (e.g. host hasn't set a description), the value is null. We score against extracted ÷ available, not extracted ÷ requested.
Pricing
This actor is designed for Apify result pricing: each successful listing pushed to the default dataset is one billable result. Individual failed listing attempts are stored in the key-value store under ERRORS; if a run produces no listing results at all, the actor pushes one run-level error item so the processing attempt is still visible and billable.
Worked examples at $0.0015 per result:
- 100 listings: $0.15
- 1,000 listings: $1.50
- 10,000 listings: $15.00
Cheaper than competitor red.cars/airbnb-scraper at $0.005/item (70% less) and undercuts tri_angle/airbnb-scraper's flat $30/month for everything except the heaviest bulk users.
How it works
We pull the SSR JSON payload Airbnb embeds in <script id="data-deferred-state-0"> on every /rooms/<id> page. No headless browser, no network of GraphQL calls. One HTTP request → one full record. That's why we can charge under a fifth of a cent per listing.
Limits to be aware of
- Deleted / migrated listings return a
{ "extractionStatus": "notfound", ... }row rather than retrying — Airbnb serves a 200 OK with a 404 page for these. If a listing you expect to exist comes backnotfound, open it in a browser to confirm it's still live. - Date-specific pricing fields only appear when Airbnb includes them in the listing page payload. If you need a dated quote, paste a listing URL that already has Airbnb's
check_in/check_out/guestsquery parameters. - Min/max nights typically only surface when Airbnb includes calendar data in the page payload; for date-less fetches these are often
null. - Inline reviews are the first ~6 from the PDP payload. For full review pagination use our companion
airbnb-review-scraperactor (handles the persisted GraphQL endpoint). - Airbnb redirects
.comto the visitor's regional domain (.ca,.co.uk, etc.). The actor follows redirects transparently. - Proxy: Apify Proxy automatic mode is the default and is what we test against. If you're hitting throttling on a tight schedule, you can plug your own residential URLs into
proxyConfiguration.
Plugging in your own proxy
In the proxyConfiguration input, set:
{"proxyConfiguration": {"proxyUrls": ["http://user:pass@residential.brightdata.com:22225","http://user:pass@gate.smartproxy.com:7000"// ...add as many as you want; Crawlee will round-robin]}}
FAQ
Why is this cheaper than the alternatives? Most other Airbnb scrapers use Playwright (a real browser). We don't need one because Airbnb already server-renders the full payload as JSON. Cheerio + raw HTTP is roughly 8x faster and 8x cheaper.
Can I get full reviews, not just the inline ones?
Use airbnb-review-scraper (same author). It paginates the persisted GraphQL endpoint and pulls every review with date filtering.
Can I scrape a search URL?
Use airbnb-search (same author). Paste any Airbnb search URL or location and get every result.
How fresh is the data? Every run hits the live PDP. No caching on our end.
Changelog
0.1.8— Detect Airbnb's 404 page directly and push a{"extractionStatus": "notfound"}row instead of retrying 5×. Test fixtures replaced with currently-active listing IDs.0.1.7— Multi-listing runs with partial success now exitSUCCEEDED(wasFAILED). Empty / unparseable input pushes a clean error row instead of throwing.0.1— Initial release.