{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Scraper API - Prices, Reviews & Calendar",
    "description": "Scrape whole cities or single listings. Extract prices with the full fee breakdown, all six rating categories, host details, amenities, photos, day-by-day availability and guest reviews — 99 fields per listing. Export to JSON, CSV or Excel, run via API, or schedule it. Failed listings are free.\n",
    "version": "1.0",
    "x-build-id": "XpqAQNcW6SSKaTY3b"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/datapipe~airbnb-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-datapipe-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/datapipe~airbnb-scraper/runs": {
      "post": {
        "operationId": "runs-sync-datapipe-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/datapipe~airbnb-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-datapipe-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": "Locations to search",
            "type": "array",
            "description": "Cities, regions or neighbourhoods, e.g. [\"Porto, Portugal\", \"Lisbon, Portugal\"]. Each one is searched and the results land in the same dataset.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "…or paste listing URLs",
            "type": "array",
            "description": "Scrape these listings directly and skip the search. Airbnb room URLs or bare listing ids. Use this instead of a location, not as well as.",
            "items": {
              "type": "string"
            }
          },
          "maxListings": {
            "title": "How many listings",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many. 20 by default, which is a complete run of every field on a real market in about twenty seconds. Raise it for a full sweep, or set 0 to take every listing the search finds — a big city is thousands of them, so that is a deliberate choice rather than something to inherit.",
            "default": 20
          },
          "mode": {
            "title": "How much detail",
            "enum": [
              "full",
              "search"
            ],
            "type": "string",
            "description": "Full opens every listing's own page for the complete record. Search only reads the result cards — much cheaper and faster, but most fields come back empty.",
            "default": "full"
          },
          "currency": {
            "title": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "AUD",
              "CAD",
              "CHF",
              "JPY",
              "CNY",
              "HKD",
              "SGD",
              "NZD",
              "INR",
              "KRW",
              "THB",
              "MYR",
              "AED",
              "ILS",
              "ZAR",
              "TRY",
              "MXN",
              "BRL",
              "SEK",
              "NOK",
              "DKK",
              "PLN",
              "CZK",
              "HUF",
              "RON"
            ],
            "type": "string",
            "description": "Prices come back converted to this. Every option here was checked against Airbnb and returns that currency; the list is what it accepts, not every ISO code.",
            "default": "USD"
          },
          "checkIn": {
            "title": "Check-in",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "YYYY-MM-DD. Defaults to about a month from the run."
          },
          "checkOut": {
            "title": "Check-out",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "YYYY-MM-DD, after check-in. Defaults to the night after check-in."
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "type": "integer",
            "description": "Guest count sent to Airbnb's search, which affects both availability and price."
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "type": "integer",
            "description": "Children in the party. Counts toward occupancy and can change the price."
          },
          "infants": {
            "title": "Infants",
            "minimum": 0,
            "type": "integer",
            "description": "Infants in the party. Most listings do not count them toward occupancy."
          },
          "pets": {
            "title": "Pets",
            "minimum": 0,
            "type": "integer",
            "description": "Pets in the party. Some listings price these separately, others refuse them."
          },
          "priceMin": {
            "title": "Lowest nightly price",
            "minimum": 0,
            "type": "integer",
            "description": "In the currency chosen above."
          },
          "priceMax": {
            "title": "Highest nightly price",
            "minimum": 0,
            "type": "integer",
            "description": "In the currency chosen above."
          },
          "minBeds": {
            "title": "Minimum beds",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings with at least this many beds."
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings with at least this many bedrooms."
          },
          "minBathrooms": {
            "title": "Minimum bathrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings with at least this many bathrooms."
          },
          "minRating": {
            "title": "Minimum rating",
            "type": "number",
            "description": "Drop listings rated below this, out of 5. A brand-new listing has no rating yet and is dropped too."
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Empty keeps all. These four are the whole set Airbnb's own filter panel offers.",
            "items": {
              "type": "string",
              "enum": [
                "House",
                "Guesthouse",
                "Apartment",
                "Hotel"
              ]
            }
          },
          "roomTypes": {
            "title": "Room types",
            "type": "array",
            "description": "Empty keeps all.",
            "items": {
              "type": "string",
              "enum": [
                "Entire home/apt",
                "Private room",
                "Shared room",
                "Hotel room"
              ]
            }
          },
          "includeReviews": {
            "title": "Include guest reviews",
            "type": "boolean",
            "description": "Off by default because reviews bill per review. Turn it on and you get every review a listing has, up to the cap below.",
            "default": false
          },
          "maxReviewsPerListing": {
            "title": "Reviews per listing, at most",
            "minimum": 0,
            "type": "integer",
            "description": "Only used when \"Include guest reviews\" is on. 50 by default; the busiest listing measured carried 537, so this is what stops one popular property dominating a run. Set 0 for every review, however many that is.",
            "default": 50
          },
          "calendarMonths": {
            "title": "Months of availability",
            "minimum": 0,
            "maximum": 12,
            "type": "integer",
            "description": "How far forward the day-by-day calendar goes, counted from today. Three months covers the booking window most analysis uses; raise it to 12 for a full year, or set 0 to skip the calendar and make the run faster.",
            "default": 3
          },
          "calendarStartMonth": {
            "title": "Calendar starts in month",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "1-12. Defaults to the month the run happens in, which is almost always what you want."
          },
          "calendarStartYear": {
            "title": "Calendar starts in year",
            "minimum": 2024,
            "type": "integer",
            "description": "Defaults to the year the run happens in. Set it together with the month above to look at a window that does not start today."
          },
          "maxPages": {
            "title": "Search pages to walk, at most",
            "minimum": 0,
            "type": "integer",
            "description": "Usually leave empty — \"How many listings\" already bounds the run, and search pages are free. About 18 listings per page."
          },
          "locale": {
            "title": "Language",
            "enum": [
              "en-US",
              "en-GB",
              "fr-FR",
              "de-DE",
              "es-ES",
              "it-IT",
              "pt-PT",
              "pt-BR",
              "nl-NL",
              "pl-PL",
              "sv-SE",
              "da-DK",
              "tr-TR",
              "ru-RU",
              "ja-JP",
              "ko-KR",
              "zh-CN",
              "el-GR"
            ],
            "type": "string",
            "description": "The language Airbnb writes review dates, house rules and cancellation terms in. It does not change which listings come back.",
            "default": "en-US"
          },
          "proxyCountry": {
            "title": "🌍 Browse from",
            "enum": [
              "",
              "US",
              "GB",
              "FR",
              "DE",
              "ES",
              "IT",
              "PT",
              "BR",
              "NL",
              "PL",
              "SE",
              "DK",
              "TR",
              "JP",
              "KR",
              "GR",
              "CA",
              "AU",
              "MX",
              "IN",
              "SG",
              "IE",
              "AT"
            ],
            "type": "string",
            "description": "Which country to search Airbnb from. Airbnb ranks listings, converts prices and shows availability differently depending on where the visitor is, so a Paris search seen from France is not the same result set you get from the United States — different ordering, different totals, sometimes different listings.\n\nPick the country your buyers browse from. The scraper reads that country's own Airbnb site (airbnb.de for Germany, airbnb.co.uk for the UK) and returns what a visitor there actually sees.\n\nLeave it empty and it follows the language above, so choosing German browses Germany. Set both when they should differ — an English-speaking analyst researching the German market, for example.\n\nChina and Russia are not listed: Airbnb withdrew from both in 2022 and a search from either returns nothing.",
            "default": ""
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}