Публичный API Соккета

Ваш чат.
На вашей странице.

Встройте конкретный личный диалог, сервер или канал Соккета в сайт и WebView-приложение. Пользователь входит прямо в блоке, а сообщения обновляются автоматически.

Один чат на блок Обновления без перезагрузки Адаптация под экран
ваш-сайт.рф / chat
Команда после катки4 участника · в сети
Сегодня

АняСобираемся на следующую игру?

Да, через десять минут 👌

МаркОтлично, я подключусь!

Сообщение...
Иллюстрация интерфейса Соккета на тестовых сообщениях
Что можно встроить

Один формат подключения.
Три типа пространства.

Личный диалог

Переписка двух участников с входом в аккаунт и доступом только для участников диалога.

Сервер

Сообщения выбранной группы. Пользователь видит и отправляет их согласно своим правам в Соккете.

Канал

Лента постов без ответов и комментариев. Открытый канал доступен после входа, закрытый — только подписчику.

Начните за несколько шагов

Быстрый старт

Нужны ID одного чата и ключ шифрования, если в нём включено сквозное шифрование. Для каждого следующего чата добавьте отдельный блок.

  1. Шаг 1

    Откройте чат в Соккете

    Перейдите в нужный диалог, сервер или канал на web.sokket.ru. ID — число в адресе открытого чата, например /chat/123.

  2. Шаг 2

    Получите ключ

    Если чат защищён сквозным шифрованием, откройте его профиль → «Ключ шифрования» → «ПОЛУЧИТЬ КЛЮЧ». Ключ скопируется в буфер обмена.

  3. Шаг 3

    Вставьте код в страницу

    Укажите ID, выберите lite или full и вставьте скопированный ключ в data-key. Для канала и любого чата без E2EE этот атрибут не нужен.

  4. Шаг 4

    Проверьте доступ

    Откройте страницу, войдите или зарегистрируйтесь в блоке. Чат появится, если аккаунт имеет к нему доступ.

Готовый пример

Встройте Lite на страницу

<div id="sokket-chat"></div>
<script src="https://web.sokket.ru/static/assets/js/sokket-embed.js?v=20261014-1"
        data-target="#sokket-chat"
        data-chat-id="123"
        data-mode="lite"
        data-key="sk-embed1.ВАШ_КЛЮЧ"></script>

Замените 123 на ID чата. Значение data-key должно быть точной копией из Соккета; для канала и чата без E2EE удалите эту строку.

Выберите размер

Два режима встраивания

Содержимое остаётся одним и тем же чатом. Меняется пространство, которое он занимает на вашей странице.

Режим Lite

Чат рядом с вашим контентом

Компактный блок для страницы сообщества, кабинета или раздела поддержки. Базовый размер — до 380 × 480 px; ширину и высоту контейнера можно задать своими стилями.

  • Один выбранный чат
  • Вход и регистрация внутри блока
  • Автоматическое обновление сообщений
Скриншот Lite · тестовые данные
Компактный встроенный чат Соккета: заголовок сервера, сообщения и поле ввода
Режим Full

Чат как отдельный экран

Для вкладки «Чат» в WebView или полноценной страницы сайта. Блок занимает всю ширину контейнера и высоту экрана либо высоту, которую вы зададите.

  • Адаптивный интерфейс Соккета
  • Один диалог, сервер или канал
  • Те же права, что у пользователя в Соккете
Скриншот Full · тестовые данные
Полноэкранный встроенный чат Соккета: заголовок сервера, сообщения и поле ввода
Для WebView и отдельной страницы

Встройте Full

<div id="sokket-full-chat" style="width:100%; height:100dvh"></div>
<script src="https://web.sokket.ru/static/assets/js/sokket-embed.js?v=20261014-1"
        data-target="#sokket-full-chat"
        data-chat-id="123"
        data-mode="full"
        data-key="sk-embed1.ВАШ_КЛЮЧ"></script>
Для зашифрованных чатов

Ключ шифрования

Если личный диалог или сервер использует E2EE, откройте в профиле раздел «Ключ шифрования» и нажмите «ПОЛУЧИТЬ КЛЮЧ». Вставьте скопированное значение в data-key. После успешного подключения в этом окне появится отметка: «Данный чат использует публичный API Соккет.»

Доступ к чату остаётся за Соккетом

