{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "additionalProperties": false,
  "description": "A manifest file for a Slack app, as described on this page: https://api.slack.com/reference/manifests",
  "id": "https://json.schemastore.org/slack-app-manifest.json",
  "properties": {
    "_metadata": {
      "description": "Settings that describe the manifest.\nhttps://api.slack.com/reference/manifests#metadata",
      "type": "object",
      "properties": {
        "major_version": {
          "description": "An integer that specifies the major version of the manifest schema to target.",
          "type": "integer"
        },
        "minor_version": {
          "description": "An integer that specifies the minor version of the manifest schema to target.",
          "type": "integer"
        }
      },
      "additionalProperties": false
    },
    "display_information": {
      "description": "Settings that describe parts of an app's appearance within Slack. If you're distributing the app via the App Directory, read our listing guidelines to pick the best values for these settings.\nhttps://api.slack.com/reference/manifests#display",
      "type": "object",
      "properties": {
        "name": {
          "description": "The name of the app.",
          "type": "string",
          "maxLength": 35
        },
        "description": {
          "description": "A short description of the app for display to users.",
          "type": "string",
          "maxLength": 140
        },
        "long_description": {
          "description": "A longer version of the description of the app.",
          "type": "string",
          "maxLength": 4000
        },
        "background_color": {
          "description": "A hex color value that specifies the background color used on hovercards that display information about your app. Can be 3-digit (#000) or 6-digit (#000000) hex values. Once an app has set a background color value, it cannot be removed, only updated.",
          "type": "string",
          "pattern": "^#(?:[\\da-fA-F]{3}){1,2}$"
        }
      },
      "required": ["name"],
      "additionalProperties": false
    },
    "settings": {
      "description": "Settings section of the app config pages.\nhttps://api.slack.com/reference/manifests#settings",
      "type": "object",
      "properties": {
        "allowed_ip_address_ranges": {
          "description": "IP addresses that conform to the Allowed IP Ranges feature",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "event_subscriptions": {
          "description": "Events API configuration for the app.",
          "type": "object",
          "properties": {
            "request_url": {
              "description": "The full https URL that acts as the Events API request URL. If set, you'll need to manually verify the Request URL in the App Manifest section of App Management.",
              "type": "string"
            },
            "bot_events": {
              "description": "The event types you want to the app to subscribe to.",
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 100
            },
            "user_events": {
              "description": "The event types you want to the app to subscribe to on behalf of authorized users.",
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 100
            }
          },
          "additionalProperties": false
        },
        "interactivity": {
          "description": "Interactivity configuration for the app.",
          "type": "object",
          "properties": {
            "is_enabled": {
              "description": "Whether or not interactivity features are enabled.",
              "type": "boolean"
            },
            "request_url": {
              "description": "The full https URL that acts as the interactive Request URL.",
              "type": "string"
            },
            "message_menu_options_url": {
              "description": "The full https URL that acts as the interactive Options Load URL.",
              "type": "string"
            }
          },
          "required": ["is_enabled"],
          "additionalProperties": false
        },
        "org_deploy_enabled": {
          "description": "Whether or not org-wide deploy is enabled.",
          "type": "boolean"
        },
        "socket_mode_enabled": {
          "description": "Whether or not Socket Mode is enabled.",
          "type": "boolean"
        },
        "token_rotation_enabled": {
          "description": "Whether or not token rotation is enabled for access tokens.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "features": {
      "description": "Features section of the app config pages.\nhttps://api.slack.com/reference/manifests#features",
      "type": "object",
      "properties": {
        "app_home": {
          "description": "App Home configuration.",
          "type": "object",
          "properties": {
            "home_tab_enabled": {
              "description": "Whether or not the Home tab is enabled.",
              "type": "boolean"
            },
            "messages_tab_enabled": {
              "description": "Whether or not the Messages tab in your App Home is enabled.",
              "type": "boolean"
            },
            "messages_tab_read_only_enabled": {
              "description": "Whether or not the users can send messages to your app in the Messages tab of your App Home.",
              "type": "boolean"
            }
          },
          "additionalProperties": false
        },
        "bot_user": {
          "description": "Bot user configuration.",
          "type": "object",
          "properties": {
            "display_name": {
              "description": "The display name of the bot user. Allowed characters: a-z, 0-9, -, _, and .",
              "type": "string",
              "maxLength": 80,
              "pattern": "^[\\w\\-.]+$"
            },
            "always_online": {
              "description": "Whether or not the bot user will always appear to be online.",
              "type": "boolean"
            }
          },
          "required": ["display_name"],
          "additionalProperties": false
        },
        "shortcuts": {
          "description": "Shortcuts configuration.",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "description": "The name of the shortcut.",
                "type": "string"
              },
              "callback_id": {
                "description": "The callback_id of this shortcut.",
                "type": "string",
                "maxLength": 255
              },
              "description": {
                "description": "A short description of this shortcut.",
                "type": "string",
                "maxLength": 150
              },
              "type": {
                "description": "Specifies which type of shortcut is being described.",
                "type": "string",
                "enum": ["message", "global"]
              }
            },
            "required": ["name", "callback_id", "description", "type"],
            "additionalProperties": false
          }
        },
        "slash_commands": {
          "description": "Slash commands configuration.",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "command": {
                "description": "The actual slash command. Should include the leading / character",
                "type": "string",
                "maxLength": 32,
                "pattern": "^/.*$"
              },
              "description": {
                "description": "A description of the slash command that will be displayed to users.",
                "type": "string",
                "maxLength": 2000
              },
              "should_escape": {
                "description": "Whether or not channels, users, and links typed with the slash command should be escaped.",
                "type": "boolean"
              },
              "url": {
                "description": "The full https URL that acts as the slash command's request URL.",
                "type": "string"
              },
              "usage_hint": {
                "description": "A short usage hint about the slash command for users.",
                "type": "string",
                "maxLength": 1000
              }
            },
            "required": ["command", "description"],
            "additionalProperties": false
          }
        },
        "unfurl_domains": {
          "description": "Valid unfurl domains to register. Please consult the unfurl docs for a list of domain requirements.",
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 5
        },
        "workflow_steps": {
          "description": "Workflow steps configuration.",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "description": "The name of the workflow step.",
                "type": "string",
                "maxLength": 50
              },
              "callback_id": {
                "description": "The callback_id of the workflow step.",
                "type": "string",
                "maxLength": 50
              }
            },
            "required": ["name", "callback_id"],
            "additionalProperties": false
          },
          "maxItems": 10
        }
      },
      "additionalProperties": false
    },
    "oauth_config": {
      "description": "OAuth configuration for the app.\nhttps://api.slack.com/reference/manifests#oauth",
      "type": "object",
      "properties": {
        "redirect_urls": {
          "description": "OAuth redirect URLs.",
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 1000
        },
        "scopes": {
          "description": "Permission scopes configuration.",
          "type": "object",
          "properties": {
            "bot": {
              "description": "Bot scopes to request upon app installation.",
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 255
            },
            "user": {
              "description": "User scopes to request upon app installation.",
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 255
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    }
  },
  "required": ["display_information"],
  "title": "Slack app manifest",
  "type": "object"
}