asyncapi: '2.4.0'
id: 'urn:com:slack:rtm:api'
info:
  title: Slack Real Time Messaging API
  version: '1.0.0'

servers:
  production:
    url: https://slack.com/api/rtm.connect
    protocol: https
    protocolVersion: '1.1'
    security:
      - token: []

channels:
  /:
    publish:
      message:
        $ref: '#/components/messages/outgoingMessage'
    subscribe:
      message:
        oneOf:
          - $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'

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:
      name: hello
      summary: 'First event received upon connection.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - hello
    connectionError:
      name: 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:
      name: accountsChanged
      summary: 'The list of accounts a user is signed into has changed.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - accounts_changed
    botAdded:
      name: 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:
      messageId: 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:
      name: channelArchive
      summary: 'A channel was archived.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - channel_archive
          channel:
            type: string
          user:
            type: string
    channelCreated:
      name: channelArchive
      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:
      messageId: channelDeleted
      summary: 'A channel was deleted.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - channel_deleted
          channel:
            type: string
    channelHistoryChanged:
      name: 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:
      name: 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:
      name: channelLeft
      summary: 'You left a channel.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - channel_left
          channel:
            type: string
    channelMarked:
      name: 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:
      name: 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:
      name: channelUnarchive
      summary: 'A channel was unarchived.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - channel_unarchive
          channel:
            type: string
          user:
            type: string
    commandsChanged:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: 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:
      name: goodbye
      summary: 'The server intends to close the connection soon.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - goodbye
    groupArchive:
      name: groupArchive
      summary: 'A private channel was archived.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - group_archive
          channel:
            type: string
    groupClose:
      name: groupClose
      summary: 'You closed a private channel.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - group_close
          user:
            type: string
          channel:
            type: string
    groupHistoryChanged:
      name: 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:
      name: 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:
      name: groupLeft
      summary: 'You left a private channel.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - group_left
          channel:
            type: string
    groupMarked:
      name: 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:
      name: groupOpen
      summary: 'You opened a private channel.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - group_open
          user:
            type: string
          channel:
            type: string
    groupRename:
      name: 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:
      name: groupUnarchive
      summary: 'A private channel was unarchived.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - group_unarchive
          channel:
            type: string
          user:
            type: string
    imClose:
      name: imClose
      summary: 'You closed a DM.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - im_close
          channel:
            type: string
          user:
            type: string
    imCreated:
      name: 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:
      name: 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:
      name: imOpen
      summary: 'You opened a DM.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - im_open
          channel:
            type: string
          user:
            type: string
    manualPresenceChange:
      name: manualPresenceChange
      summary: 'You manually updated your presence.'
      payload:
        type: object
        properties:
          type:
            type: string
            enum:
              - manual_presence_change
          presence:
            type: string
    memberJoinedChannel:
      name: 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:
      name: 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:
      messageId: 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:
      name: 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
