Skip to content

Server events

Каждое сообщение сокета:

Field Type Example Possible Values
type string "event" "event"
eventType string "new" имя события ниже
id string "a1b2c3d4e5" id пакета
timestamp number 12345.67 монотонное время сервера, не unix
ackKey? string "aiNew-chat:1" ключ подтверждения
payload object поля события; у chats, eventsBatch — массив

Для зашифрованных диалогов new, edit, delete, reaction, purgeMessages, deleteChat, refreshKeys уходят внутри eventsBatch. Пока клиент не прислал decryptAck, сервер может дополнительно сразу прислать new.

new

Новое сообщение. Для звонка type = "call", а payload — объект звонка (см. update).

Field Type Example Possible Values
chatId string "User1" Chat IDs
chatName? string "Team" имя группы
sender object см. Participant Participant
messageId integer 124 Message IDs
clientMessageId string "66d93f9b-a8ff-4f18-a092-c19bdeb31fa4" Any string
message? string "Hello, World!" Any string
attachments? array See "Attachments" Array of Attachment objects
timestamp integer 1700500000000 Unix timestamp
missed integer 1 Missed messages
firstMissed? string "66d93f9b-a8ff-4f18-a092-c19bdeb31fa4" clientMessageId первого непрочитанного
status? string "read" "read", "unread", "undelivered", "deleted"
totalMissed integer 3 непрочитанные по всем чатам
replyTo? object ReplyTo
forwarded? boolean true
forwardedFrom? object { chat, participant, messageId }
payload? object edit / delete / call / { sources } для AI
type? string "call" "new", "delete", "edit", "call", "like", "ai_answer"
muted? boolean false чат замьючен
groupAvatarUrl? string "https://example.com/a.jpg" URL
needApprove? boolean true
linkPreview? boolean true
isStreaming? boolean true AI-ответ ещё стримится
linkedMessage? string
shouldApplyToClientStorage? boolean true
emptyMessage? boolean false

Participant (sender):

Field Type Example Possible Values
id string "User1" User IDs
name string "John Doe" Any string
avatarUrl? string "https://example.com/a.jpg" URL
verified? boolean true
verificationType? string "green" "none", "green", "gold", "silver"
isAdmin? boolean false
readonly? boolean false

ReplyTo:

Field Type Example Possible Values
messageId integer 120 Message IDs
clientMessageId string "..." Any string
sender string "User1" User IDs
createdAt integer 1700500000000 Unix timestamp
message? string "Hi" Any string
deletedAt? integer 1700500000000 Unix timestamp

chats

Полный список чатов: новый чат, смена инфо, удаление. payload — массив ChatListItem, не один объект.

Field Type Example Possible Values
type string "dialog" "dialog", "group", "channel", "favorites", "ai"
id string "User1" Chat IDs
name string "John Doe" Any string
username? string "john" Any string
photoUrl? string "https://..." URL or null
lastMessageId? integer 124 Message IDs
lastMessageText? string "Hello" Any string
lastMessageTime integer 1700500000000 Unix timestamp
lastMessageAuthor? string "User1" User IDs
lastMessageStatus? string "read" "read", "unread", "undelivered", "deleted"
missed integer 1 Missed messages
firstMissed? string "66d93f9b-..." clientMessageId
verified? boolean true
verificationType? string "green" "none", "green", "gold", "silver"
isMine boolean false
attachment? object { type, count, fileName?, contactName?, voiceDuration? }
lastSeen? integer 1700500000000 Unix timestamp
onlineHidden? boolean true
participantCount? integer 12
payload? object CallPayload, если последнее сообщение — звонок
hidden? boolean false
reaction? string "👍"
liked? boolean true кто-то поставил реакцию на моё сообщение
likedMessageId? integer 120
likedMessageText? string "Hi"
likedAuthor? string "User2" User IDs
likedUserName? string "Jane"
isPinned? boolean false
isMuted? boolean false
unread? boolean true
isMyContact? boolean true
isBlocked? boolean true только если я заблокировал собеседника
needApprove? boolean true
blockCalls? boolean false
blockMessages? boolean false
isAdmin? boolean false
mention? boolean true
mentionMessageId? integer 130
mentionAuthor? string "User2" User IDs
isMentor? boolean false
allowAI? boolean true AI-ответы включены в чате
isSupport? boolean true только у чата поддержки

edit

Сообщение отредактировано.

