Airbnb Listing Details Scraper avatar

Airbnb Listing Details Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Airbnb Listing Details Scraper

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

Crikit

Maintained by Community

Actor 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

FieldTypeRequiredNotes
startUrlsarray of {url}one ofAirbnb /rooms/<id> URLs.
listingIdsarray of stringsone ofNumeric listing IDs (we'll build the URL).
maxItemsintegernoHard cap. Leave empty for no cap.
maxConcurrencyintegernoDefault 6. Lower it if your selected proxy pool throttles.
includeRawPayloadbooleannoDebug only. Adds ~150KB per item.
proxyConfigurationobjectnoDefaults 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}, plus coverImage and previewPhotos[]. roomCategory ties each photo to "Bedroom" / "Kitchen" / "Bathroom" / etc.
  • Amenities: amenities[] flat list with {id, title, subtitle, available, icon, category}, plus amenityGroups[] keeping Airbnb's category structure, plus amenityIds[] 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, additionalHouseRules free 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 sibling airbnb-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: seoFeatures with canonicalUrl, 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 back notfound, 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 / guests query 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-scraper actor (handles the persisted GraphQL endpoint).
  • Airbnb redirects .com to 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 exit SUCCEEDED (was FAILED). Empty / unparseable input pushes a clean error row instead of throwing.
  • 0.1 — Initial release.