{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Rooms URLs Scraper & Guest Complaint Reviews",
    "description": "Airbnb Rooms URLs Scraper extracts room listing URLs from Airbnb’s search interface with precision. Ideal for scaling data pipelines, monitoring markets, building datasets, or feeding other Airbnb actors with clean, structured room URLs.",
    "version": "0.1",
    "x-build-id": "5pVF29tfjwc0y1ET1"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/simpleapi~Airbnb-Rooms-URLs-Scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-simpleapi-Airbnb-Rooms-URLs-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/simpleapi~Airbnb-Rooms-URLs-Scraper/runs": {
      "post": {
        "operationId": "runs-sync-simpleapi-Airbnb-Rooms-URLs-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/simpleapi~Airbnb-Rooms-URLs-Scraper/run-sync": {
      "post": {
        "operationId": "run-sync-simpleapi-Airbnb-Rooms-URLs-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 to audit",
            "type": "array",
            "description": "One or more Airbnb room URLs (or bare room IDs). Every listing becomes one parent row; its guest reviews become child rows underneath it. Example: https://www.airbnb.com/rooms/12937",
            "default": [
              "https://www.airbnb.com/rooms/12937",
              "https://www.airbnb.com/rooms/53997462"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "🔢 Stop after this many listings",
            "minimum": 0,
            "type": "integer",
            "description": "Caps PARENT listing rows only. Review rows are additional and are capped separately below. 0 = every listing you pasted. Default 0.",
            "default": 0
          },
          "scrapeReviews": {
            "title": "💬 Read the guest reviews",
            "type": "boolean",
            "description": "Pull the review text itself, not just the count. One extra request per 50 reviews. Turn off for listing rows only. Default true.",
            "default": true
          },
          "maxReviewRating": {
            "title": "⭐ Keep reviews at or below this star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Airbnb stays average about 4.8★, so 4 is the real complaint pile — it keeps every review that scored below average. Set 3 for hard negatives only, or 5 to keep everything. Applied after Airbnb returns each page. Default 4.",
            "default": 4
          },
          "reviewSortBy": {
            "title": "↕️ Read reviews in this order",
            "enum": [
              "lowest-rated",
              "most-recent",
              "most-relevant",
              "highest-rated"
            ],
            "type": "string",
            "description": "Asked of Airbnb, not sorted locally — so a truncated pull still keeps the worst feedback. 'Lowest rated first' also lets the run stop early once ratings climb above your ceiling. Default: lowest rated first.",
            "default": "lowest-rated"
          },
          "maxReviewsPerListing": {
            "title": "🔟 Stop after this many reviews per listing",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Counted AFTER the star-rating and keyword filters, so 100 means 100 kept complaint rows. 0 = every matching review. Cost scales with reviews, not with listings. Default 100, hard cap 1000.",
            "default": 100
          },
          "reviewTag": {
            "title": "🏷️ Only reviews about this topic",
            "type": "string",
            "description": "Airbnb's own per-listing review tag, e.g. CLEANLINESS, BATHROOM, QUIET, LOCATION, COMFORT, AMENITIES. The tags a listing actually has (with counts) come back in the reviewTagsAvailable column — run once empty, then re-run with a tag. An unknown tag silently returns zero reviews.",
            "default": ""
          },
          "reviewSearchText": {
            "title": "🔍 Only reviews containing this word",
            "type": "string",
            "description": "Airbnb's own full-text review search: type mould, noise, broken, refund. Searched server-side, not by us. Leave empty for no text filter.",
            "default": ""
          },
          "complaintKeywords": {
            "title": "🚩 Flag reviews containing these words",
            "type": "array",
            "description": "Matched case-insensitively with a short suffix tolerance, so 'clean' also flags 'cleaning' and 'smell' flags 'smelly'. Clear the list to switch flagging off.",
            "default": [
              "dirty",
              "smell",
              "noise",
              "broken",
              "mold",
              "mould",
              "bug",
              "rude",
              "cold",
              "leak",
              "refund",
              "cancel"
            ],
            "items": {
              "type": "string"
            }
          },
          "onlyComplaintKeywordMatches": {
            "title": "🎯 Drop reviews that hit none of those words",
            "type": "boolean",
            "description": "Off by default, so you still see every low-rated review even when it uses words you did not list. Turn on for a pure keyword report.",
            "default": false
          },
          "enrichHostAndCoHostProfiles": {
            "title": "👤 Open the host profile",
            "type": "boolean",
            "description": "Preferred switch. When left unset the actor falls back to the legacy enrichUserProfiles key, so input JSON written for the base actor keeps working. Default false.",
            "default": false
          },
          "enrichUserProfiles": {
            "title": "👥 Enrich user profiles (legacy key)",
            "type": "boolean",
            "description": "Same behaviour as the switch above; kept so input JSON written for the base actor still runs unchanged. Used only when 'Open the host and co-host profiles' is left unset.",
            "default": false
          },
          "checkIn": {
            "title": "📅 Check-in date",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "YYYY-MM-DD. Sent to Airbnb as check_in."
          },
          "checkOut": {
            "title": "🛎️ Check-out date",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "YYYY-MM-DD. Sent to Airbnb as check_out."
          },
          "adults": {
            "title": "🧑 Adults",
            "minimum": 1,
            "type": "integer",
            "description": "Party size sent with the listing request. Minimum 1."
          },
          "children": {
            "title": "🧒 Children",
            "minimum": 0,
            "type": "integer",
            "description": "Children in the party (2-12). Minimum 0."
          },
          "infants": {
            "title": "👶 Infants",
            "minimum": 0,
            "type": "integer",
            "description": "Infants under 2. Minimum 0."
          },
          "pets": {
            "title": "🐾 Pets",
            "minimum": 0,
            "type": "integer",
            "description": "Service animals / pets. Minimum 0."
          },
          "locale": {
            "title": "🌐 Review + listing 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",
              "is-IS",
              "it-IT",
              "it-CH",
              "sw-XX",
              "lv-LV",
              "lt-LT",
              "hu-HU",
              "mt-MT",
              "ms-MY",
              "nl-BE",
              "nl-NL",
              "no-NO",
              "pl-PL",
              "pt-BR",
              "pt-PT",
              "ro-RO",
              "sq-AL",
              "sk-SK",
              "sl-SI",
              "sr-RS",
              "fi-FI",
              "sv-SE",
              "tl-PH",
              "vi-VN",
              "tr-TR",
              "el-GR",
              "bg-BG",
              "mk-MK",
              "ru-RU",
              "uk-UA",
              "ka-GE",
              "hy-AM",
              "he-IL",
              "ar-XX",
              "hi-IN",
              "th-TH",
              "ko-KR",
              "ja-JP",
              "zh-US",
              "zh-TW-US",
              "zh-CN",
              "zh-HK",
              "zh-TW"
            ],
            "type": "string",
            "description": "Language and region used for the listing page and for the review request. Default English (United States).",
            "default": "en-US"
          },
          "currency": {
            "title": "💱 Currency",
            "enum": [
              "USD",
              "CZK",
              "AUD",
              "BRL",
              "BGN",
              "CAD",
              "CLP",
              "CNY",
              "COP",
              "CRC",
              "HRK",
              "DKK",
              "EGP",
              "AED",
              "EUR",
              "GHS",
              "HKD",
              "HUF",
              "INR",
              "IDR",
              "ILS",
              "JPY",
              "KZT",
              "KES",
              "MYR",
              "MXN",
              "MAD",
              "TWD",
              "NZD",
              "NOK",
              "PEN",
              "PHP",
              "PLN",
              "GBP",
              "QAR",
              "RON",
              "SAR",
              "SGD",
              "ZAR",
              "KRW",
              "SEK",
              "CHF",
              "THB",
              "TRY",
              "UGX",
              "UAH",
              "UYU",
              "VND"
            ],
            "type": "string",
            "description": "Currency header sent with every request. Default USD.",
            "default": "USD"
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy",
            "type": "object",
            "description": "Leave as-is to start direct and auto-escalate none → datacenter → residential the moment a page comes back without its data container. Pick a group or your own proxy URLs and the actor uses them for every request instead."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}