# Tiger API

## Назначение

Tiger API — локальный сервер сигналов (WebSocket) для связи скринеров и других внешних сервисов с терминалом Tiger.com Windows.&#x20;

В текущей версии принимает команду setLinkSymbol и мгновенно открывает переданный тикер в указанной группе линковки, чтобы инструмент на графике и/или стакане обновился без ручных действий.&#x20;

## Где включать в терминале

1. Откройте меню: Настройки → Локальный сервер сигналов → Включить сервер сигналов → Сохранить.&#x20;
2. По умолчанию для WebSocket-сервера используется порт 7819.&#x20;

Подключив тумблер, можно использовать команду setLinkSymbol и другие WS-сообщения, описанные ниже.&#x20;

## Текущий формат запроса

<mark style="color:blue;">{</mark>\
&#x20;  <mark style="color:blue;">"type": "setLinkSymbol",</mark>\
&#x20;  <mark style="color:blue;">"e": "BINANCE",</mark>\
&#x20;  <mark style="color:blue;">"m": "SPOT",</mark>\
&#x20;  <mark style="color:blue;">"symbol": "BTCUSDT",</mark>\
&#x20;  <mark style="color:blue;">"linkGroup": "A"</mark>\ <mark style="color:blue;">}</mark>

### Правила валидации

* Все поля обязательные;
* Регистр значений не важен (сервер нормализует и эхо-возвращает в каноническом виде, см. примеры ниже);
* `m`: только SPOT или FUTURES (в ответе нормализуется в Spot/Futures);
* `linkGroup`: строка (буква A–Z или цифра 0–11; словари групп см. справочник ниже)

## Примеры запросов и ответов

### Успешный запрос

<details>

<summary>Пример</summary>

<mark style="color:blue;">socket.send('{"type":"setLinkSymbol","e":"BINANCE","m":"SPOT","symbol":"BTCUSDT","linkGroup":"A"}');</mark>

<mark style="color:$success;">{</mark>\
&#x20;  <mark style="color:$success;">"title": "Successful request",</mark>\
&#x20;  <mark style="color:$success;">"message": "Symbol linked successfully.",</mark>\
&#x20;  <mark style="color:$success;">"request": {</mark>\
&#x20;  <mark style="color:$success;">"e": "BINANCE",</mark>\
&#x20;  <mark style="color:$success;">"m": "Spot",</mark>\
&#x20;  <mark style="color:$success;">"symbol": "BTCUSDT",</mark>\
&#x20;  <mark style="color:$success;">"linkGroup": "A",</mark>\ <mark style="color:$success;">"   type": "SetLinkSymbol"</mark>\ <mark style="color:$success;">},</mark>\
&#x20;  <mark style="color:$success;">"response": {</mark>\
&#x20;  <mark style="color:$success;">"type": "successfully",</mark>\
&#x20;  <mark style="color:$success;">"timestamp": "2025-09-01T13:18:50.2327892+03:00"</mark>\
&#x20;   <mark style="color:$success;">}</mark>\ <mark style="color:$success;">}</mark>

</details>

### Неверный тип команды или битый JSON

<details>

<summary>Пример 1: неизвестный тип (ключи валидные, но значение поля type неверно)</summary>

<mark style="color:blue;">socket.send('{"type":"InvalidType","e":"BINANCE","m":"SPOT","symbol":"BTCUSDT","linkGroup":"A"}');</mark>

<mark style="color:$danger;">{</mark>\
&#x20;  <mark style="color:$danger;">"title": "Invalid JSON (syntax error)",</mark>\
&#x20;  <mark style="color:$danger;">"message": "Invalid JSON. Connection will close.",</mark>\
&#x20;  <mark style="color:$danger;">"request": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "InvalidType",</mark>\
&#x20;  <mark style="color:$danger;">"e": "BINANCE",</mark>\
&#x20;  <mark style="color:$danger;">"m": "SPOT",</mark>\
&#x20;  <mark style="color:$danger;">"symbol": "BTCUSDT",</mark>\
&#x20;  <mark style="color:$danger;">"linkGroup": "A"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"response": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "error",</mark>\
&#x20;  <mark style="color:$danger;">"error": { "message": "Invalid JSON format", "code": 400 },</mark>\
&#x20;  <mark style="color:$danger;">"timestamp": "2025-09-01T13:20:30.6586708+03:00"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"connection\_close": { "code": 1007, "reason": "Invalid JSON format" }</mark>\ <mark style="color:$danger;">}</mark>

</details>

<details>

<summary>Пример 2: невалидный JSON </summary>

<mark style="color:blue;">socket.send('"type": "InvalidType", "e": "BINANCE", "m": "SPOT", "symbol": "BTCUSDT", "linkGroup": "A"}');</mark>

<mark style="color:$danger;">{</mark>\
&#x20;  <mark style="color:$danger;">"title": "Invalid JSON (syntax error)",</mark>\
&#x20;  <mark style="color:$danger;">"message": "Invalid JSON. Connection will close.",</mark>\
&#x20;  <mark style="color:$danger;">"request": null,</mark>\
&#x20;  <mark style="color:$danger;">"response": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "error",</mark>\
&#x20;  <mark style="color:$danger;">"error": { "message": "Invalid JSON format", "code": 400 },</mark>\
&#x20;  <mark style="color:$danger;">"timestamp": "2025-09-01T13:21:21.996182+03:00"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"connection\_close": { "code": 1007, "reason": "Invalid JSON format" }</mark>\ <mark style="color:$danger;">}</mark>

</details>

Поведение соединения: при синтаксической ошибке JSON сервер присылает ошибку и закрывает соединение с кодом 1007.

### Ошибка валидации полей (соединение не закрывается)

<details>

<summary>Пропущены обязательные поля</summary>

<mark style="color:blue;">socket.send('{"type":"setLinkSymbol","e":"","m":"SPOT","symbol":"","linkGroup":""}');</mark>

<mark style="color:$danger;">{</mark>\
&#x20;  <mark style="color:$danger;">"title": "Missing required fields",</mark>\
&#x20;  <mark style="color:$danger;">"message": "Some fields are missing.",</mark>\
&#x20;  <mark style="color:$danger;">"request": {</mark>\
&#x20;  <mark style="color:$danger;">"e": "",</mark>\
&#x20;  <mark style="color:$danger;">"m": "Spot",</mark>\
&#x20;  <mark style="color:$danger;">"symbol": "",</mark>\
&#x20;  <mark style="color:$danger;">"linkGroup": "",</mark>\
&#x20;  <mark style="color:$danger;">"type": "SetLinkSymbol"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"response": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "error",</mark>\
&#x20;  <mark style="color:$danger;">"error": {</mark>\
&#x20;     <mark style="color:$danger;">"message": "'e' is empty, 'symbol' is empty, 'linkGroup' is empty",</mark>\
&#x20;   <mark style="color:$danger;">"code": 400</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"timestamp": "2025-09-01T13:26:53.6306133+03:00"</mark>\ <mark style="color:$danger;">}</mark>\ <mark style="color:$danger;">}</mark>

</details>

<details>

<summary>Несуществующий символ</summary>

<mark style="color:blue;">socket.send('{"type":"setLinkSymbol","e":"BINANCE","m":"SPOT","symbol":"BTCUSDT1","linkGroup":"A"}');</mark>

<mark style="color:$danger;">{</mark>\
&#x20;  <mark style="color:$danger;">"title": "Symbol not found",</mark>\
&#x20;  <mark style="color:$danger;">"message": "Trading symbol not found.",</mark>\
&#x20;  <mark style="color:$danger;">"request": {</mark>\
&#x20;  <mark style="color:$danger;">"e": "BINANCE",</mark>\
&#x20;  <mark style="color:$danger;">"m": "Spot",</mark>\
&#x20;  <mark style="color:$danger;">"symbol": "BTCUSDT1",</mark>\
&#x20;  <mark style="color:$danger;">"linkGroup": "A",</mark>\
&#x20;  <mark style="color:$danger;">"type": "SetLinkSymbol"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"response": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "error",</mark>\
&#x20;  <mark style="color:$danger;">"error": { "message": "Symbol not found", "code": 400 },</mark>\
&#x20;  <mark style="color:$danger;">"timestamp": "2025-09-01T13:28:10.9152168+03:00"</mark>\ <mark style="color:$danger;">}</mark>\ <mark style="color:$danger;">}</mark>

</details>

<details>

<summary>Некорректная группа линковки</summary>

<mark style="color:blue;">socket.send('{"type":"setLinkSymbol","e":"BINANCE","m":"SPOT","symbol":"BTCUSDT","linkGroup":"AX"}');</mark>

<mark style="color:$danger;">{</mark>\
&#x20;  <mark style="color:$danger;">"title": "Invalid link group",</mark>\
&#x20;  <mark style="color:$danger;">"message": "Link group not found.",</mark>\
&#x20;  <mark style="color:$danger;">"request": {</mark>\
&#x20;  <mark style="color:$danger;">"e": "BINANCE",</mark>\
&#x20;  <mark style="color:$danger;">"m": "Spot",</mark>\
&#x20;  <mark style="color:$danger;">"symbol": "BTCUSDT",</mark>\
&#x20;  <mark style="color:$danger;">"linkGroup": "AX",</mark>\
&#x20;  <mark style="color:$danger;">"type": "SetLinkSymbol"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"response": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "error",</mark>\
&#x20;  <mark style="color:$danger;">"error": { "message": "linkedGroup not found", "code": 400 },</mark>\
&#x20;  <mark style="color:$danger;">"timestamp": "2025-09-01T13:30:20.101782+03:00"</mark>\ <mark style="color:$danger;">}</mark>\ <mark style="color:$danger;">}</mark>

</details>

### Ping/Pong

Поддерживаются два варианта пинга.

<details>

<summary>Текстовый</summary>

<mark style="color:blue;">socket.send('ping');</mark>

<mark style="color:$success;">ответ: 'pong'</mark>

</details>

<details>

<summary>JSON</summary>

<mark style="color:blue;">socket.send('{"type":"ping","title":"some title","message":"some message"}');</mark>

<mark style="color:$success;">{</mark>\
&#x20;  <mark style="color:$success;">"title": "Pong",</mark>\
&#x20;  <mark style="color:$success;">"message": "Response 'pong' to 'ping'.",</mark>\
&#x20;  <mark style="color:$success;">"request": { "title": "some title", "message": "some message", "type": "Ping" },</mark>\
&#x20;  <mark style="color:$success;">"response": { "type": "successfully", "timestamp": "2025-09-    01T13:35:34.0389026+03:00" }</mark>\ <mark style="color:$success;">}</mark>

</details>

## Справочник по значениям

### Биржи (e)

Список поддерживаемых бирж и коннекторов:

* BINANCE
* BINANCE-FUT
* BYBIT
* OKX
* MEXC
* BITMEX
* Bitfinex
* Gate.io
* Bitget
* TigerX

Передаваемое значение регистронезависимо. ￼

### Тип рынка (m)

SPOT или FUTURES (регистр не важен; в ответе нормализуется до Spot/Futures). ￼

### Группы линковки (linkGroup)

Передаётся строка. Допустимые группы — буквенные A–Z и цифровые 0–11. Цветовые соответствия и полный справочник доступны в проектной заметке№

<details>

<summary>Буквенные группы</summary>

A: #FFF9C4

B: #93FF9D

C: #1DEAC5

D: #D380FF

E: #FFA5A9

F: #EFE95F

G: #30F74C

H: #01AC8D

I: #9CA6FF

J: #C2595B

K: #CFC937

L: #05D759

M: #0DB9D7

N: #7455F2

O: #A95A7D

P: #EBA14C

Q: #08DA8E

R: #2586E0

S: #1A46DF

T: #905BA0

U: #F56334&#x20;

V: #05A964

W: #00879A

X: #4D23F5

Y: #6C26EE

Z: #3C3C3C

</details>

<details>

<summary>Цифровые группы</summary>

0: #FFAA00

1: #FF4E00

2: #CB3400

3: #87EA09

4: #31DA06

5: #178905

6: #00E0FF

7: #0A7AE0

8: #0A42D2

9: #9655F2

10: #A700FF

11: #6509D5

</details>

## Поведение соединения и коды ошибок

* Синтаксическая ошибка JSON (невозможность распарсить, либо некорректная команда type) → ошибка с code 400 и закрытие соединения с WebSocket-кодом 1007.
* Ошибки валидации содержимого (пустые поля, несуществующий символ, неверная группа) → ошибка с code 400, соединение остаётся открытым.

  Сообщения и примеры в этом разделе см. выше.&#x20;

## Примеры push сообщений

```
socket.send('{"type": "setLinkSymbol", "e": "TigerX Binance", "m": "SPOT", "symbol": "BTCUSDT", "linkGroup": "A"}');
//socket.send('{"type": "setLinkSymbol", "e": "TigerX OKX", "m": "FUTURES", "symbol": "BTCUSDT", "linkGroup": "A"}');
//socket.send('{"type": "setLinkSymbol", "e": "Bitget", "m": "FUTURES", "symbol": "PARTIUSDT", "linkGroup": "A"}');
//socket.send('{"type": "setLinkSymbol", "e": "MOEX", "m": "FUTURES", "symbol": "CR", "linkGroup": "A"}');
//socket.send('{"type": "setLinkSymbol", "e": "MOEX", "m": "FUTURES", "symbol": "CRZ5", "linkGroup": "A"}');
```

## Рекомендации клиенту

* На синтаксические ошибки JSON (закрытие 1007) — переподключение с экспоненциальной задержкой и предварительной локальной валидацией JSON перед отправкой.
* На ошибки валидации содержимого — исправление полей и повторная отправка без переподключения.
* Поддерживать keep-alive через периодический ping (текстовый или JSON).&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://support.tiger.com/razrabotka-dlya-tiger.trade-windows/tiger-api.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
