Airbnb Full-Year Price Scraper
Pricing
from $8.00 / 1,000 results
Airbnb Full-Year Price Scraper
Returns one row per calendar day for the next 12 months of any Airbnb listing, with the actual nightly price filled in. Unlike availability-only scrapers, this resolves real prices by calling Airbnb's booking API per day.
Pricing
from $8.00 / 1,000 results
Rating
0.0
(0)
Developer
Crikit
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
Get the real host-set nightly price for every available day of any Airbnb listing, for up to 12 months ahead. One row per calendar date, with availability flags, minimum-stay rules, instant-book status, and the actual booking-quote price (including any discount the host has applied) populated for every bookable day.
This is the actor you reach for when you need to track Airbnb pricing over a full year for revenue management, market research, comp analysis, or short-term-rental dashboards. It calls Airbnb's calendar API for availability and Airbnb's booking-quote API per date window to resolve the exact same price your guests see when they click "Reserve."
Why this exists
Other Airbnb calendar scrapers on Apify all use PdpAvailabilityCalendar, which is the obvious endpoint and which returns price: null for every day. They ship that null and call it done.
This actor uses Airbnb's StaysPdpBookItQuery, the API that powers the booking sidebar, with the right combination of fragment-include flags to unlock the full pricing payload. You get the same numbers a guest sees on the listing page: nightly rate, total for the stay, original price, discounted price, discount amount, instant-book eligibility, and the host's booking tips.
What you give it
| Field | Type | Required | Notes |
|---|---|---|---|
listingUrls | array of URLs | yes (or listingIds) | Airbnb listing URLs like https://www.airbnb.com/rooms/18850420. |
listingIds | array of strings | yes (or listingUrls) | Numeric listing IDs as an alternative to URLs. |
currency | string | no, default USD | ISO-4217 currency code. Airbnb does the conversion server-side. |
adults | integer | no, default 2 | Adult guest count used in booking quotes. Some listings price per guest. |
monthsAhead | integer | no, default 12 | How many months of calendar to scrape (max 24). |
fetchPrices | boolean | no, default true | Set false to skip booking-quote calls and return only availability. |
onlyAvailableDays | boolean | no, default false | Set true to skip rows for dates the host has blocked. |
maxItems | integer | no | Hard cap on rows pushed across all listings. |
proxyConfiguration | object | no | Defaults to Apify Residential Proxy. Required for sustained throughput. |
What you get back
One row per calendar date per listing. Every available day carries the actual booking-quote price.
| Field | Type | Notes |
|---|---|---|
listingId | string | Numeric Airbnb listing ID. |
listingUrl | string | Canonical Airbnb URL. |
listingTitle | string | The host-set listing name (e.g. "Romantic loft downtown"). |
listingLatitude / listingLongitude | number | Listing coordinates. |
calendarDate | string | YYYY-MM-DD. |
available | boolean | Host's calendar marks the date open. |
bookable | boolean | Per calendar API (less reliable; use bookItAvailable). |
availableForCheckin / availableForCheckout | boolean | Per calendar API. |
minNights | integer | Minimum stay if checking in on this date. |
maxNights | integer | Maximum stay if checking in on this date. |
bookItAvailable | boolean | Authoritative bookability for the priced window. |
canInstantBook | boolean | Instant-book eligibility flag from Airbnb. |
unavailabilityMessage | string | Reason Airbnb gives when the window is not bookable. |
currency | string | ISO 4217 code (matches the input currency). |
nightlyPrice | number | Real nightly rate from the booking quote. |
nightlyPriceFormatted | string | e.g. $1,236.40 USD. |
originalPrice | number | Window total before any discount (when applicable). |
originalPriceFormatted | string | e.g. $6,182 USD. |
discountedPrice | number | Window total after the host or platform discount. |
discountedPriceFormatted | string | e.g. $5,046 USD. |
discountAmount | number | Absolute amount of the discount on the window. |
priceAfterDiscount | number | Price after discount, before taxes. |
priceAfterDiscountFormatted | string | e.g. $5,045.60 USD. |
totalForWindow | number | Top-line price for the priced window. |
totalForWindowFormatted | string | Formatted version of totalForWindow. |
priceWindowNights | integer | Number of nights the window covers. |
priceBreakdown | array | Itemized breakdown: per-night subtotal, discount lines, fees. |
priceAccessibilityLabel | string | Long-form description, e.g. "$5,046 for 5 nights, originally $6,182". |
priceQualifier | string | e.g. for 5 nights, total. |
integratedTip | string | Free-cancellation tip, e.g. Free cancellation before June 14. |
promotionAnnouncement | string | e.g. This host is offering a discount, Rare find!. |
adults | integer | Guest count used to fetch this quote. |
scrapedAt | string | ISO-8601 timestamp. |
Pricing
Flat $0.008 per daily-price row. A full year of one listing is 365 rows = $2.92.
The leading competitor charges $0.003 per row plus $0.01 extra per priced date = $0.013 per priced day. They also return null prices for every day. We are 38% cheaper AND actually deliver the price.
Worked examples:
- 1 listing, 12 months, with prices: 365 rows × $0.008 = $2.92
- 10 listings, 12 months, with prices: 3,650 rows × $0.008 = $29.20
- 100 listings, 12 months, with prices: 36,500 rows × $0.008 = $292.00
How it works under the hood
-
Availability grid. One call to
PdpAvailabilityCalendarreturns 12 months of day-level data:available,minNights,maxNights,availableForCheckin/outflags. -
Per-window booking quote. The actor chunks the year into non-overlapping windows aligned to each listing's
minNights. For every window with at least one available day, it issues aStaysPdpBookItQuerywith all of these include-flags set to true:includePdpMigrationBookItCalendarSheetFragmentincludePdpMigrationBookItFloatingFooterFragmentincludePdpMigrationBookItNavFragmentincludePdpMigrationBookItSidebarFragmentincludeOverviewMerchandisingTipsFragment
With them all true, the response returns the full booking sidebar payload:
structuredDisplayPricewithdiscountedPrice,originalPrice, per-night breakdown, plus availability, instant-book, and merchandising tips. (With them all false, you only get the empty node skeleton, which is why most competing scrapers ship null prices.) -
Row emission. Per calendar day, the actor emits one row carrying the calendar flags plus the booking-quote data for whichever window covered that date. If a window came back
isAvailable: falsefrom BookIt, the calendar's "available" flag is preserved but the booking fields are null (consistent with what a guest sees). -
Rate-limit handling. Airbnb's API sits behind Akamai with per-IP rate limits. The actor uses Apify Residential Proxy with per-request session rotation: every API call gets a fresh upstream IP, so 429s don't cascade.
Limits to be aware of
- 12 months is Airbnb's hard cap. The calendar endpoint silently clamps
count > 12to 12. The actor stitches multiple calls automatically whenmonthsAhead > 12. - Min-stay listings (>14 nights) have larger windows, so per-night cost is lower; you still get the same per-day row.
- Calendar-available vs BookIt-available: the calendar API sometimes says "available" for dates the host actually won't accept as a booking (day-of-week-only checkin, holiday blackouts).
bookItAvailableis authoritative. - Pre-booked dates legitimately have no price. The row appears with
available: false, nightlyPrice: null. - Currency conversion is server-side. Pass
currency=EURand Airbnb returns EUR prices.
FAQ
Why is this cheaper than the next-best competitor? They charge $0.003 per row plus $0.01 extra when prices exist. A priced year of one listing is 365 × $0.013 = $4.75. We do it at $0.008 flat per row = $2.92. And we actually return the price, where they return null.
Does the actor return the same price I'd see if I clicked "Reserve" on the listing page? Yes. The booking-quote API the actor hits is the same one your browser hits when it renders the booking sidebar. Discounts, promotional rates, and instant-book status are all what a guest would see.
Can I scrape multiple listings in one run?
Yes. Paste any number of URLs into listingUrls. The actor processes three listings at a time, each fanning out internally to eight concurrent booking-quote calls.
Does this require my login or session cookie? No. Airbnb's public API key is hardcoded into every airbnb.com page; the actor uses that. No authentication, no PII.
Changelog
0.2: switched price source from search-bbox toStaysPdpBookItQuerywith all fragment-include flags enabled. Adds discount, original price, instant-book, and merchandising-tip data. Real nightly rates match what guests see at booking.0.1: initial release. Calendar + per-day booking-quote pipeline. Residential proxy rotation. Multi-listing concurrency.