Skip to content

Фреймы ​

Все команды клиента и ответы сервера — JSON-объекты с полем op.

Authenticate ​

Передайте API-ключ в URL или отправьте его первым сообщением:

json
{ "op": "auth", "key": "tsk_live_..." }

Используйте форму сообщения, если не хотите ключ в WebSocket URL.

Subscribe ​

json
{
  "op": "subscribe",
  "id": 1,
  "stream": "token_trades",
  "params": {
    "mint": "DD9e...",
    "detail": "full"
  }
}
FieldDescription
opДолжно быть "subscribe"
idCorrelation id клиента; ответы сервера на команду его несут
streamОдно из восьми имён стримов
paramsЦель стрима, фильтры и опции детализации
cursorОпциональный курсор replay рядом с stream, а не внутри params
subНеобязательное имя подписки; не задали — сервер выдаст своё

Сервер подтверждает успешную подписку и возвращает её имя:

json
{ "op": "ack", "id": 1, "sub": "tt_1" }

Это имя приходит в каждом событии подписки, и его же вы передаёте в unsubscribe.

id и sub ​

Два идентификатора с разными задачами, их легко перепутать:

  • id — ваш, на команду. Он возвращается в ack или error, чтобы вы понимали, на какую команду пришёл ответ. Больше он ни для чего не нужен.
  • sub — идентификатор самой подписки. Приходит в каждом событии и в notices, которые её касаются.

Своё имя для подписки ​

Передайте sub при подписке — и подписка будет отвечать на ваше имя вместо сгенерированного:

json
{
  "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 ​

json
{
  "op": "event",
  "sub": "tt_1",
  "stream": "token_trades",
  "cursor": "000436312304:000015:0000",
  "data": {}
}
FieldDescription
subПодписка, породившая событие
streamИмя стрима
cursorПозиция события для replay после переподключения
dataПолезная нагрузка конкретного стрима

Unsubscribe ​

json
{ "op": "unsubscribe", "id": 2, "sub": "tt_1" }

Значение sub — id, возвращённый в подтверждении подписки.

Проверка соединения ​

json
{ "op": "ping", "id": 3 }

Сервер отвечает:

json
{ "op": "pong", "id": 3 }

Пинги протокола WebSocket тоже отправляются. JSON-команда полезна через прокси, которые съедают protocol-level ping.

Ошибки и notices ​

Ошибки включают id команды, которая их вызвала. Notices асинхронны и обычно включают затронутый sub. См. Ошибки и notices.

Realtime Solana data API