Личный диалог
Переписка двух участников с входом в аккаунт и доступом только для участников диалога.
Встройте конкретный личный диалог, сервер или канал Соккета в сайт и WebView-приложение. Пользователь входит прямо в блоке, а сообщения обновляются автоматически.
Переписка двух участников с входом в аккаунт и доступом только для участников диалога.
Сообщения выбранной группы. Пользователь видит и отправляет их согласно своим правам в Соккете.
Лента постов без ответов и комментариев. Открытый канал доступен после входа, закрытый — только подписчику.
Нужны ID одного чата и ключ шифрования, если в нём включено сквозное шифрование. Для каждого следующего чата добавьте отдельный блок.
Перейдите в нужный диалог, сервер или канал на web.sokket.ru. ID — число в адресе открытого чата, например /chat/123.
Если чат защищён сквозным шифрованием, откройте его профиль → «Ключ шифрования» → «ПОЛУЧИТЬ КЛЮЧ». Ключ скопируется в буфер обмена.
Укажите ID, выберите lite или full и вставьте скопированный ключ в data-key. Для канала и любого чата без E2EE этот атрибут не нужен.
Откройте страницу, войдите или зарегистрируйтесь в блоке. Чат появится, если аккаунт имеет к нему доступ.
<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 удалите эту строку.
Содержимое остаётся одним и тем же чатом. Меняется пространство, которое он занимает на вашей странице.
Компактный блок для страницы сообщества, кабинета или раздела поддержки. Базовый размер — до 380 × 480 px; ширину и высоту контейнера можно задать своими стилями.

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

<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 Соккет.Ключ в коде страницы доступен посетителям. Размещайте его только для чата, который участники согласны показывать через интеграцию. При смене эпохи сквозного шифрования экспортированный ключ потребуется обновить; будущие ключи автоматически в код страницы не публикуются.
Скрипт создаёт iframe с режимом lite или full и передаёт ключ внутрь через postMessage. Значение ключа не добавляется в адрес страницы.
data-targetdata-chat-iddata-modelite или full; если пропущен — Lite.data-keyКогда блок появляется после перехода внутри SPA, вызовите публичный метод с теми же параметрами.
SokketEmbed.mount({
target: '#sokket-chat',
chatId: 123,
mode: 'lite',
key: 'sk-embed1.ВАШ_КЛЮЧ'
});Метод возвращает управление блоком: setKey(newKey) обновляет ключ, destroy() удаляет виджет.
Вызовы идут на 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_idPOST /api/embed/v1/chat/:id/uploadодин файл: multipart/form-data, поле filePOST /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_apiPOST /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}вход, выход, микрофон, трансляция и управление комнатами
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. Готовый виджет обрабатывает эти курсоры автоматически.
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":"…"}.
OnlyID — дополнительный способ входа в аккаунт Соккета. Вход по паролю, Steam и QR-коду сохраняется. Привязка не заменяет имя, тег, аватар, уровень или историю сообщений Соккета.
Начните с 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 после входа в системном браузереЭти запросы используют действующую сессию Соккета. Секреты OAuth и ключ API профиля хранятся только на сервере.
GET /api/settings/steam/onlygames/profileсостояние привязки и отдельный игровой профиль, если выдан ключ APIPOST /api/settings/steam/onlygames/unlinkотвязка; запрещена без другого способа входаPOST /api/settings/steam/e2ee/onlyid-unlockлокальный пароль или секретная фраза для открытия E2EE на новом устройствеOnlyID подтверждает личность, но не передаёт ключи E2EE. На новом устройстве для старых зашифрованных чатов нужен пароль Соккета или перенос ключа с доверенного устройства; аккаунт без пароля задаёт отдельную секретную фразу. API каталога, библиотеки или активности игр OnlyGames пока не согласован, поэтому импорт игр не заявлен.
Сервер OnlyPlaytest создаёт отдельные чаты Соккета и управляет их участниками по неизменяемому OnlyID sub. В кабинете можно открыть список этих чатов или один чат по внешнему ключу. Скачать OpenAPI 3.1.
Ключ интеграции используется только для запросов сервер → сервер и никогда не передаётся в браузер. В iframe идёт отдельный пользовательский embed_token со сроком не более 15 минут; он открывает только чаты OnlyPlaytest для указанного parent_origin. Обычные личные диалоги и серверы Соккета остаются за своими правилами доступа и E2EE. Управляемые OnlyPlaytest чаты не используют E2EE, чтобы новый участник мог видеть историю.
Базовый адрес и серверный ключ выдаются отдельно для каждого контура. Передавайте 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_secondsPUT /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_keyGET /api/integration/v1/studio-links/{link_key}сервер проверяет link_statusDELETE /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-сессии остаётся общей для пользователя и не зависит от статуса отдельного чата. Обычные чаты Соккета не затронуты.
Параметр parent_origin должен точно совпадать с разрешённым HTTPS origin интеграции. Внешний ключ в адресе кодируется как один компонент URL. Токен не добавляется к адресу iframe, не передаётся через cookie и не хранится в sessionStorage.
GET /embed/integration/chatsсписок чатов OnlyPlaytest пользователя и непрочитанныеGET /embed/integration/chat/{external_key}один чат по внешнему ключуПосле сигнала готовности отправьте {type:"sokket:embed:session",token,expires_at?} с точным targetOrigin iframe. Когда iframe сообщит sokket:embed:session-expiring, получите новую сессию через свой сервер и отправьте такое же сообщение с новым токеном.
sokket:embed:ready — iframe загрузился; sokket:embed:unread — изменился счётчик; sokket:embed:session-expiring — скоро закончится сессия; sokket:embed:error — ошибка с кодом. Родитель должен проверять event.origin и event.source перед обработкой.
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. Эти методы видят только членство пользователя в чатах данной интеграции.
Тестовый контур доступен по адресу https://staging.sokket.ru и использует отдельные базу и ключ. Укажите этот адрес в SOKKET_API_BASE_URL и SOKKET_EMBED_ORIGIN; ключ держите только в серверном окружении OnlyPlaytest. Production-ключ для staging не подходит.
<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 показывает список чатов, непрочитанные, текст, файлы и индикатор набора. Звонки, опросы, реакции и запись голосовых сообщений в этом режиме пока не представлены; они остаются в стандартном виджете одного чата.
Стандартный виджет показывает один чат на блок. Партнёрский режим OnlyPlaytest /embed/integration/chats показывает список доступных чатов в одном iframe.
Для стандартного виджета вход или регистрация доступны внутри блока. OnlyPlaytest передаёт отдельную короткую пользовательскую embed-сессию; форма входа внутри его iframe не нужна. Доступ к каждому чату всё равно определяется членством пользователя.
Нет. Встроенный канал предназначен для просмотра постов, без ответов и комментариев.
Да. Клиент получает обновления без перезагрузки страницы и восстанавливает соединение после временного обрыва.
Снова нажмите «ПОЛУЧИТЬ КЛЮЧ» в Соккете и замените data-key на странице. Иначе новые сообщения текущей эпохи не получится расшифровать в интеграции.
Для одного существующего чата возьмите его ID и сниппет Lite или Full. Для управляемых чатов OnlyPlaytest используйте серверный API и партнёрский iframe.