Вход обязателен. Сервер проверяет членство для личных диалогов, серверов и закрытых каналов на каждом запросе. Один лишь ключ не открывает закрытую переписку.

Пример окна Соккета · тестовые данные
Ключ шифрования

Сравните изображение и цифры с устройством собеседника.

ПОЛУЧИТЬ КЛЮЧДанный чат использует публичный API Соккет.

Ключ в коде страницы доступен посетителям. Размещайте его только для чата, который участники согласны показывать через интеграцию. При смене эпохи сквозного шифрования экспортированный ключ потребуется обновить; будущие ключи автоматически в код страницы не публикуются.

Справочник

Как устроен API

Скрипт создаёт iframe с режимом lite или full и передаёт ключ внутрь через postMessage. Значение ключа не добавляется в адрес страницы.

Встраивание

Атрибуты скрипта

data-target
CSS-селектор контейнера на вашей странице.
data-chat-id
ID одного диалога, сервера или канала.
data-mode
lite или full; если пропущен — Lite.
data-key
Экспортированный ключ для E2EE чата.
Для динамических страниц

Монтаж из JavaScript

Когда блок появляется после перехода внутри SPA, вызовите публичный метод с теми же параметрами.

SokketEmbed.mount({
  target: '#sokket-chat',
  chatId: 123,
  mode: 'lite',
  key: 'sk-embed1.ВАШ_КЛЮЧ'
});

Метод возвращает управление блоком: setKey(newKey) обновляет ключ, destroy() удаляет виджет.

HTTP API виджета

Запросы, которые выполняет встроенный чат

Вызовы идут на web.sokket.ru с Bearer-токеном вошедшего пользователя. Тело запросов обычно JSON; загрузка файла использует multipart/form-data. Ответы имеют JSON-формат.

GET /api/embed/v1/sessionuser{id,name,tag,avatar}
GET /api/embed/v1/chat/:id/infoназвание, тип, права, эпоха E2EE, оформление
GET /api/embed/v1/chat/:id/messagesистория: before_id или after_id
POST /api/embed/v1/chat/:id/uploadодин файл: multipart/form-data, поле file
POST /api/embed/v1/chat/:id/sendотправка: {text, reply_to_id?, attachments?}
POST /api/embed/v1/chat/:id/typingиндикатор набора сообщения
GET /api/embed/v1/chat/:id/updatesсообщения, изменения, удаления и набор текста
GET /api/embed/v1/link-previewкарточка ссылки: ?url=...
GET /api/embed/v1/status?chat_id=N → uses_public_api
POST /api/embed/v1/usageотметка подключения: {chat_id}
Звонки и комнаты

Те же звонки, что в Соккете

В личном диалоге кнопка телефона запускает звонок и показывает входящий вызов. На сервере панель «Голосовые комнаты» показывает участников, трансляции, микрофоны и настройки комнат. Для медиа используется LiveKit. Скрипт встраивания разрешает микрофон, камеру, демонстрацию экрана и воспроизведение звука внутри iframe. Браузер может запросить доступ к устройствам; в WebView его также должно разрешить само приложение. Действия с комнатами передают поля формы application/x-www-form-urlencoded (для загрузки фона — multipart/form-data).

GET .../chat/:id/roomsкомнаты, участники, права управления
GET .../chat/:id/call/token?room_id=Nтокен LiveKit для выбранной комнаты
GET .../chat/:id/rooms/incomingвходящий звонок в личном диалоге
GET .../chat/:id/rooms/events?after=Nперемещение и модерация участника
POST .../chat/:id/rooms/{action}вход, выход, микрофон, трансляция и управление комнатами
Панель голосовых комнат Соккета во встроенном чате: участники, статусы и настройки комнат
Голосовые комнаты в режиме Full · тестовые данные
Авторизация

Токен пользователя

POST /api/v1/auth/login принимает {login,password}; POST /api/v1/auth/register — {name,tag,email,password}. Если вход требует код из письма, POST /api/v1/auth/verify-2fa принимает {email,code}. Успешный ответ этих методов содержит data.token; защищённые запросы передают Authorization: Bearer <token>.

История и права

Данные одного чата

GET .../info возвращает id, title, avatar, is_group, is_channel, can_send, e2ee, current_epoch, my_user_id и доступное оформление. История выдаётся страницами по 25 сообщений: before_id загружает предыдущие, after_id — новые. Сообщения содержат вложения и данные, нужные для карточек, реакций, рамок и никнеймов. В канале can_send=false даже для администратора.

