asyncapi: '1.2.0'
info:
  title: Slack Real Time Messaging API
  version: '1.0.0'

servers:
  - url: https://slack.com/api/rtm.connect
    scheme: https
    schemeVersion: '1.1'

security:
  - token: []

events:
  receive:
    - $ref: '#/components/messages/hello'
    - $ref: '#/components/messages/connectionError'
    - $ref: '#/components/messages/accountsChanged'
    - $ref: '#/components/messages/botAdded'
    - $ref: '#/components/messages/botChanged'
    - $ref: '#/components/messages/channelArchive'
    - $ref: '#/components/messages/channelCreated'
    - $ref: '#/components/messages/channelDeleted'
    - $ref: '#/components/messages/channelHistoryChanged'
    - $ref: '#/components/messages/channelJoined'
    - $ref: '#/components/messages/channelLeft'
    - $ref: '#/components/messages/channelMarked'
    - $ref: '#/components/messages/channelRename'
    - $ref: '#/components/messages/channelUnarchive'
    - $ref: '#/components/messages/commandsChanged'
    - $ref: '#/components/messages/dndUpdated'
    - $ref: '#/components/messages/dndUpdatedUser'
    - $ref: '#/components/messages/emailDomainChanged'
    - $ref: '#/components/messages/emojiRemoved'
    - $ref: '#/components/messages/emojiAdded'
    - $ref: '#/components/messages/fileChange'
    - $ref: '#/components/messages/fileCommentAdded'
    - $ref: '#/components/messages/fileCommentDeleted'
    - $ref: '#/components/messages/fileCommentEdited'
    - $ref: '#/components/messages/fileCreated'
    - $ref: '#/components/messages/fileDeleted'
    - $ref: '#/components/messages/filePublic'
    - $ref: '#/components/messages/fileShared'
    - $ref: '#/components/messages/fileUnshared'
    - $ref: '#/components/messages/goodbye'
    - $ref: '#/components/messages/groupArchive'
    - $ref: '#/components/messages/groupClose'
    - $ref: '#/components/messages/groupHistoryChanged'
    - $ref: '#/components/messages/groupJoined'
    - $ref: '#/components/messages/groupLeft'
    - $ref: '#/components/messages/groupMarked'
    - $ref: '#/components/messages/groupOpen'
    - $ref: '#/components/messages/groupRename'
    - $ref: '#/components/messages/groupUnarchive'
    - $ref: '#/components/messages/imClose'
    - $ref: '#/components/messages/imCreated'
    - $ref: '#/components/messages/imMarked'
    - $ref: '#/components/messages/imOpen'
    - $ref: '#/components/messages/manualPresenceChange'
    - $ref: '#/components/messages/memberJoinedChannel'
    - $ref: '#/components/messages/message'
  send:
    - $ref: '#/components/messages/outgoingMessage'

