Airbnb availability calendar (SearchAPI)
SearchAPI's airbnb_property_availability_calendar, field for field.
/v1/serp/airbnb_property_availability_calendarprice_nights: none; with sample or all, plus 1 per night actually priced (at most 92). Failed requests are freeproperty_id, start_month, start_year, months and airbnb_domain keep SearchAPI's names and defaults, and every day keeps date, is_available, is_available_for_checkin, is_available_for_checkout, is_bookable, min_nights and max_nights. SearchAPI has no prices; set price_nights to add a price object to priced days (SearchAPI's Airbnb search price vocabulary). The default none costs 8 credits.
Request
https://api.scrapercompany.com/v1/serp/airbnb_property_availability_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.
- enginestringdefault
airbnb_property_availability_calendarAccepted for SearchAPI request compatibility; the path already selects the engine.
- property_idstringrequiredpattern ^\d{1,25}$
Numeric Airbnb listing id: the number in
https://www.airbnb.com/rooms/<id>, orproperties[].idfrom/v1/serp/airbnb. - start_monthinteger | nullmin 1, max 12
SearchAPI
start_month: first month, 1-12. Defaults to the current month. - start_yearinteger | nullmin 2020, max 2100
SearchAPI
start_year. Defaults to the current year. - monthsintegerdefault
12min 1, max 12SearchAPI
months: 1-12, default 12. - 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
- price_nightsstringdefault
noneScraperCompany addition. Default
nonereturns exactly SearchAPI's fields at the base cost.none: 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 - zero_retentionbooleandefault
falseAccepted for SearchAPI compatibility; calendars and quotes are never persisted.
Example request
curl -X POST "https://api.scrapercompany.com/v1/serp/airbnb_property_availability_calendar" \
-H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"currency": "CAD",
"property_id": "34397368",
"months": 2,
"airbnb_domain": "airbnb.ca"
}'Response
200 — SearchAPI airbnb_property_availability_calendar fields, plus prices. Metered responses carry x-credits-charged and x-credits-remaining headers (see credit headers).
{
"search_metadata": {
"id": "search_5b0f8c1d2e3a4f5061728394",
"status": "Success",
"created_at": "2026-09-30T22:48:15+00:00",
"request_time_taken": 3.61,
"parsing_time_taken": 0.001,
"total_time_taken": 1.46,
"request_url": "https://www.airbnb.ca/rooms/34397368",
"collection_id": "ratecol_c328ca4cf9a747448dc64c2e80f86e25",
"observed_at": "2026-09-30T22:48:15.032Z",
"wire_bytes": 7003,
"upstream_requests": 7
},
"search_parameters": {
"engine": "airbnb_property_availability_calendar",
"airbnb_domain": "airbnb.ca",
"property_id": "34397368",
"start_month": 10,
"start_year": 2026,
"months": 2,
"currency": "CAD",
"adults": 2,
"price_nights": "sample",
"max_price_quotes": 6
},
"months": [
{
"year": 2026,
"month": 10,
"days": [
{
"date": "2029-03-06",
"is_available": true,
"is_available_for_checkin": true,
"is_available_for_checkout": true,
"is_bookable": true,
"min_nights": 2,
"max_nights": 27,
"price_status": "not_sampled"
},
{
"date": "2029-03-07",
"is_available": true,
"is_available_for_checkin": true,
"is_available_for_checkout": true,
"is_bookable": true,
"min_nights": 2,
"max_nights": 27,
"price_status": "priced",
"price": {
"check_in_date": "2029-03-07",
"check_out_date": "2029-03-09",
"currency": "CAD",
"price_per_night": "$178.00 CAD",
"extracted_price_per_night": 178,
"total_price": "$424 CAD",
"extracted_total_price": 424,
"qualifier": "for 2 nights",
"extracted_qualifier": 2,
"price_per_qualifier": "2 nights x $178.00 CAD",
"extracted_price_per_qualifier": 178,
"total_with_taxes": "$423.64 CAD",
"extracted_total_with_taxes": 423.64,
"breakdown": [
{
"description": "2 nights x $178.00 CAD",
"price": "$356.00 CAD",
"extracted_price": 356
},
{
"description": "Taxes",
"price": "$67.64 CAD",
"extracted_price": 67.64
}
],
"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"
}
}
}
]
}
],
"price_summary": {
"days": 61,
"available": 35,
"available_for_checkin": 31,
"bookable": 34,
"priced": 6,
"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": 25,
"priced": 6,
"unavailable": 26
}
}
}Response fields
Fields marked required are always present; others appear when they apply.
- search_metadataobjectrequired
Show 11 child fieldsHide child fields
- search_metadata.idstringrequired
- search_metadata.statusstringrequired
One of
Success - search_metadata.created_atstringrequired
UTC, ISO-8601.
- search_metadata.request_time_takennumberrequired
Seconds spent in upstream requests, summed; can exceed
total_time_takenbecause quotes run in parallel. - search_metadata.parsing_time_takennumberrequired
- search_metadata.total_time_takennumberrequired
- search_metadata.request_urlstringrequired
Listing URL.
- search_metadata.collection_idstringrequired
Shared by every price in this response (
ratecol_...). - search_metadata.observed_atstringrequired
UTC observation time, ISO-8601.
- search_metadata.wire_bytesintegerrequired
Bytes received from upstream, compressed.
- search_metadata.upstream_requestsintegerrequired
Upstream requests made: 1 for the calendar plus one per quote attempt.
- search_parametersobjectrequired
Echo of the effective request.
Show 14 child fieldsHide child fields
- search_parameters.enginestringrequired
One of
airbnb_property_availability_calendar - search_parameters.airbnb_domainstringrequired
- search_parameters.property_idstringrequired
- search_parameters.start_monthintegerrequired
Effective first month (defaults resolved).
- search_parameters.start_yearintegerrequired
- search_parameters.monthsintegerrequired
- search_parameters.currencystring
Present only when sent.
- search_parameters.adultsinteger
Present only when
price_nightsisn'tnone. - search_parameters.childreninteger
Present only when non-zero and
price_nightsisn'tnone. - search_parameters.infantsinteger
Present only when non-zero and
price_nightsisn'tnone. - search_parameters.petsinteger
Present only when non-zero and
price_nightsisn'tnone. - search_parameters.price_nightsstring
Present only when not
none.One of
sampleall - search_parameters.max_price_quotesinteger
As sent. Present only when sent and
price_nightsisn'tnone. - search_parameters.stay_nightsinteger
Present only when sent and
price_nightsisn'tnone.
- monthsarray of objectrequired
One entry per requested month, in order.
Show 3 child fieldsHide child fields
- months[].yearintegerrequired
- months[].monthintegerrequired
1-12.
- months[].daysarray of objectrequired
In date order.
Show 9 child fieldsHide child fields
- months[].days[].datestring (date)required
Calendar date; the night starts on this date.
- months[].days[].is_availablebooleanrequired
The night is open (not booked or blocked).
- months[].days[].is_available_for_checkinbooleanrequired
Airbnb allows arriving on this date.
- months[].days[].is_available_for_checkoutbooleanrequired
Airbnb allows departing on this date.
- months[].days[].is_bookablebooleanrequired
- months[].days[].min_nightsinteger
Minimum stay for a check-in on this date. Present only when Airbnb reports it.
- months[].days[].max_nightsinteger
Maximum stay for a check-in on this date. Present only when Airbnb reports it.
- months[].days[].price_statusobject
Present only when
price_nightsisn'tnone.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
- months[].days[].priceobject
Present only when
price_statusispriced.
- price_summaryobject
Present only when
price_nightsisn'tnone.Show 9 child fieldsHide child fields
- price_summary.daysintegerrequired
Days returned.
- price_summary.availableintegerrequired
Days whose night is open.
- price_summary.available_for_checkinintegerrequired
Days Airbnb allows arriving on.
- price_summary.bookableintegerrequired
Days Airbnb marks bookable.
- price_summary.pricedintegerrequired
Days with a quoted price (each is charged 1 credit).
- price_summary.min_price_per_nightnumber
Lowest
price_per_nightamong priced days. Present only when at least one day was priced. - price_summary.max_price_per_nightnumber
Highest
price_per_nightamong priced days. Present only when at least one day was priced. - price_summary.median_price_per_nightnumber
Median
price_per_nightamong priced days, 2 decimals. Present only when at least one day was priced. - price_summary.price_statusobjectrequired
Number of days per
price_statusvalue, keys sorted; only statuses that occur are present.Show 14 child fieldsHide child fields
- price_summary.price_status.pricedinteger
- price_summary.price_status.not_sampledinteger
- price_summary.price_status.quote_cap_reachedinteger
- price_summary.price_status.not_requestedinteger
- price_summary.price_status.unavailableinteger
- price_summary.price_status.pastinteger
- price_summary.price_status.check_in_not_allowedinteger
- price_summary.price_status.check_out_not_allowedinteger
- price_summary.price_status.stay_blockedinteger
- price_summary.price_status.stay_exceeds_max_nightsinteger
- price_summary.price_status.quote_refusedinteger
- price_summary.price_status.no_priceinteger
- price_summary.price_status.quote_failedinteger
- price_summary.price_status.quote_skippedinteger
- 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. 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.