Обновления

Синхронизация

GET .../updates?after=N&since=RFC3339 возвращает messages, changed, deleted_ids, typing_users, next_after и server_time. Для длинной серии изменений передаются changed_after и hidden_after; ответ содержит next_changed_after, next_hidden_after и флаги changed_has_more/hidden_has_more. Готовый виджет обрабатывает эти курсоры автоматически.

Отправка и ошибки

JSON и статусы

POST .../send принимает JSON {"text":"…","reply_to_id":123,"attachments":[]}; ответ .../upload можно передать в массиве attachments (до 9 файлов). reply_to_id и attachments необязательны. Для E2EE поле text содержит шифротекст sk-e2ee1. Ошибки embed API содержат status, code, message: 401 — нужен вход, 403 — нет доступа, 409 STALE_KEY — ключ сменился, 422 E2EE_REQUIRED — требуется шифротекст.

Пример ответа

Сведения о чате

Поля типа и прав позволяют встроенному клиенту показать поле ввода только там, где оно доступно.

{
  "status": "success",
  "id": 123,
  "title": "Команда после катки",
  "is_group": true,
  "is_channel": false,
  "can_send": true,
  "e2ee": true,
  "current_epoch": 3
}

Для интеграции достаточно HTML-сниппета выше: виджет управляет входом, историей, шифрованием, обновлениями и повторным подключением. Ручные вызовы выполняйте из iframe на web.sokket.ru; браузерные запросы на отправку с другого Origin сервер отклоняет. Ответ ошибок embed API: {"status":"error","code":"…","message":"…"}.

Вход и привязка

OnlyGames / OnlyID

OnlyID — дополнительный способ входа в аккаунт Соккета. Вход по паролю, Steam и QR-коду сохраняется. Привязка не заменяет имя, тег, аватар, уровень или историю сообщений Соккета.

Браузерные маршруты

OAuth 2.0 / OIDC

Начните с GET /auth/onlyid. Сервер перенаправит пользователя в OnlyID, проверит PKCE, state, nonce и подпись ID-токена, затем создаст обычную сессию Соккета. Новый пользователь перед созданием аккаунта подтверждает соглашение Соккета. Если пользователь уже вошёл в Соккет, тот же маршрут привяжет OnlyID к текущему аккаунту. Совпадение email само по себе аккаунты не объединяет.

GET /auth/onlyidвход или привязка; ?switch=1 показывает выбор аккаунта
GET /auth/onlyid/callbackзарегистрированный callback OnlyID; только для редиректа провайдера
POST /auth/onlyid/consentподтверждение соглашения при первом входе
GET /auth/onlyid/app-completeодноразовый возврат в мобильный WebView после входа в системном браузере
Настройки вошедшего пользователя

Интеграция OnlyGames

Эти запросы используют действующую сессию Соккета. Секреты OAuth и ключ API профиля хранятся только на сервере.

GET /api/settings/steam/onlygames/profileсостояние привязки и отдельный игровой профиль, если выдан ключ API
POST /api/settings/steam/onlygames/unlinkотвязка; запрещена без другого способа входа
POST /api/settings/steam/e2ee/onlyid-unlockлокальный пароль или секретная фраза для открытия E2EE на новом устройстве

OnlyID подтверждает личность, но не передаёт ключи E2EE. На новом устройстве для старых зашифрованных чатов нужен пароль Соккета или перенос ключа с доверенного устройства; аккаунт без пароля задаёт отдельную секретную фразу. API каталога, библиотеки или активности игр OnlyGames пока не согласован, поэтому импорт игр не заявлен.

Партнёрская интеграция

OnlyPlaytest: чаты в кабинете

Сервер OnlyPlaytest создаёт отдельные чаты Соккета и управляет их участниками по неизменяемому OnlyID sub. В кабинете можно открыть список этих чатов или один чат по внешнему ключу. Скачать OpenAPI 3.1.

Ключ интеграции используется только для запросов сервер → сервер и никогда не передаётся в браузер. В iframe идёт отдельный пользовательский embed_token со сроком не более 15 минут; он открывает только чаты OnlyPlaytest для указанного parent_origin. Обычные личные диалоги и серверы Соккета остаются за своими правилами доступа и E2EE. Управляемые OnlyPlaytest чаты не используют E2EE, чтобы новый участник мог видеть историю.

