openapi: 3.0.0
info:
  description: |
    DataBag provides storage for decentralized identity based self-hosting apps.
    It is intended to support sharing of personal data and hosting group
    conversations.
  version: "0.0.1"
  title: DataBag
  license:
    name: Apache 2.0
    url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
tags:
  - name: status
    description: websocket endpoint for receiving module revision events
  - name: admin
    description: account creation for portal backend.
  - name: account
    description: account configuration for portal backend. supports app attachment
  - name: authorize
    description: authorize holder of identity for external service
  - name: profile
    description: getting and setting of the public profile
  - name: alias
    description: group management for contenting attributes
  - name: contact
    description: card management for referencing contacts
  - name: attribute
    description: article management associated with profile
  - name: share
    description: channel and topic management
    
paths:

  /status:
    get:
      tags:
        - status
      description: Websocket placeholder endpoint for receiving account status updates
      operationId: status
      responses:
        '200':
          description: Awaiting announce
              
  /admin/status:
    get:
      tags:
        - admin
      description: Check if portal params have been set
      operationId: get-node-status
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: boolean
        '500':
          description: internal server error
    put:
      tags:
        - admin
      description: Set admin password and node domain
      operationId: set-node-status
      security:
        - basicCredentials: []
      parameters:
        - name: domain
          in: query
          description: domain of node
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: permission denied
        '500':
          description: internal server error
          
  /admin/config:
    get:
      tags:
        - admin
      description: Get node configuration. Access granted to admin username and password.
      operationId: get-node-config
      parameters:
        - name: token
          in: query
          description: token for admin access
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NodeConfig'
        '401':
          description: permission denied
        '500':
          description: internal server error
    put:
      tags:
        - admin
      description: Set node config. Access granted to admin username and password.
      operationId: set-node-config
      parameters:
        - name: token
          in: query
          description: token for admin access
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: permission denide
        '500':
          description: internal server error
              
  /admin/accounts:
    get:
      tags:
        - admin
      description: Get list of accounts hosted on node. Access granted to admin username and password. 
      operationId: get-node-accounts
      parameters:
        - name: token
          in: query
          description: token for admin access
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AccountProfile'
        '401':
          description: invalid password
        '404':
          description: handle not found
        '500':
          description: internal server error
    post:
      tags:
        - admin
      description: Gernerate a url for creating a new account. Access granted to admin username and password.
      operationId: add-node-account
      parameters:
        - name: token
          in: query
          description: token for admin access
          required: true
          schema:
            type: string
      responses:
        '201':
          description: success
          content:
            application/json:
              schema:
                type: string
        '401':
          description: invalid password
        '500':
          description: internal server error
          
  /admin/accounts/{accountId}/image:
    get:
      tags:
        - admin
      description: Get profile image of node account.
      operationId: get-node-account-image
      parameters:
        - name: accountId
          in: path
          description: id of account to delete
          required: true
          schema:
            type: string
        - name: token
          in: query
          description: token for admin access
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/octet-stream: # content specific
              schema:
                type: string
                format: binary
        '401':
          description: invalid authentication
        '404':
          description: account not found
        '500':
          description: internal server error
         
  /admin/accounts/{accountId}:
    delete:
      tags:
        - admin
      description: Remove account from node. Access granted to admin token
      operationId: remove-node-account
      parameters:
        - name: accountId
          in: path
          description: id of account to delete
          required: true
          schema:
            type: string
        - name: token
          in: query
          description: token for admin access
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
        '401':
          description: invalid authentication
        '404':
          description: account not found
        '500':
          description: internal server error
    
  /admin/accounts/{accountId}/auth:
    post:
      tags:
        - account
      description: Generate token to reset authentication.
      operationId: add-account-authentication
      parameters:
        - name: token
          in: query
          description: token for admin access
          required: true
          schema:
            type: string
      responses:
        '201':
          description: generated
          content:
            application/json:
              schema:
                type: string
        '401':
          description: invalid password
        '500':
          description: internal server error

  /admin/accounts/{accountId}/status: 
     put:
      tags:
        - admin
      description: Disable account. Access granted to admin token
      operationId: set-node-account
      parameters:
        - name: accountId
          in: path
          description: id of account to delete
          required: true
          schema:
            type: string
        - name: token
          in: query
          description: token for admin access
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: boolean
        '401':
          description: invalid authentication
        '404':
          description: account not found
        '500':
          description: internal server error
          
  /admin/accounts/import:
    post:
      tags:
        - admin
      description: Import an account account from a backup archive. Access granted to the admin username and password.
      operationId: import account
      security:
        - basicAuth: []
      responses:
        '201':
          description: success
        '401':
          description: permission denied
        '406':
          description: account already imported
        '500':
          description: internal server error
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                fileName:
                  type: string
                  format: binary

  /account/available:
    get:
      tags:
        - account
      description: Check if any public accounts are available
      operationId: get-account-available
      responses:
        '200':
          description: available public accounts
          content:
            application/json:
              schema:
                type: integer
                format: uint32
        '500':
          description: internal server error
          
  /account/username:
    get:
      tags:
        - account
      description: Check if username is available. Access granted account reset token or account create token.
      operationId: get-account-username
      security:
        - bearerAuth: []
      parameters:
        - name: name
          in: query
          description: username to check 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: boolean
        '401':
          description: permission denied
        '500':
          description: internal server error
          
  /account/listing:
    get:
      tags:
        - account
      description: Get profile of searchable accounts. Endpoint is publically accessible.
      operationId: get-account-listing
      parameters:
        - name: guid
          in: query
          description: filter for specified guid 
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Profile'
        '401':
          description: permission denied
        '500':
          description: internal server error
          
  /account/listing/{guid}/image:
    get:
      tags:
        - account
      description: Get profile image of searchable accounts. Endpoint is publically accessible.
      operationId: get-account-listing-image
      parameters:
        - name: guid
          in: path
          description: filter for specified guid 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/octet-stream: # content specific
              schema:
                type: string
                format: binary
        '401':
          description: permission denied
        '500':
          description: internal server error
           
  /account/listing/{guid}/message:
    get:
      tags:
        - account
      description: Get profile message of searchable account. Endpoint is publically accessible.
      operationId: get-account-listing-message
      parameters:
        - name: guid
          in: path
          description: filter for specified guid 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataMessage'
        '401':
          description: permission denied
        '500':
          description: internal server error
          

  /account/token:
    get:
      tags:
        - account
      description: Check if account reset token or account create token is valid. Access granted to valid create or reset token.
      operationId: get-account-token
      security:
        - bearerAuth: []
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: string
        '401':
          description: permission denied
        '500':
          description: internal server error
          
  /account/status:
    get:
      tags:
        - account
      description: Get disabled status of account. Authorized to account username and password.
      operationId: get-account-status
      parameters:
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccountStatus'
        '401':
          description: authentication error
        '500':
          description: internal server error
          
  /account/searchable:
    put:
      tags:
        - account
      description: Set whether account is publicly listed.
      operationId: set-account-seachable
      parameters:
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '201':
          description: success
        '401':
          description: permission denied
        '405':
          description: failed to confirm
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: boolean
   
  /account/login:
    put:
      tags:
        - account
      description: Reset account login credentials
      operationId: set-account-login
      security:
        - basicAuth: []
      responses:
        '201':
          description: success
          content:
            application/json:
              schema:
                type: string
        '401':
          description: invalid password
        '404':
          description: unknown portal
        '500':
          description: internal server error
                      
  /account/profile:
    post:
      tags:
        - account
      description: Add a new account. Basic auth will be used for the accounts username and password. Access granted to valid create account token.
      operationId: add-account
      security:
        - bearerAuth: []
        - basicCredentials: []
      responses:
        '201':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Profile'
        '400':
          description: invalid handle or password
        '401':
          description: permission denied
        '500':
          description: internal server error
    delete:
      tags:
        - account
      description: Delete account. Access granted to valid create account token.
      operationId: remove-account
      security:
        - basicAuth: []
      responses:
        '201':
          description: successful operation
        '401':
          description: permission denied
        '500':
          description: internal server error
                
  /account/assets/{assetId}:
    get:
      tags:
        - account
      description: Get asset assigned to an account. The endpoint supports byte-range requests and responds with the content-type set appropriatly. Access granted to the app tokens of the account holder and in the case of non-original assets, the contact token for accounts with which the article is shared.
      operationId: get-account-asset
      security:
        - basicAuth: []
      parameters:
        - name: assetId
          in: path
          description: specified asset id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/octet-stream: #asset specific
              schema:
                type: string
                format: binary
        '401':
          description: permission denied
        '404':
          description: asset or article not found
        '500':
          description: internal server error
          
  /account/auth:
    put:
      tags:
        - account
      description: Apply account reset token to set handle and password. Basic auth will be used for new login and password. Access granted to valid reset token.
      operationId: set-account-authentication
      security:
        - bearerAuth: []
        - basicAuth: []
      responses:
        '201':
          description: success
        '401':
          description: permission denied
        '500':
          description: internal server error
          
  /account/node:
    put:
      tags:
        - account
      description: Set forwarding address after export/import has completed. Access granted to valid reset token.
      operationId: set-account-node
      security:        
        - basicAuth: []
      responses:
        '201':
          description: success
        '401':
          description: permission denied
        '405':
          description: failed to confirm
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: string
          
  /account/apps:
    get:
      tags:
        - account
      description: Get list of attached apps to account. Access granted to account's username and password.
      operationId: get-account-apps
      security:
        - basicAuth: []
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/App'
        '401':
          description: permission denied
        '500':
          description: internal server error
    post:
      tags:
        - account
      description: Generate token to attach an app to the account. Access granted to account's username and password.
      operationId: add-account-app
      security:
        - basicAuth: []
      responses:
        '201':
          description: generated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LoginAccess'
        '401':
          description: invalid token
        '406':
          description: app limit reached
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AppData'
          
  /account/apps/{appId}:
    delete:
      tags:
        - account
      description: Get list of attached apps. Access granted to account's username and password.
      operationId: remove-account-app
      security:
        - basicAuth: []
      parameters:
        - name: appId
          in: path
          description: specified app id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
        '401':
          description: invalid password
        '404':
          description: app not found
        '410':
          description: account disabled
        '500':
          description: internal server error
                 
  /account/export:
    put:
      tags:
        - account
      description: Export account from node. Account is automatically disabled afterwards. Authorized to account username and password.
      operationId: set-account-export
      security:
        - basicAuth: []
      responses:
        '201':
          description: success
        '401':
          description: permission denied
        '500':
          description: internal server error
          
  /authorize:
    put:
      tags:
        - authorize
      description: Retrieve an authenticate data messaging verifying the account holder is accepting the action referenced by the token.
      operationId: authorize 
      security:
        - bearerAuth: []
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataMessage'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: string
          
  /profile:
    get:
      tags:
        - profile
      description: Get profile of accunt. Access granted to app token of account holder.
      operationId: get-profile
      parameters:
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Profile'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /profile/data:
    put:
      tags:
        - profile
      description: Set profile data. Access granted to app tokens of account holder.
      operationId: set-profile
      parameters:
        - name: agent
          in: query
          description: agent token 
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Profile'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProfileData'
          
  /profile/image:
    get:
      tags:
        - profile
      description: Download base64 decoded data of profile image. Access granted to app tokens of account holder.
      operationId: get-profile-image
      parameters:
        - name: agent
          in: query
          description: agent token 
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/octet-stream: # content specific
              schema:
                type: string
                format: binary
        '401':
          description: permission denied
        '405':
          description: invalid image
        '410':
          description: account disabled
        '500':
          description: internal server error
    put:
      tags:
        - profile
      description: Set base64 encode image data for profile. Access granted to app tokens of account holder.
      operationId: set-profile-image
      parameters:
        - name: agent
          in: query
          description: agent token 
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Profile'
        '401':
          description: permission denied
        '405':
          description: invalid image
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: string
          
  /profile/message:
    get:
      tags:
        - profile
      description: Get a profile data message. Access granted to app token of account holder or contact token of connected contact.
      operationId: get-profile-message
      parameters:
        - name: agent
          in: query
          description: agent token 
          required: false
          schema:
            type: string
        - name: contact
          in: query
          description: contact token 
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataMessage'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /alias/groups:
    get:
      tags:
        - alias
      description: Get groups for sharing. Access granted to app tokens of the account holder.
      operationId: get-groups
      parameters:
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: successful operation          
          headers:
            X-Group-Revision:
              schema:
                type: integer
                format: int64
              description: current group revision
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Group'
        '401':
          description: invalid token
        '410':
          description: account disabled
        '500':
          description: internal server error
    post:
      tags:
        - alias
      description: Add a group for sharing. Access granted to app tokens of account holder.
      operationId: add-group
      parameters:
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Group'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subject'
         
  /alias/groups/{groupId}/subject/{field}:
    get:
      tags:
        - alias
      description: Base64 decode and download specified field from the groups's subject. Access granted to app token of account holder.
      operationId: get-group-subject-field
      parameters:
        - name: groupId
          in: path
          description: specified group id
          required: true
          schema:
            type: string
        - name: field
          in: path
          description: field from subject to base64 decode and download
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: string
                format: binary
        '401':
          description: permission denied
        '404':
          description: field, article not found
        '405':
          description: invalid field
        '410':
          description: account disabled
        '500':
          description: internal server error
 
  /alias/groups/{groupId}/subject:
    put:
      tags:
        - alias
      description: Update group description for sharing. Access granted to app tokens of account holder.
      operationId: set-group-subject
      parameters:
        - name: groupId
          in: path
          description: specified group id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Group'
        '401':
          description: permission denied
        '404':
          description: group not found
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subject'
    delete:
      tags:
        - alias
      description: Remove sharing group
      operationId: remove-group
      parameters:
        - name: groupId
          in: path
          description: specified group id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: permission denied
        '404':
          description: group not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /contact/cards:
    get:
      tags:
        - contact
      description: Get list of cards. Access granted to app tokens of account holder.
      operationId: get-cards
      parameters:
        - name: revision
          in: query
          description: only return updated cards since specified revision
          required: false
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          headers:
            X-Card-Revision:
              schema:
                type: integer
                format: int64
              description: current card revision
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Card'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
    post:
      tags:
        - contact
      description: Add a contact card. Access granted to app tokens of account holder.
      operationId: add-card
      parameters:
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataMessage'
        '400':
          description: invalid data message
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /contact/cards/{cardId}:
    delete:
      tags:
        - contact
      description: Remove card entry. Access granted to app tokens of account holder.
      operationId: remove-card
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: permission denied
        '404':
          description: card not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /contact/cards/{cardId}/status:
    put:
      tags:
        - contact
      description: Updated connected status of contact. Access granted to app tokens of account holder.
      operationId: set-card-status
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
        - name: token
          in: query
          description: token for accessing card
          required: false # required for connected 
          schema:
            type: string
        - name: profileRevision
          in: query
          description: profile revision of contact
          required: false # required for connected 
          schema:
            type: string
        - name: articleRevision
          in: query
          description: article revision of contact
          required: false # required for connected 
          schema:
            type: string
        - name: channelRevision
          in: query
          description: channel revision of contact
          required: false # required for connected 
          schema:
            type: string
        - name: viewRevision
          in: query
          description: view revision of contact
          required: false # required for connected 
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardDetail'
        '401':
          description: permission denied
        '404':
          description: card not found
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: string
              enum: [ pending, confirmed, connecting, connected ]
          
  /contact/cards/{cardId}/openMessage:
    get:
      tags:
        - contact
      description: Get message for connecting to other contacts. Access granted to app tokens for account holder.
      operationId: get-open-message
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataMessage'
        '401':
          description: permission denied
        '404':
          description: card not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /contact/openMessage:
    put:
      tags:
        - contact
      description: Set message for connecting to a contact. If card has not already been added, the card will be created in the pending state. Access granted to public.
      operationId: set-open-message
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactStatus'
        '400':
          description: invalid data message
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DataMessage'
          
  /contact/cards/{cardId}/closeMessage:
    get:
      tags:
        - contact
      description: Get message for closing connection with contact. Access granted to app tokens for account holder.
      operationId: get-close-message
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataMessage'
        '401':
          description: permission denied
        '404':
          description: card not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /contact/closeMessage:
    put:
      tags:
        - contact
      description: Set message for closing card connection. Access granted to public.
      operationId: set-close-message
      responses:
        '200':
          description: successful operation
        '400':
          description: invalid data message
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DataMessage'
          
  /contact/cards/{cardId}/profile:
    get:
      tags:
        - contact
      description: Get profile of card entry. Access granted to app tokens of account holder.
      operationId: get-card-profile
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardProfile'
        '401':
          description: permission denied
        '404':
          description: not found
        '410':
          description: account disabled
        '500':
          description: internal server error
    put:
      tags:
        - contact
      description: Set profile of card entry. Access granted to app tokens of account holder.
      operationId: set-card-profile
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataMessage'
        '401':
          description: permission denied
        '404':
          description: card not found
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Profile'
          
  /contact/cards/{cardId}/profile/image:
    get:
      tags:
        - contact
      description: Get image of card profile. Access granted to app tokens of account holder.
      operationId: get-card-profile-image
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/octet-stream: #asset specific
              schema:
                type: string
                format: binary
        '401':
          description: permission denied
        '404':
          description: card not found
        '405':
          description: invalid image
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /contact/cards/{cardId}/detail:
    get:
      tags:
        - contact
      description: Get specified card detail. Access granted to app tokens for account holder.
      operationId: get-card-detail
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardDetail'
        '401':
          description: permission denied
        '404':
          description: card not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /contact/cards/{cardId}/notes:
    put:
      tags:
        - contact
      description: Update card notes for specified card. Access granted to app tokens for account holder.
      operationId: set-card-notes
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardDetail'
        '401':
          description: permission denied
        '404':
          description: card not found
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: string
    delete:
      tags:
        - contact
      description: Clear notes for specified card. Access granted to app tokens of account holder.
      operationId: clear-card-notes
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardDetail'
        '401':
          description: permission denied
        '404':
          description: card not found
        '410':
          description: account disabled
        '500':
          description: internal server error
            
  /contact/cards/{cardId}/groups/{groupId}:
    put:
      tags:
        - contact
      description: Set sharing group for contact. Access granted to app tokens for account holder. 
      operationId: set-card-group
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: groupId
          in: path
          description: specified group id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardDetail'
        '401':
          description: permission denied
        '404':
          description: card or group not found
        '410':
          description: account disabled
        '500':
          description: internal server error
    delete:
      tags:
        - contact
      description: Clear sharing group for card. Access granted to app tokens for account holder.
      operationId: clear-card-group
      parameters:
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: groupId
          in: path
          description: specified share id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardDetail'
        '401':
          description: permission denied
        '404':
          description: card or group not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /contact/profile/revision:
    put:
      tags:
        - contact
      description: Set profile revision for contact. This is intend to be invoked automatically anytime a contact updates their profile. Access granted to contact tokens.
      operationId: set-profile-revision
      parameters:
        - name: contact
          in: query
          description: contact token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: revision set
        '401':
          description: not authorized
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: integer
              format: int64
        
  /contact/article/revision:
    put:
      tags:
        - contact
      description: Set artcile revision for contact. This is intend to be invoked automatically anytime a contact updates their content or sharing. Access granted to contact tokens.
      operationId: set-article-revision
      parameters:
        - name: contact
          in: query
          description: contact token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: revision set
        '401':
          description: not authorized
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: integer
              format: int64
              
  /contact/channel/revision:
    put:
      tags:
        - contact
      description: Set channel revision for contact. This is intend to be invoked automatically anytime a contact updates their content or sharing. Access granted to contact tokens.
      operationId: set-channel-revision
      parameters:
        - name: contact
          in: query
          description: contact token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: revision set
        '401':
          description: not authorized
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: integer
              format: int64
              
  /contact/view/revision:
    put:
      tags:
        - contact
      description: Set view revision for contact. This is intend to be invoked automatically anytime a contact updates their content or sharing. Access granted to contact tokens.
      operationId: set-view-revision
      parameters:
        - name: contact
          in: query
          description: contact token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: revision set
        '401':
          description: not authorized
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: integer
              format: int64
              
  /attribute/articles:
    get:
      tags:
        - attribute
      description: Get article slots that should be updated based on revisions. Access granted to account token or contact token. When the request is made with a contact token the account view revision will be added to the block revision.
      operationId: get-articles
      security:
        - bearerAuth: []
      parameters:
        - name: viewRevision
          in: query
          description: view revision from which attribute revision applies 
          required: false
          schema:
            type: string
        - name: articleRevision
          in: query
          description: return updated articles since revision 
          required: false
          schema:
            type: string
        - name: types
          in: query
          description: return only articles of specified types
          required: false
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
        - name: contact
          in: query
          description: contact token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          headers:
            X-View-Revision:
              schema:
                type: integer
                format: int64
              description: current view revision
            X-Article-Revision:
              schema:
                type: integer
                format: int64
              description: current article revision
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Article'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
    post:
      tags:
        - attribute
      description: Add a content article. Access granted to app token of the account holder.
      operationId: add-article
      parameters:
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '201':
          description: entry created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Article'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subject'
          
  /attribute/articles/{articleId}:
    delete:
      tags:
        - attribute
      description: Remove specified article. Access granted to app token of account holder.
      operationId: remove-article
      parameters:
        - name: articleId
          in: path
          description: specified article id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: invalid password
        '404':
          description: article not found
        '410':
          description: account disabled
        '500':
          description: internal server error
  
  /attribute/articles/{articleId}/subject/{field}:
    get:
      tags:
        - attribute
      description: Base64 decode and download specified field from the article's subject. Access granted to app token of account holder or contact token of account the article is shared with.
      operationId: get-article-subject-field
      parameters:
        - name: articleId
          in: path
          description: specified article id 
          required: true
          schema:
            type: string
        - name: field
          in: path
          description: field from subject to base64 decode and download 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
        - name: contact
          in: query
          description: contact token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: string
                format: binary
        '401':
          description: permission denied
        '404':
          description: field, article not found
        '405':
          description: invalid field
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /attribute/articles/{articleId}/subject:
    put:
      tags:
        - attribute
      description: Set subject for article. Access granted to app token of account holder.
      operationId: set-article-subject
      parameters:
        - name: articleId
          in: path
          description: specified article id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: permission denied
        '404':
          description: article not found
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subject'
                  
  /attribute/articles/{articleId}/groups/{groupId}:
    put:
      tags:
        - attribute
      description: Set group for articles. Access granted to app tokens for account holder. 
      operationId: set-article-group
      parameters:
        - name: articleId
          in: path
          description: specified article id 
          required: true
          schema:
            type: string
        - name: groupId
          in: path
          description: specified group id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Article'
        '401':
          description: permission denied
        '404':
          description: card or group not found
        '410':
          description: account disabled
        '500':
          description: internal server error
    delete:
      tags:
        - attribute
      description: Clear sharing group for article. Access granted to app tokens for account holder.
      operationId: clear-article-group
      parameters:
        - name: articleId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: groupId
          in: path
          description: specified share id 
          required: true
          schema:
            type: string
        - name: agent
          in: query
          description: agent token
          required: false
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Article'
        '401':
          description: permission denied
        '404':
          description: card or group not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
          
  /content/channels:
    get:
      tags:
        - content
      description: Get channel slots. If revision set detail fields omittied in response
      operationId: get-channels
      security:
        - bearerAuth: []
      parameters:
        - name: viewRevision
          in: query
          description: view revision from which content revision applies 
          required: false
          schema:
            type: string
        - name: channelRevision
          in: query
          description: return updated channels since revision 
          required: false
          schema:
            type: string
        - name: types
          in: query
          description: return only channels of specified types
          required: false
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          headers:
            X-View-Revision:
              schema:
                type: integer
                format: int64
              description: current view revision
            X-Channel-Revision:
              schema:
                type: integer
                format: int64
              description: current channel revision
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Channel'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
    post:
      tags:
        - content
      description: Add a channel. 
      operationId: add-channel
      security:
        - bearerAuth: []
      responses:
        '201':
          description: entry created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Channel'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChannelParams'
          
  /content/channels/{channelId}/detail:
    get:
      tags:
        - content
      description: Get details of channel.
      operationId: get-channel-detail
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChannelDetail'
        '401':
          description: invalid password
        '404':
          description: channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
  
  /content/channels/{channelId}/summary:
    get:
      tags:
        - content
      description: Get summary of channel.
      operationId: get-channel-summary
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChannelSummary'
        '401':
          description: invalid password
        '404':
          description: channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /content/channels/{channelId}:
    delete:
      tags:
        - content
      description: Remove specified channel or membership. When invoked by account holder, channel is removed. When invoked by member, membership is removed.
      operationId: remove-channel
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: invalid password
        '404':
          description: channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
                   
  /content/channels/{channelId}/subject/{field}:
    get:
      tags:
        - content
      description: Base64 decode and download specified field from the channel's subject. Access granted to app token of account holder or contact token of account the channel is shared with.
      operationId: get-channel-subject-field
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: field
          in: path
          description: field from subject to base64 decode and download 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: string
                format: binary
        '401':
          description: permission denied
        '404':
          description: field, channel not found
        '405':
          description: invalid field
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /content/channels/{channelId}/subject:
    put:
      tags:
        - content
      description: Set subject for channel. Access granted to app token of account holder.
      operationId: set-channel-subject
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Channel'
        '401':
          description: permission denied
        '404':
          description: channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subject'
           
  /content/channels/{channelId}/groups/{groupId}:
    put:
      tags:
        - content
      description: Set group for read access to channel. Access granted to app tokens for account holder. 
      operationId: set-channel-group
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: groupId
          in: path
          description: specified group id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Channel'
        '401':
          description: permission denied
        '404':
          description: card or group not found
        '410':
          description: account disabled
        '500':
          description: internal server error
    delete:
      tags:
        - content
      description: Clear read access to channel for group. Access granted to app tokens for account holder.
      operationId: clear-channel-group
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
        - name: groupId
          in: path
          description: specified share id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Channel'
        '401':
          description: permission denied
        '404':
          description: card or group not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /content/channels/{channelId}/cards/{cardId}:
    put:
      tags:
        - content
      description: Set card for write access to channel. Access granted to app tokens for account holder. 
      operationId: set-channel-card
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Channel'
        '401':
          description: permission denied
        '404':
          description: card or group not found
        '410':
          description: account disabled
        '500':
          description: internal server error
    delete:
      tags:
        - content
      description: Clear write access to channel for card. Access granted to app tokens for account holder.
      operationId: clear-channel-card
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: cardId
          in: path
          description: specified card id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Channel'
        '401':
          description: permission denied
        '404':
          description: card or group not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /content/channels/{channelId}/topics:
    get:
      tags:
        - content
      description: Get channel topic slots. If revision set, detail fields omitted in response. Staggered loading supported through sequnce marker. Initially count can be used to limit the topics returned. The sequence marker returned in the header must be used in subsequent queries for the same topic window.
      operationId: get-channel-topics
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id
          required: true
          schema:
            type: string
        - name: revision
          in: query
          description: return updated topics since revision 
          required: false
          schema:
            type: integer
            format: int64
        - name: count
          in: query
          description: limit number of topics from latest when revision not set
          required: false
          schema:
            type: integer
            format: int64
        - name: begin
          in: query
          description: return topics after and including sequence marker
          required: false
          schema:
            type: integer
            format: int64
        - name: end
          in: query
          description: return topics before and not including sequence marker
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: successful operation
          headers:
            Topic-Revision:
              schema:
                type: integer
                format: int64
              description: current topic revision
            Topic-Marker:
              schema:
                type: integer
                format: int64
              description: sequnce marker of first topic when count set
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Topic'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
    post:
      tags:
        - content
      description: Add a topic to channel channel. 
      operationId: add-channel-topic
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id
          required: true
          schema:
            type: string
        - name: confirm
          in: query
          description: set if intial state is confirmed
          required: false
          schema:
            type: boolean
      responses:
        '201':
          description: entry created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Topic'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subject'
          
  /content/channels/{channelId}/topics/{topicId}:
    delete:
      tags:
        - content
      description: Remove specified channel. Access granted to app token of account holder.
      operationId: remove-channel-topic
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: invalid password
        '404':
          description: channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
  
  /content/channels/{channelId}/topics/{topicId}/detail:
    get:
      tags:
        - content
      description: Get detail object of topic.
      operationId: get-channel-topic-detail
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TopicDetail'
        '401':
          description: invalid password
        '404':
          description: channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /content/channels/{channelId}/topics/{topicId}/subject/{field}:
    get:
      tags:
        - content
      description: Base64 decode and download specified field from the channel's subject. Access granted to app token of account holder or contact token of account the channel is shared with.
      operationId: get-channel-topic-subject-field
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
        - name: field
          in: path
          description: field from subject to base64 decode and download 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: string
                format: binary
        '401':
          description: permission denied
        '404':
          description: field, channel not found
        '405':
          description: invalid field
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /content/channels/{channelId}/topics/{topicId}/subject:
    put:
      tags:
        - content
      description: Set subject for channel. Access granted to app token of account holder.
      operationId: set-channel-topic-subject
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
        - name: confirm
          in: query
          description: confirmed state of topic
          required: false
          schema:
            type: boolean
      responses:
        '200':
          description: success
        '401':
          description: permission denied
        '404':
          description: channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subject'
                  
  /content/channels/{channelId}/topics/{topicId}/assets:
    get:
      tags:
        - content
      description: Get list of assets assigned to an channel. The original assets will only be available to the account holder to provent the accidental sharing of content metadata. Access is granted to the app token of the account holder and the contact token of accounts the channel has been shared with.
      operationId: get-channel-topic-assets
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
      responses:
        '201':
          description: entry created
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Asset'
        '401':
          description: invalid token
        '410':
          description: account disabled
        '500':
          description: internal server error
    post:
      tags:
        - content
      description: Add an an asset to the to an channel. The original posted asset is referenced in the asset list with a null transform. The transformed assets are referenced accordingly. Transforming the asset strips it of metadata and transcodes it into a specified format. Access is granted to the app token of the account holder.
      operationId: add-channel-topic-asset
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
        - name: transforms
          in: query
          description: transforms to apply
          required: false
          schema:
            type: array
            items:
              type: string
      responses:
        '201':
          description: success
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Asset'
        '401':
          description: permission denied
        '404':
          description: channel not found
        '406':
          description: storage limit reached
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                fileName:
                  type: string
                  format: binary
          
  /content/channels/{channelId}/topics/{topicId}/assets/{assetId}:
    get:
      tags:
        - content
      description: Get asset assigned to an channel. The endpoint supports byte-range requests and responds with the content-type set appropriatly. Access granted to the app tokens of the account holder and in the case of non-original assets, the contact token for accounts with which the channel is shared.
      operationId: get-channel-topic-asset
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
        - name: assetId
          in: path
          description: specified asset id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/octet-stream: #asset specific
              schema:
                type: string
                format: binary
        '401':
          description: permission denied
        '404':
          description: asset or channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
    delete:
      tags:
        - content
      description: Remove an asset from an channel. Access granted to app tokens of the account holder.
      operationId: remove-channel-topic-asset
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
        - name: assetId
          in: path
          description: specified asset id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: permission denied
        '404':
          description: asset or channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /content/channels/{channelId}/topics/{topicId}/confirmed:
    put:
      tags:
        - content
      description: Set confirmed state of the channel. Until the confirmed state has been set to true, the channel will not be visible to contacts with which the channel is shared. Access granted to the app tokens of the acocunt holder.
      operationId: set-channel-topic-confirmed
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: permission denied
        '404':
          description: channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              type: string
              
                  
  /content/channels/{channelId}/topics/{topicId}/tags:
    get:
      tags:
        - content
      description: Get channel topic tag slots.
      operationId: get-channel-topic-tags
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
        - name: revision
          in: query
          description: return updated topics since revision 
          required: false
          schema:
            type: integer
            format: int64
        - name: count
          in: query
          description: limit number of latest from latest when revision not set
          required: false
          schema:
            type: integer
            format: int64
        - name: begin
          in: query
          description: return tags after and including sequence marker
          required: false
          schema:
            type: integer
            format: int64
        - name: end
          in: query
          description: return tags before and not including sequence marker
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: successful operation
          headers:
            Tag-Revision:
              schema:
                type: integer
                format: int64
              description: current tag revision
            Tag-Marker:
              schema:
                type: integer
                format: int64
              description: sequnce marker of first tag when count set
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Tag'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
    post:
      tags:
        - content
      description: Add a tag to channel topic. 
      operationId: add-channel-topic-tag
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
      responses:
        '201':
          description: entry created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Tag'
        '401':
          description: permission denied
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subject'
          
  /content/channels/{channelId}/topics/{topicId}/tags/{tagId}:
    delete:
      tags:
        - content
      description: Remove specified tag from channel topic. Access granted to app token of account holder.
      operationId: remove-channel-topic-tag
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id 
          required: true
          schema:
            type: string
        - name: tagId
          in: path
          description: specified tag id 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: invalid password
        '404':
          description: channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
  
  /content/channels/{channelId}/topics/{topicId}/tags/{tagId}/subject/{field}:
    get:
      tags:
        - content
      description: Base64 decode and download specified field from the channel's subject. Access granted to app token of account holder or contact token of account the channel is shared with.
      operationId: get-channel-topic-tag-subject-field
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
        - name: tagId
          in: path
          description: specified tag id
          required: true
          schema:
            type: string
        - name: field
          in: path
          description: field from subject to base64 decode and download 
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: string
                format: binary
        '401':
          description: permission denied
        '404':
          description: field, channel not found
        '405':
          description: invalid field
        '410':
          description: account disabled
        '500':
          description: internal server error
          
  /content/channels/{channelId}/topics/{topicId}/tags/{tagId}/subject:
    put:
      tags:
        - content
      description: Set subject for channel. Access granted to app token of account holder.
      operationId: set-channel-topic-tag-subject
      security:
        - bearerAuth: []
      parameters:
        - name: channelId
          in: path
          description: specified channel id 
          required: true
          schema:
            type: string
        - name: topicId
          in: path
          description: specified topic id
          required: true
          schema:
            type: string
        - name: tagId
          in: path
          description: specified tag id
          required: true
          schema:
            type: string
      responses:
        '200':
          description: success
        '401':
          description: permission denied
        '404':
          description: channel not found
        '410':
          description: account disabled
        '500':
          description: internal server error
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Subject'
              
          
externalDocs:
  description: App overview
  url: ''

