openapi: 3.0.3
info:
  title: Quiz Service API
  description: API for managing quizzes, questions, answers and statistics
  version: 2.0.0
paths:
  /account/get:
    get:
      tags: [Account]
      summary: Get the current account details
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Successfully retrieved account details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Account'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /account/create:
    post:
      tags: [Account]
      summary: Create a new account
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Account created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Account'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '409':
          $ref: '#/components/responses/ConflictError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /account/delete:
    delete:
      tags: [Account]
      summary: Delete the current account
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Account deleted successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  accountId:
                    type: string
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /accounts:
    get:
      tags: [Account]
      summary: Retrieve a list of accounts
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                limit:
                  type: integer
                  format: uint64
                page:
                  type: integer
                  format: uint64
      responses:
        '200':
          description: Successfully retrieved list of accounts
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                    format: uint64
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/Account'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /privilege/{userId}:
    get:
      tags: [Account]
      summary: Get privileges by user ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                userId:
                  type: string
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Successfully retrieved privileges for the user
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ShortPrivilege'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /account/{userId}:
    delete:
      tags: [Account]
      summary: Delete account by user ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                userId:
                  type: string
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Successfully deleted the account
          content:
            application/json:
              schema:
                type: object
                properties:
                  userId:
                    type: string
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /account/manualdone:
    post:
      tags: [Account]
      summary: Manually mark an account as done
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - id
              properties:
                id:
                  type: string
                  description: User ID to mark as done
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Account marked as done
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /account/leadtarget:
    post:
      tags: [Account]
      summary: Add a lead target for sending client requests
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - type
                - quizID
                - target
              properties:
                type:
                  type: string
                  description: Type of target (mail, telegram, whatsapp)
                  enum:
                    - mail
                    - telegram
                    - whatsapp
                quizID:
                  type: integer
                  format: int32
                  description: The associated quiz ID (0 for general rules)
                target:
                  type: string
                  description: The target address (email, channel ID, phone number)
                name:
                  type: string
                  description: Name (e.g., for Telegram channel)
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Lead target added successfully
        '208':
          $ref: '#/components/responses/AlreadyReportedError'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'

    put:
      tags: [Account]
      summary: Update a lead target
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - id
                - target
              properties:
                id:
                  type: integer
                  format: int64
                  description: Lead target ID (primary key)
                target:
                  type: string
                  description: The target address (email, channel ID, phone number)
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Lead target updated successfully
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /account/leadtarget/{id}:
    delete:
      tags: [Account]
      summary: Delete a lead target by its ID
      parameters:
        - name: id
          in: path
          required: true
          description: The ID of the lead target to delete
          schema:
            type: string
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Lead target deleted successfully
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /account/leadtarget/{quizID}:
    get:
      tags: [Account]
      summary: Get lead target by quiz ID
      parameters:
        - name: quizID
          in: path
          required: true
          description: The quiz ID associated with the lead target
          schema:
            type: string
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Successfully retrieved lead target by quiz ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LeadTarget'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /question/create:
    post:
      tags: [Question]
      summary: Create a new question
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/QuestionCreateRequest'
      responses:
        '200':
          description: Question created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Question'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '406':
          $ref: '#/components/responses/StatusNotAcceptableError'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
        '424':
          $ref: '#/components/responses/StatusFailedDependencyError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /question/getList:
    post:
      tags: [Question]
      summary: Get a paginated list of questions
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetQuestionListRequest'
      responses:
        '200':
          description: Successfully retrieved question list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetQuestionListResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '406':
          $ref: '#/components/responses/StatusNotAcceptableError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /question/edit:
    patch:
      tags: [Question]
      summary: Update an existing question
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateQuestionRequest'
      responses:
        '200':
          description: Question updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpdateQuestionResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '406':
          $ref: '#/components/responses/StatusNotAcceptableError'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
        '424':
          $ref: '#/components/responses/StatusFailedDependencyError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /question/copy:
    post:
      tags: [Question]
      summary: Create a copy of an existing question
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CopyQuestionRequest'
      responses:
        '200':
          description: Question copied successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Question'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '424':
          $ref: '#/components/responses/StatusFailedDependencyError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /question/history:
    post:
      tags: [Question]
      summary: Get question history
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetQuestionHistoryRequest'
      responses:
        '200':
          description: Successfully retrieved question history
          content:
            application/json:
              schema:
                items:
                  type: array
                  items:
                    $ref: '#/components/schemas/Question'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '424':
          $ref: '#/components/responses/StatusFailedDependencyError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /question/delete:
    delete:
      tags: [Question]
      summary: Delete a question
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeactivateQuestionRequest'
      responses:
        '200':
          description: Question deleted successfully    
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeactivateQuestionResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '424':
          $ref: '#/components/responses/StatusFailedDependencyError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /quiz/create:
    post:
      tags: [Quiz]
      summary: Create a new quiz
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateQuizRequest'
      responses:
        '201':
          description: Quiz created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Quiz'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '406':
          $ref: '#/components/responses/StatusNotAcceptableError'
        '409':
          $ref: '#/components/responses/StatusConflictError'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
        '500':
          $ref: '#/components/responses/InternalServerError'

  /quiz/getList:
    post:
      tags: [Quiz]
      summary: Get a paginated list of quizzes
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetQuizListRequest'
      responses:
        '200':
          description: Successfully retrieved quiz list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetQuizListResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '406':
          $ref: '#/components/responses/StatusNotAcceptableError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /quiz/edit:
    patch:
      tags: [Quiz]
      summary: Update an existing quiz
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateQuizRequest'
      responses:
        '200':
          description: Quiz updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpdateQuizResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '406':
          $ref: '#/components/responses/StatusNotAcceptableError'
        '409':
          $ref: '#/components/responses/StatusConflictError'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
        '424':
          $ref: '#/components/responses/StatusFailedDependencyError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /quiz/copy:
    post:
      tags: [Quiz]
      summary: Create a copy of an existing quiz
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CopyQuizRequest'
      responses:
        '200':
          description: Quiz copied successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Quiz'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '424':
          $ref: '#/components/responses/StatusFailedDependencyError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /quiz/history:
    post:
      tags: [Quiz]
      summary: Get quiz history
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetQuizHistoryRequest'
      responses:
        '200':
          description: Successfully retrieved quiz history
          content:
            application/json:
              schema:
                items:
                  type: array
                  items:
                    $ref: '#/components/schemas/Quiz'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '424':
          $ref: '#/components/responses/StatusFailedDependencyError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /quiz/delete:
    delete:
      tags: [Quiz]
      summary: Delete a quiz
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeleteQuizRequest'
      responses:
        '200':
          description: Quiz deleted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteQuizResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '424':
          $ref: '#/components/responses/StatusFailedDependencyError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /quiz/archive:
    patch:
      tags: [Quiz]
      summary: Archive a quiz
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeleteQuizRequest'
      responses:
        '200':
          description: Quiz archived successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteQuizResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '424':
          $ref: '#/components/responses/StatusFailedDependencyError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /quiz/move:
    post:
      tags: [Quiz]
      summary: Move a quiz to another account
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/QuizMoveRequest'
      responses:
        '200':
          description: Quiz moved successfully
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /quiz/template:
    post:
      tags: [Quiz]
      summary: Create a copy of a quiz template
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Template copied successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /results/getResults/{quizId}:
    post:
      tags: [Result]
      summary: Get results for a specific quiz
      security:
        - bearerAuth: []
      parameters:
        - name: quizId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetResultsRequest'
      responses:
        '200':
          description: Successfully retrieved quiz results
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetResultsResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /results/{resultId}:
    delete:
      tags: [Result]
      summary: Delete a specific result
      security:
        - bearerAuth: []
      parameters:
        - name: resultId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Result deleted successfully
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /result/seen:
    patch:
      tags: [Result]
      summary: Update status of multiple results
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateResultsStatusRequest'
      responses:
        '200':
          description: Results status updated successfully
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '406':
          description: Could not update some answers due to insufficient rights
        '500':
          $ref: '#/components/responses/InternalServerError'

  /results/{quizID}/export:
    post:
      tags: [Result]
      summary: Export quiz results to Excel
      security:
        - bearerAuth: []
      parameters:
        - name: quizID
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetResultsRequest'
      responses:
        '200':
          description: Successfully exported results
          content:
            application/vnd.openxmlformats-officedocument.spreadsheetml.sheet:
              schema:
                type: string
                format: binary
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '402':
          description: Payment required
        '500':
          $ref: '#/components/responses/InternalServerError'

  /result/{resultID}:
    get:
      tags: [Result]
      summary: Get answers for a specific result
      security:
        - bearerAuth: []
      parameters:
        - name: resultID
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Successfully retrieved result answers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Answer'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '402':
          description: Payment required
        '500':
          $ref: '#/components/responses/InternalServerError'

  /statistic/{quizID}/devices:
    post:
      tags: [Statistic]
      summary: Get device statistics for quiz
      security:
        - bearerAuth: []
      parameters:
        - name: quizID
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeviceStatRequest'
      responses:
        '200':
          description: Successfully retrieved device statistics
          content:
            application/json:
              schema:
                type: object
                properties:
                  devices:
                    type: array
                    items:
                      $ref: '#/components/schemas/DeviceStat'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /statistic/{quizID}/general:
    post:
      tags: [Statistic]
      summary: Get general statistics for quiz
      security:
        - bearerAuth: []
      parameters:
        - name: quizID
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeviceStatRequest'
      responses:
        '200':
          description: Successfully retrieved general statistics
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneralStatsResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /statistic/{quizID}/questions:
    post:
      tags: [Statistic]
      summary: Get question statistics for quiz
      security:
        - bearerAuth: []
      parameters:
        - name: quizID
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeviceStatRequest'
      responses:
        '200':
          description: Successfully retrieved question statistics
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/QuestionStat'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /statistic:
    post:
      tags: [Statistic]
      summary: Get global service statistics
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeviceStatRequest'
      responses:
        '200':
          description: Successfully retrieved service statistics
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceStatistics'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /statistics/{quizID}/pipelines:
    get:
      tags: [Statistic]
      summary: Get pipeline statistics for quiz
      security:
        - bearerAuth: []
      parameters:
        - name: quizID
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeviceStatRequest'
      responses:
        '200':
          description: Successfully retrieved pipeline statistics
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PipelineStat'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /telegram/pool:
    get:
      tags: [Telegram]
      summary: Get all non-deleted Telegram accounts (active, inactive, and banned)
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Successfully retrieved Telegram accounts
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TelegramAccount'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /telegram/create:
    post:
      tags: [Telegram]
      summary: Authorize server in Telegram account
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TelegramAuthRequest'
      responses:
        '200':
          description: Authorization started successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  signature:
                    type: string
        '400':
          $ref: '#/components/responses/BadRequestError'
        '409':
          description: Account already exists and is active
        '500':
          $ref: '#/components/responses/InternalServerError'

  /telegram/{id}:
    delete:
      tags: [Telegram]
      summary: Soft delete Telegram account by ID
      security:
        - bearerAuth: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Account deleted successfully
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /telegram/setCode:
    post:
      tags: [Telegram]
      summary: Send authorization code received from Telegram
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TelegramCodeRequest'
      responses:
        '200':
          description: Code sent successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
        '400':
          $ref: '#/components/responses/BadRequestError'
        '403':
          description: Authorization failed
        '500':
          $ref: '#/components/responses/InternalServerError'

