basePath: /
definitions:
  apierr.APIError:
    enum:
    - -1
    - 0
    - 1101
    - 1102
    - 1103
    - 1104
    - 1105
    - 1106
    - 1121
    - 1151
    - 1152
    - 1153
    - 1152
    - 1161
    - 1171
    - 1201
    - 1202
    - 1203
    - 1204
    - 1205
    - 1206
    - 1207
    - 1208
    - 1209
    - 1301
    - 1302
    - 1303
    - 1304
    - 1305
    - 1306
    - 1307
    - 1311
    - 1401
    - 1501
    - 1511
    - 1512
    - 2101
    - 3001
    - 3002
    - 9901
    - 9902
    - 9903
    - 9904
    - 9905
    type: integer
    x-enum-varnames:
    - UNDEFINED
    - NO_ERROR
    - MISSING_UID
    - MISSING_TOK
    - MISSING_TITLE
    - INVALID_PRIO
    - REQ_METHOD
    - INVALID_CLIENTTYPE
    - PAGETOKEN_ERROR
    - BINDFAIL_QUERY_PARAM
    - BINDFAIL_BODY_PARAM
    - BINDFAIL_URI_PARAM
    - BINDFAIL_HEADER_PARAM
    - INVALID_BODY_PARAM
    - INVALID_ENUM_VALUE
    - NO_TITLE
    - TITLE_TOO_LONG
    - CONTENT_TOO_LONG
    - USR_MSG_ID_TOO_LONG
    - TIMESTAMP_OUT_OF_RANGE
    - SENDERNAME_TOO_LONG
    - CHANNEL_TOO_LONG
    - CHANNEL_DESCRIPTION_TOO_LONG
    - CHANNEL_NAME_EMPTY
    - USER_NOT_FOUND
    - CLIENT_NOT_FOUND
    - CHANNEL_NOT_FOUND
    - SUBSCRIPTION_NOT_FOUND
    - MESSAGE_NOT_FOUND
    - SUBSCRIPTION_USER_MISMATCH
    - KEY_NOT_FOUND
    - USER_AUTH_FAILED
    - NO_DEVICE_LINKED
    - CHANNEL_ALREADY_EXISTS
    - CANNOT_SELFDELETE_KEY
    - CANNOT_SELFUPDATE_KEY
    - QUOTA_REACHED
    - FAILED_VERIFY_PRO_TOKEN
    - INVALID_PRO_TOKEN
    - FIREBASE_COM_FAILED
    - FIREBASE_COM_ERRORED
    - INTERNAL_EXCEPTION
    - PANIC
    - NOT_IMPLEMENTED
  ginresp.apiError:
    properties:
      errhighlight:
        type: integer
      error:
        type: integer
      message:
        type: string
      success:
        type: boolean
    type: object
  ginresp.compatAPIError:
    properties:
      errid:
        type: integer
      message:
        type: string
      success:
        type: boolean
    type: object
  handler.Ack.response:
    properties:
      message:
        type: string
      new_ack:
        type: integer
      prev_ack:
        type: integer
      success:
        type: boolean
    type: object
  handler.AddClient.body:
    properties:
      agent_model:
        type: string
      agent_version:
        type: string
      client_type:
        $ref: '#/definitions/models.ClientType'
      fcm_token:
        type: string
      name:
        type: string
    required:
    - agent_model
    - agent_version
    - client_type
    - fcm_token
    type: object
  handler.CreateChannel.body:
    properties:
      description:
        type: string
      name:
        type: string
      subscribe:
        type: boolean
    type: object
  handler.CreateSubscription.body:
    properties:
      channel_id:
        type: string
      channel_internal_name:
        type: string
      channel_owner_user_id:
        type: string
    type: object
  handler.CreateUser.body:
    properties:
      agent_model:
        type: string
      agent_version:
        type: string
      client_name:
        type: string
      client_type:
        $ref: '#/definitions/models.ClientType'
      fcm_token:
        type: string
      no_client:
        type: boolean
      pro_token:
        type: string
      username:
        type: string
    type: object
  handler.CreateUserKey.body:
    properties:
      all_channels:
        type: boolean
      channels:
        items:
          type: string
        type: array
      name:
        type: string
      permissions:
        type: string
    required:
    - name
    - permissions
    type: object
  handler.DatabaseTest.response:
    properties:
      libVersion:
        type: string
      sourceID:
        type: string
      success:
        type: boolean
    type: object
  handler.Expand.response:
    properties:
      data:
        $ref: '#/definitions/models.CompatMessage'
      message:
        type: string
      success:
        type: boolean
    type: object
  handler.Health.response:
    properties:
      status:
        type: string
    type: object
  handler.Info.response:
    properties:
      fcm_token_set:
        type: boolean
      is_pro:
        type: integer
      message:
        type: string
      quota:
        type: integer
      quota_max:
        type: integer
      success:
        type: boolean
      unack_count:
        type: integer
      user_id:
        type: integer
      user_key:
        type: string
    type: object
  handler.ListChannelMessages.response:
    properties:
      messages:
        items:
          $ref: '#/definitions/models.Message'
        type: array
      next_page_token:
        type: string
      page_size:
        type: integer
      total_count:
        type: integer
    type: object
  handler.ListChannelSubscriptions.response:
    properties:
      subscriptions:
        items:
          $ref: '#/definitions/models.Subscription'
        type: array
    type: object
  handler.ListChannels.response:
    properties:
      channels:
        items:
          $ref: '#/definitions/models.ChannelWithSubscription'
        type: array
    type: object
  handler.ListClients.response:
    properties:
      clients:
        items:
          $ref: '#/definitions/models.Client'
        type: array
    type: object
  handler.ListMessages.response:
    properties:
      messages:
        items:
          $ref: '#/definitions/models.Message'
        type: array
      next_page_token:
        type: string
      page_size:
        type: integer
      total_count:
        type: integer
    type: object
  handler.ListSenderNames.response:
    properties:
      sender_names:
        items:
          $ref: '#/definitions/models.SenderNameStatistics'
        type: array
    type: object
  handler.ListUserKeys.response:
    properties:
      keys:
        items:
          $ref: '#/definitions/models.KeyToken'
        type: array
    type: object
  handler.ListUserSubscriptions.response:
    properties:
      subscriptions:
        items:
          $ref: '#/definitions/models.Subscription'
        type: array
    type: object
  handler.Register.response:
    properties:
      is_pro:
        type: boolean
      message:
        type: string
      quota:
        type: integer
      quota_max:
        type: integer
      success:
        type: boolean
      user_id:
        type: integer
      user_key:
        type: string
    type: object
  handler.Requery.response:
    properties:
      count:
        type: integer
      data:
        items:
          $ref: '#/definitions/models.CompatMessage'
        type: array
      message:
        type: string
      success:
        type: boolean
    type: object
  handler.SendMessage.combined:
    properties:
      channel:
        example: test
        type: string
      content:
        example: This is a message
        type: string
      key:
        example: P3TNH8mvv14fm
        type: string
      msg_id:
        example: db8b0e6a-a08c-4646
        type: string
      priority:
        enum:
        - 0
        - 1
        - 2
        example: 1
        type: integer
      sender_name:
        example: example-server
        type: string
      timestamp:
        example: 1669824037
        type: number
      title:
        example: Hello World
        type: string
      user_id:
        example: "7725"
        type: string
    type: object
  handler.SendMessage.response:
    properties:
      errhighlight:
        type: integer
      error:
        $ref: '#/definitions/apierr.APIError'
      is_pro:
        type: boolean
      message:
        type: string
      messagecount:
        type: integer
      quota:
        type: integer
      quota_max:
        type: integer
      scn_msg_id:
        type: string
      success:
        type: boolean
      suppress_send:
        type: boolean
    type: object
  handler.Sleep.response:
    properties:
      duration:
        type: number
      end:
        type: string
      start:
        type: string
    type: object
  handler.Update.response:
    properties:
      is_pro:
        type: integer
      message:
        type: string
      quota:
        type: integer
      quota_max:
        type: integer
      success:
        type: boolean
      user_id:
        type: integer
      user_key:
        type: string
    type: object
  handler.UpdateSubscription.body:
    properties:
      active:
        type: boolean
      confirmed:
        type: boolean
    type: object
  handler.UpdateUserKey.body:
    properties:
      all_channels:
        type: boolean
      channels:
        items:
          type: string
        type: array
      name:
        type: string
      permissions:
        type: string
    type: object
  handler.Upgrade.response:
    properties:
      is_pro:
        type: boolean
      message:
        type: string
      quota:
        type: integer
      quota_max:
        type: integer
      success:
        type: boolean
      user_id:
        type: integer
    type: object
  handler.UptimeKuma.body:
    properties:
      heartbeat:
        properties:
          localDateTime:
            type: string
          msg:
            type: string
          status:
            type: integer
          time:
            type: string
          timezone:
            type: string
          timezoneOffset:
            type: string
        type: object
      monitor:
        properties:
          name:
            type: string
          url:
            type: string
        type: object
      msg:
        type: string
    type: object
  handler.UptimeKuma.response:
    properties:
      message_id:
        type: string
    type: object
  handler.pingResponse:
    properties:
      info:
        $ref: '#/definitions/handler.pingResponseInfo'
      message:
        type: string
    type: object
  handler.pingResponseInfo:
    properties:
      addr:
        type: string
      headers:
        additionalProperties:
          items:
            type: string
          type: array
        type: object
      method:
        type: string
      request:
        type: string
      uri:
        type: string
    type: object
  models.Channel:
    properties:
      channel_id:
        type: string
      description_name:
        description: = DescriptionName, (optional), longer description text, initally
          nil
        type: string
      display_name:
        description: = DisplayName, used for display purposes, can be changed, initially
          equals InternalName
        type: string
      internal_name:
        description: = InternalName, used for sending, normalized, cannot be changed
        type: string
      messages_sent:
        type: integer
      owner_user_id:
        type: string
      subscribe_key:
        description: can be nil, depending on endpoint
        type: string
      timestamp_created:
        type: string
      timestamp_lastsent:
        type: string
    type: object
  models.ChannelPreview:
    properties:
      channel_id:
        type: string
      description_name:
        type: string
      display_name:
        type: string
      internal_name:
        type: string
      messages_sent:
        type: integer
      owner_user_id:
        type: string
      subscription:
        $ref: '#/definitions/models.Subscription'
    type: object
  models.ChannelWithSubscription:
    properties:
      channel_id:
        type: string
      description_name:
        description: = DescriptionName, (optional), longer description text, initally
          nil
        type: string
      display_name:
        description: = DisplayName, used for display purposes, can be changed, initially
          equals InternalName
        type: string
      internal_name:
        description: = InternalName, used for sending, normalized, cannot be changed
        type: string
      messages_sent:
        type: integer
      owner_user_id:
        type: string
      subscribe_key:
        description: can be nil, depending on endpoint
        type: string
      subscription:
        $ref: '#/definitions/models.Subscription'
      timestamp_created:
        type: string
      timestamp_lastsent:
        type: string
    type: object
  models.Client:
    properties:
      agent_model:
        type: string
      agent_version:
        type: string
      client_id:
        type: string
      fcm_token:
        type: string
      name:
        type: string
      timestamp_created:
        type: string
      type:
        $ref: '#/definitions/models.ClientType'
      user_id:
        type: string
    type: object
  models.ClientType:
    enum:
    - ANDROID
    - IOS
    - LINUX
    - MACOS
    - WINDOWS
    type: string
    x-enum-varnames:
    - ClientTypeAndroid
    - ClientTypeIOS
    - ClientTypeLinux
    - ClientTypeMacOS
    - ClientTypeWindows
  models.CompatMessage:
    properties:
      body:
        type: string
      priority:
        type: integer
      scn_msg_id:
        type: integer
      timestamp:
        type: integer
      title:
        type: string
      trimmed:
        type: boolean
      usr_msg_id:
        type: string
    type: object
  models.KeyToken:
    properties:
      all_channels:
        type: boolean
      channels:
        items:
          type: string
        type: array
      keytoken_id:
        type: string
      messages_sent:
        type: integer
      name:
        type: string
      owner_user_id:
        type: string
      permissions:
        items:
          $ref: '#/definitions/models.TokenPerm'
        type: array
      timestamp_created:
        type: string
      timestamp_lastused:
        type: string
      token:
        type: string
    type: object
  models.KeyTokenPreview:
    properties:
      all_channels:
        type: boolean
      channels:
        items:
          type: string
        type: array
      keytoken_id:
        type: string
      name:
        type: string
      owner_user_id:
        type: string
      permissions:
        type: string
    type: object
  models.Message:
    properties:
      channel_id:
        type: string
      channel_internal_name:
        type: string
      channel_owner_user_id:
        description: user that owns the channel
        type: string
      content:
        type: string
      message_id:
        type: string
      priority:
        type: integer
      sender_ip:
        type: string
      sender_name:
        type: string
      sender_user_id:
        description: user that sent the message (this is also the owner of the channel
          that contains it)
        type: string
      timestamp:
        type: string
      title:
        type: string
      trimmed:
        type: boolean
      used_key_id:
        type: string
      usr_message_id:
        type: string
    type: object
  models.SenderNameStatistics:
    properties:
      count:
        type: integer
      first_timestamp:
        type: string
      last_timestamp:
        type: string
      name:
        type: string
    type: object
  models.Subscription:
    properties:
      active:
        description: Subscriber has activated the subscription (default)
        type: boolean
      channel_id:
        type: string
      channel_internal_name:
        type: string
      channel_owner_user_id:
        type: string
      confirmed:
        description: Channel-Owner confirmed subscription
        type: boolean
      subscriber_user_id:
        type: string
      subscription_id:
        type: string
      timestamp_created:
        type: string
    type: object
  models.TokenPerm:
    enum:
    - A
    - CR
    - CS
    - UR
    type: string
    x-enum-comments:
      PermAdmin: Edit userdata (+ includes all other permissions)
      PermChannelRead: Read messages
      PermChannelSend: Send messages
      PermUserRead: Read userdata
    x-enum-varnames:
    - PermAdmin
    - PermChannelRead
    - PermChannelSend
    - PermUserRead
  models.User:
    properties:
      default_channel:
        type: string
      default_priority:
        type: integer
      is_pro:
        type: boolean
      max_body_size:
        type: integer
      max_channel_description_length:
        type: integer
      max_channel_name_length:
        type: integer
      max_sender_name_length:
        type: integer
      max_title_length:
        type: integer
      max_user_message_id_length:
        type: integer
      messages_sent:
        type: integer
      quota_max:
        type: integer
      quota_remaining:
        type: integer
      quota_used:
        type: integer
      timestamp_created:
        type: string
      timestamp_lastread:
        type: string
      timestamp_lastsent:
        type: string
      user_id:
        type: string
      username:
        type: string
    type: object
  models.UserPreview:
    properties:
      user_id:
        type: string
      username:
        type: string
    type: object
  models.UserWithClientsAndKeys:
    properties:
      admin_key:
        type: string
      clients:
        items:
          $ref: '#/definitions/models.Client'
        type: array
      default_channel:
        type: string
      default_priority:
        type: integer
      is_pro:
        type: boolean
      max_body_size:
        type: integer
      max_channel_description_length:
        type: integer
      max_channel_name_length:
        type: integer
      max_sender_name_length:
        type: integer
      max_title_length:
        type: integer
      max_user_message_id_length:
        type: integer
      messages_sent:
        type: integer
      quota_max:
        type: integer
      quota_remaining:
        type: integer
      quota_used:
        type: integer
      read_key:
        type: string
      send_key:
        type: string
      timestamp_created:
        type: string
      timestamp_lastread:
        type: string
      timestamp_lastsent:
        type: string
      user_id:
        type: string
      username:
        type: string
    type: object
