core/api/openapi2.yaml

2286 lines
61 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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