Field Type Example Possible Values
chatId string "User1" Chat IDs
userId? string "User1" кто редактировал
messageId integer 125 id сервисного сообщения
clientMessageId string "66d93f9b-a8ff-4f18-a092-c19bdeb31fa4"
originalMessageId integer 124 редактируемое сообщение
originalClientMessageId string "440C17F2-FA09-48F8-8273-E3990FE0BAC5"
message string "Updated text" Any string
attachments? array Attachment[]
timestamp integer 1700500000000 Unix timestamp
payload? object edit / delete / call / AI
linkPreview? boolean true
isStreamingComplete? boolean true AI дописал ответ

delete

Field Type Example Possible Values
chatId string "User1" Chat IDs
messageId integer 126 id сервисного сообщения
clientMessageId string "66d93f9b-a8ff-4f18-a092-c19bdeb31fa4"
originalMessageId integer 124 удалённое сообщение
originalClientMessageId string "440C17F2-FA09-48F8-8273-E3990FE0BAC5"

deleteChat

Чат удалён у этого пользователя. Для AI-чата вместо этого приходит chats.

Field Type Example Possible Values
chatId string "User1" Chat IDs
messageId integer -1 всегда -1

update

Патч уже существующего сообщения. Сейчас так обновляется звонок: смена audio → video и завершение звонка.

Field Type Example Possible Values
chatId string "User1" Chat IDs
timestamp integer 1700500000000 Unix timestamp
messageId integer 130 id апдейта
clientMessageId string "qzjdfsdfvpFe8Da3Nlt2"
headMessageId integer 124 id сообщения звонка
sender object Participant
type? string "call" "call"
update object { payload: CallPayload partial }

update.payload для звонка:

Field Type Example Possible Values
callId string "call-1" Call IDs
callType? string "video" "video", "audio"
status? string "received" "missed", "received", "in progress"
direction? string "incoming" "incoming", "outgoing"
closedAt? integer 1700500000000 Unix timestamp
duration? integer 42 секунды
isVideo? boolean true
caller? string "User1" User IDs
participants? array ["User1"] User IDs
users? array CallParticipant[]

Звонок как new (type: "call") несёт тот же CallPayload плюс chatId, messageId, clientMessageId, missed, sender, timestamp.

calls

Активные звонки пользователя. Приходит при подключении, только если список не пуст. payload — объект, не массив.

Field Type Example Possible Values
calls array см. элемент

Элемент calls[]:

Field Type Example Possible Values
callId string "call-1" Call IDs
chatId string "User2" Chat IDs
isVideo boolean true
isGroup boolean false
caller string "User1" User IDs

newCallInvites

В текущий звонок добавили участников. Только если сокет онлайн.

Field Type Example Possible Values
callId string "call-1" Call IDs
chatId string "User2" Chat IDs
inviter string "User1" User IDs
participants array CallParticipant[]

CallParticipant: id, token, uid, connectedAt?, disconnectedAt?, firstConnectedAt?, acceptedAt?, invited?, duration?.

userInvitedToCall

Конкретного пользователя позвали в звонок.

Field Type Example Possible Values
callId string "call-1" Call IDs
chatId string "User2" Chat IDs
inviter string "User1" User IDs
invitedUser object CallParticipant

callAccepted

Собеседник нажал «Ответить». Вход в Agora может быть позже.

Field Type Example Possible Values
callId string "call-1" Call IDs
chatId string "User2" Chat IDs
acceptedBy string "User2" User IDs

online

Field Type Example Possible Values
userId string "User1" User IDs
lastSeen? integer 1700500000000 Unix timestamp

offline

Field Type Example Possible Values
userId string "User1" User IDs
lastSeen integer 1700500000000 Unix timestamp
onlineHidden? boolean true статус скрыт настройками приватности

Offline Event Trigger

Если от клиента нет ping 25 секунд, сокет закрывается и участникам уходит offline.

typing

Для личного чата userId нет: chatId — это id печатающего. Для группы есть оба поля. Событие не буферизуется и не чаще раза в 1.5 с, пока stop не true.

Field Type Example Possible Values
chatId string "User2" Chat IDs
userId? string "User2" User IDs, только группы
stop? boolean true

dlvrd

Field Type Example Possible Values
chatId string "User2" Chat IDs
userId? string "User2" user (for groups)
messageId integer 123 Message IDs
clientMessageId string "123"
timestamp integer 1700500000000 Unix timestamp

