Skip to content
Airbnb

Airbnb priced calendar

Day-by-day availability for 1-12 months with Airbnb's own quoted prices.

POST/v1/airbnb/calendar
8+ credits8, plus 1 per night actually priced (at most 92, so at most 100 a call); refused, failed and unsampled nights and failed requests are free

One 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

POSThttps://api.scrapercompany.com/v1/airbnb/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.

  • listing_idstringrequiredpattern ^\d{1,25}$

    Numeric Airbnb listing id: the number in https://www.airbnb.com/rooms/<id>, or properties[].id from /v1/serp/airbnb.

  • 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

  • monthsintegerdefault 3min 1, max 12

    Calendar 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 sample

    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

  • include_listingbooleandefault false

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

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

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 (no currency sent and no day priced).

  • requested_currencystring

    Present only when currency was sent.

  • guestsobjectrequired

    Party the quotes were priced for.

    Show 4 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 ofnonesampleall

  • stay_nightsinteger

    Present only when stay_nights was sent.

  • max_price_quotesintegerrequired

    Quote budget that applied: the requested max_price_quotes or the mode default (12 for sample, 92 for all), capped at 92 and at 31 x months; 0 with price_nights: none.

  • listingobject

    Present only when at least one listing fact is known.

    Show 16 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 with include_listing.

    • listing.room_typestring

      Airbnb space type, e.g. ENTIRE_HOME. Only with include_listing.

    • listing.locationstring

      Displayed location, e.g. Toronto. Only with include_listing.

    • listing.overviewarray of string

      Summary items, e.g. Entire guest suite, 1 bed, 1 bath. Only with include_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 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 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_night among priced days. Present only when at least one day was priced.

    • summary.max_price_per_nightnumber

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

    • summary.median_price_per_nightnumber

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

    • summary.price_statusobjectrequired

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

      Show 14 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 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_nights is 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

    • days[].price_errorstring

      Reason behind quote_refused (Airbnb's message), no_price, quote_failed or quote_skipped (deadline_exceeded or stopped_after_failures). Present only when there is one.

    • days[].priceobject

      Present only when price_status is priced.

      Show 17 child fields
      • days[].price.price_per_nightnumberrequired

        Airbnb's own nightly figure for the quoted stay (the N nights x $X line): all-in, with cleaning and service fees folded in, before taxes. It depends on the stay length, so read it with check_in, check_out and nights.

      • 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 or stay_nights was omitted.

      • days[].price.accommodationnumber

        Exact subtotal of the nightly line (nights x 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_basis is then nightly_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_night includes. 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 in fees, not in the nightly figure.

        One ofnightly_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 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.

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, plus 1 per night actually priced (at most 92, so at most 100 a call); refused, failed and unsampled nights and failed requests are free). Failed, blocked and empty results are free. Credit metering is in beta and does not block requests yet.