---
slug: "t-invest"
name: "T-Invest API"
vendor: "Т-Банк"
industry: "finance"
docsUrl: "https://developer.tbank.ru/invest/intro/intro/"
version: 2
updatedAt: "2026-10-24"
---

# T-Invest 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.

```python
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.

```bash
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 — дробная.

```python
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. Дальше вызывай те же методы, что и в бою, — заявки, портфель, котировки — на адресе песочницы. Стоп-заявки и часть отчётов в песочнице недоступны.

```bash
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.

```python
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 операций за запрос.

## Источники

- [OpenAPI-спецификация (GitHub)](https://github.com/RussianInvestments/investAPI/blob/main/src/docs/swagger-ui/openapi.yaml)
- [Токен](https://github.com/RussianInvestments/investAPI/blob/main/src/docs/token.md)
- [Песочница и прод](https://github.com/RussianInvestments/investAPI/blob/main/src/docs/url_difference.md)
- [HTTP-коды ответа](https://github.com/RussianInvestments/investAPI/blob/main/src/docs/http_errors.md)
- [Лимиты](https://github.com/RussianInvestments/investAPI/blob/main/src/docs/limits.md)

---

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