T-Invest API API

Отрасль: Платежи и финансы. Актуально на 2026-10-24.

Интерфейс для работы с торговой платформой Т-Инвестиции: поиск инструментов и их параметров, исторические и текущие котировки, выставление и отмена заявок, портфель и операции по счёту, расписания торгов. Основной протокол — gRPC, для REST есть прокси с OpenAPI-спецификацией, для потоков данных — WebSocket. Есть песочница для тестирования роботов на реальных рыночных данных без изменения реального счёта.

Сценарии

Посмотреть счета и портфель

Сводка по брокерским счетам: стоимость портфеля, позиции, доходность — для своего дашборда или отчёта.

  1. Выпусти токен в настройках Т-Инвестиций: для чтения хватит Readonly. Передавай его в заголовке Authorization: Bearer <токен>. REST-адрес — https://invest-public-api.tbank.ru/rest/<сервис>/<метод>, все методы — POST с JSON.
  2. Получи счета: POST /tinkoff.public.invest.api.contract.v1.UsersService/GetAccounts — в ответе id каждого счёта.
  3. Получи портфель: POST /tinkoff.public.invest.api.contract.v1.OperationsService/GetPortfolio с accountId. Позиции без оценки — POST /tinkoff.public.invest.api.contract.v1.OperationsService/GetPositions.
  4. Суммы приходят объектами MoneyValue и Quotation: целая часть в units (строкой), дробная — в nano (миллиардные доли). Значение = units + nano / 1 000 000 000.
import requests

API = "https://invest-public-api.tbank.ru/rest/tinkoff.public.invest.api.contract.v1"
H = {"Authorization": "Bearer <токен>"}
q = lambda m: int(m["units"]) + m["nano"] / 1e9

accounts = requests.post(f"{API}.UsersService/GetAccounts", headers=H, json={}).json()["accounts"]
for acc in accounts:
    p = requests.post(f"{API}.OperationsService/GetPortfolio", headers=H, json={"accountId": acc["id"], "currency": "RUB"}).json()
    print(acc["name"], q(p["totalAmountPortfolio"]))

Найти инструмент и узнать его цену

Получить идентификатор бумаги по тикеру, последнюю цену и свечи для графика.

  1. Найди инструмент: POST /tinkoff.public.invest.api.contract.v1.InstrumentsService/FindInstrument с query — тикером или названием (например, SBER). Для торговли передай apiTradeAvailableFlag = true. Сохрани uid инструмента.
  2. Последняя цена: POST /tinkoff.public.invest.api.contract.v1.MarketDataService/GetLastPrices с instrumentId — массивом uid (или тикер_класс, например SBER_TQBR).
  3. Свечи: POST /tinkoff.public.invest.api.contract.v1.MarketDataService/GetCandles с instrumentId, from и to в UTC и interval, например CANDLE_INTERVAL_HOUR.
  4. Стакан, если нужен, — POST /tinkoff.public.invest.api.contract.v1.MarketDataService/GetOrderBook с depth.
API=https://invest-public-api.tbank.ru/rest/tinkoff.public.invest.api.contract.v1
curl -X POST "$API.InstrumentsService/FindInstrument" -H "Authorization: Bearer $TINVEST_TOKEN" \
  -H 'Content-Type: application/json' -d '{"query": "SBER", "apiTradeAvailableFlag": true}'

curl -X POST "$API.MarketDataService/GetLastPrices" -H "Authorization: Bearer $TINVEST_TOKEN" \
  -H 'Content-Type: application/json' -d '{"instrumentId": ["SBER_TQBR"]}'

Выставить заявку и проверить исполнение

Торговый робот или кнопка «Купить» в своём интерфейсе.

  1. Нужен токен Full-access (или с доступом к конкретному счёту), функция «Подтверждение сделок кодом» должна быть выключена. Сначала отладь робота в песочнице.
  2. Проверь, сколько лотов можно купить: POST /tinkoff.public.invest.api.contract.v1.OrdersService/GetMaxLots с accountId и instrumentId.
  3. Выстави заявку: POST /tinkoff.public.invest.api.contract.v1.OrdersService/PostOrder с accountId, instrumentId, quantity (в лотах), direction (ORDER_DIRECTION_BUY или SELL), orderType (LIMIT или MARKET), price для лимитной заявки и orderId — UUID для идемпотентности: повтор с тем же orderId не создаст вторую заявку.
  4. Проверь статус: POST /tinkoff.public.invest.api.contract.v1.OrdersService/GetOrderState. Отменить — POST /tinkoff.public.invest.api.contract.v1.OrdersService/CancelOrder, изменить — POST /tinkoff.public.invest.api.contract.v1.OrdersService/ReplaceOrder с новым idempotencyKey.
  5. Цена передаётся объектом Quotation: units — целая часть строкой, nano — дробная.
