1061 lines
24 KiB
YAML
1061 lines
24 KiB
YAML
openapi: 3.0.0
|
|
paths:
|
|
/api/v1/health:
|
|
get:
|
|
operationId: HealthController_check
|
|
summary: Проверка состояния сервиса
|
|
parameters: []
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Health
|
|
/api/v1/auth/register:
|
|
post:
|
|
operationId: AuthController_register
|
|
summary: Register new user
|
|
parameters: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RegisterDto'
|
|
responses:
|
|
'201':
|
|
description: ''
|
|
tags:
|
|
- Auth
|
|
/api/v1/auth/login:
|
|
post:
|
|
operationId: AuthController_login
|
|
summary: Login with email and password
|
|
parameters: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LoginDto'
|
|
responses:
|
|
'201':
|
|
description: ''
|
|
tags:
|
|
- Auth
|
|
/api/v1/auth/refresh:
|
|
post:
|
|
operationId: AuthController_refresh
|
|
summary: Refresh access token
|
|
parameters: []
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Auth
|
|
/api/v1/auth/logout:
|
|
post:
|
|
operationId: AuthController_logout
|
|
summary: Logout user
|
|
parameters: []
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Auth
|
|
security:
|
|
- bearer: []
|
|
/api/v1/auth/me:
|
|
get:
|
|
operationId: AuthController_getProfile
|
|
summary: Get current user profile
|
|
parameters: []
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Auth
|
|
security:
|
|
- bearer: []
|
|
patch:
|
|
operationId: AuthController_updateProfile
|
|
summary: Update current user profile
|
|
parameters: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UpdateProfileDto'
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Auth
|
|
security:
|
|
- bearer: []
|
|
/api/v1/securities/search:
|
|
get:
|
|
operationId: SecuritiesController_search
|
|
summary: Поиск по инструментам
|
|
parameters:
|
|
- name: q
|
|
required: true
|
|
in: query
|
|
description: Поисковый запрос (тикер, название, ISIN)
|
|
schema:
|
|
type: string
|
|
- name: type
|
|
required: false
|
|
in: query
|
|
schema:
|
|
default: all
|
|
enum:
|
|
- all
|
|
- share
|
|
- bond
|
|
type: string
|
|
- name: limit
|
|
required: false
|
|
in: query
|
|
schema:
|
|
default: 20
|
|
type: number
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Securities
|
|
/api/v1/securities/screener:
|
|
get:
|
|
operationId: SecuritiesController_screener
|
|
summary: Фильтр ценных бумаг по параметрам
|
|
parameters:
|
|
- name: type
|
|
required: true
|
|
in: query
|
|
schema:
|
|
enum:
|
|
- share
|
|
- bond
|
|
type: string
|
|
- name: priceMin
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: priceMax
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: volumeMin
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: listLevel
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: changePercentMin
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: changePercentMax
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: capitalizationMin
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: yieldMin
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: yieldMax
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: durationMin
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: durationMax
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: couponMin
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: couponMax
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: couponPercentMin
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: couponPercentMax
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: number
|
|
- name: maturityBefore
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: maturityAfter
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: bondType
|
|
required: false
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: sortBy
|
|
required: false
|
|
in: query
|
|
schema:
|
|
default: price
|
|
type: string
|
|
- name: sortOrder
|
|
required: false
|
|
in: query
|
|
schema:
|
|
default: asc
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
schema:
|
|
default: 1
|
|
type: number
|
|
- name: pageSize
|
|
required: false
|
|
in: query
|
|
schema:
|
|
default: 20
|
|
type: number
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ScreenerResultDto'
|
|
tags:
|
|
- Securities
|
|
/api/v1/securities/shares/{secid}:
|
|
get:
|
|
operationId: SharesController_getShare
|
|
summary: Получить спецификацию акции
|
|
parameters:
|
|
- name: secid
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Shares
|
|
/api/v1/securities/shares/{secid}/marketdata:
|
|
get:
|
|
operationId: SharesController_getMarketData
|
|
summary: Получить рыночные данные акции
|
|
parameters:
|
|
- name: secid
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Shares
|
|
/api/v1/securities/shares/{secid}/dividends:
|
|
get:
|
|
operationId: SharesController_getDividends
|
|
summary: Получить дивиденды
|
|
parameters:
|
|
- name: secid
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Shares
|
|
/api/v1/securities/shares/{secid}/history:
|
|
get:
|
|
operationId: SharesController_getHistory
|
|
summary: Получить дневную историю торгов акции
|
|
parameters:
|
|
- name: secid
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: string
|
|
- name: from
|
|
required: true
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: till
|
|
required: true
|
|
in: query
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Shares
|
|
/api/v1/securities/bonds/{secid}:
|
|
get:
|
|
operationId: BondsController_getBond
|
|
summary: Получить спецификацию облигации
|
|
parameters:
|
|
- name: secid
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Bonds
|
|
/api/v1/securities/bonds/{secid}/marketdata:
|
|
get:
|
|
operationId: BondsController_getMarketData
|
|
summary: Получить рыночные данные облигации
|
|
parameters:
|
|
- name: secid
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Bonds
|
|
/api/v1/securities/bonds/{secid}/history:
|
|
get:
|
|
operationId: BondsController_getHistory
|
|
summary: Получить дневную историю торгов облигации
|
|
parameters:
|
|
- name: secid
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: string
|
|
- name: from
|
|
required: true
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: till
|
|
required: true
|
|
in: query
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Bonds
|
|
/api/v1/securities/shares/{secid}/candles:
|
|
get:
|
|
operationId: CandlesController_getShareCandles
|
|
summary: Получить свечи акции
|
|
parameters:
|
|
- name: secid
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: string
|
|
- name: interval
|
|
required: true
|
|
in: query
|
|
schema:
|
|
enum:
|
|
- 1h
|
|
- 24h
|
|
type: string
|
|
- name: from
|
|
required: true
|
|
in: query
|
|
schema:
|
|
format: date
|
|
example: '2025-06-13'
|
|
type: string
|
|
- name: till
|
|
required: true
|
|
in: query
|
|
schema:
|
|
format: date
|
|
example: '2026-06-13'
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Candles
|
|
/api/v1/securities/bonds/{secid}/candles:
|
|
get:
|
|
operationId: CandlesController_getBondCandles
|
|
summary: Получить свечи облигации
|
|
parameters:
|
|
- name: secid
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: string
|
|
- name: interval
|
|
required: true
|
|
in: query
|
|
schema:
|
|
enum:
|
|
- 1h
|
|
- 24h
|
|
type: string
|
|
- name: from
|
|
required: true
|
|
in: query
|
|
schema:
|
|
format: date
|
|
example: '2025-06-13'
|
|
type: string
|
|
- name: till
|
|
required: true
|
|
in: query
|
|
schema:
|
|
format: date
|
|
example: '2026-06-13'
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Candles
|
|
/api/v1/portfolios:
|
|
get:
|
|
operationId: PortfolioController_findAll
|
|
summary: Get all portfolios for current user
|
|
parameters: []
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/PortfolioListResponseDto'
|
|
tags:
|
|
- Portfolios
|
|
security:
|
|
- bearer: []
|
|
post:
|
|
operationId: PortfolioController_create
|
|
summary: Create a new portfolio
|
|
parameters: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreatePortfolioDto'
|
|
responses:
|
|
'201':
|
|
description: ''
|
|
tags:
|
|
- Portfolios
|
|
security:
|
|
- bearer: []
|
|
/api/v1/portfolios/{id}:
|
|
get:
|
|
operationId: PortfolioController_findOne
|
|
summary: Get portfolio details with positions and prices
|
|
parameters:
|
|
- name: id
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: number
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PortfolioDetailResponseDto'
|
|
tags:
|
|
- Portfolios
|
|
security:
|
|
- bearer: []
|
|
patch:
|
|
operationId: PortfolioController_update
|
|
summary: Update portfolio
|
|
parameters:
|
|
- name: id
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: number
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UpdatePortfolioDto'
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Portfolios
|
|
security:
|
|
- bearer: []
|
|
delete:
|
|
operationId: PortfolioController_remove
|
|
summary: Delete portfolio
|
|
parameters:
|
|
- name: id
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: number
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Portfolios
|
|
security:
|
|
- bearer: []
|
|
/api/v1/portfolios/{id}/positions:
|
|
post:
|
|
operationId: PortfolioController_addPosition
|
|
summary: Add position to portfolio
|
|
parameters:
|
|
- name: id
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: number
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AddPositionDto'
|
|
responses:
|
|
'201':
|
|
description: ''
|
|
tags:
|
|
- Portfolios
|
|
security:
|
|
- bearer: []
|
|
/api/v1/portfolios/{id}/positions/{positionId}:
|
|
patch:
|
|
operationId: PortfolioController_updatePosition
|
|
summary: Update position
|
|
parameters:
|
|
- name: id
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: number
|
|
- name: positionId
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: number
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UpdatePositionDto'
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Portfolios
|
|
security:
|
|
- bearer: []
|
|
delete:
|
|
operationId: PortfolioController_removePosition
|
|
summary: Remove position from portfolio
|
|
parameters:
|
|
- name: id
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: number
|
|
- name: positionId
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: number
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Portfolios
|
|
security:
|
|
- bearer: []
|
|
/api/v1/portfolios/{id}/analytics:
|
|
get:
|
|
operationId: PortfolioController_getAnalytics
|
|
summary: Get portfolio analytics with PnL
|
|
parameters:
|
|
- name: id
|
|
required: true
|
|
in: path
|
|
schema:
|
|
type: number
|
|
responses:
|
|
'200':
|
|
description: ''
|
|
tags:
|
|
- Portfolios
|
|
security:
|
|
- bearer: []
|
|
info:
|
|
title: MoexVibe API
|
|
description: ''
|
|
version: 1.0.0
|
|
contact: {}
|
|
tags: []
|
|
servers: []
|
|
components:
|
|
securitySchemes:
|
|
bearer:
|
|
scheme: bearer
|
|
bearerFormat: JWT
|
|
type: http
|
|
schemas:
|
|
RegisterDto:
|
|
type: object
|
|
properties:
|
|
email:
|
|
type: string
|
|
example: user@example.com
|
|
password:
|
|
type: string
|
|
example: securePass123
|
|
name:
|
|
type: string
|
|
example: John
|
|
required:
|
|
- email
|
|
- password
|
|
LoginDto:
|
|
type: object
|
|
properties:
|
|
email:
|
|
type: string
|
|
example: user@example.com
|
|
password:
|
|
type: string
|
|
example: securePass123
|
|
required:
|
|
- email
|
|
- password
|
|
UpdateProfileDto:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
example: John Doe
|
|
ScreenerItemDto:
|
|
type: object
|
|
properties:
|
|
secid:
|
|
type: string
|
|
example: SBER
|
|
shortName:
|
|
type: string
|
|
example: Сбербанк
|
|
isin:
|
|
type: string
|
|
example: RU0009029540
|
|
type:
|
|
type: string
|
|
enum:
|
|
- share
|
|
- bond
|
|
price:
|
|
type: object
|
|
example: 322.35
|
|
change:
|
|
type: object
|
|
example: 1.15
|
|
changePercent:
|
|
type: object
|
|
example: 0.36
|
|
volume:
|
|
type: number
|
|
example: 1925163
|
|
listLevel:
|
|
type: number
|
|
example: 1
|
|
capitalization:
|
|
type: object
|
|
example: 6958336818320
|
|
yieldToMaturity:
|
|
type: object
|
|
example: 12.71
|
|
duration:
|
|
type: object
|
|
example: 4.5
|
|
couponValue:
|
|
type: object
|
|
example: 40.64
|
|
couponPercent:
|
|
type: object
|
|
example: 8.15
|
|
accruedInt:
|
|
type: object
|
|
example: 29.48
|
|
matDate:
|
|
type: object
|
|
example: '2027-02-03'
|
|
bondType:
|
|
type: object
|
|
example: ОФЗ-ПД
|
|
required:
|
|
- secid
|
|
- shortName
|
|
- isin
|
|
- type
|
|
- volume
|
|
- listLevel
|
|
ScreenerResultDto:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ScreenerItemDto'
|
|
total:
|
|
type: number
|
|
page:
|
|
type: number
|
|
pageSize:
|
|
type: number
|
|
totalPages:
|
|
type: number
|
|
required:
|
|
- items
|
|
- total
|
|
- page
|
|
- pageSize
|
|
- totalPages
|
|
PortfolioListResponseDto:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: number
|
|
name:
|
|
type: string
|
|
description:
|
|
type: object
|
|
currency:
|
|
type: string
|
|
default: RUB
|
|
createdAt:
|
|
type: string
|
|
updatedAt:
|
|
type: string
|
|
totalValue:
|
|
type: number
|
|
description: Total market value of all positions
|
|
positionCount:
|
|
type: number
|
|
description: Total number of positions
|
|
shareCount:
|
|
type: number
|
|
description: Number of share positions
|
|
bondCount:
|
|
type: number
|
|
description: Number of bond positions
|
|
required:
|
|
- id
|
|
- name
|
|
- currency
|
|
- createdAt
|
|
- updatedAt
|
|
- totalValue
|
|
- positionCount
|
|
- shareCount
|
|
- bondCount
|
|
CreatePortfolioDto:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
example: Мой портфель
|
|
description:
|
|
type: string
|
|
example: Описание портфеля
|
|
currency:
|
|
type: string
|
|
default: RUB
|
|
enum:
|
|
- RUB
|
|
- USD
|
|
- EUR
|
|
- CNY
|
|
- KZT
|
|
- BYN
|
|
required:
|
|
- name
|
|
PositionWithPriceDto:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: number
|
|
secid:
|
|
type: string
|
|
example: SBER
|
|
shortName:
|
|
type: object
|
|
type:
|
|
type: string
|
|
example: share
|
|
enum:
|
|
- share
|
|
- bond
|
|
quantity:
|
|
type: number
|
|
example: 10
|
|
buyPrice:
|
|
type: object
|
|
buyDate:
|
|
type: object
|
|
notes:
|
|
type: object
|
|
tags:
|
|
type: object
|
|
currentPrice:
|
|
type: object
|
|
totalCost:
|
|
type: object
|
|
currentValue:
|
|
type: object
|
|
weightPercent:
|
|
type: number
|
|
pnl:
|
|
type: object
|
|
pnlPercent:
|
|
type: object
|
|
dividendIncome:
|
|
type: object
|
|
totalReturn:
|
|
type: object
|
|
totalReturnPercent:
|
|
type: object
|
|
change:
|
|
type: object
|
|
changePercent:
|
|
type: object
|
|
yieldToMaturity:
|
|
type: object
|
|
duration:
|
|
type: object
|
|
couponValue:
|
|
type: object
|
|
couponPercent:
|
|
type: object
|
|
nextCouponDate:
|
|
type: object
|
|
matDate:
|
|
type: object
|
|
accruedInt:
|
|
type: object
|
|
bid:
|
|
type: object
|
|
offer:
|
|
type: object
|
|
couponPeriod:
|
|
type: object
|
|
bondType:
|
|
type: object
|
|
offerDate:
|
|
type: object
|
|
required:
|
|
- id
|
|
- secid
|
|
- type
|
|
- quantity
|
|
- weightPercent
|
|
PortfolioSummaryDto:
|
|
type: object
|
|
properties:
|
|
totalInvested:
|
|
type: number
|
|
totalValue:
|
|
type: number
|
|
totalPnl:
|
|
type: number
|
|
totalPnlPercent:
|
|
type: object
|
|
totalDividends:
|
|
type: number
|
|
totalReturn:
|
|
type: number
|
|
totalReturnPercent:
|
|
type: object
|
|
positionCount:
|
|
type: number
|
|
weightedYield:
|
|
type: object
|
|
required:
|
|
- totalInvested
|
|
- totalValue
|
|
- totalPnl
|
|
- totalPnlPercent
|
|
- totalDividends
|
|
- totalReturn
|
|
- totalReturnPercent
|
|
- positionCount
|
|
- weightedYield
|
|
PortfolioDetailResponseDto:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: number
|
|
name:
|
|
type: string
|
|
description:
|
|
type: object
|
|
currency:
|
|
type: string
|
|
default: RUB
|
|
createdAt:
|
|
type: string
|
|
updatedAt:
|
|
type: string
|
|
positions:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/PositionWithPriceDto'
|
|
totalValue:
|
|
type: number
|
|
analytics:
|
|
$ref: '#/components/schemas/PortfolioSummaryDto'
|
|
required:
|
|
- id
|
|
- name
|
|
- currency
|
|
- createdAt
|
|
- updatedAt
|
|
- positions
|
|
- totalValue
|
|
- analytics
|
|
UpdatePortfolioDto:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
example: Мой портфель
|
|
description:
|
|
type: string
|
|
example: Обновлённое описание
|
|
currency:
|
|
type: string
|
|
default: RUB
|
|
enum:
|
|
- RUB
|
|
- USD
|
|
- EUR
|
|
- CNY
|
|
- KZT
|
|
- BYN
|
|
AddPositionDto:
|
|
type: object
|
|
properties:
|
|
secid:
|
|
type: string
|
|
example: SBER
|
|
quantity:
|
|
type: number
|
|
example: 10
|
|
buyPrice:
|
|
type: number
|
|
example: 250.5
|
|
buyDate:
|
|
type: string
|
|
example: '2026-06-01'
|
|
notes:
|
|
type: string
|
|
example: Покупка на дип
|
|
tags:
|
|
type: string
|
|
example:
|
|
- DIVIDEND
|
|
- GROWTH
|
|
enum:
|
|
- DIVIDEND
|
|
- GROWTH
|
|
- DEFENSIVE
|
|
- SPECULATIVE
|
|
- BOND
|
|
- ETF
|
|
- GOVERNMENT
|
|
- CASH
|
|
required:
|
|
- secid
|
|
- quantity
|
|
UpdatePositionDto:
|
|
type: object
|
|
properties:
|
|
quantity:
|
|
type: number
|
|
example: 15
|
|
buyPrice:
|
|
type: number
|
|
example: 260
|
|
buyDate:
|
|
type: string
|
|
example: '2026-06-15'
|
|
notes:
|
|
type: string
|
|
example: Докупка
|
|
tags:
|
|
type: string
|
|
example:
|
|
- DIVIDEND
|
|
enum:
|
|
- DIVIDEND
|
|
- GROWTH
|
|
- DEFENSIVE
|
|
- SPECULATIVE
|
|
- BOND
|
|
- ETF
|
|
- GOVERNMENT
|
|
- CASH
|