{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://venuemind.dev/schemas/calendar-webhook-event.schema.json",
  "title": "VenueMind Calendar Webhook Event",
  "type": "object",
  "required": [
    "sourceSystem",
    "id",
    "type",
    "occurredAt",
    "event"
  ],
  "properties": {
    "sourceSystem": {
      "type": "string",
      "minLength": 1
    },
    "id": {
      "type": "string",
      "minLength": 1
    },
    "type": {
      "enum": [
        "event.created",
        "event.updated",
        "event.cancelled",
        "event.deleted"
      ]
    },
    "occurredAt": {
      "type": "string",
      "format": "date-time",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"
    },
    "event": {
      "type": "object",
      "required": [
        "externalId",
        "sourceVersion",
        "title",
        "startAt",
        "endAt",
        "timezone",
        "location",
        "attendanceTarget",
        "organizer"
      ],
      "properties": {
        "externalId": {
          "type": "string",
          "minLength": 1
        },
        "sourceVersion": {
          "type": "string",
          "minLength": 1
        },
        "title": {
          "type": "string",
          "minLength": 1
        },
        "startAt": {
          "type": "string",
          "format": "date-time",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?(?:Z|(?!-00:00)[+-]\\d{2}:\\d{2})$"
        },
        "endAt": {
          "type": "string",
          "format": "date-time",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?(?:Z|(?!-00:00)[+-]\\d{2}:\\d{2})$"
        },
        "timezone": {
          "type": "string",
          "minLength": 1
        },
        "location": {
          "type": "object",
          "required": [
            "label"
          ],
          "properties": {
            "label": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        "attendanceTarget": {
          "type": "integer",
          "minimum": 0
        },
        "organizer": {
          "type": "object",
          "required": [
            "displayName",
            "organization",
            "role"
          ],
          "properties": {
            "displayName": {
              "type": "string",
              "minLength": 1,
              "pattern": "^(?![\\s\\S]*(?:[@＠]|(?:^|[\\s(])(?:[Hh][Tt][Tt][Pp][Ss]?|[Mm][Aa][Ii][Ll][Tt][Oo]|[Tt][Ee][Ll]|[Ss][Mm][Ss])\\s*:|(?:^|[\\s(])[Ww][Ww][Ww][.\\uFF0E\\uFF61\\u2024]|(?:[A-Za-z0-9-]+[.\\uFF0E\\uFF61\\u2024])+(?:[Cc][Oo][Mm]|[Oo][Rr][Gg]|[Nn][Ee][Tt]|[Ii][Oo]|[Cc][Oo]|[Dd][Ee][Vv]|[Aa][Pp][Pp]|[Aa][Ii]|[Mm][Ee]|[Ii][Nn][Ff][Oo]|[Bb][Ii][Zz]|[Ee][Dd][Uu]|[Gg][Oo][Vv])(?:[\\s/:?#]|$)|\\+[\\s(]*[0-9][0-9\\s()./\\-\\u00A0\\u200B-\\u200D\\u2010-\\u2015\\u2060\\u2212\\uFEFF]{5,}[0-9]|(?:^|[\\s(])(?:(?:\\([0-9]{2,4}\\)|[0-9]{2,3})[\\s./\\-\\u00A0\\u200B-\\u200D\\u2010-\\u2015\\u2060\\u2212\\uFEFF]){2,}[0-9]{3,4}(?:$|[\\s)])|(?:^|[\\s(])[0-9]{10,}(?:$|[\\s)])|(?:^|[\\s(])(?:[Dd][Ii][Ss][Cc][Oo][Rr][Dd]|[Tt][Ee][Ll][Ee][Gg][Rr][Aa][Mm]|[Ww][Hh][Aa][Tt][Ss][Aa][Pp][Pp]|[Ww][Ee][Cc][Hh][Aa][Tt]|[Ss][Ll][Aa][Cc][Kk])(?:\\s*:\\s*[A-Za-z0-9_.-]+|\\s+(?:[A-Za-z][0-9][A-Za-z0-9_-]*|[A-Za-z0-9_]+[-_.][A-Za-z0-9_.-]+))))[\\s\\S]+$"
            },
            "organization": {
              "type": "string",
              "minLength": 1,
              "pattern": "^(?![\\s\\S]*(?:[@＠]|(?:^|[\\s(])(?:[Hh][Tt][Tt][Pp][Ss]?|[Mm][Aa][Ii][Ll][Tt][Oo]|[Tt][Ee][Ll]|[Ss][Mm][Ss])\\s*:|(?:^|[\\s(])[Ww][Ww][Ww][.\\uFF0E\\uFF61\\u2024]|(?:[A-Za-z0-9-]+[.\\uFF0E\\uFF61\\u2024])+(?:[Cc][Oo][Mm]|[Oo][Rr][Gg]|[Nn][Ee][Tt]|[Ii][Oo]|[Cc][Oo]|[Dd][Ee][Vv]|[Aa][Pp][Pp]|[Aa][Ii]|[Mm][Ee]|[Ii][Nn][Ff][Oo]|[Bb][Ii][Zz]|[Ee][Dd][Uu]|[Gg][Oo][Vv])(?:[\\s/:?#]|$)|\\+[\\s(]*[0-9][0-9\\s()./\\-\\u00A0\\u200B-\\u200D\\u2010-\\u2015\\u2060\\u2212\\uFEFF]{5,}[0-9]|(?:^|[\\s(])(?:(?:\\([0-9]{2,4}\\)|[0-9]{2,3})[\\s./\\-\\u00A0\\u200B-\\u200D\\u2010-\\u2015\\u2060\\u2212\\uFEFF]){2,}[0-9]{3,4}(?:$|[\\s)])|(?:^|[\\s(])[0-9]{10,}(?:$|[\\s)])|(?:^|[\\s(])(?:[Dd][Ii][Ss][Cc][Oo][Rr][Dd]|[Tt][Ee][Ll][Ee][Gg][Rr][Aa][Mm]|[Ww][Hh][Aa][Tt][Ss][Aa][Pp][Pp]|[Ww][Ee][Cc][Hh][Aa][Tt]|[Ss][Ll][Aa][Cc][Kk])(?:\\s*:\\s*[A-Za-z0-9_.-]+|\\s+(?:[A-Za-z][0-9][A-Za-z0-9_-]*|[A-Za-z0-9_]+[-_.][A-Za-z0-9_.-]+))))[\\s\\S]+$"
            },
            "role": {
              "type": "string",
              "minLength": 1,
              "pattern": "^(?![\\s\\S]*(?:[@＠]|(?:^|[\\s(])(?:[Hh][Tt][Tt][Pp][Ss]?|[Mm][Aa][Ii][Ll][Tt][Oo]|[Tt][Ee][Ll]|[Ss][Mm][Ss])\\s*:|(?:^|[\\s(])[Ww][Ww][Ww][.\\uFF0E\\uFF61\\u2024]|(?:[A-Za-z0-9-]+[.\\uFF0E\\uFF61\\u2024])+(?:[Cc][Oo][Mm]|[Oo][Rr][Gg]|[Nn][Ee][Tt]|[Ii][Oo]|[Cc][Oo]|[Dd][Ee][Vv]|[Aa][Pp][Pp]|[Aa][Ii]|[Mm][Ee]|[Ii][Nn][Ff][Oo]|[Bb][Ii][Zz]|[Ee][Dd][Uu]|[Gg][Oo][Vv])(?:[\\s/:?#]|$)|\\+[\\s(]*[0-9][0-9\\s()./\\-\\u00A0\\u200B-\\u200D\\u2010-\\u2015\\u2060\\u2212\\uFEFF]{5,}[0-9]|(?:^|[\\s(])(?:(?:\\([0-9]{2,4}\\)|[0-9]{2,3})[\\s./\\-\\u00A0\\u200B-\\u200D\\u2010-\\u2015\\u2060\\u2212\\uFEFF]){2,}[0-9]{3,4}(?:$|[\\s)])|(?:^|[\\s(])[0-9]{10,}(?:$|[\\s)])|(?:^|[\\s(])(?:[Dd][Ii][Ss][Cc][Oo][Rr][Dd]|[Tt][Ee][Ll][Ee][Gg][Rr][Aa][Mm]|[Ww][Hh][Aa][Tt][Ss][Aa][Pp][Pp]|[Ww][Ee][Cc][Hh][Aa][Tt]|[Ss][Ll][Aa][Cc][Kk])(?:\\s*:\\s*[A-Za-z0-9_.-]+|\\s+(?:[A-Za-z][0-9][A-Za-z0-9_-]*|[A-Za-z0-9_]+[-_.][A-Za-z0-9_.-]+))))[\\s\\S]+$"
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    }
  },
  "additionalProperties": false
}
