{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Listings Scraper & Price Tracker",
    "description": "Airbnb listings scraper and price tracker: scrape Airbnb search results for any location and dates — nightly and total price with taxes, rating, number of reviews, property type, coordinates and photos. Track price changes between runs. One flat row per listing, no personal data.",
    "version": "0.2",
    "x-build-id": "HgbikCVPUcVUbClsw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/myth84~airbnb-listings-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-myth84-airbnb-listings-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/myth84~airbnb-listings-scraper/runs": {
      "post": {
        "operationId": "runs-sync-myth84-airbnb-listings-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/myth84~airbnb-listings-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-myth84-airbnb-listings-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": {
          "locations": {
            "title": "Locations",
            "maxItems": 50,
            "type": "array",
            "description": "One or more destinations, one per line, as typed in the Airbnb search box, e.g. <code>Lisbon, Portugal</code>, <code>Brooklyn, New York</code>. Each one is a separate search with the same dates, guests, filters and currency, and <b>Maximum listings applies to each destination</b> (and to each search URL). A listing found twice is saved and charged once; <code>searchLocation</code> tells which one found it. Up to 50. Default empty: clear it if you paste search URLs below.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "startUrls": {
            "title": "Airbnb search URLs",
            "type": "array",
            "description": "Airbnb search result URLs copied from your browser, one per line, e.g. <code>https://www.airbnb.com/s/Lisbon--Portugal/homes</code>. Filters that have no field here (amenities, neighbourhoods, map area, categories) are kept; the guests, currency, language, price and size fields below replace the URL's own, and so do dates and room types when you set them. Default empty: a location is enough for most searches.",
            "items": {
              "type": "string",
              "pattern": "^https?://"
            },
            "default": []
          },
          "location": {
            "title": "Single location",
            "type": "string",
            "description": "Single destination (kept for compatibility; prefer <code>locations</code>): a city, region, address or landmark as typed in the Airbnb search box, e.g. <code>Lisbon, Portugal</code>, searched before the destinations of <code>locations</code> (up to 50 together). Leave empty when you use locations or paste search URLs."
          },
          "checkIn": {
            "title": "Check-in",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Check-in date, YYYY-MM-DD, e.g. <code>2026-11-20</code>, given with Check-out. Leave both dates empty to use the relative stay below (better for schedules: fixed dates expire). With no date at all (these four fields empty) the search is flexible: Airbnb proposes its own stay for each listing, so the prices are of different stays and not comparable."
          },
          "checkOut": {
            "title": "Check-out",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Check-out date, YYYY-MM-DD, after the check-in date, e.g. <code>2026-11-23</code>. Required when a check-in date is given."
          },
          "checkInDaysFromNow": {
            "title": "Check-in in N days",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Used when the dates above are empty: check-in this many days from today (UTC), 30 = in one month. A relative stay never expires in a schedule. Empty with Nights also empty = flexible search (prices not comparable)."
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "Used when the dates above are empty: length of the relative stay. If only one of these two fields is set, the other one is 30 days (check-in) or 3 nights."
          },
          "adults": {
            "title": "Adults",
            "minimum": 0,
            "maximum": 16,
            "type": "integer",
            "description": "Number of adults, 0 to 16; prices depend on the number of guests. Default 2: a couple, the occupancy of our validation runs.",
            "default": 2
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 15,
            "type": "integer",
            "description": "Number of children aged 2 to 12, 0 to 15; they count in the guests column, and prices depend on the number of guests. Default 0: adults only.",
            "default": 0
          },
          "infants": {
            "title": "Infants",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Number of infants under 2, 0 to 5 (not counted in the guests column). Default 0: no infant.",
            "default": 0
          },
          "pets": {
            "title": "Pets",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Number of pets travelling with you, 0 to 5; only pet-friendly listings are returned when set. Default 0: every listing, pet-friendly or not.",
            "default": 0
          },
          "maxResults": {
            "title": "Maximum listings",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Stop after this many unique listings (for each destination and each search URL when you fill Locations); you are never charged for more. A result page holds about 18 listings and Airbnb caps one search at 15 pages (270 listings): keep <b>Split large areas</b> enabled (Advanced section) to go beyond that. Default 100: a city overview in about 6 pages (the form is prefilled with 20 for a quick first run).",
            "default": 100
          },
          "priceMin": {
            "title": "Min price per night",
            "minimum": 0,
            "maximum": 1000000000,
            "type": "integer",
            "description": "Keep only listings whose nightly price is at least this amount, a whole number in the selected currency, e.g. <code>50</code> for 50 USD (Airbnb's own price filter). Leave empty for no minimum."
          },
          "priceMax": {
            "title": "Max price per night",
            "minimum": 0,
            "maximum": 1000000000,
            "type": "integer",
            "description": "Keep only listings whose nightly price is at most this amount, a whole number in the selected currency, e.g. <code>150</code> for 150 USD (Airbnb's own price filter); it must be at least the minimum price. Leave empty for no maximum."
          },
          "roomTypes": {
            "title": "Room types",
            "uniqueItems": true,
            "type": "array",
            "description": "Select one or more room types to keep: entire home or apartment, private room, shared room, hotel room (Airbnb's own room type filter). Default empty: every type.",
            "items": {
              "type": "string",
              "enum": [
                "entire_home",
                "private_room",
                "shared_room",
                "hotel_room"
              ],
              "enumTitles": [
                "Entire home/apt",
                "Private room",
                "Shared room",
                "Hotel room"
              ]
            },
            "default": []
          },
          "minBedrooms": {
            "title": "Min bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Keep only listings with at least this many bedrooms. Leave empty for no minimum."
          },
          "minBeds": {
            "title": "Min beds",
            "minimum": 0,
            "maximum": 40,
            "type": "integer",
            "description": "Keep only listings with at least this many beds. Leave empty for no minimum."
          },
          "minBathrooms": {
            "title": "Min bathrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Keep only listings with at least this many bathrooms. Leave empty for no minimum."
          },
          "currency": {
            "title": "Currency",
            "pattern": "^[A-Za-z]{3}$",
            "type": "string",
            "description": "ISO 4217 code of the currency used for every price, e.g. USD, EUR or GBP. Pick one from the list or type any code supported by Airbnb. Default USD: one currency for every destination of the run, so prices stay comparable; pick EUR or GBP for local prices.",
            "default": "USD"
          },
          "locale": {
            "title": "Language",
            "pattern": "^[a-z]{2}(-[A-Za-z]{2})?$",
            "type": "string",
            "description": "Airbnb language code for titles, property types and badges, e.g. <code>en</code>, <code>fr</code>, <code>es</code> or <code>en-GB</code>: two lowercase letters, optionally followed by a region. Default en: English property types and badges, the same words for every destination.",
            "default": "en"
          },
          "domain": {
            "title": "Airbnb site",
            "pattern": "^www\\.airbnb\\.[a-z.]+$",
            "type": "string",
            "description": "Airbnb site to query, e.g. <code>www.airbnb.fr</code> or <code>www.airbnb.co.uk</code>. Listing URLs in the output use this domain; European sites display regulated totals including taxes. Default www.airbnb.com: the international site, used by our validation runs.",
            "default": "www.airbnb.com"
          },
          "monitorPrices": {
            "title": "Monitor prices",
            "type": "boolean",
            "description": "Compare the total price of each listing with the one recorded by your previous run of the same search, and fill changeType, previousPrice and priceDelta. When on, maxResults is the number of listings compared per run. Default off: a plain search.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitoring store name",
            "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$",
            "type": "string",
            "description": "Name of the key-value store of your account that keeps the previous prices, one record per search. Use one store per schedule if you prefer, e.g. <code>airbnb-lisbon-daily</code>. Letters, digits and dashes only, at most 63 characters; upper case is lowered. Default airbnb-price-monitor: one store for all your monitoring runs.",
            "default": "airbnb-price-monitor"
          },
          "onlyChanges": {
            "title": "Only changes",
            "type": "boolean",
            "description": "With price monitoring on: save and charge only the new listings and the listings whose total price changed since your previous run; a run without any change succeeds with an empty dataset. Default off: every compared listing is saved with its changeType.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify datacenter proxies (automatic) are enough for Airbnb search pages. If your runs get blocked, switch to Apify residential proxies. Selecting a proxy country records it in the viewCountryCode column. You can also provide your own proxy URLs. Default: Apify datacenter proxies, included in the price.",
            "default": {
              "useApifyProxy": true
            }
          },
          "splitSearchArea": {
            "title": "Split large areas",
            "type": "boolean",
            "description": "When a search is saturated (15 pages), divide its map area into quadrants and search each of them until the maximum number of listings is reached. Default on: without it one search stops at about 270 listings, too few to cover a whole city.",
            "default": true
          },
          "includeMapPins": {
            "title": "Include map pins",
            "type": "boolean",
            "description": "Also keep the listings that Airbnb shows only as pins on the map next to the result grid (a couple more per page). Default on: they come with the same page, at no extra request.",
            "default": true
          },
          "maxRequests": {
            "title": "Max page requests",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Safety cap on the number of result pages fetched in one run, all searches included (about 18 listings per page). Default 500: about 9,000 listings, far above a usual run.",
            "default": 500
          },
          "delayMs": {
            "title": "Delay between pages",
            "minimum": 0,
            "maximum": 30000,
            "type": "integer",
            "description": "Pause between two page requests of the same search, in milliseconds. Increase it if you get blocked; 0 disables the pause. Default 800: steady pacing that worked in our validation and control runs.",
            "default": 800
          },
          "debugStoreHtml": {
            "title": "Store raw HTML pages",
            "type": "boolean",
            "description": "Debugging only: save every fetched page in the run's key-value store. Slows the run down and uses storage. Default off: no page is stored.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}