read

Field Type Example Possible Values
chatId string "User2" Chat IDs
userId? string "User2" user (for groups)
messageId integer 123 Message IDs
clientMessageId string "123"
timestamp integer 1700500000000 Unix timestamp

messagePinned

Закрепление и открепление. pinnedAt есть только при закреплении.

Field Type Example Possible Values
chatId string "User2" Chat IDs
userId string "User2" User IDs
messageId integer 123 Message IDs
pinnedAt? integer 1700500000000 Unix timestamp

reaction

Добавленная или снятая реакция. При снятии messageId может отсутствовать.

Field Type Example Possible Values
chatId string "_qzjQofkCDvpFe8Da3Nlt2" Chat IDs
messageId? integer 2 id сервисного сообщения, если реакция поставлена
originalMessageId integer 1 сообщение, к которому реакция
userId string "SYDY5qXsnv2aJnkoI9qF8E20" кто поставил
authorId string "authorId" автор сообщения
timestamp integer 1700500000000 Unix timestamp
reaction string "👍" Any string
isSet boolean true true — поставлена, false — снята
isNew boolean false первая реакция этого пользователя
avatarUrl? string "https://server.com/avatar.jpg" URL
userName? string "Jane"
clientMessageId string "440C17F2-FA09-48F8-8273-E3990FE0BAC5"
originalClientMessageId string "440C17F2-FA09-48F8-8273-E3990FE0BAC5"
text? string "Hello" текст сообщения

newStory

Field Type Example Possible Values
userId? string "_qzjQofkCDvpFe8Da3Nlt2" User IDs
chatId? string "groupId" Chat IDs
storyId string "SYDY5qXsnv2aJnkoI9qF8E20" Story IDs
userAvatar? string "https://example.com/picture.jpg" URL
storyPreview? string "https://cloudflare.com/dsdfsf/preview.jpg" URL
fileLink? string "https://..." URL
duration? integer 15 секунды
price? number 1.5
published? integer 1700500000000 Unix timestamp
name? string "Jane"
verified? boolean true

removedStory

Field Type Example Possible Values
userId? string "_qzjQofkCDvpFe8Da3Nlt2" User IDs
chatId? string "groupId" Chat IDs
storyId string "SYDY5qXsnv2aJnkoI9qF8E20" Story IDs

joinRequest

Админам группы: вход по инвайту, который надо подтвердить.

Field Type Example Possible Values
chatId string "_qzjQofkCDvpFe8Da3Nlt2" Chat IDs
userId string "_qzjQofkCDvpFe8Da3Nlt2" User IDs
linkId string "SYDY5qXsnv2aJnkoI9qF8E20" Invite Link IDs

privateGroupApproveRequest

Админам приватной группы: вход по инвайту, сообщение надо подтвердить.

Field Type Example Possible Values
chatId string "_qzjQofkCDvpFe8Da3Nlt2" Chat IDs
userId string "_qzjQofkCDvpFe8Da3Nlt2" User IDs
linkId string "SYDY5qXsnv2aJnkoI9qF8E20" Invite Link IDs

purgeMessages

Все сообщения группы очищены. В зашифрованном диалоге приходит через eventsBatch, и тогда есть messageId.

Field Type Example Possible Values
chatId string "_qzjQofkCDvpFe8Da3Nlt2" Chat IDs
userId string "_qzjQofkCDvpFe8Da3Nlt2" кто очистил
timestamp integer 1700500000000 Unix timestamp
lastMessageId? integer 0
messageId? integer 0 равен lastMessageId, для батча

readyVideo

Видео обработано Stream и готово к воспроизведению. Если видео было вложением сообщения — messageId равен финальному id сообщения. Для сторис messageId = -1, а clientMessageId — новый случайный id.

Field Type Example Possible Values
fileId string "_qzjQofkCDvpFe8Da3Nlt2" Uploaded file ID
messageId integer -1 Message IDs
clientMessageId string "qzjdfsdfvpFe8Da3Nlt2" string

refreshKeys

Собеседник сбросил ключи диалога. История до messageId больше не расшифровывается этим ключом. Для зашифрованного чата приходит через eventsBatch.

Field Type Example Possible Values
chatId string "User2" Chat IDs
messageId integer 120 последний id до сброса

eventsBatch

Пакет событий зашифрованного диалога, до 50 штук, по возрастанию payload.messageId. payload события — массив.