components:
  securitySchemes:
    token:
      type: httpApiKey
      name: token
      in: query

  schemas:
    attachment:
      type: object
      properties:
        fallback:
          type: string
        color:
          type: string
        pretext:
          type: string
        author_name:
          type: string
        author_link:
          type: string
          format: uri
        author_icon:
          type: string
          format: uri
        title:
          type: string
        title_link:
          type: string
          format: uri
        text:
          type: string
        fields:
          type: array
          items:
            type: object
            properties:
              title:
                type: string
              value:
                type: string
              short:
                type: boolean
        image_url:
          type: string
          format: uri
        thumb_url:
          type: string
          format: uri
        footer:
          type: string
        footer_icon:
          type: string
          format: uri
        ts:
          type: number

  messages:
    hello:
      summary: First event received upon connection.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['hello']

    connectionError:
      summary: Event received when a connection error happens.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['error']
          error:
            type: object
            properties:
              code:
                type: number
              msg:
                type: string

    accountsChanged:
      summary: The list of accounts a user is signed into has changed.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['accounts_changed']

    botAdded:
      summary: A bot user was added.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['bot_added']
          bot:
            type: object
            properties:
              id:
                type: string
              app_id:
                type: string
              name:
                type: string
              icons:
                type: object
                additionalProperties:
                  type: string

    botChanged:
      summary: A bot user was changed.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['bot_added']
          bot:
            type: object
            properties:
              id:
                type: string
              app_id:
                type: string
              name:
                type: string
              icons:
                type: object
                additionalProperties:
                  type: string

    channelArchive:
      summary: A channel was archived.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['channel_archive']
          channel:
            type: string
          user:
            type: string

    channelCreated:
      summary: A channel was created.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['channel_created']
          channel:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              created:
                type: number
              creator:
                type: string

    channelDeleted:
      summary: A channel was deleted.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['channel_deleted']
          channel:
            type: string

    channelHistoryChanged:
      summary: Bulk updates were made to a channel's history.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['channel_history_changed']
          latest:
            type: string
          ts:
            type: string
          event_ts:
            type: string

    channelJoined:
      summary: You joined a channel.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['channel_joined']
          channel:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              created:
                type: number
              creator:
                type: string

    channelLeft:
      summary: You left a channel.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['channel_left']
          channel:
            type: string

    channelMarked:
      summary: Your channel read marker was updated.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['channel_marked']
          channel:
            type: string
          ts:
            type: string

    channelRename:
      summary: A channel was renamed.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['channel_rename']
          channel:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              created:
                type: number

    channelUnarchive:
      summary: A channel was unarchived.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['channel_unarchive']
          channel:
            type: string
          user:
            type: string

    commandsChanged:
      summary: A slash command has been added or changed.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['commands_changed']
          event_ts:
            type: string

    dndUpdated:
      summary: Do not Disturb settings changed for the current user.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['dnd_updated']
          user:
            type: string
          dnd_status:
            type: object
            properties:
              dnd_enabled:
                type: boolean
              next_dnd_start_ts:
                type: number
              next_dnd_end_ts:
                type: number
              snooze_enabled:
                type: boolean
              snooze_endtime:
                type: number

    dndUpdatedUser:
      summary: Do not Disturb settings changed for a member.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['dnd_updated_user']
          user:
            type: string
          dnd_status:
            type: object
            properties:
              dnd_enabled:
                type: boolean
              next_dnd_start_ts:
                type: number
              next_dnd_end_ts:
                type: number

    emailDomainChanged:
      summary: The workspace email domain has changed.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['email_domain_changed']
          email_domain:
            type: string
          event_ts:
            type: string

    emojiRemoved:
      summary: A custom emoji has been removed.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['emoji_changed']
          subtype:
            type: string
            enum: ['remove']
          names:
            type: array
            items:
              type: string
          event_ts:
            type: string

    emojiAdded:
      summary: A custom emoji has been added.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['emoji_changed']
          subtype:
            type: string
            enum: ['add']
          name:
            type: string
          value:
            type: string
            format: uri
          event_ts:
            type: string

    fileChange:
      summary: A file was changed.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['file_change']
          file_id:
            type: string
          file:
            type: object
            properties:
              id:
                type: string

    fileCommentAdded:
      summary: A file comment was added.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['file_comment_added']
          comment: {}
          file_id:
            type: string
          file:
            type: object
            properties:
              id:
                type: string

    fileCommentDeleted:
      summary: A file comment was deleted.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['file_comment_deleted']
          comment:
            type: string
          file_id:
            type: string
          file:
            type: object
            properties:
              id:
                type: string

    fileCommentEdited:
      summary: A file comment was edited.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['file_comment_edited']
          comment: {}
          file_id:
            type: string
          file:
            type: object
            properties:
              id:
                type: string

    fileCreated:
      summary: A file was created.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['file_created']
          file_id:
            type: string
          file:
            type: object
            properties:
              id:
                type: string

    fileDeleted:
      summary: A file was deleted.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['file_deleted']
          file_id:
            type: string
          event_ts:
            type: string

    filePublic:
      summary: A file was made public.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['file_public']
          file_id:
            type: string
          file:
            type: object
            properties:
              id:
                type: string

    fileShared:
      summary: A file was shared.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['file_shared']
          file_id:
            type: string
          file:
            type: object
            properties:
              id:
                type: string

    fileUnshared:
      summary: A file was unshared.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['file_unshared']
          file_id:
            type: string
          file:
            type: object
            properties:
              id:
                type: string

    goodbye:
      summary: The server intends to close the connection soon.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['goodbye']

    groupArchive:
      summary: A private channel was archived.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['group_archive']
          channel:
            type: string

    groupClose:
      summary: You closed a private channel.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['group_close']
          user:
            type: string
          channel:
            type: string

    groupHistoryChanged:
      summary: Bulk updates were made to a private channel's history.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['group_history_changed']
          latest:
            type: string
          ts:
            type: string
          event_ts:
            type: string

    groupJoined:
      summary: You joined a private channel.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['group_joined']
          channel:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              created:
                type: number
              creator:
                type: string

    groupLeft:
      summary: You left a private channel.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['group_left']
          channel:
            type: string

    groupMarked:
      summary: A private channel read marker was updated.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['group_marked']
          channel:
            type: string
          ts:
            type: string

    groupOpen:
      summary: You opened a private channel.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['group_open']
          user:
            type: string
          channel:
            type: string

    groupRename:
      summary: A private channel was renamed.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['group_rename']
          channel:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              created:
                type: number

    groupUnarchive:
      summary: A private channel was unarchived.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['group_unarchive']
          channel:
            type: string
          user:
            type: string

    imClose:
      summary: You closed a DM.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['im_close']
          channel:
            type: string
          user:
            type: string

    imCreated:
      summary: A DM was created.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['im_created']
          channel:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              created:
                type: number
              creator:
                type: string
          user:
            type: string

    imMarked:
      summary: A direct message read marker was updated.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['im_marked']
          channel:
            type: string
          ts:
            type: string

    imOpen:
      summary: You opened a DM.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['im_open']
          channel:
            type: string
          user:
            type: string

    manualPresenceChange:
      summary: You manually updated your presence.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['manual_presence_change']
          presence:
            type: string

    memberJoinedChannel:
      summary: A user joined a public or private channel.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['member_joined_channel']
          user:
            type: string
          channel:
            type: string
          channel_type:
            type: string
            enum:
              - C
              - G
          team:
            type: string
          inviter:
            type: string

    memberLeftChannel:
      summary: A user left a public or private channel.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['member_left_channel']
          user:
            type: string
          channel:
            type: string
          channel_type:
            type: string
            enum:
              - C
              - G
          team:
            type: string

    message:
      summary: A message was sent to a channel.
      payload:
        type: object
        properties:
          type:
            type: string
            enum: ['message']
          user:
            type: string
          channel:
            type: string
          text:
            type: string
          ts:
            type: string
          attachments:
            type: array
            items:
              $ref: '#/components/schemas/attachment'
          edited:
            type: object
            properties:
              user:
                type: string
              ts:
                type: string

    outgoingMessage:
      summary: A message was sent to a channel.
      payload:
        type: object
        properties:
          id:
            type: number
          type:
            type: string
            enum: ['message']
          channel:
            type: string
          text:
            type: string
