{
  "title": "Airbnb Listing Monitor - Ratings & Public Profile Changes",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "roomUrls": {
      "title": "Airbnb room URLs",
      "type": "array",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "default": [],
      "prefill": [
        "https://www.airbnb.com/rooms/905399"
      ],
      "description": "Up to 20 exact https://www.airbnb.com/rooms/ID URLs. Tracking parameters are removed; booking date, guest-count and price queries are not supported. Empty room and city lists use the sample room."
    },
    "cityUrls": {
      "title": "Optional curated city directories",
      "type": "array",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "default": [],
      "description": "Up to 2 exact https://www.airbnb.com/city-name/stays URLs. Discover the public structured list (12 listings observed), then read each room. This is not full search or all local inventory."
    },
    "maxDiscoveredListings": {
      "title": "Maximum discovered listings",
      "type": "integer",
      "default": 20,
      "minimum": 1,
      "maximum": 40,
      "description": "Total unique rooms selected from city pages. Lower than the visible directory count yields partial coverage and prevents history advancement."
    },
    "maxResults": {
      "title": "Maximum saved listing rows",
      "type": "integer",
      "default": 20,
      "minimum": 1,
      "maximum": 60,
      "description": "Maximum charged rows saved. When requested rooms remain, SUMMARY reports partial coverage and comparison history stays unchanged."
    },
    "comparePrevious": {
      "title": "Compare previous saved observations",
      "type": "boolean",
      "default": false,
      "description": "Compare with the last complete successful observation under the same input selection and snapshot name. First comparison establishes a baseline."
    },
    "onlyChanges": {
      "title": "Save only new or changed observations",
      "type": "boolean",
      "default": false,
      "description": "Enables comparison. Unchanged observations are skipped and incur no result event; an unchanged run may correctly produce zero rows."
    },
    "snapshotName": {
      "title": "Snapshot name",
      "type": "string",
      "editor": "textfield",
      "default": "default",
      "description": "Use 1-80 letters, numbers, underscores or hyphens. One active writer per watchlist and snapshot; new names create independent history."
    },
    "maxRunSeconds": {
      "title": "Run budget in seconds",
      "type": "integer",
      "default": 90,
      "minimum": 30,
      "maximum": 120,
      "description": "Shared deadline for all source reads and output. Failed, partial or spending-limited runs do not advance comparison history."
    }
  }
}