Field Type Example Possible Values
eventType string "new" "new", "edit", "delete", "reaction", "purgeMessages", "deleteChat", "refreshKeys"
eventId string "a1b2" id элемента батча
payload object payload соответствующего события, плюс timestamp

aiAnswerChunk

Кусок стримингового ответа AI. Следующий кусок уходит после ack с ackKey этого пакета.

Field Type Example Possible Values
chatId string "aiChat" Chat IDs
messageId integer 12 Message IDs
chunk string "Hello" фрагмент текста

ttsChunk

Кусок озвучки. chunk — Uint8Array; JSON.stringify превращает его в объект { "0": 255, "1": 128, ... }.

Field Type Example Possible Values
chatId string "aiChat" Chat IDs
messageId integer 12 Message IDs
chunk bytes байты аудио

regVerified

Пользователь набрал нужное число подтверждений. payload пустой: {}.

walletBalanceUpdated

Только если сокет онлайн.

Field Type Example Possible Values
txId string "tx-1"
walletName string "Main"
walletId string "wallet-1"
value number 10.5
type string "transfer" тип операции
description? string "top up"
meta? object

paymentFail

Оплата подписки на чат или сторис не прошла. payload — транзакция.

Field Type Example Possible Values
id string "tx-1"
userId string "User1" User IDs
type string "subscription" "purchase", "transfer", "twoStepTransfer", "subscription", "withdrawal"
status string "failed" "pending", "processing", "completed", "failed", "cancelled"
amount number 10
currency? string "EUR"
convertedAmount? number 10
convertedCurrency? string "USD"
exchangeRate? number 1.1
sourceWalletId? string "wallet-1"
targetWalletId? string "wallet-2"
targetUserId? string "User2" User IDs
externalTransactionId? string "ext-1"
createdAt integer 1700500000000 Unix timestamp
updatedAt integer 1700500000000 Unix timestamp
error? string "declined"
invoiceId? string "inv-1"
metadata? object { objectType: "chat" \| "story", invoiceId, ... }

Те же поля транзакции у subscriptionError, storyPaymentError, withdrawSuccess, withdrawError, transferSuccess, transferError, transferCancelled.

subscriptionActivated

Подписка на чат оплачена и активирована. payload — подписка, не транзакция.

Field Type Example Possible Values
id string "sub-1"
chatId string "groupId" Chat IDs
status integer 1 1 active, 0 pending, -1 ended
periodType? integer 1 1 = 1 мес, 2 = 3, 3 = 6, 4 = 9, 5 = год
createdAt? integer 1700500000000
startedAt? integer 1700500000000
validUntil? integer 1700500000000
cancelledAt? integer 1700500000000
paymentMethod? string "subscription"
paymentValue? number 10
paidCalls? boolean true
paidMessages? boolean true

subscriptionError

Деньги списались, но подписку активировать не удалось. payload — транзакция (см. paymentFail).

storyPaid

Сторис оплачена. payload — сторис.

Field Type Example Possible Values
storyId string "SYDY5qXsnv2aJnkoI9qF8E20" Story IDs
userId string "User1" автор
fileLink string "https://..." URL
preview? string "https://..." URL
duration integer 15 секунды
price? number 1.5
published integer 1700500000000 Unix timestamp
isForAll? boolean true
isSeen? boolean false
isPurchased? boolean true
reaction? string "👍"

storyPaymentError

Оплата сторис прошла, но отметить её оплаченной не удалось. payload — транзакция (см. paymentFail).

withdrawSuccess

Вывод завершён (status: "completed"). payload — транзакция.

withdrawError

Вывод не завершён. payload — транзакция.

transferSuccess

Перевод завершён. Уходит и отправителю, и получателю. payload — транзакция.

transferError

Перевод не прошёл. payload — транзакция.

transferCancelled

Перевод отменён. Уходит отправителю. payload — транзакция.

supportTicket

Только сокетам аккаунта поддержки (операторская админка).

Field Type Example Possible Values
ticketId string "ticket-1"
userId string "User1" пользователь тикета
status string "waiting" "ai", "waiting", "operator", "closed"
operatorId string "op-1" или null
event string "escalated" "opened", "escalated", "taken", "reassigned", "closed", "auto_closed", "user_message", "support_message"
timestamp integer 1700500000000 Unix timestamp
targetOperatorIds? array ["op-1"] при reassigned
messageId? integer 40
preview? string "Need help"