{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Scraper — Prices, Availability Calendar & Listings",
    "description": "Airbnb listings with prices for your dates and guests, by place, URL or listing id. One row per listing: nightly rate, stay total, rating, bedrooms, coordinates, Superhost, photos. Optional: 24-month availability calendar with occupancy, reviews. Free: amenities, house rules, host, price breakdown.",
    "version": "1.2",
    "x-build-id": "l47BrSKdvXMOZ8bfh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kestrel~airbnb-prices-calendar/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kestrel-airbnb-prices-calendar",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/kestrel~airbnb-prices-calendar/runs": {
      "post": {
        "operationId": "runs-sync-kestrel-airbnb-prices-calendar",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/kestrel~airbnb-prices-calendar/run-sync": {
      "post": {
        "operationId": "run-sync-kestrel-airbnb-prices-calendar",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "locationQueries": {
            "title": "Places",
            "uniqueItems": true,
            "type": "array",
            "description": "Places as typed on Airbnb, e.g. [\"Lisbon, Portugal\"], [\"Brooklyn, NY\"], [\"Algarve\"]. Each returns up to maxListingsPerQuery listings with a price for the stay. A place Airbnb does not recognise is reported as an unknown_area status row and costs nothing (Airbnb would otherwise answer with listings from all over the world): write it as Airbnb spells it, with the country when ambiguous. Use for \"Airbnb prices in <city>\" and market runs; for exact listings use listingIds.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Airbnb URLs",
            "uniqueItems": true,
            "type": "array",
            "description": "Airbnb search URLs (https://www.airbnb.com/s/Paris--France/homes?checkin=2026-11-10&checkout=2026-11-14&price_max=200) or listing URLs (https://www.airbnb.com/rooms/12345678). A search URL keeps every filter it carries: dates, guests, price band, room type, bedrooms, amenities, map bounds; checkIn/checkOut given here override its dates. Use for \"price the listings from this search\" or \"this listing\". A URL from another site is rejected before anything is charged. Default empty.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "listingIds": {
            "title": "Listing ids",
            "uniqueItems": true,
            "type": "array",
            "description": "Numeric Airbnb listing ids, e.g. [\"11562247\", \"45307024\"] (the number in /rooms/<id>). Each is priced for the stay straight from its page and the row carries the full details (amenities, house rules, cancellation policy, host, price breakdown, available flag) at no extra charge. Use for \"track these listings\", your own portfolio or a comp set; filters and maxListingsPerQuery do not apply. Default empty.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}|\\+?\\s*\\d+\\s*(d|days?|w|weeks?|m|months?|y|years?)|today|tomorrow)?$",
            "type": "string",
            "description": "Check-in date: \"2026-11-07\" (YYYY-MM-DD) or relative to the run date: \"30 days\", \"tomorrow\". Relative dates make a schedule that never needs editing; they count from the run day, so for a fixed weekday stay (Friday to Sunday) run weekly on that weekday with multiples of 7 (\"28 days\", \"30 days\"). Empty (default) = no stay: each listing row carries Airbnb's default displayed price and is billed. A past date is rejected before anything is charged; give both checkIn and checkOut or neither."
          },
          "checkOut": {
            "title": "Check-out",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}|\\+?\\s*\\d+\\s*(d|days?|w|weeks?|m|months?|y|years?)|today|tomorrow)?$",
            "type": "string",
            "description": "Check-out date after checkIn: \"2026-11-10\" or relative: \"33 days\". Nights = checkOut minus checkIn, so checkIn \"30 days\" + checkOut \"33 days\" = a 3-night stay starting 30 days after each run. Every price in the run is for exactly this stay."
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Adults in the party, 1 to 16, e.g. 2 (default 2). Passed to Airbnb as in the site's guest picker: prices depend on the guest count and the results are those the site shows for that party.",
            "default": 2
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Children aged 2 to 12, 0 to 10, e.g. 1 (default 0). Counted as guests for price and capacity, as on the site.",
            "default": 0
          },
          "infants": {
            "title": "Infants",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Infants under 2, 0 to 5, e.g. 1 (default 0). Passed to Airbnb exactly as the site's guest picker does.",
            "default": 0
          },
          "pets": {
            "title": "Pets",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Pets, 0 to 5, e.g. 1 (default 0). Passed to Airbnb as in the site's guest picker, so the results and prices are those a guest travelling with a pet sees. Use for \"pet-friendly Airbnb in <city>\".",
            "default": 0
          },
          "currency": {
            "title": "Currency",
            "pattern": "^[A-Z]{3}$",
            "minLength": 3,
            "maxLength": 3,
            "type": "string",
            "description": "ISO 4217 code for every price in the run, e.g. \"EUR\" (default \"USD\"). Any currency Airbnb supports: USD, EUR, GBP, JPY, AUD, CAD, BRL, MXN, CHF, SGD, INR, THB, AED, … Echoed on every row. When the user names no currency, pass the destination's (\"EUR\" for Lisbon, \"MXN\" for Mexico City).",
            "default": "USD"
          },
          "locale": {
            "title": "Language",
            "type": "string",
            "description": "Airbnb locale for listing names, descriptions and reviews, e.g. \"en\" (default), \"fr\", \"de\", \"es\", \"pt\", \"it\", \"ja\". Prices and availability are not affected.",
            "default": "en"
          },
          "maxListingsPerQuery": {
            "title": "Max listings per place",
            "minimum": 1,
            "maximum": 280,
            "type": "integer",
            "description": "Listings to return per place or search URL, 1 to 280, e.g. 50 (default 40). The main cost control: at most maxListingsPerQuery × $0.005 per place and stay (calendar and review rows only if asked). Airbnb applies filters before this cap, so 30 asked = the first 30 matching listings in Airbnb's relevance order — not by price: for \"the N cheapest\" set priceMax, or raise the cap and sort price_total at your end. About 280 is Airbnb's ceiling per search. Ignored for listingIds.",
            "default": 40
          },
          "includeDetails": {
            "title": "Listing details",
            "type": "boolean",
            "description": "true = each listing row also gets description, amenities (name, group, available flag), house rules, cancellation policy, rating breakdown (cleanliness, accuracy, …), host (name, Superhost, verified, years hosting), person capacity, sleeping arrangement, highlights, the exact price breakdown for the stay, and an available flag with Airbnb's message when the dates are not available. No extra charge, one extra request per listing. Default false. Rows from listingIds always carry these.",
            "default": false
          },
          "calendarMonths": {
            "title": "Calendar months",
            "minimum": 0,
            "maximum": 24,
            "type": "integer",
            "description": "0 (default) = no calendar. N = one calendar row per listing with day-by-day availability for the next N months (1 to 24): available, check-in and check-out allowed, minimum and maximum nights per day, plus occupancy for the next 30, 90 and 365 nights and the next available date. $0.002 per month, so 12 = $0.024 per listing. Availability only: Airbnb's calendar carries no price per day (price one-night stays for that). Blocked and booked nights look the same; occupancy counts both.",
            "default": 0
          },
          "maxReviewsPerListing": {
            "title": "Max reviews per listing",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "0 (default) = no reviews. N = up to N reviews per listing (maximum 200) as review rows at $0.003 each: rating, text, Airbnb's translation and original language, date, reviewer name and location, stay type, host reply. Use for \"prices and the latest reviews together\". For a rating filter, every review of a listing or more than 200, use kestrel/airbnb-reviews-scraper.",
            "default": 0
          },
          "reviewsSort": {
            "title": "Reviews order",
            "enum": [
              "most_recent",
              "highest_rated",
              "lowest_rated",
              "most_relevant"
            ],
            "type": "string",
            "description": "Which reviews come first when maxReviewsPerListing is set: \"most_recent\" (default), \"highest_rated\", \"lowest_rated\" (complaints first), \"most_relevant\" (Airbnb's own order). Ignored when maxReviewsPerListing is 0.",
            "default": "most_recent"
          },
          "priceMin": {
            "title": "Min price per night",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest nightly price in `currency`, e.g. 80. 0 (default) = no minimum. Applied by Airbnb before maxListingsPerQuery, so filtered listings are never returned or billed. Place searches only; a pasted search URL keeps its own filters.",
            "default": 0
          },
          "priceMax": {
            "title": "Max price per night",
            "minimum": 0,
            "type": "integer",
            "description": "Highest nightly price in `currency`, e.g. 200. 0 (default) = no maximum. Applied by Airbnb before maxListingsPerQuery, so listings above it are never returned or billed. Place searches only. Use for \"Airbnb under 200 a night in <city>\". Must be at least priceMin.",
            "default": 0
          },
          "roomTypes": {
            "title": "Room types",
            "type": "array",
            "description": "Only these room types, e.g. [\"entire_home\"] for whole places. Allowed: \"entire_home\", \"private_room\", \"shared_room\", \"hotel_room\". Empty (default) = any. Place searches only. Use for \"entire homes in <city>\", \"private rooms in <city>\".",
            "items": {
              "type": "string",
              "enum": [
                "entire_home",
                "private_room",
                "shared_room",
                "hotel_room"
              ],
              "enumTitles": [
                "Entire home",
                "Private room",
                "Shared room",
                "Hotel room"
              ]
            },
            "default": []
          },
          "minBedrooms": {
            "title": "Min bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum bedrooms, e.g. 2. 0 (default) = any. Applied by Airbnb before the cap; place searches only. Use for \"2-bedroom Airbnbs in <city>\".",
            "default": 0
          },
          "minBeds": {
            "title": "Min beds",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum beds, e.g. 3. 0 (default) = any. Applied by Airbnb before the cap; place searches only.",
            "default": 0
          },
          "minBathrooms": {
            "title": "Min bathrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum bathrooms, e.g. 2. 0 (default) = any. Applied by Airbnb before the cap; place searches only.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy settings. Airbnb accepts datacenter proxies for these calls: keep the default {\"useApifyProxy\": true}.",
            "default": {
              "useApifyProxy": true
            }
          },
          "sessions": {
            "title": "Parallel proxy sessions",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Parallel proxy sessions (egress IPs), 1 to 16, e.g. 4 (default 4). Each is paced at perIp requests per second; more sessions = a faster run at the same cost.",
            "default": 4
          },
          "perIp": {
            "title": "Requests per second per IP",
            "minimum": 0.1,
            "maximum": 3,
            "type": "number",
            "description": "Requests per second per session, 0.1 to 3, e.g. 1 (default 1). Airbnb tolerated 1 per second in tests; raise it only when a run is slow and not being throttled.",
            "default": 1
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}