Airbnb priced calendar
Day-by-day availability for 1-12 months with Airbnb's own quoted prices.
/v1/airbnb/calendarOne upstream call returns availability, min/max nights and check-in / check-out rules. With price_nights = sample or all, each priced date is the check-in of a real quoted stay (stay_nights, default the date's minimum stay) from the query the listing page's booking sidebar runs: the nightly figure, taxes, discounts and total the guest would see.
Request
https://api.scrapercompany.com/v1/airbnb/calendarAuthenticate with your API key in the x-api-key header (see Authentication).
Body
JSON object. Unknown fields are rejected with 422.
- currencystring | null
Airbnb-supported ISO 4217 currency for quoted prices. Omit for the domain's default; the currency Airbnb actually priced in is returned on every priced day.
51 allowed values
AED, AUD, BAM, BGN, BRL, CAD, CHF, CLP, CNY, COP, CRC, CZK, DKK, EGP, EUR, GBP, GHS, GTQ, HKD, HNL, HUF, IDR, ILS, INR, JPY, KES, KRW, KZT, MAD, MXN, MYR, NOK, NZD, PEN, PHP, PLN, QAR, RON, RUB, SAR, SEK, SGD, THB, TRY, TWD, UAH, UGX, USD, UYU, VND, ZAR
- adultsintegerdefault
1min 1, max 16Adults aged 13+; quotes are priced for this party.
- childrenintegerdefault
0min 0, max 15Children aged 2-12.
- infantsintegerdefault
0min 0, max 5Infants under 2.
- petsintegerdefault
0min 0, max 5Pets.
- max_price_quotesinteger | nullmin 1, max 92
Upper bound on price quotes, 1-92. The request holds 8 + this many credits and is charged 8 + the nights actually priced.
- stay_nightsinteger | nullmin 1, max 28
Length of the stay each priced date is quoted for. Omit to use each date's own minimum stay. Airbnb folds cleaning and service fees into its nightly rate, so the same night costs less per night on a longer stay. 1-28.
- listing_idstringrequiredpattern ^\d{1,25}$
Numeric Airbnb listing id: the number in
https://www.airbnb.com/rooms/<id>, orproperties[].idfrom/v1/serp/airbnb. - airbnb_domainstringdefault
airbnb.comCountry/language Airbnb host. The host does not change prices; it picks the market and the default currency.
94 allowed values
airbnb.ae, airbnb.am, airbnb.at, airbnb.az, airbnb.ba, airbnb.be, airbnb.ca, airbnb.cat, airbnb.ch, airbnb.cl, airbnb.cn, airbnb.co.cr, airbnb.co.id, airbnb.co.in, airbnb.co.kr, airbnb.co.nz, airbnb.co.uk, airbnb.co.ve, airbnb.com, airbnb.com.ar, airbnb.com.au, airbnb.com.bo, airbnb.com.br, airbnb.com.bz, airbnb.com.co, airbnb.com.ec, airbnb.com.ee, airbnb.com.gt, airbnb.com.hk, airbnb.com.hn, airbnb.com.my, airbnb.com.ni, airbnb.com.pa, airbnb.com.pe, airbnb.com.ph, airbnb.com.py, airbnb.com.ro, airbnb.com.sg, airbnb.com.sv, airbnb.com.tr, airbnb.com.tw, airbnb.com.ua, airbnb.com.vn, airbnb.cz, airbnb.de, airbnb.dk, airbnb.es, airbnb.fi, airbnb.fr, airbnb.gr, airbnb.gy, airbnb.hu, airbnb.ie, airbnb.is, airbnb.it, airbnb.jp, airbnb.lt, airbnb.lu, airbnb.lv, airbnb.me, airbnb.mx, airbnb.nl, airbnb.no, airbnb.pl, airbnb.pt, airbnb.rs, airbnb.ru, airbnb.se, airbnb.si, ar.airbnb.com, bg.airbnb.com, de.airbnb.lu, es.airbnb.com, fr.airbnb.be, fr.airbnb.ca, fr.airbnb.ch, ga.airbnb.ie, he.airbnb.com, hi.airbnb.co.in, hr.airbnb.com, it.airbnb.ch, ka.airbnb.com, kn.airbnb.co.in, mk.airbnb.com, mr.airbnb.co.in, mt.airbnb.com.mt, sk.airbnb.com, sq.airbnb.com, sw.airbnb.com, th.airbnb.com, xh.airbnb.co.za, zh-t.airbnb.com, zh.airbnb.com, zu.airbnb.co.za
- monthsintegerdefault
3min 1, max 12Calendar months to return, starting at
start_month(default 3). - start_monthinteger | nullmin 1, max 12
First month, 1-12. Defaults to the current month.
- start_yearinteger | nullmin 2020, max 2100
Year of
start_month. Defaults to the current year. - price_nightsstringdefault
samplenone: availability only (one upstream request).sample: quotemax_price_quotescheck-in dates spread evenly over the valid ones (default 12).all: quote every valid check-in date in order, up tomax_price_quotes(default and maximum 92). Each quote is one ~0.9 KB upstream request and one credit.One of
nonesampleall - include_listingbooleandefault
falseAdd title, property type, rating, capacity and coordinates from one extra ~10 KB upstream request. No extra credits.
Example request
curl -X POST "https://api.scrapercompany.com/v1/airbnb/calendar" \
-H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"currency": "CAD",
"adults": 2,
"max_price_quotes": 8,
"listing_id": "34397368",
"airbnb_domain": "airbnb.ca",
"months": 2,
"price_nights": "sample"
}'Response
200 — Day-by-day availability with quoted nightly prices (trimmed to 3 days). Metered responses carry x-credits-charged and x-credits-remaining headers (see credit headers).
{
"listing_id": "34397368",
"link": "https://www.airbnb.ca/rooms/34397368",
"airbnb_domain": "airbnb.ca",
"currency": "CAD",
"requested_currency": "CAD",
"guests": {
"adults": 2,
"children": 0,
"infants": 0,
"pets": 0
},
"start_month": 10,
"start_year": 2026,
"months": 2,
"price_nights": "sample",
"max_price_quotes": 8,
"listing": {
"constant_min_nights": 2,
"max_guests": 2,
"pets_allowed": false,
"children_allowed": true
},
"summary": {
"days": 61,
"available": 35,
"available_for_checkin": 31,
"bookable": 34,
"priced": 8,
"min_price_per_night": 169.5,
"max_price_per_night": 178,
"median_price_per_night": 178,
"price_status": {
"check_in_not_allowed": 4,
"not_sampled": 23,
"priced": 8,
"unavailable": 26
}
},
"days": [
{
"date": "2029-03-03",
"available": false,
"available_for_checkin": false,
"available_for_checkout": false,
"bookable": false,
"min_nights": 2,
"max_nights": 27,
"closed_to_arrival": false,
"closed_to_departure": false,
"price_status": "unavailable"
},
{
"date": "2029-03-07",
"available": true,
"available_for_checkin": true,
"available_for_checkout": true,
"bookable": true,
"min_nights": 2,
"max_nights": 27,
"closed_to_arrival": false,
"closed_to_departure": false,
"price_status": "priced",
"price": {
"price_per_night": 178,
"currency": "CAD",
"check_in": "2029-03-07",
"check_out": "2029-03-09",
"nights": 2,
"accommodation": 356,
"taxes": 67.64,
"total": 423.64,
"price_per_night_text": "$178.00 CAD",
"total_text": "$423.64 CAD",
"display_total": "$424 CAD",
"price_basis": "nightly_all_in_before_taxes",
"display_style": "REGULATED_TOTAL",
"breakdown": [
{
"description": "2 nights x $178.00 CAD",
"price": "$356.00 CAD",
"extracted_price": 356,
"kind": "nights"
},
{
"description": "Taxes",
"price": "$67.64 CAD",
"extracted_price": 67.64,
"kind": "tax"
}
],
"provenance": {
"schema_version": 1,
"observation_id": "rateobs_9e60ad832506e113550acd2fe556ad55",
"collection_id": "ratecol_c328ca4cf9a747448dc64c2e80f86e25",
"observed_at": "2026-09-30T22:48:15.032Z",
"source": "airbnb",
"source_kind": "vacation_rental_stay_quote",
"collector": "scrapingme.ota.airbnb_calendar",
"source_property_id": "34397368",
"requested_market": "airbnb.ca",
"requested_currency": "CAD",
"returned_currency": "CAD",
"egress_mode": "direct",
"price_basis": "nightly_all_in_before_taxes",
"derivation": "airbnb_stay_average_nightly"
}
}
}
],
"metadata": {
"collection_id": "ratecol_c328ca4cf9a747448dc64c2e80f86e25",
"observed_at": "2026-09-30T22:48:15.032Z",
"calendar_operation": "PdpAvailabilityCalendar",
"upstream_requests": 9,
"price_quotes": 8,
"wire_bytes": 8913,
"request_time_taken": 4.69,
"parsing_time_taken": 0.001,
"total_time_taken": 1.52,
"egress": [
"direct"
]
}
}Response fields
Fields marked required are always present; others appear when they apply.
- listing_idstringrequired
Airbnb listing id.
- linkstringrequired
Listing URL on
airbnb_domain. - airbnb_domainstringrequired
- currencystring
Currency of the quoted prices: the one Airbnb priced in, else the requested
currency. Omitted when neither is known (nocurrencysent and no day priced). - requested_currencystring
Present only when
currencywas sent. - guestsobjectrequired
Party the quotes were priced for.
Show 4 child fieldsHide child fields
- guests.adultsintegerrequired
- guests.childrenintegerrequired
- guests.infantsintegerrequired
- guests.petsintegerrequired
- start_monthintegerrequired
Effective first month (defaults to the current UTC month).
- start_yearintegerrequired
Effective year of
start_month. - monthsintegerrequired
- price_nightsstringrequired
One of
nonesampleall - stay_nightsinteger
Present only when
stay_nightswas sent. - max_price_quotesintegerrequired
Quote budget that applied: the requested
max_price_quotesor the mode default (12 forsample, 92 forall), capped at 92 and at 31 xmonths; 0 withprice_nights: none. - listingobject
Present only when at least one listing fact is known.
Show 16 child fieldsHide child fields
- listing.constant_min_nightsinteger
Minimum stay that applies to every date, when Airbnb reports one.
- listing.max_guestsinteger
Guest capacity.
- listing.pets_allowedboolean
- listing.children_allowedboolean
- listing.infants_allowedboolean
- listing.guest_policystring
Airbnb's guest-policy sentence, e.g.
This place has a maximum of 2 guests, not including infants. - listing.titlestring
Listing title. Only with
include_listing. - listing.property_typestring
Airbnb property type, e.g.
PRIVATE_SUITE. Only withinclude_listing. - listing.room_typestring
Airbnb space type, e.g.
ENTIRE_HOME. Only withinclude_listing. - listing.locationstring
Displayed location, e.g.
Toronto. Only withinclude_listing. - listing.overviewarray of string
Summary items, e.g.
Entire guest suite,1 bed,1 bath. Only withinclude_listing. - listing.ratingnumber
Average rating. Only with
include_listing. - listing.reviewsinteger
Review count. Only with
include_listing. - listing.is_guest_favoriteboolean
Only with
include_listing. - listing.is_luxeboolean
Only with
include_listing. - listing.gps_coordinatesobject
Only with
include_listing.Show 2 child fieldsHide child fields
- listing.gps_coordinates.latitudenumberrequired
- listing.gps_coordinates.longitudenumberrequired
- summaryobjectrequired
Counts over the returned days, and the spread of quoted nightly prices.
Show 9 child fieldsHide child fields
- summary.daysintegerrequired
Days returned.
- summary.availableintegerrequired
Days whose night is open.
- summary.available_for_checkinintegerrequired
Days Airbnb allows arriving on.
- summary.bookableintegerrequired
Days Airbnb marks bookable.
- summary.pricedintegerrequired
Days with a quoted price (each is charged 1 credit).
- summary.min_price_per_nightnumber
Lowest
price_per_nightamong priced days. Present only when at least one day was priced. - summary.max_price_per_nightnumber
Highest
price_per_nightamong priced days. Present only when at least one day was priced. - summary.median_price_per_nightnumber
Median
price_per_nightamong priced days, 2 decimals. Present only when at least one day was priced. - summary.price_statusobjectrequired
Number of days per
price_statusvalue, keys sorted; only statuses that occur are present.Show 14 child fieldsHide child fields
- summary.price_status.pricedinteger
- summary.price_status.not_sampledinteger
- summary.price_status.quote_cap_reachedinteger
- summary.price_status.not_requestedinteger
- summary.price_status.unavailableinteger
- summary.price_status.pastinteger
- summary.price_status.check_in_not_allowedinteger
- summary.price_status.check_out_not_allowedinteger
- summary.price_status.stay_blockedinteger
- summary.price_status.stay_exceeds_max_nightsinteger
- summary.price_status.quote_refusedinteger
- summary.price_status.no_priceinteger
- summary.price_status.quote_failedinteger
- summary.price_status.quote_skippedinteger
- daysarray of objectrequired
One row per date of the requested months, in date order.
Show 12 child fieldsHide child fields
- days[].datestring (date)required
Calendar date; the night starts on this date.
- days[].availablebooleanrequired
The night is open (not booked or blocked).
- days[].available_for_checkinbooleanrequired
Airbnb allows arriving on this date.
- days[].available_for_checkoutbooleanrequired
Airbnb allows departing on this date.
- days[].bookablebooleanrequired
Airbnb's bookable flag for this date.
- days[].min_nightsinteger
Minimum stay for a check-in on this date. Present only when Airbnb reports it.
- days[].max_nightsinteger
Maximum stay for a check-in on this date. Present only when Airbnb reports it.
- days[].closed_to_arrivalboolean
Arrival restriction for this date. Present only when Airbnb returns arrival/departure rules for it.
- days[].closed_to_departureboolean
Departure restriction for this date. Present only when Airbnb returns arrival/departure rules for it.
- days[].price_statusobject
Present unless
price_nightsisnone.14 allowed values
priced, not_sampled, quote_cap_reached, not_requested, unavailable, past, check_in_not_allowed, check_out_not_allowed, stay_blocked, stay_exceeds_max_nights, quote_refused, no_price, quote_failed, quote_skipped
- days[].price_errorstring
Reason behind
quote_refused(Airbnb's message),no_price,quote_failedorquote_skipped(deadline_exceededorstopped_after_failures). Present only when there is one. - days[].priceobject
Present only when
price_statusispriced.Show 17 child fieldsHide child fields
- days[].price.price_per_nightnumberrequired
Airbnb's own nightly figure for the quoted stay (the
N nights x $Xline): all-in, with cleaning and service fees folded in, before taxes. It depends on the stay length, so read it withcheck_in,check_outandnights. - days[].price.currencystring
Currency Airbnb priced the quote in (ISO 4217). Omitted when it can't be read from the price text.
- days[].price.check_instring (date)required
Check-in of the quoted stay (this date).
- days[].price.check_outstring (date)required
Check-out of the quoted stay.
- days[].price.nightsintegerrequired
Nights in the quoted stay:
stay_nights, or the date's minimum stay when that is longer orstay_nightswas omitted. - days[].price.accommodationnumber
Exact subtotal of the nightly line (
nightsx nightly rate). Omitted when the amount can't be read. - days[].price.discountnumber
Total discount as a positive amount (e.g. a long-stay discount). Present only when the quote has a discount line.
- days[].price.feesnumber
Sum of separately listed fee lines. Present only when Airbnb itemizes fees;
price_basisis thennightly_before_listed_fees_and_taxes. - days[].price.taxesnumber
Sum of tax lines. Present only when Airbnb itemizes taxes.
- days[].price.totalnumber
Stay total including taxes, from the quote's Total line. Present only when the quote has one.
- days[].price.price_per_night_textstringrequired
Nightly figure as displayed, e.g.
$178.00 CAD. - days[].price.total_textstring
Total line as displayed. Present only when the quote has one.
- days[].price.display_totalstring
Headline price Airbnb shows for the stay, rounded as displayed (e.g.
$424 CAD). Present only when shown. - days[].price.price_basisstringrequired
What
price_per_nightincludes.nightly_all_in_before_taxes: fees folded in, taxes separate.nightly_before_listed_fees_and_taxes: the quote itemized a fee line, so those fees are infees, not in the nightly figure.One of
nightly_all_in_before_taxesnightly_before_listed_fees_and_taxes - days[].price.display_stylestring
Airbnb's price display style for the quote, e.g.
REGULATED_TOTAL. Present only when Airbnb returns one. - days[].price.breakdownarray of objectrequired
Airbnb's price lines in display order.
- days[].price.provenanceobjectrequired
Where, when and how one normalized price was observed.
- metadataobjectrequired
Show 10 child fieldsHide child fields
- metadata.collection_idstringrequired
Shared by every price in this response (
ratecol_...). - metadata.observed_atstringrequired
UTC observation time, ISO-8601.
- metadata.calendar_operationstringrequired
Upstream operation used.
- metadata.upstream_requestsintegerrequired
Upstream requests made, including retried attempts.
- metadata.price_quotesintegerrequired
Stays planned for quoting (skipped quotes included).
- metadata.wire_bytesintegerrequired
Bytes received from upstream, compressed.
- metadata.request_time_takennumberrequired
Seconds spent in upstream requests, summed. Quotes run in parallel, so this can exceed
total_time_taken. - metadata.parsing_time_takennumberrequired
Seconds spent parsing the calendar.
- metadata.total_time_takennumberrequired
End-to-end seconds for this request.
- metadata.egressarray of stringrequired
How upstream requests were routed:
direct,proxy, or both.
- warningsarray of string
Things worth checking: refused, failed or skipped quotes, a currency other than the one asked for, stays quoted longer than
stay_nights, missing listing details. Present only when there is at least one.
Errors
Errors return a JSON body with a detail field. Failed requests are not charged. See Errors for the full list and retry advice.
| Status | Meaning | Retry? |
|---|---|---|
401Unauthorized | Missing or invalid API key. {"detail":"missing or invalid API key"} | No, fix the request |
402Payment Required | Not enough credits for this request. Only returned once credit enforcement is switched on; during the beta metering runs in shadow mode and never blocks. {"detail":"insufficient credits: this request costs 5, 0 available. Credits renew 2026-11-01."} | No, fix the request |
404Not Found | The property, stay, job or record was not found. {"detail":"job not found"} | No, fix the request |
422Unprocessable Content | Request validation failed. {"detail":[{"loc":["body","name"],"msg":"Field required","type":"missing"}]} | No, fix the request |
429Too Many Requests | Too many requests: the key's requests-per-minute limit was exceeded, or (once credit enforcement is on) the plan's concurrent-request limit. No rate-limit or Retry-After headers are sent; back off and retry. {"detail":"rate limit 60/min exceeded"} | Yes, with backoff |
502Bad Gateway | The upstream source failed, blocked the request or returned an unusable answer. Safe to retry later; failed requests are not charged. {"detail":"RuntimeError"} | Yes, with backoff |
503Service Unavailable | Temporarily unavailable: a dependency of this endpoint is down, or the upstream source changed its contract. Retry later. {"detail":"database unavailable: OperationalError"} | Yes, with backoff |
Try it
- Export your key:
export SCRAPERCOMPANY_API_KEY=sk_...(no key yet? request access). - Copy the cURL example above and run it in a terminal.
- Or open the interactive playground on api.scrapercompany.com, paste your key and pick this endpoint.