import uuid

order = requests.post(f"{API}.OrdersService/PostOrder", headers=H, json={
    "accountId": "<id счёта>",
    "instrumentId": "<uid инструмента>",
    "quantity": "1",
    "direction": "ORDER_DIRECTION_BUY",
    "orderType": "ORDER_TYPE_LIMIT",
    "price": {"units": "280", "nano": 500000000},  # 280,5 ₽
    "orderId": str(uuid.uuid4()),
}).json()
state = requests.post(f"{API}.OrdersService/GetOrderState", headers=H,
                      json={"accountId": "<id счёта>", "orderId": order["orderId"]}).json()
print(state["executionReportStatus"])

Проверить робота в песочнице

Тестировать стратегию на реальных рыночных данных, не трогая настоящий счёт.

  1. Выпусти отдельный Sandbox token — обычный токен в песочнице не работает, и наоборот. Адрес песочницы — https://sandbox-invest-public-api.tbank.ru/rest.
  2. Открой счёт: POST /tinkoff.public.invest.api.contract.v1.SandboxService/OpenSandboxAccount.
  3. Пополни его: POST /tinkoff.public.invest.api.contract.v1.SandboxService/SandboxPayIn с accountId и amount.
  4. Дальше вызывай те же методы, что и в бою, — заявки, портфель, котировки — на адресе песочницы. Стоп-заявки и часть отчётов в песочнице недоступны.
SB=https://sandbox-invest-public-api.tbank.ru/rest/tinkoff.public.invest.api.contract.v1
ACC=$(curl -s -X POST "$SB.SandboxService/OpenSandboxAccount" -H "Authorization: Bearer $SANDBOX_TOKEN" \
  -H 'Content-Type: application/json' -d '{"name": "robot-test"}' | jq -r .accountId)

curl -X POST "$SB.SandboxService/SandboxPayIn" -H "Authorization: Bearer $SANDBOX_TOKEN" \
  -H 'Content-Type: application/json' -d "{\"accountId\": \"$ACC\", \"amount\": {\"units\": \"100000\", \"nano\": 0, \"currency\": \"rub\"}}"

Выгрузить операции по счёту

Сделки, комиссии, дивиденды и пополнения — для учёта и налоговых расчётов.

  1. Запроси операции: POST /tinkoff.public.invest.api.contract.v1.OperationsService/GetOperationsByCursor с accountId, from и to в UTC и limit (до 1000).
  2. Если в ответе hasNext = true, повтори запрос с cursor = nextCursor из ответа.
  3. Отфильтровать можно по типам операций (operationTypes), инструменту (instrumentId) и статусу (state).
  4. Лимит сервиса операций — 200 запросов в минуту; при превышении придёт 429.
ops, cursor = [], ""
while True:
    r = requests.post(f"{API}.OperationsService/GetOperationsByCursor", headers=H, json={
        "accountId": "<id счёта>", "from": "2026-01-01T00:00:00Z", "to": "2026-10-24T00:00:00Z",
        "limit": 1000, "cursor": cursor}).json()
    ops += r["items"]
    if not r.get("hasNext"):
        break
    cursor = r["nextCursor"]

Базовые URL

Авторизация

Тип: Bearer-токен