components:
  schemas:
  
    Announce:
      type: object
      required:
        - appToken
      properties:
        appToken:
          type: string

    LoginAccess {
      type: object
      required:
        - guid
        - appToken
        - created
      properties:
        guid:
          type: string
        appToken:
          type: string
        created:
          type: integer
          format: int64
          
    Revision:    
      type: object
      required:
        - profile
        - article
        - group
        - channel
        - card
      properties:
        account:
          type: integer
          format: int64
        profile:
          type: integer
          format: int64
        article:
          type: integer
          format: int64
        group:
          type: integer
          format: int64
        channel:
          type: integer
          format: int64
        card:
          type: integer
          format: int64
      
    NodeConfig:
      type: object
      required:
        - domain
        - accountStorage
      properties:
        domain:
          type: string
        accountStorage:
          type: integer
          format: int64
        enableImage:
          type: boolean
        enableAudio:
          type: boolean
        enableVideo:
          type: boolean
        keyType:
          type: string
          
    AccountStatus:
      type: object
      required:
        - disabled
        - storageUsed
        - storageAvailable
        - forwardingAddress
        - searchable
      properties:
        disabled:
          type: boolean
        storageUsed:
          type: integer
          format: int64
        storageAvailable:
          type: integer
          format: int64
        forwardingAddress:
          type: string
        searchable:
          type: boolean
          
    AccountProfile:
      type: object
      required:
        - guid
        - revision
        - node
      properties:
        accountId:
          type: integer
          format: uint32
        guid:
          type: string
        handle:
          type: string
        name:
          type: string
        description:
          type: string
        location:
          type: string
        imageSet:
          type: boolean
        disabled:
          type: boolean
          
    Profile:
      type: object
      required:
        - guid
        - revision
        - node
      properties:
        guid:
          type: string
        handle:
          type: string
        name:
          type: string
        description:
          type: string
        location:
          type: string
        image:
          type: string
          format: base64 encoded data
        revision:
          type: integer
          format: int64
        version:
          type: string
        node:
          type: string
          
    ProfileData:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        location:
          type: string
          
    Account:
      type: object
      required:
        - accountId
        - disabled
      properties:
        accountId:
          type: integer
          format: uint32
        guid:
          type: string
        handle:
          type: string
        name:
          type: string
        description:
          type: string
        location:
          type: string
        imageSet:
          type: boolean
        disabled:
          type: boolean
        
    App:
      type: object
      required:
        - id
        - revision
        - data
      properties:
        id:
          type: string
        revision:
          type: integer
          format: int64
        data:
          $ref: '#/components/schemas/AppData'
          
    AppData:
      type: object
      required:
        - attached
      properties:
        name:
          type: string
        description:
          type: string
        url:
          type: string
        image:
          type: string
          format: base64 encoded image
        attached:
          type: integer
          format: int64
          
    Card:
      type: object
      required:
        - id
        - revision
        - data
      properties:
        id:
          type: string
        revision:
          type: integer
          format: int64
        data:
          $ref: '#/components/schemas/CardData'
        
    CardData:
      type: object
      required:
        - detailRevision
        - profileRevision
        - notifiedProfile
        - notifiedArticle
        - notifiedChannel
        - notifiedView
      properties:
        detailRevision:
          type: integer
          format: int64
        profileRevision:
          type: integer
          format: int64
        notifiedProfile:
          type: integer
          format: int64
        notifiedArticle:
          type: integer
          format: int64
        notifiedChannel:
          type: integer
          format: int64
        notifiedView:
          type: integer
          format: int64
        cardDetail:
          $ref: '#/components/schemas/CardDetail'
        cardProfile:
          $ref: '#/components/schemas/CardProfile'
      
    CardProfile:
      type: object
      required:
        - guid
        - node
      properties:
        guid:
          type: string
        handle:
          type: string
        name:
          type: string
        description:
          type: string
        location:
          type: string
        imageSet:
          type: boolean
        version:
          type: string
        node:
          type: string
        revision:
          type: integer
          format: int64
          
    CardDetail:
      type: object
      required:
        - status
      properties:
        status:
          type: string
          enum: [ pending, confirmed, requested, connecting, connected ]
        statusUpdated:
          type: integer
          format: int64
        token:
          type: string
        notes:
          type: string
        groups:
          type: array
          items:
            type: string
            
    Group:
      type: object
      required:
        - id
        - revision
        - data
      properties:
        id:
          type: string
        revision:
          type: integer
          format: int64
        data:
          $ref: '#/components/schemas/GroupData'
          
    GroupData:
      type: object
      required:
        - dataType
        - data
        - created
        - updated
      properties:
        dataType:
          type: string
        data:
          type: string
        created:
          type: integer
          format: int64
        updated:
          type: integer
          format: int64

    ChannelParams:
      type: object
      required:
        - dataType
        - data
        - groups
        - cards
      properties:
        dataType:
          type: string
        data:
          type: string
        groups:
          type: array
          items:
            type: string
        cards:
          type: array
          items:
            type: string

    Channel:
      type: object
      required:
        - id
        - revision
        - data
      properties:
        id:
          type: string
        revision:
          type: integer
          format: int64
        data:
          $ref: '#/components/schemas/ChannelData'
          
    ChannelData:
      type: object
      required:
        - detailRevision
        - topicRevision
      properties:
        detailRevision:
          type: integer
          format: int64
        topicRevision:
          type: integer
          format: int64
        channelSummary:
          $ref: '#/components/schemas/ChannelSummary'
        channelDetail:
          $ref: '#/components/schemas/ChannelDetail'
          
    ChannelDetail:
      type: object
      required:
        - dataType
        - data
        - created
        - updated
      properties:
        dataType:
          type: string
        data:
          type: string
        created:
          type: integer
          format: int64
        updated:
          type: integer
          format: int64
        enableImage:
          type: boolean
        enableAudio:
          type: boolean
        enableVideo:
          type: video
        contacts:
          $ref: '#/components/schemas/ChannelContacts'
        members:
          type: array
          items:
            type: string
            
    ChannelSummary:
      type: object
      properties:
        lastTopic:
          $ref: '#/components/schemas/TopicDetail'
          
    ChannelContacts:
      type: object
      required:
        - groups
        - cards
      properties:
        groups:
          type: array
          items:
            type: string
        cards:
          type: array
          items:
            type: string
      
    ChannelMembers:
      type: object
      required:
        - members
      properties:
        members:
          type: array
          items:
            type: string
    
    Topic:
      type: object
      required:
        - id
        - revision
        - data
      properties:
        id:
          type: string
        revision:
          type: integer
          format: int64
        data:
          $ref: '#/components/schemas/TopicData'
    
    TopicData:
      type: object
      required:
        - detailRevision
        - tagRevision
      properties:
        detailRevision:
          type: integer
          format: int64
        tagRevision:
          type: integer
          format: int64
        topicDetail:
          $ref: '#/components/schemas/TopicDetail'
          
    TopicDetail:
      type: object
      required:
        - guid
        - dataType
        - data
        - created
        - updated
        - status
      properties:
        guid:
          type: string
        dataType:
          type: string
        data:
          type: string
        created:
          type: integer
          format: int64
        updated:
          type: integer
          format: int64
        status:
          type: string
          enum: [ unconfirmed, confirmed ]
        transform:
          type: string
          enum: [ complete, incomplete ]
          
    Tag:
      type: object
      required:
        - id
        - revision
        - data
      properties:
        id:
          type: string
        revision:
          type: integer
          format: int64
        data:
          $ref: '#/components/schemas/TagData'
        
    TagData:
      type: object
      required:
        - guid
        - dataType
        - data
        - created
        - updated
      properties:
        guid:
          type: string
        dataType:
          type: string
        data:
          type: string
        created:
          type: integer
          format: int64
        updated:
          type: integer
          format: int64
          
    Article:
      type: object
      required:
        - id
        - revision
        - data
      properties:
        id:
          type: string
        revision:
          type: integer
          format: int64
        data:
          $ref: '#/components/schemas/ArticleData'
        
    ArticleData:
      type: object
      required:
        - dataType
        - data
        - created
        - updated
        - status
      properties:
        dataType:
          type: string
        data:
          type: string
        created:
          type: integer
          format: int64
        updated:
          type: integer
          format: int64
        status:
          type: string
          enum: [ unconfirmed, confirmed, incomplete, error ]
        groups:
          $ref: '#/components/schemas/ArticleGroups'
          
    ArticleGroups:
      type: object
      required:
        - groups
      properties:
        groups:
          type: array
          items:
            type: string
          
    Asset:
      type: object
      required:
        - assetId
      properties:
        assetId:
          type: string
        transform:
          type: string
        status:
          type: string
          enum: [ pending, processing, importing, ready, error ]
          
    Subject:
      type: object
      required:
        - dataType
        - data
      properties:
        dataType:
          type: string
        data:
          type: string
          
    Claim:
      type: object
      required: 
        - token
      properties:
        token:
          type: string
          
    Identity:
      type: object
      required:
        - revision
        - version
        - node
      properties:
        revision:
          type: integer
          format: int64
        handle:
          type: string
        name:
          type: string
        description:
          type: string
        location:
          type: string
        image:
          type: string
          format: base64 encoded image
        version:
          type: string
        node:
          type: string
          
    Connect:
      type: object
      required:
        - contact
        - token
      properties:
        contact:
          type: string
        token:
          type: string
        viewRevision:
          type: integer
          format: int64
        articleRevision:
          type: integer
          format: int64
        profileRevision:
          type: integer
          format: int64
        handle:
          type: string
        name:
          type: string
        description:
          type: string
        location:
          type: string
        image:
          type: string
          format: base64 encoded image
        version:
          type: string
        node:
          type: string
          
    Disconnect:
      type: object
      required:
        - contact
      properties:
        contact:
          type: string
    
    SignedData:
      type: object
      required:
        - guid
        - timestamp
        - messageType
        - value
      properties:
        guid:
          type: string
        timestamp:
          type: integer
          format: int64
        messageType:
          type: string
          enum: [Connect, Disconnect, Identity, Authenticate]
        value:
          type: string
          format: json string of Connect, Disconnect, Authenticate, or Profile
          
    ContactStatus:
      type: object
      required:
        - status
      properties:
        token:
          type: string
        profileRevision:
          type: integer
          format: int64
        articleRevision:
          type: integer
          format: int64
        channelRevision:
          type: integer
          format: int64
        viewRevision:
          type: integer
          format: int64
        status:
          type: string
          enum: [ pending, confirmed, requested, connecting, connected ]
          
    DataMessage:
      type: object
      required:
        - message
        - keyType
        - publicKey
        - signature
        - signatureType
      properties:
        message:
          type: string
          format: base64 encoded json string of SignedData
        keyType:
          type: string
          enum: [RSA4096, RSA2048]
        publicKey:
          type: string
          format: base64 encoding of account public key
        signature:
          type: string
          format: base64 encoding of message signature
        signatureType:
          type: string
          enum: [PKCS1v15, PSS]

          
  securitySchemes:
  
    basicAuth:
      type: http
      scheme: basic
  
    basicCredentials:
      type: http
      scheme: basic 

    bearerAuth: 
      type: http
      scheme: bearer