T-Invest API API
Отрасль: Платежи и финансы. Актуально на 2026-10-24.
Интерфейс для работы с торговой платформой Т-Инвестиции: поиск инструментов и их параметров, исторические и текущие котировки, выставление и отмена заявок, портфель и операции по счёту, расписания торгов. Основной протокол — gRPC, для REST есть прокси с OpenAPI-спецификацией, для потоков данных — WebSocket. Есть песочница для тестирования роботов на реальных рыночных данных без изменения реального счёта.
Сценарии
Посмотреть счета и портфель
Сводка по брокерским счетам: стоимость портфеля, позиции, доходность — для своего дашборда или отчёта.
- Выпусти токен в настройках Т-Инвестиций: для чтения хватит Readonly. Передавай его в заголовке Authorization: Bearer <токен>. REST-адрес — https://invest-public-api.tbank.ru/rest/<сервис>/<метод>, все методы — POST с JSON.
- Получи счета: POST /tinkoff.public.invest.api.contract.v1.UsersService/GetAccounts — в ответе id каждого счёта.
- Получи портфель: POST /tinkoff.public.invest.api.contract.v1.OperationsService/GetPortfolio с accountId. Позиции без оценки — POST /tinkoff.public.invest.api.contract.v1.OperationsService/GetPositions.
- Суммы приходят объектами 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"]))
Найти инструмент и узнать его цену
Получить идентификатор бумаги по тикеру, последнюю цену и свечи для графика.
- Найди инструмент: POST /tinkoff.public.invest.api.contract.v1.InstrumentsService/FindInstrument с query — тикером или названием (например, SBER). Для торговли передай apiTradeAvailableFlag = true. Сохрани uid инструмента.
- Последняя цена: POST /tinkoff.public.invest.api.contract.v1.MarketDataService/GetLastPrices с instrumentId — массивом uid (или тикер_класс, например SBER_TQBR).
- Свечи: POST /tinkoff.public.invest.api.contract.v1.MarketDataService/GetCandles с instrumentId, from и to в UTC и interval, например CANDLE_INTERVAL_HOUR.
- Стакан, если нужен, — 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"]}'
Выставить заявку и проверить исполнение
Торговый робот или кнопка «Купить» в своём интерфейсе.
- Нужен токен Full-access (или с доступом к конкретному счёту), функция «Подтверждение сделок кодом» должна быть выключена. Сначала отладь робота в песочнице.
- Проверь, сколько лотов можно купить: POST /tinkoff.public.invest.api.contract.v1.OrdersService/GetMaxLots с accountId и instrumentId.
- Выстави заявку: POST /tinkoff.public.invest.api.contract.v1.OrdersService/PostOrder с accountId, instrumentId, quantity (в лотах), direction (ORDER_DIRECTION_BUY или SELL), orderType (LIMIT или MARKET), price для лимитной заявки и orderId — UUID для идемпотентности: повтор с тем же orderId не создаст вторую заявку.
- Проверь статус: 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.
- Цена передаётся объектом 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"])
Проверить робота в песочнице
Тестировать стратегию на реальных рыночных данных, не трогая настоящий счёт.
- Выпусти отдельный Sandbox token — обычный токен в песочнице не работает, и наоборот. Адрес песочницы — https://sandbox-invest-public-api.tbank.ru/rest.
- Открой счёт: POST /tinkoff.public.invest.api.contract.v1.SandboxService/OpenSandboxAccount.
- Пополни его: POST /tinkoff.public.invest.api.contract.v1.SandboxService/SandboxPayIn с accountId и amount.
- Дальше вызывай те же методы, что и в бою, — заявки, портфель, котировки — на адресе песочницы. Стоп-заявки и часть отчётов в песочнице недоступны.
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\"}}"
Выгрузить операции по счёту
Сделки, комиссии, дивиденды и пополнения — для учёта и налоговых расчётов.
- Запроси операции: POST /tinkoff.public.invest.api.contract.v1.OperationsService/GetOperationsByCursor с accountId, from и to в UTC и limit (до 1000).
- Если в ответе hasNext = true, повтори запрос с cursor = nextCursor из ответа.
- Отфильтровать можно по типам операций (operationTypes), инструменту (instrumentId) и статусу (state).
- Лимит сервиса операций — 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
- Боевой (REST):
https://invest-public-api.tbank.ru/rest
- Тестовый (REST, песочница):
https://sandbox-invest-public-api.tbank.ru/rest
- Боевой (gRPC):
invest-public-api.tinkoff.ru:443
- Тестовый (gRPC, песочница):
sandbox-invest-public-api.tinkoff.ru:443
Авторизация
Тип: 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 |
да |
Сумма пополнения |
Нюансы
- Для
PostOrder и PostStopOrder обязателен orderId — ключ идемпотентности в формате UID до 36 символов; у ReplaceOrder новый ключ передаётся в idempotencyKey.
- Суммы и цены передаются не числом, а объектом Quotation/MoneyValue: целая часть в
units (строка) и дробная в nano.
- Песочница работает почти со всеми теми же методами, но в ней недоступны
GetBrokerReport, GetDividendsForeignIssuer и сервис стоп-заявок; для неё нужен отдельный Sandbox token.
- Сделки на сумму больше 30 000 000 рублей требуют подтверждения и через API недоступны.
- Лимиты считаются суммарно по всем счетам пользователя; с одного адреса рекомендуется не больше 50 запросов в секунду по всем счетам и токенам.
- Разработчикам публичного ПО нужно зарегистрировать название приложения через invest-public-api@tbank.ru.
Ошибки
| Код |
Описание |
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-запросов в минуту:
- Сервис инструментов — 200
- Сервис счетов — 100
- Сервис операций — 200 (формирование отчётов — 5)
- Сервис котировок — 600
- Сервис стоп-ордеров — 50
- Песочница — 200
- Сервис ордеров — 100; отдельно
getOrders — 200, postOrder — 300, cancelOrder — 100, postOrderAsync — 450
getHistory (REST) — 30
В одном 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