{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Scraper — Listings & Reviews",
    "description": "Scrape Airbnb listings worldwide. Prices, ratings, amenities, host info, availability, reviews. Price-range splitting bypasses the 240-listing cap. No API key required.",
    "version": "0.1",
    "x-build-id": "YKhKVPsLjoyI10v2K"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/unfenced-group~airbnb-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-unfenced-group-airbnb-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/unfenced-group~airbnb-scraper/runs": {
      "post": {
        "operationId": "runs-sync-unfenced-group-airbnb-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/unfenced-group~airbnb-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-unfenced-group-airbnb-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": {
          "locationQueries": {
            "title": "Location queries",
            "type": "array",
            "description": "List of locations to search (e.g. 'London', 'Paris, France', 'Miami Beach, FL'). The scraper uses price-range splitting to collect all listings without the 240-listing cap.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Search URLs",
            "type": "array",
            "description": "Airbnb search result URLs. Apply filters in your browser first (dates, guests, amenities), then paste the URL here. All your filters are preserved.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "listingUrls": {
            "title": "Listing URLs",
            "type": "array",
            "description": "Individual Airbnb listing URLs (e.g. https://www.airbnb.com/rooms/12345678). Scrapes the detail page directly.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "checkIn": {
            "title": "Check-in date",
            "type": "string",
            "description": "Check-in date in YYYY-MM-DD format. Enables date-specific pricing in the output."
          },
          "checkOut": {
            "title": "Check-out date",
            "type": "string",
            "description": "Check-out date in YYYY-MM-DD format. Required when check-in is set."
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "type": "integer",
            "description": "Number of adult guests. Affects pricing and availability shown.",
            "default": 2
          },
          "currency": {
            "title": "Currency",
            "minLength": 3,
            "maxLength": 3,
            "type": "string",
            "description": "ISO 4217 currency code for prices (e.g. EUR, USD, GBP, JPY, AUD, CAD, CHF, SEK, PLN, BRL, MXN, ARS, ZAR, AED, THB, SGD, INR, KES, NZD, NOK, DKK, TRY, HUF, CZK, RON, HKD, TWD, KRW, IDR, MYR, PHP, VND, EGP, NGN, and any other currency Airbnb supports).",
            "default": "USD"
          },
          "locale": {
            "title": "Locale / language",
            "enum": [
              "en-US",
              "en-GB",
              "de-DE",
              "fr-FR",
              "es-ES",
              "it-IT",
              "pt-BR",
              "nl-NL",
              "ja-JP",
              "ko-KR",
              "zh-CN",
              "pl-PL",
              "ru-RU"
            ],
            "type": "string",
            "description": "Language for listing descriptions and labels.",
            "default": "en-US"
          },
          "priceMin": {
            "title": "Minimum nightly price",
            "minimum": 0,
            "type": "integer",
            "description": "Only return listings at or above this nightly price (in selected currency). Also used as the lower bound for price-range splitting."
          },
          "priceMax": {
            "title": "Maximum nightly price",
            "minimum": 0,
            "type": "integer",
            "description": "Only return listings at or below this nightly price. Increase above 10000 for luxury markets."
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Filter listings by minimum number of bedrooms."
          },
          "minBeds": {
            "title": "Minimum beds",
            "minimum": 0,
            "type": "integer",
            "description": "Filter listings by minimum number of beds."
          },
          "minBathrooms": {
            "title": "Minimum bathrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Filter listings by minimum number of bathrooms."
          },
          "skipDetailPages": {
            "title": "Fast mode (skip detail pages)",
            "type": "boolean",
            "description": "If enabled, only search-result data is collected — much faster and cheaper, but without amenities, full descriptions, host details, or sub-ratings. Best for large-scale price monitoring.",
            "default": false
          },
          "includeReviews": {
            "title": "Include guest reviews",
            "type": "boolean",
            "description": "If enabled, guest reviews are scraped for each listing (text, rating, date, reviewer). This makes runs slower. Control volume with Max reviews per listing.",
            "default": false
          },
          "maxReviewsPerListing": {
            "title": "Max reviews per listing",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of reviews to collect per listing when Include reviews is enabled.",
            "default": 50
          },
          "calendarMonths": {
            "title": "Calendar availability (months)",
            "minimum": 0,
            "maximum": 12,
            "type": "integer",
            "description": "Number of months of future availability data to fetch per listing (0 = disabled). Each day includes available status, nightly price, min nights, and check-in eligibility. Max 12 months.",
            "default": 0
          },
          "monitoringMode": {
            "title": "Monitoring mode (incremental)",
            "type": "boolean",
            "description": "If enabled, only listings not seen in previous runs are collected and saved. Listing IDs are persisted across runs with a 60-day TTL.",
            "default": false
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum total listings to return across all inputs. Set to 0 for unlimited.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Maximum parallel detail page requests. Keep at 3 or below to avoid IP blocks.",
            "default": 3
          },
          "useProxy": {
            "title": "Use Residential Proxy",
            "type": "boolean",
            "description": "Enable residential proxy for geo-specific pricing accuracy. Default: false — Airbnb's server-rendered data works from standard IPs. Enable only if you need pricing from a specific country or if requests fail.",
            "default": false
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Number of price buckets to scrape in parallel (1–5). Default 2 is 1.3× faster than sequential with no rate-limit risk. Recommended: 3 for large cities (1.6× faster). Max: 5.",
            "default": 2
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}