host: simplecloudnotifier.de
info:
  contact: {}
  description: API for SCN
  title: SimpleCloudNotifier API
  version: "2.0"
paths:
  /:
    post:
      description: All parameter can be set via query-parameter or the json body.
        Only UserID, UserKey and Title are required
      parameters:
      - example: test
        in: query
        name: channel
        type: string
      - example: This is a message
        in: query
        name: content
        type: string
      - example: P3TNH8mvv14fm
        in: query
        name: key
        type: string
      - example: db8b0e6a-a08c-4646
        in: query
        name: msg_id
        type: string
      - enum:
        - 0
        - 1
        - 2
        example: 1
        in: query
        name: priority
        type: integer
      - example: example-server
        in: query
        name: sender_name
        type: string
      - example: 1669824037
        in: query
        name: timestamp
        type: number
      - example: Hello World
        in: query
        name: title
        type: string
      - example: "7725"
        in: query
        name: user_id
        type: string
      - description: ' '
        in: body
        name: post_body
        schema:
          $ref: '#/definitions/handler.SendMessage.combined'
      - example: test
        in: formData
        name: channel
        type: string
      - example: This is a message
        in: formData
        name: content
        type: string
      - example: P3TNH8mvv14fm
        in: formData
        name: key
        type: string
      - example: db8b0e6a-a08c-4646
        in: formData
        name: msg_id
        type: string
      - enum:
        - 0
        - 1
        - 2
        example: 1
        in: formData
        name: priority
        type: integer
      - example: example-server
        in: formData
        name: sender_name
        type: string
      - example: 1669824037
        in: formData
        name: timestamp
        type: number
      - example: Hello World
        in: formData
        name: title
        type: string
      - example: "7725"
        in: formData
        name: user_id
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.SendMessage.response'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: The user_id was not found or the user_key is wrong
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "403":
          description: The user has exceeded its daily quota - wait 24 hours or upgrade
            your account
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: An internal server error occurred - try again later
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Send a new message
      tags:
      - External
  /api/ack.php:
    get:
      deprecated: true
      operationId: compat-ack
      parameters:
      - description: the user_id
        in: query
        name: user_id
        required: true
        type: string
      - description: the user_key
        in: query
        name: user_key
        required: true
        type: string
      - description: the message id
        in: query
        name: scn_msg_id
        required: true
        type: string
      - description: the user_id
        in: formData
        name: user_id
        required: true
        type: string
      - description: the user_key
        in: formData
        name: user_key
        required: true
        type: string
      - description: the message id
        in: formData
        name: scn_msg_id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.Ack.response'
        default:
          description: ""
          schema:
            $ref: '#/definitions/ginresp.compatAPIError'
      summary: Acknowledge that a message was received
      tags:
      - API-v1
  /api/db-test:
    post:
      operationId: api-common-dbtest
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.DatabaseTest.response'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Check for a working database connection
      tags:
      - Common
  /api/expand.php:
    get:
      deprecated: true
      operationId: compat-expand
      parameters:
      - description: The user_id
        in: query
        name: user_id
        required: true
        type: string
      - description: The user_key
        in: query
        name: user_key
        required: true
        type: string
      - description: The message-id
        in: query
        name: scn_msg_id
        required: true
        type: string
      - description: The user_id
        in: formData
        name: user_id
        required: true
        type: string
      - description: The user_key
        in: formData
        name: user_key
        required: true
        type: string
      - description: The message-id
        in: formData
        name: scn_msg_id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.Expand.response'
        default:
          description: ""
          schema:
            $ref: '#/definitions/ginresp.compatAPIError'
      summary: Get a whole (potentially truncated) message
      tags:
      - API-v1
  /api/health:
    get:
      operationId: api-common-health
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.Health.response'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Server Health-checks
      tags:
      - Common
  /api/info.php:
    get:
      deprecated: true
      operationId: compat-info
      parameters:
      - description: the user_id
        in: query
        name: user_id
        required: true
        type: string
      - description: the user_key
        in: query
        name: user_key
        required: true
        type: string
      - description: the user_id
        in: formData
        name: user_id
        required: true
        type: string
      - description: the user_key
        in: formData
        name: user_key
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.Info.response'
        default:
          description: ""
          schema:
            $ref: '#/definitions/ginresp.compatAPIError'
      summary: Get information about the current user
      tags:
      - API-v1
  /api/ping:
    delete:
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.pingResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Simple endpoint to test connection (any http method)
      tags:
      - Common
    get:
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.pingResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Simple endpoint to test connection (any http method)
      tags:
      - Common
    patch:
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.pingResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Simple endpoint to test connection (any http method)
      tags:
      - Common
    post:
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.pingResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Simple endpoint to test connection (any http method)
      tags:
      - Common
    put:
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.pingResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Simple endpoint to test connection (any http method)
      tags:
      - Common
  /api/register.php:
    get:
      deprecated: true
      operationId: compat-register
      parameters:
      - description: the (android) fcm token
        in: query
        name: fcm_token
        required: true
        type: string
      - description: if the user is a paid account
        enum:
        - "true"
        - "false"
        in: query
        name: pro
        required: true
        type: string
      - description: the (android) IAP token
        in: query
        name: pro_token
        required: true
        type: string
      - description: the (android) fcm token
        in: formData
        name: fcm_token
        required: true
        type: string
      - description: if the user is a paid account
        enum:
        - "true"
        - "false"
        in: formData
        name: pro
        required: true
        type: string
      - description: the (android) IAP token
        in: formData
        name: pro_token
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.Register.response'
        default:
          description: ""
          schema:
            $ref: '#/definitions/ginresp.compatAPIError'
      summary: Register a new account
      tags:
      - API-v1
  /api/requery.php:
    get:
      deprecated: true
      operationId: compat-requery
      parameters:
      - description: the user_id
        in: query
        name: user_id
        required: true
        type: string
      - description: the user_key
        in: query
        name: user_key
        required: true
        type: string
      - description: the user_id
        in: formData
        name: user_id
        required: true
        type: string
      - description: the user_key
        in: formData
        name: user_key
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.Requery.response'
        default:
          description: ""
          schema:
            $ref: '#/definitions/ginresp.compatAPIError'
      summary: Return all not-acknowledged messages
      tags:
      - API-v1
  /api/sleep/{secs}:
    post:
      operationId: api-common-sleep
      parameters:
      - description: sleep delay (in seconds)
        in: path
        name: secs
        required: true
        type: number
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.Sleep.response'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Return 200 after x seconds
      tags:
      - Common
  /api/update.php:
    get:
      deprecated: true
      operationId: compat-update
      parameters:
      - description: the user_id
        in: query
        name: user_id
        required: true
        type: string
      - description: the user_key
        in: query
        name: user_key
        required: true
        type: string
      - description: the (android) fcm token
        in: query
        name: fcm_token
        required: true
        type: string
      - description: the user_id
        in: formData
        name: user_id
        required: true
        type: string
      - description: the user_key
        in: formData
        name: user_key
        required: true
        type: string
      - description: the (android) fcm token
        in: formData
        name: fcm_token
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.Update.response'
        default:
          description: ""
          schema:
            $ref: '#/definitions/ginresp.compatAPIError'
      summary: Set the fcm-token (android)
      tags:
      - API-v1
  /api/upgrade.php:
    get:
      deprecated: true
      operationId: compat-upgrade
      parameters:
      - description: the user_id
        in: query
        name: user_id
        required: true
        type: string
      - description: the user_key
        in: query
        name: user_key
        required: true
        type: string
      - description: if the user is a paid account
        enum:
        - "true"
        - "false"
        in: query
        name: pro
        required: true
        type: string
      - description: the (android) IAP token
        in: query
        name: pro_token
        required: true
        type: string
      - description: the user_id
        in: formData
        name: user_id
        required: true
        type: string
      - description: the user_key
        in: formData
        name: user_key
        required: true
        type: string
      - description: if the user is a paid account
        enum:
        - "true"
        - "false"
        in: formData
        name: pro
        required: true
        type: string
      - description: the (android) IAP token
        in: formData
        name: pro_token
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.Upgrade.response'
        default:
          description: ""
          schema:
            $ref: '#/definitions/ginresp.compatAPIError'
      summary: Upgrade a free account to a paid account
      tags:
      - API-v1
  /api/v2/messages:
    get:
      description: |-
        The next_page_token is an opaque token, the special value "@start" (or empty-string) is the beginning and "@end" is the end
        Simply start the pagination without a next_page_token and get the next page by calling this endpoint with the returned next_page_token of the last query
        If there are no more entries the token "@end" will be returned
        By default we return long messages with a trimmed body, if trimmed=false is supplied we return full messages (this reduces the max page_size)
      operationId: api-messages-list
      parameters:
      - description: RFC3339
        in: query
        name: after
        type: string
      - description: RFC3339
        in: query
        name: before
        type: string
      - collectionFormat: csv
        in: query
        items:
          type: string
        name: channel
        type: array
      - collectionFormat: csv
        in: query
        items:
          type: string
        name: channel_id
        type: array
      - in: query
        name: has_sender
        type: boolean
      - in: query
        name: next_page_token
        type: string
      - in: query
        name: page_size
        type: integer
      - collectionFormat: csv
        in: query
        items:
          type: integer
        name: priority
        type: array
      - collectionFormat: csv
        in: query
        items:
          type: string
        name: search
        type: array
      - collectionFormat: csv
        in: query
        items:
          type: string
        name: sender
        type: array
      - collectionFormat: csv
        in: query
        items:
          type: string
        name: string_search
        type: array
      - in: query
        name: trimmed
        type: boolean
      - collectionFormat: csv
        in: query
        items:
          type: string
        name: used_key
        type: array
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.ListMessages.response'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: List all (subscribed) messages
      tags:
      - API-v2
  /api/v2/messages/{mid}:
    delete:
      description: The user must own the message and request the resource with the
        ADMIN Key
      operationId: api-messages-delete
      parameters:
      - description: MessageID
        in: path
        name: mid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Message'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: message not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Delete a single message
      tags:
      - API-v2
    get:
      description: |-
        The user must either own the message and request the resource with the READ or ADMIN Key
        Or the user must subscribe to the corresponding channel (and be confirmed) and request the resource with the READ or ADMIN Key
        The returned message is never trimmed
      operationId: api-messages-get
      parameters:
      - description: MessageID
        in: path
        name: mid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Message'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: message not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Get a single message (untrimmed)
      tags:
      - API-v2
  /api/v2/preview/channels/{cid}:
    get:
      operationId: api-channels-get-preview
      parameters:
      - description: ChannelID
        in: path
        name: cid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.ChannelPreview'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: channel not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Get a single channel (similar to api-channels-get, but can be called
        from anyone and only returns a subset of fields)
      tags:
      - API-v2
  /api/v2/preview/keys/{kid}:
    get:
      operationId: api-tokenkeys-get-preview
      parameters:
      - description: TokenKeyID (actual token || token-id)
        in: path
        name: kid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.KeyTokenPreview'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: message not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Get a single key (similar to api-tokenkeys-get, but can be called from
        anyone and only returns a subset of fields)
      tags:
      - API-v2
  /api/v2/preview/users/{uid}:
    get:
      operationId: api-user-get-preview
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.UserPreview'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: user not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Get a user (similar to api-user-get, but can be called from anyone
        and only returns a subset of fields)
      tags:
      - API-v2
  /api/v2/sender-names:
    get:
      operationId: api-sendernames-list
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.ListSenderNames.response'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: message not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: List sender-names (of all messages this user can view, eitehr own or
        foreign-subscribed)
      tags:
      - API-v2
  /api/v2/users:
    post:
      operationId: api-user-create
      parameters:
      - description: ' '
        in: body
        name: post_body
        schema:
          $ref: '#/definitions/handler.CreateUser.body'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.UserWithClientsAndKeys'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Create a new user
      tags:
      - API-v2
  /api/v2/users/{uid}:
    get:
      operationId: api-user-get
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.User'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: user not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Get a user
      tags:
      - API-v2
    patch:
      operationId: api-user-delete
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.User'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: user not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: (Self-)Deletes a user (including all entities - all messages, channels,
        clients, .....)
      tags:
      - API-v2
  /api/v2/users/{uid}/channels:
    get:
      description: |-
        The possible values for 'selector' are:
        - "owned"          Return all channels of the user
        - "subscribed"     Return all channels that the user is subscribing to
        - "all"            Return channels that the user owns or is subscribing
        - "subscribed_any" Return all channels that the user is subscribing to (even unconfirmed)
        - "all_any"        Return channels that the user owns or is subscribing (even unconfirmed)
      operationId: api-channels-list
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: 'Filter channels (default: owned)'
        enum:
        - owned
        - subscribed
        - all
        - subscribed_any
        - all_any
        in: query
        name: selector
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.ListChannels.response'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: List channels of a user (subscribed/owned/all)
      tags:
      - API-v2
    post:
      operationId: api-channels-create
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: ' '
        in: body
        name: post_body
        schema:
          $ref: '#/definitions/handler.CreateChannel.body'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.ChannelWithSubscription'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "409":
          description: channel already exists
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Create a new (empty) channel
      tags:
      - API-v2
  /api/v2/users/{uid}/channels/{cid}:
    get:
      operationId: api-channels-get
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: ChannelID
        in: path
        name: cid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.ChannelWithSubscription'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: channel not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Get a single channel
      tags:
      - API-v2
    patch:
      operationId: api-channels-delete
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: ChannelID
        in: path
        name: cid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Channel'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: channel not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: delete a channel (including all messages, subscriptions, etc)
      tags:
      - API-v2
  /api/v2/users/{uid}/channels/{cid}/messages:
    get:
      description: |-
        The next_page_token is an opaque token, the special value "@start" (or empty-string) is the beginning and "@end" is the end
        Simply start the pagination without a next_page_token and get the next page by calling this endpoint with the returned next_page_token of the last query
        If there are no more entries the token "@end" will be returned
        By default we return long messages with a trimmed body, if trimmed=false is supplied we return full messages (this reduces the max page_size)
      operationId: api-channel-messages
      parameters:
      - in: query
        name: next_page_token
        type: string
      - in: query
        name: page_size
        type: integer
      - in: query
        name: trimmed
        type: boolean
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: ChannelID
        in: path
        name: cid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.ListChannelMessages.response'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: channel not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: List messages of a channel
      tags:
      - API-v2
  /api/v2/users/{uid}/channels/{cid}/subscriptions:
    get:
      operationId: api-chan-subscriptions-list
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: ChannelID
        in: path
        name: cid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.ListChannelSubscriptions.response'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: channel not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: List all subscriptions of a channel
      tags:
      - API-v2
  /api/v2/users/{uid}/clients:
    get:
      operationId: api-clients-list
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.ListClients.response'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: List all clients
      tags:
      - API-v2
    post:
      operationId: api-clients-create
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: ' '
        in: body
        name: post_body
        schema:
          $ref: '#/definitions/handler.AddClient.body'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Client'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Add a new clients
      tags:
      - API-v2
  /api/v2/users/{uid}/clients/{cid}:
    delete:
      operationId: api-clients-delete
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: ClientID
        in: path
        name: cid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Client'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: client not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Delete a client
      tags:
      - API-v2
    get:
      operationId: api-clients-get
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: ClientID
        in: path
        name: cid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Client'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: client not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Get a single client
      tags:
      - API-v2
    patch:
      description: The body-values are optional, only send the ones you want to update
      operationId: api-client-update
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: ClientID
        in: path
        name: cid
        required: true
        type: string
      - description: Change the clientname (send an empty string to clear it)
        in: body
        name: clientname
        schema:
          type: string
      - description: Send a verification of premium purchase
        in: body
        name: pro_token
        schema:
          type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Client'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: client is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: client not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: (Partially) update a client
      tags:
      - API-v2
  /api/v2/users/{uid}/keys:
    get:
      operationId: api-usersendernames-list
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.ListUserKeys.response'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: message not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: List sender-names (of allthe messages of this user)
      tags:
      - API-v2
    post:
      operationId: api-tokenkeys-create
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: ' '
        in: body
        name: post_body
        schema:
          $ref: '#/definitions/handler.CreateUserKey.body'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.KeyToken'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: message not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Create a new key
      tags:
      - API-v2
  /api/v2/users/{uid}/keys/{kid}:
    delete:
      description: Cannot be used to delete the key used in the request itself
      operationId: api-tokenkeys-delete
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: TokenKeyID
        in: path
        name: kid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.KeyToken'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: message not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Delete a key
      tags:
      - API-v2
    get:
      description: The request must be done with an ADMIN key, the returned key does
        not include its token.
      operationId: api-tokenkeys-get
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: TokenKeyID
        in: path
        name: kid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.KeyToken'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: message not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Get a single key
      tags:
      - API-v2
    patch:
      operationId: api-tokenkeys-update
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: TokenKeyID
        in: path
        name: kid
        required: true
        type: string
      - description: ' '
        in: body
        name: post_body
        schema:
          $ref: '#/definitions/handler.UpdateUserKey.body'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.KeyToken'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: message not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Update a key
      tags:
      - API-v2
  /api/v2/users/{uid}/keys/current:
    get:
      description: Can be done with keys of any permission - the returned key does
        not include its token.
      operationId: api-tokenkeys-get-current
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: TokenKeyID
        in: path
        name: kid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.KeyToken'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: message not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Get the key currently used by this request
      tags:
      - API-v2
  /api/v2/users/{uid}/subscriptions:
    get:
      description: |-
        The possible values for 'direction' are:
        - "outgoing"       Subscriptions with the user as subscriber (= subscriptions he can use to read channels)
        - "incoming"       Subscriptions to channels of this user (= incoming subscriptions and subscription requests)
        - "both"           Combines "outgoing" and "incoming" (default)

        The possible values for 'confirmation' are:
        - "confirmed"      Confirmed (active) subscriptions
        - "unconfirmed"    Unconfirmed (pending) subscriptions
        - "all"            Combines "confirmed" and "unconfirmed" (default)

        The possible values for 'external' are:
        - "true"           Subscriptions with subscriber_user_id != channel_owner_user_id  (subscriptions from other users)
        - "false"          Subscriptions with subscriber_user_id == channel_owner_user_id  (subscriptions from this user to his own channels)
        - "all"            Combines "external" and "internal" (default)

        The `subscriber_user_id` parameter can be used to additionally filter the subscriber_user_id (return subscribtions from a specific user)

        The `channel_owner_user_id` parameter can be used to additionally filter the channel_owner_user_id (return subscribtions to a specific user)
      operationId: api-user-subscriptions-list
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: 'Filter subscriptions (default: outgoing_all)'
        enum:
        - outgoing_all
        - outgoing_confirmed
        - outgoing_unconfirmed
        - incoming_all
        - incoming_confirmed
        - incoming_unconfirmed
        in: query
        name: selector
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.ListUserSubscriptions.response'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: List all subscriptions of a user (incoming/owned)
      tags:
      - API-v2
    post:
      description: Either [channel_owner_user_id, channel_internal_name] or [channel_id]
        must be supplied in the request body
      operationId: api-subscriptions-create
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - in: query
        name: chan_subscribe_key
        type: string
      - description: ' '
        in: body
        name: post_data
        schema:
          $ref: '#/definitions/handler.CreateSubscription.body'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Subscription'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Create/Request a subscription
      tags:
      - API-v2
  /api/v2/users/{uid}/subscriptions/{sid}:
    delete:
      operationId: api-subscriptions-delete
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: SubscriptionID
        in: path
        name: sid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Subscription'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: subscription not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Cancel (delete) subscription
      tags:
      - API-v2
    get:
      operationId: api-subscriptions-get
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: SubscriptionID
        in: path
        name: sid
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Subscription'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: subscription not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Get a single subscription
      tags:
      - API-v2
    patch:
      operationId: api-subscriptions-update
      parameters:
      - description: UserID
        in: path
        name: uid
        required: true
        type: string
      - description: SubscriptionID
        in: path
        name: sid
        required: true
        type: string
      - description: ' '
        in: body
        name: post_data
        schema:
          $ref: '#/definitions/handler.UpdateSubscription.body'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.Subscription'
        "400":
          description: supplied values/parameters cannot be parsed / are invalid
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: user is not authorized / has missing permissions
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "404":
          description: subscription not found
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: internal server error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Update a subscription (e.g. confirm)
      tags:
      - API-v2
  /external/v1/uptime-kuma:
    post:
      description: All parameter can be set via query-parameter or the json body.
        Only UserID, UserKey and Title are required
      parameters:
      - in: query
        name: channel
        type: string
      - in: query
        name: channel_down
        type: string
      - in: query
        name: channel_up
        type: string
      - example: P3TNH8mvv14fm
        in: query
        name: key
        type: string
      - in: query
        name: priority
        type: integer
      - in: query
        name: priority_down
        type: integer
      - in: query
        name: priority_up
        type: integer
      - in: query
        name: senderName
        type: string
      - example: "7725"
        in: query
        name: user_id
        type: string
      - description: ' '
        in: body
        name: post_body
        schema:
          $ref: '#/definitions/handler.UptimeKuma.body'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.UptimeKuma.response'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: The user_id was not found or the user_key is wrong
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "403":
          description: The user has exceeded its daily quota - wait 24 hours or upgrade
            your account
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: An internal server error occurred - try again later
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Send a new message
      tags:
      - External
  /send:
    post:
      description: All parameter can be set via query-parameter or the json body.
        Only UserID, UserKey and Title are required
      parameters:
      - example: test
        in: query
        name: channel
        type: string
      - example: This is a message
        in: query
        name: content
        type: string
      - example: P3TNH8mvv14fm
        in: query
        name: key
        type: string
      - example: db8b0e6a-a08c-4646
        in: query
        name: msg_id
        type: string
      - enum:
        - 0
        - 1
        - 2
        example: 1
        in: query
        name: priority
        type: integer
      - example: example-server
        in: query
        name: sender_name
        type: string
      - example: 1669824037
        in: query
        name: timestamp
        type: number
      - example: Hello World
        in: query
        name: title
        type: string
      - example: "7725"
        in: query
        name: user_id
        type: string
      - description: ' '
        in: body
        name: post_body
        schema:
          $ref: '#/definitions/handler.SendMessage.combined'
      - example: test
        in: formData
        name: channel
        type: string
      - example: This is a message
        in: formData
        name: content
        type: string
      - example: P3TNH8mvv14fm
        in: formData
        name: key
        type: string
      - example: db8b0e6a-a08c-4646
        in: formData
        name: msg_id
        type: string
      - enum:
        - 0
        - 1
        - 2
        example: 1
        in: formData
        name: priority
        type: integer
      - example: example-server
        in: formData
        name: sender_name
        type: string
      - example: 1669824037
        in: formData
        name: timestamp
        type: number
      - example: Hello World
        in: formData
        name: title
        type: string
      - example: "7725"
        in: formData
        name: user_id
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.SendMessage.response'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: The user_id was not found or the user_key is wrong
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "403":
          description: The user has exceeded its daily quota - wait 24 hours or upgrade
            your account
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: An internal server error occurred - try again later
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Send a new message
      tags:
      - External
  /send.php:
    post:
      deprecated: true
      description: All parameter can be set via query-parameter or form-data body.
        Only UserID, UserKey and Title are required
      parameters:
      - example: test
        in: query
        name: channel
        type: string
      - example: This is a message
        in: query
        name: content
        type: string
      - example: P3TNH8mvv14fm
        in: query
        name: key
        type: string
      - example: db8b0e6a-a08c-4646
        in: query
        name: msg_id
        type: string
      - enum:
        - 0
        - 1
        - 2
        example: 1
        in: query
        name: priority
        type: integer
      - example: example-server
        in: query
        name: sender_name
        type: string
      - example: 1669824037
        in: query
        name: timestamp
        type: number
      - example: Hello World
        in: query
        name: title
        type: string
      - example: "7725"
        in: query
        name: user_id
        type: string
      - example: test
        in: formData
        name: channel
        type: string
      - example: This is a message
        in: formData
        name: content
        type: string
      - example: P3TNH8mvv14fm
        in: formData
        name: key
        type: string
      - example: db8b0e6a-a08c-4646
        in: formData
        name: msg_id
        type: string
      - enum:
        - 0
        - 1
        - 2
        example: 1
        in: formData
        name: priority
        type: integer
      - example: example-server
        in: formData
        name: sender_name
        type: string
      - example: 1669824037
        in: formData
        name: timestamp
        type: number
      - example: Hello World
        in: formData
        name: title
        type: string
      - example: "7725"
        in: formData
        name: user_id
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handler.SendMessage.response'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/ginresp.apiError'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/ginresp.apiError'
      summary: Send a new message (compatibility)
      tags:
      - External
swagger: "2.0"
tags:
- name: External
- name: API-v1
- name: API-v2
- name: Common