{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Listings Scraper & Price Monitor: Track Changes",
    "description": "Scrape Airbnb search results and listings (price per night, total price, rating, reviews, capacity, coordinates) and monitor only what changed between runs. No login, no cookies, pay per listing. Fast, plain HTTP.",
    "version": "0.1",
    "x-build-id": "wbpfGKbhlKWV57S1r"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kislov-data~airbnb-listing-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kislov-data-airbnb-listing-monitor",
        "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/kislov-data~airbnb-listing-monitor/runs": {
      "post": {
        "operationId": "runs-sync-kislov-data-airbnb-listing-monitor",
        "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/kislov-data~airbnb-listing-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-kislov-data-airbnb-listing-monitor",
        "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",
        "required": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "Airbnb links",
            "type": "array",
            "description": "Search pages such as <code>https://www.airbnb.com/s/Lisbon--Portugal/homes</code> (filters in the link are kept) and/or listing links such as <code>https://www.airbnb.com/rooms/3086039</code>. Prices come from search pages; a listing link adds details such as capacity but no price. Any Airbnb domain is accepted, the Actor always reads the English version.",
            "default": [
              {
                "url": "https://www.airbnb.com/s/Lisbon--Portugal/homes"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "all",
              "monitor"
            ],
            "type": "string",
            "description": "All listings: return everything found. Monitor: after the first run return only listings whose price, rating, review count or availability changed since the previous run (the first run returns everything).",
            "default": "all"
          },
          "checkIn": {
            "title": "Check-in date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Optional, format YYYY-MM-DD. Applied to every link and replaces dates inside the links. Always set dates for price monitoring: without dates Airbnb shows a price for a default stay that changes over time."
          },
          "checkOut": {
            "title": "Check-out date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Optional, format YYYY-MM-DD. Must be used together with the check-in date."
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Optional number of adults. Applied to every link and replaces the value inside the links. Empty means the link decides (Airbnb default is 1)."
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 15,
            "type": "integer",
            "description": "Optional number of children (ages 2-12) for the price calculation."
          },
          "infants": {
            "title": "Infants",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Optional number of infants (under 2) for the price calculation."
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Three-letter currency code for all prices, for example USD, EUR, GBP, CAD.",
            "default": "USD"
          },
          "maxListingsPerSource": {
            "title": "Max listings per search link",
            "minimum": 1,
            "maximum": 270,
            "type": "integer",
            "description": "How many listings to read from each search link. A page holds 18 listings and Airbnb shows at most 15 pages (270 listings) per search, so split big areas into several searches (neighborhoods, price ranges).",
            "default": 20
          },
          "includeListingDetails": {
            "title": "Open every listing page for exact details",
            "type": "boolean",
            "description": "Search results do not show guest capacity and may hide Superhost status behind a Guest favorite badge. Turn this on to load each listing page and fill both exactly. It multiplies the number of requests, so runs take longer.",
            "default": false
          },
          "reportNewListings": {
            "title": "Monitor: also return new listings",
            "type": "boolean",
            "description": "In monitor mode, also return listings that were not in the previous run of the same search. Airbnb reshuffles the order of search results, so with a small limit this can be noisy.",
            "default": false
          },
          "reportDisappeared": {
            "title": "Monitor: report disappeared listings",
            "type": "boolean",
            "description": "In monitor mode, return a short record for listings that were in the previous run but are no longer in the results for your dates. Only works when the whole result set was read (under 15 pages); it means gone from the results, which usually means not available for those dates. These records are free.",
            "default": false
          },
          "stateName": {
            "title": "Monitoring storage name",
            "type": "string",
            "description": "Name of the key-value store that remembers the previous run. Use a different name for each monitoring job.",
            "default": "airbnb-monitor-state"
          },
          "requestDelaySeconds": {
            "title": "Pause between requests (seconds)",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Minimum pause between page requests. Keep it at 1 or more to stay polite to the site.",
            "default": 1
          },
          "concurrency": {
            "title": "Parallel searches",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "How many search links to read at the same time. Requests are still spaced by the pause above.",
            "default": 2
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional Apify datacenter proxy. By default requests go directly from the Apify platform. The Actor never uses residential proxies and never tries to get around bot protection: pages that return a block are skipped and not charged.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}