Skip to content
Airbnb

Airbnb availability calendar (SearchAPI)

SearchAPI's airbnb_property_availability_calendar, field for field.

POST/v1/serp/airbnb_property_availability_calendar
8+ credits8 with the default price_nights: none; with sample or all, plus 1 per night actually priced (at most 92). Failed requests are free

property_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

POSThttps://api.scrapercompany.com/v1/serp/airbnb_property_availability_calendar

Authenticate 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 16

    Adults aged 13+; quotes are priced for this party.

  • childrenintegerdefault 0min 0, max 15

    Children aged 2-12.

  • infantsintegerdefault 0min 0, max 5

    Infants under 2.

  • petsintegerdefault 0min 0, max 5

    Pets.

  • 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_calendar

    Accepted 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>, or properties[].id from /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 12

    SearchAPI months: 1-12, default 12.

  • airbnb_domainstringdefault airbnb.com

    Country/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 none

    ScraperCompany addition. Default none returns exactly SearchAPI's fields at the base cost. none: availability only (one upstream request). sample: quote max_price_quotes check-in dates spread evenly over the valid ones (default 12). all: quote every valid check-in date in order, up to max_price_quotes (default and maximum 92). Each quote is one ~0.9 KB upstream request and one credit.

    One ofnonesampleall

  • zero_retentionbooleandefault false

    Accepted 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).

200 response
{
  "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
    }
  }
}
Arrays are shortened to their first items.

Response fields

Fields marked required are always present; others appear when they apply.

  • search_metadataobjectrequired
    Show 11 child fields
    • search_metadata.idstringrequired
    • search_metadata.statusstringrequired

      One ofSuccess

    • search_metadata.created_atstringrequired

      UTC, ISO-8601.

    • search_metadata.request_time_takennumberrequired

      Seconds spent in upstream requests, summed; can exceed total_time_taken because 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 fields
    • search_parameters.enginestringrequired

      One ofairbnb_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_nights isn't none.

    • search_parameters.childreninteger

      Present only when non-zero and price_nights isn't none.

    • search_parameters.infantsinteger

      Present only when non-zero and price_nights isn't none.

    • search_parameters.petsinteger

      Present only when non-zero and price_nights isn't none.

    • search_parameters.price_nightsstring

      Present only when not none.

      One ofsampleall

    • search_parameters.max_price_quotesinteger

      As sent. Present only when sent and price_nights isn't none.

    • search_parameters.stay_nightsinteger

      Present only when sent and price_nights isn't none.

  • monthsarray of objectrequired

    One entry per requested month, in order.

    Show 3 child fields
    • months[].yearintegerrequired
    • months[].monthintegerrequired

      1-12.

    • months[].daysarray of objectrequired

      In date order.

      Show 9 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_nights isn't none.

        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_status is priced.

  • price_summaryobject

    Present only when price_nights isn't none.

    Show 9 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_night among priced days. Present only when at least one day was priced.

    • price_summary.max_price_per_nightnumber

      Highest price_per_night among priced days. Present only when at least one day was priced.

    • price_summary.median_price_per_nightnumber

      Median price_per_night among priced days, 2 decimals. Present only when at least one day was priced.

    • price_summary.price_statusobjectrequired

      Number of days per price_status value, keys sorted; only statuses that occur are present.

      Show 14 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.

StatusMeaningRetry?
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 is a list of problems for schema errors, or a string for semantic checks performed by the endpoint.

{"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

  1. Export your key: export SCRAPERCOMPANY_API_KEY=sk_... (no key yet? request access).
  2. Copy the cURL example above and run it in a terminal.
  3. Or open the interactive playground on api.scrapercompany.com, paste your key and pick this endpoint.

Credits

From 8 credits per successful call (8 with the default price_nights: none; with sample or all, plus 1 per night actually priced (at most 92). Failed requests are free). Failed, blocked and empty results are free. Credit metering is in beta and does not block requests yet.