# T-Invest API: Выставить заявку и проверить исполнение

Сценарий из mcp-everything. Актуально на 2026-10-24.

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

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"])
```

## Базовые 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.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/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 | нет | Цена |

## Нюансы

- Для `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.

## Другие сценарии

- [Посмотреть счета и портфель](https://mcp-everything.ru/integrations/t-invest/scenarios/posmotret-scheta-i-portfel.md)
- [Найти инструмент и узнать его цену](https://mcp-everything.ru/integrations/t-invest/scenarios/nayti-instrument-i-uznat-ego-tsenu.md)
- [Проверить робота в песочнице](https://mcp-everything.ru/integrations/t-invest/scenarios/proverit-robota-v-pesochnitse.md)
- [Выгрузить операции по счёту](https://mcp-everything.ru/integrations/t-invest/scenarios/vygruzit-operatsii-po-schetu.md)

---

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