{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Review Scraper With Topic & Keyword Filters",
    "description": "Airbnb Review Scraper extracts Airbnb reviews with topic and keyword filters, including ratings, review text, dates, reviewer details, property information, and sentiment insights. Ideal for guest feedback analysis, property research, competitor monitoring, and hospitality insights.",
    "version": "0.1",
    "x-build-id": "GvVffmtznncDK3QgI"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapier~airbnb-review-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapier-airbnb-review-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/scrapier~airbnb-review-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapier-airbnb-review-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/scrapier~airbnb-review-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapier-airbnb-review-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",
        "required": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "🏡 Airbnb Listings (URL or listing ID)",
            "type": "array",
            "description": "📥 One or more Airbnb listing addresses (https://www.airbnb.com/rooms/12937) or bare numeric listing IDs (12937). Anything that is not a listing is reported as an unsupported input row instead of being guessed at.",
            "items": {
              "type": "string"
            }
          },
          "listingUrls": {
            "title": "➕ Extra Listings (optional)",
            "type": "array",
            "description": "🧾 Additional Airbnb listing addresses or numeric listing IDs. These are merged with the field above and de-duplicated, so a listing named twice is only collected once.",
            "items": {
              "type": "string"
            }
          },
          "reviewTopics": {
            "title": "🎯 Review Topics",
            "type": "array",
            "description": "🏷️ Keep only reviews Airbnb itself files under the selected topics, e.g. Cleanliness or Getting around. Leave empty for every review. Each listing offers its own subset of topics — a topic a listing does not use returns an honest zero for that listing, never an error. The full topic table for every listing is published as its own row.",
            "items": {
              "type": "string",
              "enum": [
                "ACCESS",
                "BATHROOM",
                "CHECK_IN",
                "CLEANLINESS",
                "COMFORT",
                "DECOR",
                "GETTING_AROUND",
                "GRILL",
                "HOSPITALITY",
                "HOT_TUB",
                "INDOOR_SPACES",
                "LOCATION",
                "NEARBY",
                "PARKING",
                "POOL",
                "SLEEP",
                "VALUE",
                "VIEW",
                "WALKABILITY"
              ],
              "enumTitles": [
                "Access",
                "Bathroom",
                "Check-in",
                "Cleanliness",
                "Comfort",
                "Decor",
                "Getting around",
                "Grill",
                "Hospitality",
                "Hot tub",
                "Indoor spaces",
                "Location",
                "Nearby",
                "Parking",
                "Pool",
                "Sleep quality",
                "Value",
                "View",
                "Walkability"
              ]
            }
          },
          "reviewSearchQuery": {
            "title": "🔍 Keyword Inside The Reviews",
            "type": "string",
            "description": "💬 Keep only reviews that mention this word or phrase, e.g. parking, wifi, noise. Every returned review really contains the term. A term nobody wrote about returns zero reviews with the listing still marked as reachable."
          },
          "matchMode": {
            "title": "🧩 How To Combine Topic & Keyword",
            "enum": [
              "topicThenText",
              "topicOnly",
              "textOnly"
            ],
            "type": "string",
            "description": "⚙️ topicThenText (default) = take the selected topics, then keep only those reviews that also contain the keyword — the overlap of both. topicOnly = ignore the keyword. textOnly = ignore the topics."
          },
          "emitTopicBreakdownRow": {
            "title": "📊 Publish Each Listing's Topic Table",
            "type": "boolean",
            "description": "🧮 Adds one extra row per listing (type listingTopics) with every topic Airbnb offers for it, the review count behind each topic and its share of the listing's total. Counts come straight from the listing, not from the reviews collected."
          },
          "maxReviewsPerListing": {
            "title": "📊 Reviews Per Listing",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "🔢 Maximum number of review rows per listing, counted separately for each selected topic. Example: 25 with Cleanliness and Location selected returns up to 25 cleanliness reviews and up to 25 location reviews for each listing."
          },
          "maxComments": {
            "title": "📦 Reviews Per Listing (legacy key)",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "♻️ Kept so input built for the original scraper keeps working. Used only when the field above is left empty.",
            "default": 10
          },
          "sortOrder": {
            "title": "↕️ Review Order",
            "enum": [
              "MOST_RECENT",
              "BEST_QUALITY",
              "RATING_DESC",
              "RATING_ASC"
            ],
            "type": "string",
            "description": "📅 Newest first is the default because it walks a listing's reviews without repeating rows. Airbnb's own ranking (BEST_QUALITY) re-serves the same reviews across pages, so deep pulls under it are incomplete.",
            "default": "MOST_RECENT"
          },
          "reviewLanguage": {
            "title": "🌍 Review Language",
            "enum": [
              "en-US",
              "de-DE",
              "es-ES",
              "fr-FR",
              "it-IT",
              "pt-PT",
              "nl-NL",
              "da-DK",
              "cs-CZ",
              "hr-HR",
              "id-ID",
              "ca-ES",
              "et-EE",
              "ga-IE",
              "az-AZ",
              "bs-BA",
              "xh-ZA",
              "zu-ZA"
            ],
            "type": "string",
            "description": "🗣️ Language used for the localized review content and dates. The language part of the code is what changes the response."
          },
          "locale": {
            "title": "🌐 Review Language (legacy key)",
            "type": "string",
            "description": "♻️ Kept so input built for the original scraper keeps working. Used only when the field above is left empty.",
            "default": "en-US"
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy Configuration",
            "type": "object",
            "description": "🚦 Optional connection settings. The run starts on a direct connection and moves to a more resilient route on its own if a listing is slow to answer.",
            "properties": {
              "useApifyProxy": {
                "title": "✅ Use Apify Proxy",
                "type": "boolean",
                "description": "🎛️ Route requests through Apify Proxy."
              },
              "apifyProxyGroups": {
                "title": "🧩 Groups",
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "🏷️ Optional. Leave empty to let the run choose."
              },
              "apifyProxyCountry": {
                "title": "🌍 Country",
                "type": "string",
                "description": "📌 Optional ISO-2 country code, e.g. US, GB, CA."
              }
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}