components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

  responses:
    UnauthorizedError:
      description: Unauthorized – authentication required
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: "Authentication required"
              code:
                type: integer
                example: 401

    NotFoundError:
      description: Resource not found
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: "Resource not found"
              code:
                type: integer
                example: 404

    InternalServerError:
      description: Internal server error
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: "Internal server error"
              code:
                type: integer
                example: 500

    BadRequestError:
      description: Invalid request data
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: "Invalid request data"
              code:
                type: integer
                example: 400

    ConflictError:
      description: Conflict – resource already exists
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: "Resource already exists"
              code:
                type: integer
                example: 409

    AlreadyReportedError:
      description: Resource already used
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: "Resource already used"
              code:
                type: integer
                example: 208
    StatusNotAcceptableError:
      description: Status not acceptable – requested format not supported
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: "Requested format not acceptable"
              code:
                type: integer
                example: 406

    StatusFailedDependencyError:
      description: Failed dependency – a prerequisite condition failed
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: "A prerequisite condition failed"
              code:
                type: integer
                example: 424

    StatusConflictError:
      description: Conflict – request could not be completed due to conflict with current state
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: "Conflict with current state"
              code:
                type: integer
                example: 409



  schemas:
    Account:
      type: object
      required:
        - id
        - user_id
        - created_at
      properties:
        id:
          type: string
          description: Unique identifier of the account
        user_id:
          type: string
          description: User identifier
        created_at:
          type: string
          format: date-time
          description: Account creation timestamp
        deleted:
          type: boolean
          description: Whether the account is marked as deleted
          default: false
        privileges:
          type: object
          description: Map of privileges assigned to the account
          additionalProperties:
            $ref: '#/components/schemas/ShortPrivilege'

    ShortPrivilege:
      type: object
      required:
        - id
        - privilege_id
        - privilege_name
        - amount
        - created_at
      properties:
        id:
          type: string
          description: Unique identifier of the privilege
        privilege_id:
          type: string
          description: Privilege type identifier
        privilege_name:
          type: string
          description: Name of the privilege
        amount:
          type: integer
          format: uint64
          description: Amount or limit of the privilege
        created_at:
          type: string
          format: date-time
          description: When the privilege was granted

    LeadTarget:
      type: object
      required:
        - id
        - accountID
        - type
        - target
      properties:
        id:
          type: integer
          format: int64
          description: Unique identifier of the lead target
        accountID:
          type: string
          description: ID of the account that owns this target
        type:
          type: string
          description: Type of lead target
          enum: [mail, telegram, whatsapp]
        quizID:
          type: integer
          format: int32
          description: Associated quiz ID (0 for general rules)
        target:
          type: string
          description: Target address (email, channel ID, phone number)
        inviteLink:
          type: string
          description: Invite link for Telegram channel
        deleted:
          type: boolean
          description: Whether the target is marked as deleted
          default: false
        createdAt:
          type: string
          format: date-time
          description: Creation timestamp

    CreateQuizRequest:
      type: object
      required:
        - name
      properties:
        fingerprinting:
          type: boolean
          description: Whether to store device ID
          default: false
        repeatable:
          type: boolean
          description: Whether to allow multiple quiz attempts
          default: false
        note_prevented:
          type: boolean
          description: Whether to save answers even if quiz is aborted
          default: false
        mail_notifications:
          type: boolean
          description: Whether to send email notifications for quiz completions
          default: false
        unique_answers:
          type: boolean
          description: Whether to save only the last quiz attempt
          default: false
        name:
          type: string
          description: Quiz name (max 700 characters)
          maxLength: 700
        description:
          type: string
          description: Quiz description
        config:
          type: string
          description: JSON serialized configuration for page rules
        status:
          type: string
          description: Quiz status
          enum: [draft, template, stop, start]
          default: draft
        limit:
          type: integer
          format: uint64
          description: Maximum number of quiz attempts allowed
        due_to:
          type: integer
          format: uint64
          description: Timestamp when quiz expires
        question_cnt:
          type: integer
          format: uint64
          description: Number of questions to create in one request
        time_of_passing:
          type: integer
          format: uint64
          description: Time limit for completing quiz in seconds
        pausable:
          type: boolean
          description: Whether quiz can be paused
          default: false
        super:
          type: boolean
          description: Whether this is a group quiz
          default: false
        group_id:
          type: integer
          format: uint64
          description: ID of super quiz if this is part of a group

    GetQuizListRequest:
      type: object
      properties:
        limit:
          type: integer
          format: uint64
          description: Number of items per page
          minimum: 1
          default: 10
        page:
          type: integer
          format: uint64
          description: Page number
          minimum: 1
          default: 1
        from:
          type: integer
          format: int64
          description: Start timestamp for filtering
        to:
          type: integer
          format: int64
          description: End timestamp for filtering
        search:
          type: string
          description: Search query
        status:
          type: string
          description: Filter by status
          enum: [stop, start, draft, template, timeout, offlimit]
        deleted:
          type: boolean
          description: Filter by deletion status
        archived:
          type: boolean
          description: Filter by archive status
        super:
          type: boolean
          description: Filter by group status
        group_id:
          type: integer
          format: uint64
          description: Filter by group ID

    GetQuizListResponse:
      type: object
      required:
        - count
        - items
      properties:
        count:
          type: integer
          format: uint64
          description: Total number of items
        items:
          type: array
          description: List of quizzes
          items:
            $ref: '#/components/schemas/Quiz'

    UpdateQuizRequest:
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          format: uint64
        fp:
          type: boolean
        rep:
          type: boolean
        note_prevented:
          type: boolean
        mailing:
          type: boolean
        uniq:
          type: boolean
        name:
          type: string
        desc:
          type: string
        conf:
          type: string
        status:
          type: string
          enum: [draft, template, stop, start]
        limit:
          type: integer
          format: uint64
        due_to:
          type: integer
          format: uint64
        time_of_passing:
          type: integer
          format: uint64
        pausable:
          type: boolean
        question_cnt:
          type: integer
          format: uint64
        super:
          type: boolean
        group_id:
          type: integer
          format: uint64

    UpdateQuizResponse:
      type: object
      properties:
        updated:
          type: integer
          format: uint64

    CopyQuizRequest:
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          format: uint64

    GetQuizHistoryRequest:
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          format: uint64
        l:
          type: integer
          format: uint64
        p:
          type: integer
          format: uint64

    DeleteQuizRequest:
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          format: uint64

    DeleteQuizResponse:
      type: object
      properties:
        deactivated:
          type: integer
          format: uint64

    QuizMoveRequest:
      type: object
      required:
        - qid
        - accountID
      properties:
        qid:
          type: string
        accountID:
          type: string

    QuestionCreateRequest:
      type: object
      required:
        - quiz_id
        - title
        - type
      properties:
        quiz_id:
          type: integer
          format: uint64
          description: relation to quiz
        title:
          type: string
          description: title of question (max 512 chars)
        description:
          type: string
          description: additional content in question such as pics, html markup or plain text
        type:
          type: string
          description: type of question
          enum: [text, variant, images, select, varimg, emoji, date, number, page, rating, result, file]
        required:
          type: boolean
          description: set true if question must be answered for valid quiz passing
        page:
          type: integer
          description: set page of question
        content:
          type: string
          description: json serialized config

    GetQuestionListRequest:
      type: object
      properties:
        limit:
          type: integer
          format: uint64
          description: page size
        page:
          type: integer
          format: uint64
          description: page number
        from:
          type: integer
          format: int64
          description: start of time period
        to:
          type: integer
          format: int64
        quiz_id:
          type: integer
          format: uint64
          description: relation to quiz
        search:
          type: string
          description: search string to search in files
        type:
          type: string
          description: type of questions
          enum: [text, variant, images, select, varimg, emoji, date, number, page, rating, result, file]
        deleted:
          type: boolean
          description: true to get only deleted questions
        required:
          type: boolean
          description: filter by required status

    GetQuestionListResponse:
      type: object
      properties:
        count:
          type: integer
          format: uint64
        items:
          type: array
          items:
            $ref: '#/components/schemas/Question'

    UpdateQuestionRequest:
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          format: uint64
        title:
          type: string
          description: title of question (max 512 chars)
        desc:
          type: string
          description: additional content in question
        type:
          type: string
          description: type of question
          enum: [text, variant, images, select, varimg, emoji, date, number, page, rating, result, file]
        required:
          type: boolean
          description: set true if question must be answered
        content:
          type: string
          description: json serialized config
        page:
          type: integer
          description: page number of question

    UpdateQuestionResponse:
      type: object
      properties:
        updated:
          type: integer
          format: uint64

    CopyQuestionRequest:
      type: object
      required:
        - id
        - quiz_id
      properties:
        id:
          type: integer
          format: uint64
        quiz_id:
          type: integer
          format: uint64

    GetQuestionHistoryRequest:
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          format: uint64
        l:
          type: integer
          format: uint64
        p:
          type: integer
          format: uint64

    DeactivateQuestionRequest:
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          format: uint64

    DeactivateQuestionResponse:
      type: object
      properties:
        deactivated:
          type: integer
          format: uint64

    GetResultsRequest:
      type: object
      properties:
        To:
          type: string
          format: date-time
        From:
          type: string
          format: date-time
        New:
          type: boolean
        Page:
          type: integer
          format: uint64
        Limit:
          type: integer
          format: uint64

    GetResultsResponse:
      type: object
      properties:
        total_count:
          type: integer
          format: uint64
        results:
          type: array
          items:
            $ref: '#/components/schemas/AnswerExport'

    UpdateResultsStatusRequest:
      type: object
      required:
        - Answers
      properties:
        Answers:
          type: array
          items:
            type: integer
            format: int64

    DeviceStatRequest:
      type: object
      properties:
        From:
          type: integer
          format: uint64
          description: Start timestamp for statistics
        To:
          type: integer
          format: uint64
          description: End timestamp for statistics

    DeviceStat:
      type: object
      properties:
        Device:
          type: object
          additionalProperties:
            type: number
            format: float
          description: Percentage distribution of device types across all answers with res=true
        OS:
          type: object
          additionalProperties:
            type: number
            format: float
          description: Percentage distribution of operating systems across all answers with res=true
        Browser:
          type: object
          additionalProperties:
            type: number
            format: float
          description: Percentage distribution of browsers across all answers with res=true

    GeneralStatsResponse:
      type: object
      properties:
        Open:
          type: object
          additionalProperties:
            type: integer
            format: uint64
        Result:
          type: object
          additionalProperties:
            type: integer
            format: uint64
        AvTime:
          type: object
          additionalProperties:
            type: integer
            format: uint64
        Conversion:
          type: object
          additionalProperties:
            type: integer
            format: uint64

    QuestionStat:
      type: object
      properties:
        Funnel:
          type: array
          items:
            type: number
            format: float
          maxItems: 3
          description: Three separate funnel metrics
        FunnelData:
          type: array
          items:
            type: number
            format: float
          maxItems: 4
          description: Funnel data metrics
        Results:
          type: object
          additionalProperties:
            type: number
            format: float
          description: Map of question titles to percentage of answers with result=true
        Questions:
          type: object
          additionalProperties:
            type: object
            additionalProperties:
              type: number
              format: float
          description: Map of question titles to their answer distributions

    ServiceStatistics:
      type: object
      properties:
        Registrations:
          type: integer
          format: int64
          description: Number of registered accounts from from to to
        Quizes:
          type: integer
          format: int64
          description: Number of created non-deleted quizzes
        Results:
          type: integer
          format: int64
          description: Number of answers with result=true

    PipelineStat:
      type: object
      additionalProperties:
        type: array
        items:
          type: object
          properties:
            count:
              type: integer
              format: int64
            questionID:
              type: integer
              format: int64

    TelegramAccount:
      type: object
      properties:
        ID:
          type: integer
          format: int64
          description: Unique identifier of the Telegram account
        ApiID:
          type: integer
          format: int32
          description: Telegram API ID
        ApiHash:
          type: string
          description: Telegram API Hash
        PhoneNumber:
          type: string
          description: Phone number in international format
        Password:
          type: string
          description: Account password
        Status:
          type: string
          enum: [active, inactive, ban]
          description: Current status of the Telegram account
        Deleted:
          type: boolean
          description: Whether the account is marked as deleted
        CreatedAt:
          type: string
          format: date-time
          description: Creation timestamp

    TelegramAuthRequest:
      type: object
      required:
        - api_id
        - api_hash
        - phone_number
        - password
      properties:
        api_id:
          type: integer
          format: int32
          description: Telegram API ID
        api_hash:
          type: string
          description: Telegram API Hash
        phone_number:
          type: string
          description: Phone number in international format
        password:
          type: string
          description: Account password

    TelegramCodeRequest:
      type: object
      required:
        - code
        - signature
      properties:
        code:
          type: string
          description: Authorization code received from Telegram
        signature:
          type: string
          description: Signature received from create endpoint

    Question:
      type: object
      properties:
        id:
          type: integer
          format: uint64
          description: Unique identifier of the question
        quiz_id:
          type: integer
          format: uint64
          description: Relation to quiz table
        title:
          type: string
          description: Title of question
        description:
          type: string
          description: HTML/text representation of question and question description for answerer
        type:
          type: string
          description: Type field
          enum: [variant, images, varimg, file, text, emoji, select, date, number, page, rating, result]
        required:
          type: boolean
          description: Answerer must answer this question
        deleted:
          type: boolean
          description: Fake deleting field
        page:
          type: integer
          description: Set page number for question
        content:
          type: string
          description: Serialized JSON content
        version:
          type: integer
          description: Version number
        parent_ids:
          type: array
          items:
            type: integer
            format: int32
          description: IDs of parent questions if this is a child question
        created_at:
          type: string
          format: date-time
          description: Creation timestamp
        updated_at:
          type: string
          format: date-time
          description: Last update timestamp

    Quiz:
      type: object
      properties:
        id:
          type: integer
          format: uint64
          description: Unique identifier of the quiz
        qid:
          type: string
          description: UUID for secure data get and post
        accountid:
          type: string
          description: Account that created the quiz
        deleted:
          type: boolean
          description: Fake delete field
        archived:
          type: boolean
          description: Field for archiving quiz
        fingerprinting:
          type: boolean
          description: Field that need for storing device id
        repeatable:
          type: boolean
          description: Make it true for allow more than one quiz checkouting
        note_prevented:
          type: boolean
          description: Note answers even if the quiz was aborted
        mail_notifications:
          type: boolean
          description: Set true if you want get an email with every quiz passing
        unique_answers:
          type: boolean
          description: Set true if we you mention only last quiz passing
        name:
          type: string
          description: Quiz name
        description:
          type: string
          description: Quiz description
        config:
          type: string
          description: Serialize json with config for page rules
        status:
          type: string
          description: Status of quiz as enum
          enum: [draft, template, stop, start, timeout, offlimit]
        limit:
          type: integer
          format: uint64
          description: Max count of quiz passing
        due_to:
          type: integer
          format: uint64
          description: Time when quiz is end
        time_of_passing:
          type: integer
          format: uint64
          description: Amount of seconds for give all appropriate answers for quiz
        pausable:
          type: boolean
          description: True allows to pause the quiz taking
        version:
          type: integer
          description: Version number
        version_comment:
          type: string
          description: Comment for the current version
        parent_ids:
          type: array
          items:
            type: integer
            format: int32
          description: IDs of parent quizzes if this is a child quiz
        created_at:
          type: string
          format: date-time
          description: Creation timestamp
        updated_at:
          type: string
          format: date-time
          description: Last update timestamp
        questions_count:
          type: integer
          format: uint64
          description: Number of questions in the quiz
        session_count:
          type: integer
          format: uint64
          description: Number of quiz sessions started
        passed_count:
          type: integer
          format: uint64
          description: Number of completed quiz attempts
        average_time:
          type: integer
          format: uint64
          description: Average time taken to complete the quiz in seconds
        super:
          type: boolean
          description: Whether this is a super quiz (group)
        group_id:
          type: integer
          format: uint64
          description: ID of the super quiz if this quiz belongs to a group

    UTMSavingMap:
      type: object
      additionalProperties:
        type: string
      description: Map of UTM parameters and their values

    Answer:
      type: object
      properties:
        Id:
          type: integer
          format: uint64
          description: Unique identifier of the answer
        content:
          type: string
          description: Serialized JSON content of the answer (empty for buttons)
        question_id:
          type: integer
          format: uint64
          description: ID of the question this answer belongs to
        QuizId:
          type: integer
          format: uint64
          description: ID of the quiz this answer belongs to
        Fingerprint:
          type: string
          description: Device identifier
        Session:
          type: string
          description: Session identifier (xid)
        Result:
          type: boolean
          description: Whether this is a result answer
        CreatedAt:
          type: string
          format: date-time
          description: Creation timestamp
        new:
          type: boolean
          description: Whether this is a new answer
        Deleted:
          type: boolean
          description: Whether the answer is marked as deleted
        Email:
          type: string
          description: Email address associated with the answer
        DeviceType:
          type: string
          description: Type of device used
        Device:
          type: string
          description: Device information
        Browser:
          type: string
          description: Browser information
        IP:
          type: string
          description: IP address
        OS:
          type: string
          description: Operating system information
        Start:
          type: boolean
          description: Whether this is a start answer
        Utm:
          $ref: '#/components/schemas/UTMSavingMap'
          description: UTM parameters
        Version:
          type: integer
          format: int32
          description: Version number

    AnswerExport:
      type: object
      properties:
        content:
          type: string
          description: Serialized JSON content of the answer
        id:
          type: integer
          format: uint64
          description: Unique identifier of the answer
        new:
          type: boolean
          description: Whether this is a new answer
        created_at:
          type: string
          format: date-time
          description: Creation timestamp
        Version:
          type: integer
          format: int32
          description: Version number