Integration API · только с сервера

Пользователи, сессии, чаты

Базовый адрес и серверный ключ выдаются отдельно для каждого контура. Передавайте Authorization: Bearer <integration_key>. Клиентский браузер не должен вызывать эти методы. Создание пользователя требует подтверждённого согласия на соглашение Соккета: consent_attested: true. Совпадение email не связывает аккаунты.

PUT /api/integration/v1/users/{onlyid_sub}идемпотентное создание или обновление связанного пользователя
POST /api/integration/v1/sessionsкороткоживущий токен iframe: onlyid_sub, parent_origin, ttl_seconds
PUT /api/integration/v1/chats/{external_key}создать или обновить чат, принадлежащий этой интеграции
GET /api/integration/v1/chats/{external_key}прочитать состояние чата и версию состава
PUT /api/integration/v1/chats/{external_key}/membersзадать полный желаемый состав участников
GET /api/integration/v1/chats/{external_key}/membersпрочитать текущий состав и версию
POST /api/integration/v1/chats/{external_key}/members/{onlyid_sub}точечно добавить участника или изменить роль
DELETE /api/integration/v1/chats/{external_key}/members/{onlyid_sub}точечно убрать участника без удаления аккаунта
GET /api/integration/v1/users/{onlyid_sub}/unreadсчётчик непрочитанных в чатах интеграции
Привязка студии

Подтверждение владельца Соккета

Владелец существующего сервера или канала Соккета получает одноразовый код на 15 минут в настройках. Уполномоченный представитель студии вводит его в OnlyPlaytest, где партнёр проверяет право управлять этой студией и подтверждает код серверным запросом. Отдельные закрытые чаты плейтестов создаются с studio_link_key. Участники связанного сервера или канала не получают доступ к ним автоматически; доступ есть только у явно добавленных участников. При смене владельца привязка приостанавливается до нового кода, а при отключении связанные чаты и история сохраняются для участников без дальнейших серверных изменений партнёром.

POST /api/conversations/{id}/studio-link-codeтолько владелец Соккета с обычной сессией выпускает код
GET /api/conversations/{id}/studio-linkвладелец проверяет состояние привязки
DELETE /api/conversations/{id}/studio-linkвладелец отключает студию
POST /api/integration/v1/studio-linksсервер OnlyPlaytest отправляет code и link_key
GET /api/integration/v1/studio-links/{link_key}сервер проверяет link_status
DELETE /api/integration/v1/studio-links/{link_key}сервер отключает студию со своей стороны
Права внутри плейтеста

Модерация своего чата

Участник с ролью admin может удалять чужие сообщения, закреплять их и запрещать отправку сообщений другому участнику только в том закрытом чате плейтеста, где он состоит. Он не становится администратором обычных чатов Соккета. Методы модерации требуют пользовательский embed_token и X-Embed-Parent-Origin.

GET /api/embed/integration/v1/chats/{external_key}/moderationсостав и закрепы своего чата
POST /api/embed/integration/v1/chats/{external_key}/moderation/muteзапретить или разрешить отправку участнику
POST /api/embed/integration/v1/chats/{external_key}/moderation/pinзакрепить сообщение
POST /api/embed/integration/v1/chats/{external_key}/moderation/unpinснять закреп
POST /api/embed/integration/v1/chats/{external_key}/moderation/deleteмягко удалить сообщение для всех

После приостановки или отключения привязки студии текущие участники продолжают читать историю связанных закрытых чатов в iframe. Отправка сообщений и файлов, индикатор набора и команды модерации через партнёрский iframe возвращают 409 STUDIO_LINK_INACTIVE; GET .../info показывает can_send=false и can_moderate=false. Выдача embed-сессии остаётся общей для пользователя и не зависит от статуса отдельного чата. Обычные чаты Соккета не затронуты.

Iframe с авторизацией партнёра

Список или конкретный чат

Параметр parent_origin должен точно совпадать с разрешённым HTTPS origin интеграции. Внешний ключ в адресе кодируется как один компонент URL. Токен не добавляется к адресу iframe, не передаётся через cookie и не хранится в sessionStorage.

