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