{
  "title": "Airbnb Stay Finder: Nightly Rates, Fees & Availability",
  "description": "Search Airbnb stays by city, neighborhood, place ID or map area, or load specific listing URLs. Get nightly and stay-total prices, fees, host details, amenities, reviews and a 12-month availability calendar.",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "mode": {
      "title": "Mode",
      "type": "string",
      "description": "Search discovers listings by location or map area. Details loads the listing URLs or IDs you provide.",
      "editor": "select",
      "enum": [
        "search",
        "details"
      ],
      "enumTitles": [
        "Search by location or map area",
        "Load specific listing URLs or IDs"
      ],
      "default": "search",
      "prefill": "search",
      "sectionCaption": "Search"
    },
    "location": {
      "title": "Location",
      "type": "string",
      "description": "City, region, country or neighborhood, e.g. New York, Paris, SoHo. Airbnb's own location lookup validates the name before searching (mode=search).",
      "editor": "textfield",
      "prefill": "New York"
    },
    "placeId": {
      "title": "Airbnb place ID",
      "type": "string",
      "description": "Optional Google/Airbnb place ID (e.g. ChIJOwg_06VPwokRYv534QaPC8g). Takes precedence over the resolved location and skips text matching (mode=search).",
      "editor": "textfield"
    },
    "neighborhood": {
      "title": "Neighborhood",
      "type": "string",
      "description": "Optional neighborhood to combine with Location, e.g. SoHo + New York (mode=search).",
      "editor": "textfield"
    },
    "bbox": {
      "title": "Map bounding box",
      "type": "object",
      "description": "Search inside a map rectangle instead of a named location. Use decimal degrees: swLat, swLng (south-west corner) and neLat, neLng (north-east corner), plus an optional zoom (1-22). Example: {\"swLat\": 40.7075, \"swLng\": -74.0135, \"neLat\": 40.7904, \"neLng\": -73.9591, \"zoom\": 13} (mode=search).",
      "editor": "json"
    },
    "listingUrls": {
      "title": "Listing URLs",
      "type": "array",
      "description": "Airbnb room URLs, e.g. https://www.airbnb.com/rooms/23222680 (mode=details).",
      "editor": "stringList",
      "sectionCaption": "Specific listings"
    },
    "listingIds": {
      "title": "Listing IDs",
      "type": "array",
      "description": "Numeric Airbnb listing IDs, e.g. 23222680. You can mix these with listing URLs (mode=details).",
      "editor": "stringList"
    },
    "checkIn": {
      "title": "Check-in date",
      "type": "string",
      "description": "Stay start date in YYYY-MM-DD format. Leave both dates empty to use Airbnb's displayed quote (search) or to skip the price quote (details).",
      "editor": "textfield",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "nullable": true,
      "sectionCaption": "Stay dates and guests"
    },
    "checkOut": {
      "title": "Check-out date",
      "type": "string",
      "description": "Stay end date in YYYY-MM-DD format. Must be after the check-in date.",
      "editor": "textfield",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "nullable": true
    },
    "adults": {
      "title": "Adults",
      "type": "integer",
      "description": "Number of adult guests (1-16).",
      "default": 1,
      "minimum": 1,
      "maximum": 16
    },
    "children": {
      "title": "Children",
      "type": "integer",
      "description": "Number of children aged 2-12 (0-15).",
      "default": 0,
      "minimum": 0,
      "maximum": 15
    },
    "infants": {
      "title": "Infants",
      "type": "integer",
      "description": "Number of infants under 2 (0-5).",
      "default": 0,
      "minimum": 0,
      "maximum": 5
    },
    "pets": {
      "title": "Pets",
      "type": "integer",
      "description": "Number of pets (0-5).",
      "default": 0,
      "minimum": 0,
      "maximum": 5
    },
    "minPrice": {
      "title": "Minimum nightly price",
      "type": "integer",
      "description": "Lowest nightly price to include, in the selected currency. 0 means no minimum.",
      "default": 0,
      "minimum": 0,
      "maximum": 100000,
      "sectionCaption": "Filters"
    },
    "maxPrice": {
      "title": "Maximum nightly price",
      "type": "integer",
      "description": "Highest nightly price to include, in the selected currency. 0 means no maximum.",
      "default": 0,
      "minimum": 0,
      "maximum": 100000
    },
    "roomType": {
      "title": "Room type",
      "type": "string",
      "description": "Restrict results to one Airbnb room type.",
      "editor": "select",
      "enum": [
        "Any",
        "Entire home/apt",
        "Private room",
        "Shared room",
        "Hotel room"
      ],
      "enumTitles": [
        "Any room type",
        "Entire home or apartment",
        "Private room",
        "Shared room",
        "Hotel room"
      ],
      "default": "Any"
    },
    "propertyType": {
      "title": "Property type",
      "type": "string",
      "description": "Restrict results to one Airbnb property type.",
      "editor": "select",
      "enum": [
        "Any",
        "Apartment",
        "House",
        "Villa",
        "Condominium",
        "Loft",
        "Guest suite",
        "Guesthouse",
        "Hotel",
        "Resort",
        "Cottage",
        "Cabin",
        "Bungalow",
        "Townhouse",
        "Tiny home",
        "Boat",
        "Barn",
        "Camper/RV",
        "Farm stay",
        "Castle",
        "Cave",
        "Dome",
        "Container",
        "Treehouse",
        "Yurt",
        "Serviced apartment"
      ],
      "enumTitles": [
        "Any property type",
        "Apartment",
        "House",
        "Villa",
        "Condominium",
        "Loft",
        "Guest suite",
        "Guesthouse",
        "Hotel",
        "Resort",
        "Cottage",
        "Cabin",
        "Bungalow",
        "Townhouse",
        "Tiny home",
        "Boat",
        "Barn",
        "Camper/RV",
        "Farm stay",
        "Castle",
        "Cave",
        "Dome",
        "Container",
        "Treehouse",
        "Yurt",
        "Serviced apartment"
      ],
      "default": "Any"
    },
    "minBedrooms": {
      "title": "Minimum bedrooms",
      "type": "integer",
      "description": "Minimum number of bedrooms. 0 means no minimum.",
      "default": 0,
      "minimum": 0,
      "maximum": 20
    },
    "minBeds": {
      "title": "Minimum beds",
      "type": "integer",
      "description": "Minimum number of beds. 0 means no minimum.",
      "default": 0,
      "minimum": 0,
      "maximum": 30
    },
    "minBathrooms": {
      "title": "Minimum bathrooms",
      "type": "integer",
      "description": "Minimum number of bathrooms. 0 means no minimum.",
      "default": 0,
      "minimum": 0,
      "maximum": 20
    },
    "maxListings": {
      "title": "Maximum listings",
      "type": "integer",
      "description": "Hard cap on records (1-300). Airbnb pages hold 40 results each; duplicate cards are removed automatically.",
      "default": 20,
      "prefill": 3,
      "minimum": 1,
      "maximum": 300,
      "sectionCaption": "Output"
    },
    "includeDetails": {
      "title": "Include full listing details",
      "type": "boolean",
      "description": "Adds the listing page and an exact stay quote: host, amenities, photos, description, fees and availability. Costs extra requests per listing.",
      "default": false,
      "prefill": false,
      "sectionCaption": "Detail enrichment"
    },
    "includeReviews": {
      "title": "Include reviews",
      "type": "boolean",
      "description": "Fetch recent guest reviews for each listing (up to maxReviews).",
      "default": false,
      "prefill": false
    },
    "maxReviews": {
      "title": "Maximum reviews per listing",
      "type": "integer",
      "description": "Reviews returned per listing (1-24).",
      "default": 12,
      "minimum": 1,
      "maximum": 24
    },
    "includeCalendar": {
      "title": "Include availability calendar",
      "type": "boolean",
      "description": "Fetch the day-by-day availability calendar for each listing.",
      "default": false,
      "prefill": false
    },
    "calendarMonths": {
      "title": "Calendar months",
      "type": "integer",
      "description": "Number of months to return, starting with the current month (1-12).",
      "default": 12,
      "minimum": 1,
      "maximum": 12
    },
    "currency": {
      "title": "Currency",
      "type": "string",
      "description": "Currency for prices. Airbnb returns quotes in this currency.",
      "editor": "select",
      "enum": [
        "USD",
        "EUR",
        "GBP",
        "JPY",
        "CAD",
        "AUD",
        "NZD",
        "CHF",
        "SEK",
        "NOK",
        "DKK",
        "PLN",
        "CZK",
        "HUF",
        "RON",
        "BGN",
        "TRY",
        "RUB",
        "UAH",
        "ILS",
        "AED",
        "SAR",
        "QAR",
        "KWD",
        "BHD",
        "OMR",
        "EGP",
        "ZAR",
        "NGN",
        "KES",
        "GHS",
        "MAD",
        "INR",
        "PKR",
        "BDT",
        "LKR",
        "NPR",
        "CNY",
        "HKD",
        "TWD",
        "SGD",
        "MYR",
        "THB",
        "IDR",
        "PHP",
        "VND",
        "KRW",
        "MXN",
        "BRL",
        "ARS",
        "CLP",
        "COP",
        "PEN",
        "UYU",
        "CRC",
        "DOP"
      ],
      "enumTitles": [
        "US dollar",
        "Euro",
        "British pound",
        "Japanese yen",
        "Canadian dollar",
        "Australian dollar",
        "New Zealand dollar",
        "Swiss franc",
        "Swedish krona",
        "Norwegian krone",
        "Danish krone",
        "Polish zloty",
        "Czech koruna",
        "Hungarian forint",
        "Romanian leu",
        "Bulgarian lev",
        "Turkish lira",
        "Russian ruble",
        "Ukrainian hryvnia",
        "Israeli shekel",
        "UAE dirham",
        "Saudi riyal",
        "Qatari riyal",
        "Kuwaiti dinar",
        "Bahraini dinar",
        "Omani rial",
        "Egyptian pound",
        "South African rand",
        "Nigerian naira",
        "Kenyan shilling",
        "Ghanaian cedi",
        "Moroccan dirham",
        "Indian rupee",
        "Pakistani rupee",
        "Bangladeshi taka",
        "Sri Lankan rupee",
        "Nepalese rupee",
        "Chinese yuan",
        "Hong Kong dollar",
        "Taiwan dollar",
        "Singapore dollar",
        "Malaysian ringgit",
        "Thai baht",
        "Indonesian rupiah",
        "Philippine peso",
        "Vietnamese dong",
        "South Korean won",
        "Mexican peso",
        "Brazilian real",
        "Argentine peso",
        "Chilean peso",
        "Colombian peso",
        "Peruvian sol",
        "Uruguayan peso",
        "Costa Rican colon",
        "Dominican peso"
      ],
      "default": "USD",
      "sectionCaption": "Language and network"
    },
    "locale": {
      "title": "Locale",
      "type": "string",
      "description": "Language/region used for Airbnb labels, dates and localized text.",
      "editor": "select",
      "enum": [
        "en",
        "en-US",
        "en-GB",
        "en-CA",
        "en-AU",
        "de-DE",
        "fr-FR",
        "es-ES",
        "es-MX",
        "it-IT",
        "pt-BR",
        "pt-PT",
        "nl-NL",
        "sv-SE",
        "da-DK",
        "nb-NO",
        "fi-FI",
        "pl-PL",
        "cs-CZ",
        "hu-HU",
        "ro-RO",
        "el-GR",
        "tr-TR",
        "ru-RU",
        "uk-UA",
        "he-IL",
        "ar",
        "hi-IN",
        "id-ID",
        "th-TH",
        "vi-VN",
        "ja-JP",
        "ko-KR",
        "zh-CN",
        "zh-TW"
      ],
      "enumTitles": [
        "English",
        "English (United States)",
        "English (United Kingdom)",
        "English (Canada)",
        "English (Australia)",
        "German",
        "French",
        "Spanish (Spain)",
        "Spanish (Mexico)",
        "Italian",
        "Portuguese (Brazil)",
        "Portuguese (Portugal)",
        "Dutch",
        "Swedish",
        "Danish",
        "Norwegian",
        "Finnish",
        "Polish",
        "Czech",
        "Hungarian",
        "Romanian",
        "Greek",
        "Turkish",
        "Russian",
        "Ukrainian",
        "Hebrew",
        "Arabic",
        "Hindi",
        "Indonesian",
        "Thai",
        "Vietnamese",
        "Japanese",
        "Korean",
        "Chinese (Simplified)",
        "Chinese (Traditional)"
      ],
      "default": "en"
    },
    "proxyConfiguration": {
      "title": "Proxy configuration",
      "type": "object",
      "description": "Optional. Leave empty and the actor connects directly, then switches to an automatic Apify proxy only if Airbnb blocks a request.",
      "editor": "proxy"
    }
  }
}