GET /embed/integration/chatsсписок чатов OnlyPlaytest пользователя и непрочитанные
GET /embed/integration/chat/{external_key}один чат по внешнему ключу
Сообщения parent → iframe

Выдача и обновление токена

После сигнала готовности отправьте {type:"sokket:embed:session",token,expires_at?} с точным targetOrigin iframe. Когда iframe сообщит sokket:embed:session-expiring, получите новую сессию через свой сервер и отправьте такое же сообщение с новым токеном.

Сообщения iframe → parent

Состояние виджета

sokket:embed:ready — iframe загрузился; sokket:embed:unread — изменился счётчик; sokket:embed:session-expiring — скоро закончится сессия; sokket:embed:error — ошибка с кодом. Родитель должен проверять event.origin и event.source перед обработкой.

Embed API · токен пользователя

Данные внутри iframe

GET /api/embed/integration/v1/session проверяет сессию. GET /api/embed/integration/v1/chats отдаёт список, GET /api/embed/integration/v1/unread — счётчики. Для выбранного {external_key} доступны info, messages, updates, send, typing и upload. Каждый запрос несёт Authorization: Bearer <embed_token> и X-Embed-Parent-Origin. Эти методы видят только членство пользователя в чатах данной интеграции.

Staging

Раздельные доступы

Тестовый контур доступен по адресу https://staging.sokket.ru и использует отдельные базу и ключ. Укажите этот адрес в SOKKET_API_BASE_URL и SOKKET_EMBED_ORIGIN; ключ держите только в серверном окружении OnlyPlaytest. Production-ключ для staging не подходит.

Пример интеграции iframe

Список чатов через готовый helper

<div id="playtest-chats"></div>
<script src="https://web.sokket.ru/static/assets/js/sokket-embed.js?v=20261014-1"></script>
<script>
const widget = SokketEmbed.mountIntegration({
  target: '#playtest-chats', mode: 'inbox', theme: 'dark', lang: 'ru',
  onUnread: ({ count }) => console.log('Непрочитанных:', count),
  onSessionExpiring: async () =>
    widget.setSession(await getEmbedSessionFromYourServer())
});
getEmbedSessionFromYourServer().then(session => widget.setSession(session));
// Ваш метод возвращает {embed_token, expires_at}; ключ интеграции остаётся на сервере.
</script>

Чтобы открыть один чат, используйте mode: 'chat' и externalKey: 'playtest:campaign:example'. Helper проверяет origin и канал сообщений, принимает новый токен через widget.setSession(session). При выходе пользователя вызовите widget.clearSession(), при удалении блока — widget.destroy(). Очистка iframe не отзывает уже выданный токен на сервере; он истекает по expires_at. getEmbedSessionFromYourServer() — ваш серверный маршрут, не метод Соккета в браузере.

Партнёрский iframe показывает список чатов, непрочитанные, текст, файлы и индикатор набора. Звонки, опросы, реакции и запись голосовых сообщений в этом режиме пока не представлены; они остаются в стандартном виджете одного чата.

Частые вопросы

Перед запуском

Если ответ не нашёлся, напишите нам на sokket@list.ru.

Можно ли показать несколько чатов одним блоком?

Стандартный виджет показывает один чат на блок. Партнёрский режим OnlyPlaytest /embed/integration/chats показывает список доступных чатов в одном iframe.

Нужен ли вход в Соккет?

Для стандартного виджета вход или регистрация доступны внутри блока. OnlyPlaytest передаёт отдельную короткую пользовательскую embed-сессию; форма входа внутри его iframe не нужна. Доступ к каждому чату всё равно определяется членством пользователя.

Можно ли отправлять сообщения в канал?

Нет. Встроенный канал предназначен для просмотра постов, без ответов и комментариев.

Будут ли новые сообщения появляться сами?

Да. Клиент получает обновления без перезагрузки страницы и восстанавливает соединение после временного обрыва.

Что делать после смены ключа E2EE?

Снова нажмите «ПОЛУЧИТЬ КЛЮЧ» в Соккете и замените data-key на странице. Иначе новые сообщения текущей эпохи не получится расшифровать в интеграции.

Готовы подключить?

Выберите вид встраивания.

Для одного существующего чата возьмите его ID и сниппет Lite или Full. Для управляемых чатов OnlyPlaytest используйте серверный API и партнёрский iframe.

Перейти в Соккет