{
  "title": "Meetup Group & Event Monitor - Schedules and Changes",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "groupUrls": {
      "title": "Meetup group URLs",
      "type": "array",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "default": [],
      "prefill": [
        "https://www.meetup.com/orlandopython/"
      ],
      "description": "Up to 5 public www.meetup.com/group/ URLs. Reads the active-event window embedded on the group page, usually up to 4 events. If the group has more events, SUMMARY is partial and history does not advance."
    },
    "eventUrls": {
      "title": "Meetup event URLs",
      "type": "array",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "default": [],
      "prefill": [],
      "description": "Up to 20 exact public www.meetup.com/group/events/id/ URLs. Fetches those details directly. Empty group and event lists use the sample group."
    },
    "maxEvents": {
      "title": "Maximum selected event details",
      "type": "integer",
      "default": 10,
      "minimum": 1,
      "maximum": 20,
      "description": "Bounds detail requests across the deduplicated watchlist. Explicit event URLs take priority. Unread selected events remain reported as partial coverage."
    },
    "maxResults": {
      "title": "Maximum saved event rows",
      "type": "integer",
      "default": 10,
      "minimum": 1,
      "maximum": 20,
      "description": "Maximum confirmed rows saved. Nested versions, tiers and group metadata are included in the row. If requested observations remain, history is preserved and SUMMARY reports partial coverage."
    },
    "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": 120,
      "minimum": 30,
      "maximum": 120,
      "description": "Shared deadline for all source reads and output. Failed, partial or spending-limited runs do not advance comparison history."
    }
  }
}