Токен выпускается в настройках профиля Т-Инвестиций (https://www.tbank.ru/invest/settings/). Функция «Подтверждение сделок кодом» должна быть отключена. Токен показывается один раз, выпускать можно неограниченное количество. Виды токенов: Readonly (только чтение), Full-access (все методы), токен с доступом к конкретному счёту и Sandbox token (только для песочницы; для обычных методов вернёт ошибку). Токен передаётся в заголовке Authorization в формате Bearer t.QtEo8ahkNFX4RTpbqp0u4z4GDZq27HzUp6AotJASBx7_DVqmqZMHfM2Cy7JmUjS80boI9eVg, в gRPC — в metadata каждого запроса и стрима.

Срок жизни токена — три месяца с даты последнего использования. Неактуальный токен даёт ошибку:

"code": "40003"
"message": "authentication token is missing or invalid"

Методы

POST /tinkoff.public.invest.api.contract.v1.UsersService/GetAccounts — Счета пользователя

Параметр Где Тип Обяз. Описание
status body v1AccountStatus нет Фильтр по статусу счёта

POST /tinkoff.public.invest.api.contract.v1.UsersService/GetInfo — Информация о пользователе

Тело запроса пустое.

POST /tinkoff.public.invest.api.contract.v1.InstrumentsService/FindInstrument — Найти инструмент

Параметр Где Тип Обяз. Описание
query body string да Строка поиска
instrumentKind body v1InstrumentType нет Тип инструмента
apiTradeAvailableFlag body boolean нет Показывать только торговые инструменты

POST /tinkoff.public.invest.api.contract.v1.InstrumentsService/GetInstrumentBy — Основная информация об инструменте

Параметр Где Тип Обяз. Описание
idType body v1InstrumentIdType да Тип идентификатора
classCode body string нет Идентификатор class_code; обязателен, если id_type = ticker
id body string да Идентификатор запрашиваемого инструмента

POST /tinkoff.public.invest.api.contract.v1.InstrumentsService/Shares — Список акций

Параметр Где Тип Обяз. Описание
instrumentStatus body v1InstrumentStatus нет Статус инструмента
instrumentExchange body v1InstrumentExchangeType нет Площадка

POST /tinkoff.public.invest.api.contract.v1.MarketDataService/GetCandles — Исторические свечи

Параметр Где Тип Обяз. Описание
from body string да Начало периода по UTC
to body string да Окончание периода по UTC
interval body v1CandleInterval да Интервал свечей, например CANDLE_INTERVAL_1_MIN, CANDLE_INTERVAL_HOUR, CANDLE_INTERVAL_DAY
instrumentId body string нет figi, instrument_uid или ticker + '_' + class_code
candleSourceType body v1GetCandlesRequestCandleSource нет Источник свечей
limit body integer нет Максимальное количество свечей в ответе

POST /tinkoff.public.invest.api.contract.v1.MarketDataService/GetLastPrices — Цены последних сделок

Параметр Где Тип Обяз. Описание
instrumentId body string нет Массив идентификаторов: figi, instrument_uid или ticker + '_' + class_code
lastPriceType body v1LastPriceType нет Тип цены
instrumentStatus body v1InstrumentStatus нет Статус инструмента

POST /tinkoff.public.invest.api.contract.v1.MarketDataService/GetOrderBook — Стакан по инструменту

Параметр Где Тип Обяз. Описание
depth body integer да Глубина стакана
instrumentId body string нет figi, instrument_uid или ticker + '_' + class_code

POST /tinkoff.public.invest.api.contract.v1.OperationsService/GetPortfolio — Портфель по счёту

Параметр Где Тип Обяз. Описание
accountId body string да Идентификатор счёта пользователя
currency body PortfolioRequestCurrencyRequest нет Валюта расчёта

POST /tinkoff.public.invest.api.contract.v1.OperationsService/GetPositions — Позиции по счёту

Параметр Где Тип Обяз. Описание
accountId body string да Идентификатор счёта пользователя

POST /tinkoff.public.invest.api.contract.v1.OperationsService/GetOperationsByCursor — Операции по счёту с пагинацией

Параметр Где Тип Обяз. Описание
accountId body string да Идентификатор счёта клиента
instrumentId body string нет FIGI или UID инструмента
from body string нет Начало периода по UTC
to body string нет Окончание периода по UTC
cursor body string нет Идентификатор элемента, с которого начать ответ
limit body integer нет Лимит операций: по умолчанию 100, максимум 1000
operationTypes body array нет Типы операций из списка OperationType
state body v1OperationState нет Статус операции
withoutCommissions body boolean нет Флаг возврата комиссии, по умолчанию false
withoutTrades body boolean нет Ответ без массива сделок
withoutOvernights body boolean нет Флаг показа overnight-операций

POST /tinkoff.public.invest.api.contract.v1.OrdersService/PostOrder — Выставить заявку

Параметр Где Тип Обяз. Описание
quantity body string да Количество лотов
price body v1Quotation нет Цена (для лимитной заявки)
price.units body string нет Целая часть суммы
price.nano body integer нет Дробная часть суммы
direction body v1OrderDirection да ORDER_DIRECTION_BUY или ORDER_DIRECTION_SELL
accountId body string да Номер счёта
orderType body v1OrderType да ORDER_TYPE_LIMIT, ORDER_TYPE_MARKET, ORDER_TYPE_BESTPRICE
orderId body string да Идентификатор запроса для идемпотентности в формате UID, до 36 символов
instrumentId body string нет Figi или Instrument_uid
timeInForce body v1TimeInForceType нет Срок действия заявки
priceType body v1PriceType нет Тип цены
confirmMarginTrade body boolean нет Согласие на заявку, которая может привести к непокрытой позиции; по умолчанию false

POST /tinkoff.public.invest.api.contract.v1.OrdersService/ReplaceOrder — Изменить выставленную заявку

Параметр Где Тип Обяз. Описание
accountId body string да Номер счёта
orderId body string да Идентификатор заявки на бирже
idempotencyKey body string да Новый ключ идемпотентности, до 36 символов; перезатирает старый
quantity body string да Количество лотов
price body v1Quotation нет Цена
priceType body v1PriceType нет Тип цены
confirmMarginTrade body boolean нет Согласие на непокрытую позицию

POST /tinkoff.public.invest.api.contract.v1.OrdersService/CancelOrder — Отменить заявку

Параметр Где Тип Обяз. Описание
accountId body string да Номер счёта
orderId body string да Идентификатор заявки
orderIdType body v1OrderIdType нет Тип идентификатора заявки

POST /tinkoff.public.invest.api.contract.v1.OrdersService/GetOrders — Активные заявки по счёту

Параметр Где Тип Обяз. Описание
accountId body string да Номер счёта
advancedFilters body GetOrdersRequestGetOrdersRequestFilters нет Дополнительные фильтры

POST /tinkoff.public.invest.api.contract.v1.OrdersService/GetOrderState — Статус торгового поручения

Параметр Где Тип Обяз. Описание
accountId body string да Номер счёта
orderId body string да Идентификатор заявки
priceType body v1PriceType нет Тип цены
orderIdType body v1OrderIdType нет Тип идентификатора заявки

POST /tinkoff.public.invest.api.contract.v1.OrdersService/GetMaxLots — Доступное количество лотов

Параметр Где Тип Обяз. Описание
accountId body string да Номер счёта
instrumentId body string да Идентификатор инструмента
price body v1Quotation нет Цена

POST /tinkoff.public.invest.api.contract.v1.StopOrdersService/PostStopOrder — Выставить стоп-заявку

Параметр Где Тип Обяз. Описание
quantity body string да Количество лотов
price body v1Quotation нет Цена
stopPrice body v1Quotation нет Стоп-цена
direction body v1StopOrderDirection да Направление
accountId body string да Номер счёта
expirationType body v1StopOrderExpirationType да Тип срока действия
stopOrderType body v1StopOrderType да Тип стоп-заявки
expireDate body string нет Окончание действия по UTC; обязательно для GoodTillDate
instrumentId body string да figi или instrument_uid
orderId body string да Ключ идемпотентности в формате UID, до 36 символов
confirmMarginTrade body boolean нет Согласие на непокрытую позицию

POST /tinkoff.public.invest.api.contract.v1.SandboxService/OpenSandboxAccount — Открыть счёт в песочнице

Параметр Где Тип Обяз. Описание
name body string нет Название счёта

POST /tinkoff.public.invest.api.contract.v1.SandboxService/SandboxPayIn — Пополнить счёт в песочнице

Параметр Где Тип Обяз. Описание
accountId body string да Номер счёта в песочнице
amount body v1MoneyValue да Сумма пополнения

Нюансы

Ошибки

Код Описание
400 INVALID_ARGUMENT — запрос составлен неверно
401 UNAUTHENTICATED — токен не найден или не активен
403 PERMISSION_DENIED — недостаточно прав; проверьте соответствие токена и счёта
404 Неверный URL запроса
408 Превышено время ожидания ответа
415 Неверный тип данных
429 RESOURCE_EXHAUSTED — превышен лимит запросов в минуту
500 Внутренняя ошибка сервера
503 Сервис временно недоступен
504 DEADLINE_EXCEEDED — нет ответа от шлюза
30011 interval is invalid (пример из спецификации, HTTP 400)
40002 insufficient privileges (HTTP 403)
40003 authentication token is missing or invalid (HTTP 401)
50004 account not found (HTTP 404)

Ограничения

Лимиты unary-запросов в минуту:

В одном stream-соединении сервиса котировок — до 300 одновременных подписок на свечи, стаканы и ленту сделок суммарно. GetOperationsByCursor отдаёт до 1000 операций за запрос.

Источники


Если этого недостаточно — официальная документация: https://developer.tbank.ru/invest/intro/intro/ JSON: https://mcp-everything.ru/api/integrations/t-invest. MCP: https://mcp-everything.ru/mcp