{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Review Scraper: Category Ratings & Host Replies",
    "description": "Airbnb Review Scraper extracts reviews with category ratings and host replies, including review text, ratings, dates, reviewer details, property data, and host responses. Ideal for guest feedback analysis, property research, competitor monitoring, and hospitality insights.",
    "version": "0.1",
    "x-build-id": "Y0pZYhe4ZfmeVk2V2"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapio~airbnb-review-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapio-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/scrapio~airbnb-review-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapio-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/scrapio~airbnb-review-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapio-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": "🏡 Listings To Score",
            "type": "array",
            "description": "📥 One or more Airbnb listing addresses (e.g. https://www.airbnb.com/rooms/12937) or bare listing IDs (e.g. 12937). Bulk input works too. Anything that is not a listing is reported as skipped rather than silently answered with unrelated listings.",
            "items": {
              "type": "string"
            }
          },
          "scorecardTargets": {
            "title": "➕ Extra Listings",
            "type": "array",
            "description": "📋 Optional additional listing addresses or listing IDs. They are merged with the list above and de-duplicated. Example: [\"20669368\", \"https://www.airbnb.com/rooms/15335253\"].",
            "items": {
              "type": "string"
            }
          },
          "includeListingScorecard": {
            "title": "⭐ Include The Listing Rating Scorecard",
            "type": "boolean",
            "description": "✅ Emit one `type: listing` row per listing with overallRating, ratingAccuracy, ratingCleanliness, ratingCheckin, ratingCommunication, ratingLocation, ratingValue, weakestCategory, strongestCategory and categorySpread. A score that cannot be read unambiguously is left empty, never guessed. Default is on.",
            "default": true
          },
          "scorecardOnly": {
            "title": "🎯 Scorecard Only (Skip Review Rows)",
            "type": "boolean",
            "description": "📊 Return only the per-listing scorecard row and no individual review rows. Useful for comparing many listings quickly. Default is off.",
            "default": false
          },
          "includeHostReplies": {
            "title": "💬 Include Host Replies",
            "type": "boolean",
            "description": "✅ Attach the host's reply text and reply date to every review that has one, and count the reply rate on the listing row. Default is on.",
            "default": true
          },
          "hostRepliesAsChildRows": {
            "title": "🧵 Also Emit Each Reply As Its Own Row",
            "type": "boolean",
            "description": "↩️ Emit an extra `type: hostReply` / `isChild: true` row per reply, linked to its review through parentReviewId. Default is on.",
            "default": true
          },
          "mirrorRepliesToChildDataset": {
            "title": "🗂️ Mirror Replies To A Separate Dataset",
            "type": "boolean",
            "description": "📦 Copy every host reply row into a run-scoped dataset named `<runId>-host-replies`, in addition to the main dataset. Default is on.",
            "default": true
          },
          "onlyReviewsWithHostReply": {
            "title": "🔎 Only Keep Reviews That Got A Reply",
            "type": "boolean",
            "description": "🎯 Emit review rows only where the host replied. The listing row still reports the true reply rate over everything that was read. Default is off.",
            "default": false
          },
          "reviewsPerListing": {
            "title": "📊 Reviews Per Listing",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "🔢 Maximum number of reviews to read per listing. Example: 30 listings x 30 = up to 900 review rows plus their replies. Default is 30."
          },
          "maxComments": {
            "title": "📊 Max Reviews Per Listing (legacy key)",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "🔢 Same meaning as Reviews Per Listing, kept so an existing input file keeps working. When both are set this one wins. Leave empty to use Reviews Per Listing."
          },
          "sortOrder": {
            "title": "🔀 Review Order",
            "enum": [
              "MOST_RECENT",
              "RATING_DESC",
              "RATING_ASC",
              "BEST_QUALITY"
            ],
            "type": "string",
            "description": "📑 Which order to read the reviews in. Newest first is the default because it walks a listing without repeating rows; Airbnb's own ranking can return the same review on more than one page."
          },
          "contentLanguage": {
            "title": "🌍 Review Language",
            "enum": [
              "en-US",
              "az-AZ",
              "id-ID",
              "bs-BA",
              "ca-ES",
              "cs-CZ",
              "sr-ME",
              "da-DK",
              "de-DE",
              "de-AT",
              "de-CH",
              "de-LU",
              "et-EE",
              "en-AU",
              "en-CA",
              "en-GB",
              "en-GY",
              "en-IN",
              "en-IE",
              "en-NZ",
              "en-SG",
              "en-AE",
              "es-AR",
              "es-BZ",
              "es-BO",
              "es-CL",
              "es-CO",
              "es-CR",
              "es-EC",
              "es-SV",
              "es-ES",
              "es-US",
              "es-GT",
              "es-HN",
              "es-419",
              "es-MX",
              "es-NI",
              "es-PA",
              "es-PY",
              "es-PE",
              "es-VE",
              "fr-BE",
              "fr-CA",
              "fr-FR",
              "fr-CH",
              "fr-LU",
              "ga-IE",
              "hr-HR",
              "xh-ZA",
              "zu-ZA"
            ],
            "type": "string",
            "description": "🗣️ Language used for the localized review text and dates. The language part of the code is what changes the result; the region part is kept in the output so you can see what was requested."
          },
          "locale": {
            "title": "🌍 Review Language (legacy key)",
            "type": "string",
            "description": "🗣️ Same meaning as Review Language, kept so an existing input file keeps working. When both are set this one wins. Leave empty to use Review Language."
          },
          "proxyConfiguration": {
            "title": "🌐 Connection",
            "type": "object",
            "description": "🚦 Optional. The run starts on a direct connection and adjusts its 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": "🧩 Advanced Routing",
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "🏷️ Optional advanced routing selection."
              },
              "apifyProxyCountry": {
                "title": "🌍 Proxy 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}