{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Scraper - Prices, Availability & Full City Coverage",
    "description": "Airbnb scraper for prices, ratings, beds, baths, coordinates and real availability. Skips listings that aren't free on your dates, and beats Airbnb's ~270-result limit by searching the map in tiles: 1,596 listings from one town instead of 270. Any city, any country.",
    "version": "0.1",
    "x-build-id": "uVo2vwED9wdEnGIPP"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/assuring_team~airbnb-search-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-assuring_team-airbnb-search-scraper",
        "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/assuring_team~airbnb-search-scraper/runs": {
      "post": {
        "operationId": "runs-sync-assuring_team-airbnb-search-scraper",
        "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/assuring_team~airbnb-search-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-assuring_team-airbnb-search-scraper",
        "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": {
          "searchUrls": {
            "title": "🔗 Search URLs (paste from browser)",
            "type": "array",
            "description": "Search on airbnb.com with your filters applied, then copy the URL from the address bar and paste it here. This is the most precise way to search.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchText": {
            "title": "🔤 …or just search by text",
            "type": "string",
            "description": "e.g. \"Fes Morocco\" or \"riads in Marrakech\". Used only when no Search URL is given — the Airbnb search URL is built automatically."
          },
          "checkIn": {
            "title": "📅 Check-in",
            "type": "string",
            "description": "Check-in date (YYYY-MM-DD). Empty = keep the date already in the URL."
          },
          "checkOut": {
            "title": "📅 Check-out",
            "type": "string",
            "description": "Check-out date (YYYY-MM-DD). Empty = keep the date already in the URL. Set both dates or neither."
          },
          "defaultNights": {
            "title": "Nights to price when no dates are given",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Leave the dates above empty and Airbnb quotes every listing for a different window of its own choosing, so the prices cannot be compared. Instead the actor pins one stay this many nights long, about a month out, and prices every listing for it. Set to 0 to let Airbnb choose per listing.",
            "default": 3
          },
          "adults": {
            "title": "Adults",
            "minimum": 0,
            "maximum": 16,
            "type": "integer",
            "description": "Number of adults. 0 = keep whatever the pasted URL already says.",
            "default": 0
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 15,
            "type": "integer",
            "description": "Number of children (ages 2-12). 0 = keep whatever the pasted URL already says.",
            "default": 0
          },
          "infants": {
            "title": "Infants",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Number of infants (under 2). 0 = keep whatever the pasted URL already says.",
            "default": 0
          },
          "pets": {
            "title": "Pets",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Number of pets. 0 = keep whatever the pasted URL already says.",
            "default": 0
          },
          "maxItems": {
            "title": "📊 How many listings do you want",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many listings, counted across all your search URLs. Set 0 for no limit. Note that with Full coverage on you usually want 0 - a small number here makes the run stop early and defeats the point of covering the whole city.",
            "default": 200
          },
          "maxPagesPerSearch": {
            "title": "Max pages per search URL",
            "minimum": 1,
            "maximum": 15,
            "type": "integer",
            "description": "Airbnb itself caps search results at about 15 pages / 270 listings. Defaults to 5 pages (~90 listings).",
            "default": 5
          },
          "minPrice": {
            "title": "💰 Min price (total stay / monthly)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings with price at or above this amount in the chosen currency. Injects price_min into search URLs and drops listings below this price. 0 = no filter.",
            "default": 0
          },
          "maxPrice": {
            "title": "💰 Max price (total stay / monthly)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings with price at or below this amount in the chosen currency. Injects price_max into search URLs and drops listings above this price. 0 = no filter.",
            "default": 0
          },
          "fullCoverage": {
            "title": "🗺 Full coverage (beat Airbnb's ~270 limit)",
            "type": "boolean",
            "description": "Airbnb never returns more than ~270 listings for one search, however many exist. Switch this on and the run splits the map into tiles and searches each one separately, then merges and de-duplicates — the only way to get a whole city. Set Max listings to 0 for unlimited. Costs one search per tile.",
            "default": false
          },
          "maxTiles": {
            "title": "Max map tiles",
            "minimum": 4,
            "maximum": 400,
            "type": "integer",
            "description": "Hard ceiling on how many map tiles a full-coverage run may create, so a dense city cannot run away with your budget.",
            "default": 60
          },
          "minBedrooms": {
            "title": "🛏 Min bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Only keep listings with at least this many bedrooms. Guest capacity is already handled by the Adults/Children fields above — Airbnb filters the search itself, so every result fits your party. Use this to additionally demand a certain size. 0 = no filter.",
            "default": 0
          },
          "minBeds": {
            "title": "🛏 Min beds",
            "minimum": 0,
            "maximum": 40,
            "type": "integer",
            "description": "Only keep listings with at least this many beds. 0 = no filter.",
            "default": 0
          },
          "minGuestCapacity": {
            "title": "👥 Min guest capacity (exact)",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Only keep listings that officially sleep at least this many guests. Airbnb does not put capacity in search results, so switching this on makes the run open every listing's own page — much slower and more expensive, but the number is exact rather than inferred. Note that the Adults/Children fields already make Airbnb filter by capacity on its own, so you usually do not need this. 0 = no filter.",
            "default": 0
          },
          "exactDatesOnly": {
            "title": "📅 Only listings free on my exact dates",
            "type": "boolean",
            "description": "Airbnb pads its results with listings that are already booked on your dates, quoting them for a nearby stay instead — so a 17-night search comes back with 11- or 16-night rows. Leave this on to drop those. Turn it off to also see the alternative-date suggestions. Only applies when both dates are set.",
            "default": true
          },
          "onlyDiscounted": {
            "title": "🏷️ Deal Sniper: Only listings with active discounts",
            "type": "boolean",
            "description": "Only keep listings that have an active discount (special offer, early-bird discount, weekly/monthly discount).",
            "default": false
          },
          "minDiscountPercent": {
            "title": "🏷️ Minimum discount percentage (%)",
            "minimum": 0,
            "maximum": 90,
            "type": "integer",
            "description": "Only keep listings offering at least this percentage discount (e.g. 20 = only 20%+ off deals). 0 = no filter.",
            "default": 0
          },
          "fetchListingDetails": {
            "title": "🔎 Fetch exact details from each listing page",
            "type": "boolean",
            "description": "Opens every listing's own page to collect the full description, guest reviews & comments, guest capacity, exact bedroom/bed/bath counts, and whether the bathroom is shared. Turned on automatically when minGuestCapacity, includeDescription, or includeReviews are set.",
            "default": false
          },
          "includeDescription": {
            "title": "📝 Include house description",
            "type": "boolean",
            "description": "Extracts the full \"About this space\" description text for each listing from its details page.",
            "default": false
          },
          "includeReviews": {
            "title": "💬 Include guest reviews & comments",
            "type": "boolean",
            "description": "Scrapes recent guest review comments and ratings for each listing (visits listing page in browser).",
            "default": false
          },
          "maxReviewsPerListing": {
            "title": "💬 Max reviews per listing",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of recent guest review comments to collect per listing when includeReviews is on.",
            "default": 5
          },
          "minRating": {
            "title": "⭐ Min rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Only keep listings rated at least this (0–5). Listings with no rating yet are excluded when this is set. 0 = no filter.",
            "default": 0
          },
          "entirePlaceOnly": {
            "title": "🏠 Entire place only",
            "type": "boolean",
            "description": "Only keep listings that are whole properties (apartments, houses, villas). Filters out private rooms and shared rooms.",
            "default": false
          },
          "propertyType": {
            "title": "🏡 Property type",
            "enum": [
              "",
              "Riad",
              "Apartment",
              "Home",
              "Villa",
              "Guesthouse",
              "Townhouse",
              "Bed and breakfast",
              "Vacation home",
              "Hotel",
              "Loft",
              "Condo"
            ],
            "type": "string",
            "description": "Only keep listings of this type. Matched against Airbnb's own label, e.g. \"Riad in Fes\".",
            "default": ""
          },
          "filterAmenities": {
            "title": "✨ Required amenities (filter search)",
            "type": "array",
            "description": "Only show listings that offer these amenities. Injects Airbnb's official filter parameters into the search queries.",
            "items": {
              "type": "string",
              "enum": [
                "airConditioning",
                "wifi",
                "tv",
                "freeParking",
                "hairDryer",
                "iron",
                "kitchen",
                "washer",
                "dryer",
                "heating",
                "dedicatedWorkspace",
                "pool",
                "hotTub",
                "evCharger",
                "crib",
                "kingBed",
                "gym",
                "bbqGrill",
                "breakfast",
                "indoorFireplace",
                "smokingAllowed",
                "waterfront"
              ],
              "enumTitles": [
                "Air conditioning (Climatisation)",
                "Wifi",
                "TV (Télévision)",
                "Free parking (Parking gratuit)",
                "Hair dryer (Sèche-cheveux)",
                "Iron (Fer à repasser)",
                "Kitchen (Cuisine)",
                "Washer (Lave-linge)",
                "Dryer (Sèche-linge)",
                "Heating (Chauffage)",
                "Dedicated workspace (Espace de travail dédié)",
                "Pool (Piscine)",
                "Hot tub (Jacuzzi)",
                "EV charger (Recharge pour véhicule électrique)",
                "Crib (Lit pour bébé)",
                "King bed (Lit king size)",
                "Gym (Salle de sport)",
                "BBQ grill (Barbecue)",
                "Breakfast (Petit-déjeuner)",
                "Indoor fireplace (Cheminée)",
                "Smoking allowed (Logement fumeur)",
                "Waterfront (Au bord de l'eau)"
              ]
            },
            "default": []
          },
          "currency": {
            "title": "Currency",
            "enum": [
              "USD",
              "EUR",
              "MAD",
              "GBP",
              "CAD",
              "AUD",
              "AED",
              "SAR"
            ],
            "type": "string",
            "description": "Currency all prices are returned in.",
            "default": "USD"
          },
          "locale": {
            "title": "Language",
            "enum": [
              "en",
              "fr",
              "es",
              "ar"
            ],
            "type": "string",
            "description": "Page language. Affects the wording of scraped text fields.",
            "default": "en"
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Residential proxies are strongly recommended — datacenter IPs get blocked fast.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "proxyCountry": {
            "title": "🌍 Proxy country",
            "enum": [
              "",
              "MA",
              "FR",
              "US",
              "GB",
              "ES",
              "DE",
              "NL",
              "IT",
              "AE",
              "SA",
              "CA"
            ],
            "type": "string",
            "description": "Browse as if from this country. Airbnb ranks results and shows totals differently per country, so pick the one you normally browse from to get the same order and prices you see yourself. Leave empty for a random country (results will drift between runs).",
            "default": ""
          },
          "useHttpFastPath": {
            "title": "⚡ Fast mode (no browser)",
            "type": "boolean",
            "description": "Airbnb puts the search results straight into the page's HTML, so a plain download gets the same data as a full browser — roughly 6x faster and 20x cheaper. Any page this cannot fetch automatically falls back to the browser, so results are unaffected. Turn off only to force the browser for everything.",
            "default": true
          },
          "httpConcurrency": {
            "title": "Fast-mode parallel downloads",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many pages to download at once in fast mode. Plain downloads are light, so this can be far higher than a browser allows. Lower it if Airbnb starts blocking.",
            "default": 15
          },
          "delayBetweenRequests": {
            "title": "Delay between pages (seconds)",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Wait time after each page. Higher = slower but less likely to get blocked. 0 = no delay.",
            "default": 0
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}