Фреймы
Все команды клиента и ответы сервера — JSON-объекты с полем op.
Authenticate
Передайте API-ключ в URL или отправьте его первым сообщением:
{ "op": "auth", "key": "tsk_live_..." }Используйте форму сообщения, если не хотите ключ в WebSocket URL.
Subscribe
{
"op": "subscribe",
"id": 1,
"stream": "token_trades",
"params": {
"mint": "DD9e...",
"detail": "full"
}
}| Field | Description |
|---|---|
op | Должно быть "subscribe" |
id | Correlation id клиента; ответы сервера на команду его несут |
stream | Одно из восьми имён стримов |
params | Цель стрима, фильтры и опции детализации |
cursor | Опциональный курсор replay рядом с stream, а не внутри params |
sub | Необязательное имя подписки; не задали — сервер выдаст своё |
Сервер подтверждает успешную подписку и возвращает её имя:
{ "op": "ack", "id": 1, "sub": "tt_1" }Это имя приходит в каждом событии подписки, и его же вы передаёте в unsubscribe.
id и sub
Два идентификатора с разными задачами, их легко перепутать:
id— ваш, на команду. Он возвращается вackилиerror, чтобы вы понимали, на какую команду пришёл ответ. Больше он ни для чего не нужен.sub— идентификатор самой подписки. Приходит в каждом событии и в notices, которые её касаются.
Своё имя для подписки
Передайте sub при подписке — и подписка будет отвечать на ваше имя вместо сгенерированного:
{
"op": "subscribe",
"id": 1,
"stream": "token_trades",
"sub": "wsol-chart",
"params": { "mint": "So11111111111111111111111111111111111111112" }
}События придут с "sub": "wsol-chart" — это избавляет от таблицы соответствия между сгенерированными id и тем, что подписка кормит на вашей стороне.
Имя — до 64 символов, и на этом соединении оно должно быть свободно: повтор даёт duplicate_subscription. На двух разных соединениях wsol-chart можно занять дважды. Имена принадлежат подпискам, а не целям, поэтому один и тот же mint на basic и на full — это две подписки и два имени.
Не передали sub — сервер выдаст имя вида tt_1: код стрима и счётчик. Сгенерированные имена считайте непрозрачными: счётчик обнуляется при перезапуске сервиса, так что разбирать их в коде не стоит.
Валидация параметров
- Список принимает не более 50 значений.
- Строка принимает не более 64 символов.
- Неизвестные параметры завершаются с
invalid_params, поэтому опечатки не игнорируются молча. - Обязательные цели стрима (
mintилиwallet) должны быть валидными адресами Solana.
Необязательный фильтр, который вы не задали, означает «без ограничения», и как именно вы это скажете — неважно: не передавайте поле, пришлите null или пришлите пустой список. Все три варианта работают одинаково, поэтому список фильтров, который собрал ваш код и оставил пустым, подпишет на всё, а не свалится с ошибкой.
Event
{
"op": "event",
"sub": "tt_1",
"stream": "token_trades",
"cursor": "000436312304:000015:0000",
"data": {}
}| Field | Description |
|---|---|
sub | Подписка, породившая событие |
stream | Имя стрима |
cursor | Позиция события для replay после переподключения |
data | Полезная нагрузка конкретного стрима |
Unsubscribe
{ "op": "unsubscribe", "id": 2, "sub": "tt_1" }Значение sub — id, возвращённый в подтверждении подписки.
Проверка соединения
{ "op": "ping", "id": 3 }Сервер отвечает:
{ "op": "pong", "id": 3 }Пинги протокола WebSocket тоже отправляются. JSON-команда полезна через прокси, которые съедают protocol-level ping.
Ошибки и notices
Ошибки включают id команды, которая их вызвала. Notices асинхронны и обычно включают затронутый sub. См. Ошибки и notices.