Sergey Krylov 462212c95e
Some checks failed
CI / ci (pull_request) Failing after 3m18s
CI / ci (push) Failing after 3m16s
docs: update apps/docs — fix inconsistencies, add broker events diagrams
2026-06-22 22:15:51 +03:00

10 KiB
Raw Blame History

API reference

Все эндпоинты находятся под префиксом /api/v1. Swagger UI: /api/docs.

Защищённые эндпоинты требуют заголовок Authorization: Bearer <accessToken>.

Auth

POST /auth/register

Регистрация нового пользователя.

Request:

{
  "email": "user@example.com",
  "password": "securePass123",
  "name": "John"
}

Response: { data: { user, accessToken }, meta } + Set-Cookie: refresh_token.

POST /auth/login

Вход по email и паролю.

Request:

{
  "email": "user@example.com",
  "password": "securePass123"
}

Response: { data: { user, accessToken }, meta } + Set-Cookie: refresh_token.

POST /auth/refresh

Обновление access token через refresh token из cookie.

Response: { data: { user, accessToken }, meta } + новый Set-Cookie: refresh_token.

POST /auth/logout

Выход из системы. Удаляет refresh token из БД и чистит cookie.

Headers: Authorization: Bearer <accessToken>

Response: { data: { message }, meta }.

GET /auth/me

Информация о текущем пользователе.

Headers: Authorization: Bearer <accessToken>

Response:

{
  "data": {
    "id": 1,
    "email": "user@example.com",
    "name": "John",
    "role": "user"
  },
  "meta": { "fromCache": false, "cachedAt": null }
}

PATCH /auth/me

Обновление профиля текущего пользователя.

Headers: Authorization: Bearer <accessToken>

Request:

{
  "name": "John Doe"
}

Response: { data: { id, email, name, role }, meta }.

Health

GET /health

Проверка состояния сервиса.

Response:

{
  "status": "ok",
  "timestamp": "2026-06-13T12:00:00.000Z",
  "uptime": 1234.56
}

Securities

GET /securities/search

Поиск по инструментам.

Параметры:

Параметр Тип Обязателен По умолчанию Описание
q string да Поисковый запрос (1-100 символов)
type enum нет all Фильтр: all, share, bond
limit integer нет 20 Лимит результатов

Response:

{
  "data": [
    {
      "secid": "SBER",
      "isin": "RU0009029540",
      "shortName": "Сбербанк",
      "type": "share",
      "listLevel": 1,
      "currency": "RUB",
      "price": null
    }
  ],
  "meta": { "fromCache": false, "cachedAt": null }
}

GET /securities/screener

Скринер ценных бумаг по параметрам цены, объёма, доходности, дюрации, купона и срока погашения.

Параметры:

Параметр Тип Обязателен Описание
type enum да share или bond
priceMin, priceMax number нет Диапазон цены
volumeMin number нет Минимальный объём
yieldMin, yieldMax number нет Диапазон доходности облигаций
durationMin, durationMax number нет Диапазон дюрации
sortBy string нет Поле сортировки
sortOrder enum нет asc или desc
page, pageSize integer нет Пагинация

Response: { data: { items, total, page, pageSize, totalPages }, meta }.

Shares

GET /securities/shares/:secid

Спецификация акции.

Параметры: secid — тикер (например, SBER)

Response: ShareResponse — спецификация + текущие рыночные данные.

{
  "data": {
    "secid": "SBER",
    "isin": "RU0009029540",
    "name": "Сбербанк России ПАО ао",
    "shortName": "Сбербанк",
    "latName": null,
    "listLevel": 1,
    "issueSize": 21586948000,
    "faceValue": 3,
    "faceUnit": "RUB",
    "type": "common_share",
    "marketData": {
      "price": 322.35,
      "change": 1.15,
      "changePercent": 0.36,
      "open": 321.3,
      "high": 322.66,
      "low": 321.2,
      "volume": 1925163,
      "value": 620184479,
      "issueCapitalization": 6958336818320,
      "updatedAt": "2026-06-13T10:30:00.000Z"
    }
  },
  "meta": { "fromCache": false, "cachedAt": null }
}

GET /securities/shares/:secid/marketdata

Рыночные данные акции (без спецификации).

Response:

{
  "data": {
    "price": 322.35,
    "change": 1.15,
    "changePercent": 0.36,
    "open": 321.3,
    "high": 322.66,
    "low": 321.2,
    "volume": 1925163,
    "value": 620184479,
    "issueCapitalization": 6958336818320,
    "updatedAt": "2026-06-13T10:30:00.000Z"
  },
  "meta": { "fromCache": true, "cachedAt": null }
}

GET /securities/shares/:secid/dividends

Дивиденды акции.

Параметры: secid — тикер

Response:

