Airbnb Full-Year Price Scraper avatar

Airbnb Full-Year Price Scraper

Pricing

from $8.00 / 1,000 results

Go to Apify Store
Airbnb Full-Year Price Scraper

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

Crikit

Maintained by Community

Actor 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

FieldTypeRequiredNotes
listingUrlsarray of URLsyes (or listingIds)Airbnb listing URLs like https://www.airbnb.com/rooms/18850420.
listingIdsarray of stringsyes (or listingUrls)Numeric listing IDs as an alternative to URLs.
currencystringno, default USDISO-4217 currency code. Airbnb does the conversion server-side.
adultsintegerno, default 2Adult guest count used in booking quotes. Some listings price per guest.
monthsAheadintegerno, default 12How many months of calendar to scrape (max 24).
fetchPricesbooleanno, default trueSet false to skip booking-quote calls and return only availability.
onlyAvailableDaysbooleanno, default falseSet true to skip rows for dates the host has blocked.
maxItemsintegernoHard cap on rows pushed across all listings.
proxyConfigurationobjectnoDefaults 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.

FieldTypeNotes
listingIdstringNumeric Airbnb listing ID.
listingUrlstringCanonical Airbnb URL.
listingTitlestringThe host-set listing name (e.g. "Romantic loft downtown").
listingLatitude / listingLongitudenumberListing coordinates.
calendarDatestringYYYY-MM-DD.
availablebooleanHost's calendar marks the date open.
bookablebooleanPer calendar API (less reliable; use bookItAvailable).
availableForCheckin / availableForCheckoutbooleanPer calendar API.
minNightsintegerMinimum stay if checking in on this date.
maxNightsintegerMaximum stay if checking in on this date.
bookItAvailablebooleanAuthoritative bookability for the priced window.
canInstantBookbooleanInstant-book eligibility flag from Airbnb.
unavailabilityMessagestringReason Airbnb gives when the window is not bookable.
currencystringISO 4217 code (matches the input currency).
nightlyPricenumberReal nightly rate from the booking quote.
nightlyPriceFormattedstringe.g. $1,236.40 USD.
originalPricenumberWindow total before any discount (when applicable).
originalPriceFormattedstringe.g. $6,182 USD.
discountedPricenumberWindow total after the host or platform discount.
discountedPriceFormattedstringe.g. $5,046 USD.
discountAmountnumberAbsolute amount of the discount on the window.
priceAfterDiscountnumberPrice after discount, before taxes.
priceAfterDiscountFormattedstringe.g. $5,045.60 USD.
totalForWindownumberTop-line price for the priced window.
totalForWindowFormattedstringFormatted version of totalForWindow.
priceWindowNightsintegerNumber of nights the window covers.
priceBreakdownarrayItemized breakdown: per-night subtotal, discount lines, fees.
priceAccessibilityLabelstringLong-form description, e.g. "$5,046 for 5 nights, originally $6,182".
priceQualifierstringe.g. for 5 nights, total.
integratedTipstringFree-cancellation tip, e.g. Free cancellation before June 14.
promotionAnnouncementstringe.g. This host is offering a discount, Rare find!.
adultsintegerGuest count used to fetch this quote.
scrapedAtstringISO-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

  1. Availability grid. One call to PdpAvailabilityCalendar returns 12 months of day-level data: available, minNights, maxNights, availableForCheckin/out flags.

  2. 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 a StaysPdpBookItQuery with all of these include-flags set to true:

    • includePdpMigrationBookItCalendarSheetFragment
    • includePdpMigrationBookItFloatingFooterFragment
    • includePdpMigrationBookItNavFragment
    • includePdpMigrationBookItSidebarFragment
    • includeOverviewMerchandisingTipsFragment

    With them all true, the response returns the full booking sidebar payload: structuredDisplayPrice with discountedPrice, 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.)

  3. 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: false from BookIt, the calendar's "available" flag is preserved but the booking fields are null (consistent with what a guest sees).

  4. 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 > 12 to 12. The actor stitches multiple calls automatically when monthsAhead > 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). bookItAvailable is authoritative.
  • Pre-booked dates legitimately have no price. The row appears with available: false, nightlyPrice: null.
  • Currency conversion is server-side. Pass currency=EUR and 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 to StaysPdpBookItQuery with 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.