{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Search Scraper",
    "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": "gEuTIas2DiNf9MjlW"
  },
  "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": 1
          },
          "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.",
            "default": 15
          },
          "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
          },
          "fetchListingDetails": {
            "title": "🔎 Fetch exact details from each listing page",
            "type": "boolean",
            "description": "Opens every listing's own page to collect the guest capacity, the exact bedroom/bed/bath counts Airbnb states there, the precise property type (e.g. \"Private room in rental unit\") and whether the bathroom is shared. Costs one extra page load per listing, so a run takes roughly 10–15× longer. Turned on automatically when a min guest capacity is set.",
            "default": false
          },
          "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
          },
          "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": ""
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}