{
  "data": [
    {
      "registryCloseDate": "2026-07-10",
      "value": 33.4,
      "currency": "RUB"
    }
  ],
  "meta": { "fromCache": false, "cachedAt": null }
}

GET /securities/shares/:secid/history

Дневная история торгов акции.

Параметры:

Параметр Тип Обязателен Описание
from string (date) да Начальная дата (YYYY-MM-DD)
till string (date) да Конечная дата (YYYY-MM-DD)

Response:

{
  "data": [
    {
      "date": "2026-06-13",
      "open": 321.3,
      "high": 322.66,
      "low": 321.2,
      "close": 322.35,
      "volume": 1925163,
      "value": 620184479
    }
  ],
  "meta": { "fromCache": false, "cachedAt": null }
}

Bonds

GET /securities/bonds/:secid

Спецификация облигации.

Параметры: secid — тикер

Response: BondResponse — спецификация + рыночные данные.

{
  "data": {
    "secid": "SU26238RMFS5",
    "isin": "RU000A106ZJ4",
    "name": "ОФЗ 26238",
    "shortName": "ОФЗ 26238",
    "latName": null,
    "listLevel": 1,
    "issueSize": 500000000,
    "faceValue": 1000,
    "faceUnit": "RUB",
    "matDate": "2041-05-15",
    "couponValue": 34.9,
    "couponPercent": 6.98,
    "couponPeriod": 182,
    "nextCoupon": "2026-12-01",
    "accruedInt": 12.45,
    "bondType": "OFZ",
    "bondSubType": "",
    "offerDate": null,
    "buybackDate": null,
    "marketData": {
      "price": 98.45,
      "yieldToMaturity": 7.12,
      "duration": 8.34,
      "accruedInt": 12.45,
      "couponValue": 34.9,
      "couponPercent": 6.98,
      "nextCouponDate": "2026-12-01",
      "open": 98.3,
      "high": 98.6,
      "low": 98.2,
      "volume": 1500000,
      "updatedAt": "2026-06-13T10:30:00.000Z"
    }
  },
  "meta": { "fromCache": false, "cachedAt": null }
}

GET /securities/bonds/:secid/marketdata

Рыночные данные облигации.

GET /securities/bonds/:secid/history

Дневная история торгов облигации.

Параметры: from, till (date)

Response:

{
  "data": [
    {
      "date": "2026-06-13",
      "closePrice": 98.45,
      "yieldClose": 7.12,
      "duration": 8.34
    }
  ],
  "meta": { "fromCache": false, "cachedAt": null }
}

Candles

GET /securities/shares/:secid/candles

Свечи акции.

GET /securities/bonds/:secid/candles

Свечи облигации.

Параметры:

Параметр Тип Обязателен Описание
interval enum да 1h или 24h
from string (date) да Начальная дата
till string (date) да Конечная дата

Response:

{
  "data": [
    {
      "open": 321.3,
      "high": 322.66,
      "low": 321.2,
      "close": 322.35,
      "volume": 1925163,
      "value": 620184479,
      "begin": "2026-06-13T10:00:00",
      "end": "2026-06-13T10:59:59"
    }
  ],
  "meta": { "fromCache": false, "cachedAt": null }
}

Портфели

Все portfolio endpoints защищены JWT и возвращают envelope { data, meta }.

Endpoint Method Описание
/api/v1/portfolios GET Список портфелей пользователя
/api/v1/portfolios POST Создать портфель
/api/v1/portfolios/:id GET Детали портфеля с позициями и текущими ценами
/api/v1/portfolios/:id PATCH Обновить портфель
/api/v1/portfolios/:id DELETE Удалить портфель
/api/v1/portfolios/:id/positions POST Добавить позицию
/api/v1/portfolios/:id/positions/:positionId PATCH Обновить позицию
/api/v1/portfolios/:id/positions/:positionId DELETE Удалить позицию
/api/v1/portfolios/:id/analytics GET Аналитика портфеля и PnL

DELETE endpoints возвращают { data: null, meta }, что отражено в OpenAPI schema и frontend codegen types.

Broker (T-Bank Invest)

Все broker endpoints защищены JWT и возвращают envelope { data, meta }.

Endpoint Method Описание
/api/v1/broker/accounts GET Список брокерских счетов и ИИС
/api/v1/broker/accounts/:accountId/portfolio GET Портфель счёта: позиции, cash, метаданные
/api/v1/broker/accounts/:accountId/events GET События и будущие выплаты (дивиденды, купоны) с фильтром по датам
/api/v1/broker/accounts/:accountId/operations GET История операций (cursor pagination)
/api/v1/broker/accounts/:accountId/operations/refresh POST Принудительная синхронизация операций из T-Bank
/api/v1/broker/accounts/:accountId/positions GET Позиции счёта (с пагинацией)