{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/granite-md/json-schema/granite-md-webhook-update-schema.json",
  "title": "WebhookUpdate",
  "x-generated": "2026-11-10",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/granite-md-openapi.yaml#/components/schemas/WebhookUpdate",
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2000
    },
    "bot_token": {
      "type": "string",
      "maxLength": 100
    },
    "chat_id": {
      "type": "string",
      "maxLength": 40
    },
    "actions": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/IntegrationAction"
      }
    },
    "folder": {
      "type": "string",
      "maxLength": 200
    },
    "signing_secret": {
      "type": "string",
      "maxLength": 200,
      "description": "`slack`: the app's signing secret (Basic Information); notetakers: the webhook's signing secret."
    },
    "public_key": {
      "type": "string",
      "maxLength": 200,
      "description": "`discord`: the application's public key (hex)."
    },
    "application_id": {
      "type": "string",
      "maxLength": 40,
      "description": "`discord`: the application ID; with `bot_token`, Granite registers the slash commands."
    },
    "inbound_token": {
      "type": "string",
      "maxLength": 200,
      "description": "`teams`: the outgoing webhook's security token; `mattermost`, `rocket_chat`, `zulip`: the webhook's token; `fireflies`, `granola`, `meetgeek`: the API key meetings are fetched with."
    },
    "rotate_action_key": {
      "type": "boolean"
    },
    "description": {
      "type": "string",
      "maxLength": 200
    },
    "events": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/WebhookEventType"
      }
    },
    "active": {
      "type": "boolean"
    },
    "rotate_secret": {
      "type": "boolean"
    }
  },
  "$defs": {
    "IntegrationAction": {
      "type": "string",
      "description": "What an integration may do: `capture` (plain messages to the inbox note), `create`,\n`append`, `daily` (today's daily note), `search`, `list` (a folder), `read`, `update`\n(replace the text), `move` and `delete` (a note or a whole folder), and `meeting`\n(notetakers only: save each finished meeting as a note).\n",
      "enum": [
        "capture",
        "create",
        "append",
        "daily",
        "search",
        "list",
        "read",
        "update",
        "move",
        "delete",
        "meeting"
      ]
    },
    "WebhookEventType": {
      "type": "string",
      "enum": [
        "*",
        "note.*",
        "member.*",
        "note.created",
        "note.updated",
        "note.moved",
        "note.deleted",
        "vault.shared",
        "member.added",
        "member.removed",
        "member.role_changed"
      ]
    }
  }
}