訊息格式
訊息的欄位和各型別 body 的格式。傳送訊息、查詢與匯出訊息、撤回、編輯與置頂和會話的介面都用這裡的定義。
| 你想知道 | 見 |
|---|---|
發圖片、檔案等訊息時 body 怎麼寫 | 訊息型別 |
| 附件的地址從哪來、過期後怎樣 | 附件的地址 |
| 返回的訊息物件每個欄位的含義 | 訊息物件 |
conversation_id、seq、message_id 的區別 | 會話 ID |
| 群裡“張三加入了群聊”這類提示 | 群提示 |
| 訊息能儲存多久 | 訊息保留期 |
訊息有三種來源,格式相同,用 via 欄位區分:
| 來源 | via |
|---|---|
| 使用者在客戶端傳送 | client |
| 你的服務端透過 OpenAPI 傳送(以某個使用者或系統的身份) | openapi |
| 控制檯傳送 | console |
| 服務自動寫入的群提示和通話記錄 | system |
會話 ID
會話是兩個使用者之間(單聊)或一個群裡(群聊)的訊息流,用 conversation_id 標識,conversation_type 為 single 或 group。三個容易混淆的 ID:
| ID | 範圍 | 用來做什麼 |
|---|---|---|
conversation_id | 一個會話 | 查詢歷史訊息、標記已讀、刪除會話 |
seq | 會話內,從 1 連續遞增 | 翻頁、判斷是否漏收、引用回覆 |
message_id | 全應用唯一 | 按 ID 查詢、撤回、編輯、置頂、匯出 |
怎麼拿到會話 ID:
| 會話 | 獲取方式 |
|---|---|
| 單聊 | 傳送訊息響應中的 conversation_id;或按兩人的使用者名稱查詢單聊會話、查詢使用者的會話列表,見會話與歷史訊息。ID 由服務端生成,不能由使用者名稱推算;兩人之間還沒有訊息時沒有會話,查詢返回 404 not_found |
| 群聊 | 就是群 ID(group_id),建群后直接用 |
使用者被刪除後,即使同名的使用者名稱被重新註冊,新使用者與對方之間也是另一個會話,看不到原來的訊息。
序號 seq
每條訊息在會話中有一個序號 seq,從 1 開始連續遞增,單聊雙方看到的序號相同。群提示也佔用序號;只推線上的訊息不儲存,沒有序號。
- 序號只在會話內唯一。要在全應用範圍內標識一條訊息,使用
message_id。 - 客戶端按序號判斷是否漏收了訊息,歷史訊息也按序號翻頁,見會話與歷史訊息。
訊息 ID
message_id 是訊息在全應用範圍內唯一的 ID(字串),大體隨傳送時間遞增。服務端的按 ID 查詢、撤回、編輯、置頂等介面都用它指定訊息,匯出也按它的順序進行。
訊息型別
type | 說明 | 誰可以傳送 |
|---|---|---|
text | 文字 | 客戶端、服務端 |
image | 圖片 | 客戶端、服務端 |
voice | 語音 | 客戶端、服務端 |
video | 影片 | 客戶端、服務端 |
file | 檔案 | 客戶端、服務端 |
location | 位置 | 客戶端、服務端 |
custom | 自定義訊息,結構由你定義,如訂單卡片、紅包、業務通知 | 客戶端、服務端 |
tip | 群提示,由服務在群變化時自動寫入,見群提示 | 只有系統 |
call | 通話記錄,由服務在音視訊通話結束後自動寫入,見通話記錄 | 只有系統 |
傳送 tip、call 或其他不支援的型別返回 400 invalid_argument,details.reason 為 unknown_type。訊息型別之後可能增加,客戶端遇到不認識的型別時應顯示為“當前版本不支援此訊息”,不要丟棄,否則會話中的序號會不連續。
各型別的訊息體 body 都是 JSON 物件,欄位如下。表中沒有列出的欄位不做檢查,會原樣儲存和返回,可以用來攜帶你自己的資料。圖片、語音、影片和檔案訊息中的檔案要先上傳,再把得到的地址寫進 body,見附件的地址。
文字 text
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
text | String | 是 | 文字內容,不能為空或只有空白字元。可以包含換行、回車和製表符 |
{ "text": "你好,明天上午十点评审" }訊息正文中的“@張三”文字由傳送方自己拼寫,服務端只根據 mentions 判斷誰被 @ 了。
圖片 image
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
url | String | 是 | 圖片地址:上傳後得到的檔案地址,即檔案物件的 url |
thumbnail_url | String | 否 | 縮圖地址:檔案物件的 thumbnail_url(長邊不超過 480 畫素) |
width | Number | 否 | 寬度,畫素,非負整數。取檔案物件的 width |
height | Number | 否 | 高度,畫素,非負整數。取檔案物件的 height |
size | Number | 否 | 檔案大小,位元組,非負整數。取檔案物件的 size |
format | String | 否 | 格式,如 jpg、png,可以按檔案物件的 content_type 填寫 |
{
"url": "https://im.example.com/media/v1/f/99606017553203200/5nOzK6E40hgYIKl80dYVLQ",
"thumbnail_url": "https://im.example.com/media/v1/f/99606017553203200/5nOzK6E40hgYIKl80dYVLQ/thumb",
"width": 1080,
"height": 720,
"size": 218935,
"format": "jpg"
}寬高和大小請使用檔案物件中的值:服務端會去掉圖片中的拍攝資訊等後設資料,儲存後的大小可能與原檔案不同。
語音 voice
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
url | String | 是 | 語音的檔案地址 |
duration_seconds | Number | 是 | 時長,秒,0 到 86400 之間的整數。服務端不解析音訊,由傳送方填寫 |
size | Number | 否 | 檔案大小,位元組,非負整數 |
format | String | 否 | 格式,如 amr、aac |
{
"url": "https://im.example.com/media/v1/f/99607894634266624/BW6oGMSauXheems_KKZ5HQ",
"duration_seconds": 3,
"size": 48044,
"format": "wav"
}影片 video
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
url | String | 是 | 影片的檔案地址 |
duration_seconds | Number | 是 | 時長,秒,0 到 86400 之間的整數。服務端不解析影片,由傳送方填寫 |
thumbnail_url | String | 否 | 封面圖地址。服務端不擷取影片的封面:請在客戶端擷取一幀,作為圖片另外上傳,填寫它的檔案地址或縮圖地址 |
width | Number | 否 | 寬度,畫素,非負整數 |
height | Number | 否 | 高度,畫素,非負整數 |
size | Number | 否 | 檔案大小,位元組,非負整數 |
format | String | 否 | 格式,如 mp4 |
{
"url": "https://im.example.com/media/v1/f/99607911269875712/q0Y8RkM2c1ZbJx4TnW6aPg",
"duration_seconds": 30,
"thumbnail_url": "https://im.example.com/media/v1/f/99607911324401664/Hk7dVw2LmQ9sTzR5yB1cNe/thumb",
"width": 1280,
"height": 720,
"size": 3048000,
"format": "mp4"
}檔案 file
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
url | String | 是 | 檔案地址 |
name | String | 是 | 檔名,1 到 255 個字元,不能只有空白,不能包含 /、\、控制字元和改變文字方向的字元(U+202A 到 U+202E、U+2066 到 U+2069)。規則與上傳時的 name 相同,通常填上傳時的檔名 |
size | Number | 否 | 檔案大小,位元組,非負整數 |
format | String | 否 | 格式,如 pdf |
{
"url": "https://im.example.com/media/v1/f/99606363390345216/qKZTLgqgze82AN96YOCJzg",
"name": "季度报告.pdf",
"size": 1048576,
"format": "pdf"
}位置 location
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
latitude | Number | 是 | 緯度,-90 到 90 |
longitude | Number | 是 | 經度,-180 到 180 |
name | String | 否 | 地點名稱 |
address | String | 否 | 詳細地址 |
{ "latitude": 39.9087, "longitude": 116.3975, "name": "天安门", "address": "北京市东城区" }自定義 custom
body 可以是任意 JSON 物件,結構由你定義,只受下文通用規則的限制。
{ "card": "order_shipped", "order_id": "8812", "title": "你的订单已发货" }業務卡片的可信度
custom 的內容由傳送方決定,使用者在客戶端也能發出看起來像“轉賬”“訂單”的卡片。涉及資金、訂單狀態的卡片,客戶端只應信任 via 不是 client 的訊息,即由你的服務端或系統寫入的訊息。
通話記錄 call
音視訊通話結束後,服務自動在會話中寫入一條通話記錄(via 為 system,client_msg_id 以 sys_ 開頭)。客戶端和你的服務端都不能傳送這種訊息。
| 通話 | 寫入哪個會話 | 傳送者 |
|---|---|---|
| 一對一 | 兩人的單聊 | 主叫 |
| 群通話 | 群會話 | 發起人;他已不在群裡時以系統身份寫入(sender 為 null,sender_type 為 system) |
哪些通話會寫入、是否計入未讀、怎樣關閉,見通話記錄。
| 欄位 | 型別 | 說明 |
|---|---|---|
call_id | String | 通話 ID,可以用它查詢通話詳情 |
call_type | String | single 一對一 / group 群通話 |
media | String | audio 語音 / video 影片 |
result | String | 通話的結束原因,取值見結束原因 |
duration_seconds | Number | 通話時長,秒,沒有接通為 0 |
started_at | String | 發起通話的時間 |
{
"call_id": "100313666666102784",
"call_type": "group",
"media": "video",
"result": "completed",
"duration_seconds": 32,
"started_at": "2026-10-04T19:30:41.871Z"
}內容的通用規則
- 地址:
url、thumbnail_url必須是帶主機名的http或https地址,最長 2048 個字元。服務端不訪問地址,也不檢查它指向的檔案是否存在;應用開啟media_url_only後,客戶端傳送的地址另有限制,見附件的地址。 - JSON 物件:
body和ext都必須是 JSON 物件,巢狀不超過 10 層,鍵的總數不超過 256 個,不能有重複的鍵。 - 控制字元:所有字串(包括鍵)都不能包含控制字元,只有文字訊息的
text允許換行、回車和製表符。 - 數字:寬高、大小、時長必須是非負整數,不能帶小數。
不符合時返回 400 invalid_argument,details.reason 為 invalid_body,details.field 指出出錯的欄位:
{
"error": {
"code": "invalid_argument",
"message": "url 必须是 http 或 https 地址,最长 2048 个字符",
"details": { "field": "url", "reason": "invalid_body" },
"request_id": "JB2OCKPROHY2SZ2Q4VNURTDZWW"
}
}附件的地址
傳送圖片、語音、影片和檔案訊息分兩步:
- 以用途
attachment上傳檔案(客戶端上傳,或你的服務端呼叫上傳檔案),得到檔案地址,形如https://im.example.com/media/v1/f/{file_id}/{secret};圖片的縮圖地址是檔案地址末尾加/thumb。 - 把地址寫進
body的url、thumbnail_url,再傳送訊息。
傳送時不檢查檔案:服務端只檢查地址的格式,不檢查檔案是否存在、是否上傳完成。請用上傳完成後返回的地址;地址寫錯時訊息照樣發出,接收方下載時才失敗。
下載:檔案地址不能直接下載。客戶端用 User Token 換取短期有效的下載地址(或帶著 User Token 請求檔案地址,得到 302 跳轉);你的服務端透過 OpenAPI 換取,見下載與管理檔案。本應用登入的使用者拿到地址就能換取,不按會話判斷;只有群檔案要求是群成員。
檔案的幾種狀態,換取下載地址時的結果:
| 狀態 | 什麼時候 | 換取下載地址 | 直接請求檔案地址 | 客戶端顯示 |
|---|---|---|---|---|
| 已過期 | 上傳後超過 attachment_retention_days 天(執行策略,預設 30 天),或被你的服務端刪除 | file_expired;刪除約 30 天后為 not_found | 410 | “檔案已過期” |
| 已遮蔽 | 因違規被遮蔽 | file_blocked | 403 | “檔案已被遮蔽” |
檔案過期、刪除或遮蔽後,訊息本身不變,body 中的地址也不變;需要時另行撤回訊息。撤回訊息不會刪除附件。
外部地址:應用沒有開啟 media_url_only(預設)時,url、thumbnail_url 也可以是任意 http、https 地址,服務端原樣儲存,不會訪問。這樣的檔案不經過本服務,不受上面的保留期和遮蔽約束。
地址限制:應用在執行策略中開啟 media_url_only 後,使用者在客戶端傳送圖片、語音、影片和檔案訊息時,url、thumbnail_url 只能是本服務的檔案地址或縮圖地址,或者 media_allowed_hosts 中主機的 https 地址(*.example.com 匹配它的任意一級子域名)。不符合時返回 400 invalid_argument,details.reason 為 url_not_allowed,details.field 指出欄位。這項檢查只看地址的形式,不查詢檔案;你的服務端傳送的訊息不做這項檢查。
{
"error": {
"code": "invalid_argument",
"message": "附件地址不被允许",
"details": { "field": "thumbnail_url", "reason": "url_not_allowed" },
"request_id": "AK2OWVVKVS4JWVKUNOGDRTGPMR"
}
}擴充套件欄位 ext
每種型別的訊息都可以帶 ext:你自定義的擴充套件內容(JSON 物件),如業務 ID、訊息來源、轉發來源。規則與 body 相同,服務端原樣儲存和返回。不需要時省略或傳 null。
@ 提及
群訊息可以用 mentions @ 成員或全體成員,單聊不能使用(返回 invalid_argument,mentions_not_allowed)。
| 欄位 | 型別 | 說明 |
|---|---|---|
usernames | Array<String> | 被 @ 的成員的使用者名稱,最多 20 個 |
all | Boolean | 是否 @ 全體成員,預設 false |
- 不是群成員的使用者(包括不存在的使用者名稱)會被忽略,不返回錯誤;響應中的
mentions.usernames只包含實際被 @ 的成員。 - 被 @ 的成員的會話會顯示“有人 @ 我”,直到他讀到這條訊息,見會話與歷史訊息。這條訊息被撤回後,提醒退回到之前一條仍然有效的 @。
- 客戶端只有群主和管理員可以 @ 全體成員;服務端傳送不受這一限制。
引用回覆
訊息可以用 reply_to 引用同一會話中的一條訊息,請求中只需給出序號:
"reply_to": { "seq": 3 }被引用的訊息必須存在、沒有被撤回或擦除、在保留期內;指定了傳送者時,還必須是傳送者能看到、且沒有被他刪除的訊息,否則返回 invalid_argument,details.reason 為 invalid_reply。
服務端只儲存被引用訊息的序號和傳送者,返回為 { "seq": 3, "sender": "alice" }。客戶端按序號從本地或服務端取得原訊息顯示;原訊息之後被撤回時,顯示相應的提示,不會洩露撤回的內容。
大小上限
一條訊息的型別、body、ext、mentions 和 reply_to 合計按服務端的 JSON 編碼(去掉空白、UTF-8 位元組,<、>、& 不轉義)計算,不能超過應用執行策略中的 max_message_body_bytes:預設 5120 位元組(5 KB),可設 1024 到 32768 位元組,見執行策略。超出時返回 413 payload_too_large,details.max_bytes 為當前的上限:
{
"error": {
"code": "payload_too_large",
"message": "消息超过大小上限",
"details": { "max_bytes": 5120 },
"request_id": "NVZEB2A22BM63WPDECDBUIZ4P5"
}
}傳送時的 push 欄位另計,見傳送訊息。
訊息物件
傳送、查詢、匯出、撤回、編輯、置頂等介面返回的訊息都是同一個結構。服務端介面以服務端的視角返回:能看到會話中的全部訊息,不受任何使用者刪除訊息、清空聊天記錄的影響。
| 欄位 | 型別 | 說明 |
|---|---|---|
conversation_id | String | 所在會話的 ID,見會話 ID |
conversation_type | String | single 單聊 / group 群聊 |
seq | Number | 在會話中的序號 |
message_id | String | 訊息 ID,全應用唯一 |
client_msg_id | String | 傳送時的去重 ID。服務端傳送時沒有給出的,由服務端生成(32 個十六進位制字元);群提示以 evt_ 開頭,通話記錄以 sys_ 開頭 |
sender | String | 傳送者的使用者名稱。可為 null:以系統身份傳送的訊息和群提示,或傳送者已被刪除 |
sender_type | String | user 使用者 / system 系統。sender_type 為 user 而 sender 為 null 表示傳送者已被刪除 |
recipient | String | 單聊的接收者使用者名稱,傳送者的其他裝置據此知道發給了誰。群聊為 null;接收者已被刪除時也為 null |
type | String | 訊息型別 |
body | Object | 訊息體,格式見各型別。已撤回、已擦除的訊息為 null |
ext | Object | 擴充套件欄位,可為 null |
mentions | Object | 提及:usernames(不含已刪除的使用者)和 all。沒有 @ 時為 null |
reply_to | Object | 引用回覆:seq 和 sender(被引用訊息的傳送者,系統傳送的或已刪除的為 null)。沒有引用時為 null |
need_receipt | Boolean | 是否要求群已讀回執 |
exclude_from_unread | Boolean | 是否不計入接收者的未讀數。群提示總是 true |
reactions | Array<Object> | 表情回應,每種表情一項,沒有時為 null。見下文 |
pinned | Object | 置頂資訊 { "by": ..., "at": ... }:by 為置頂的使用者,由服務端或控制檯置頂時為 null;at 為置頂時間。沒有置頂時為 null |
edited | Object | 編輯資訊 { "at": ..., "count": ... }:最近一次編輯的時間和累計編輯次數。沒有編輯過為 null |
recalled | Object | 撤回資訊 { "by": ..., "role": ..., "at": ... },沒有撤回為 null。見下文 |
erased | Boolean | 是否已被擦除。應用開啟了“刪除使用者時擦除他的訊息”時,被刪除的使用者發過的訊息會被擦除,內容清空 |
via | String | 寫入方式:client 客戶端 / openapi 服務端 / console 控制檯 / system 系統(群提示、通話記錄) |
created_at | String | 傳送時間。同一會話中,序號越大時間越晚(不會更早) |
message_version | Number | 這條訊息最近一次變化(撤回、編輯、擦除、表情回應、置頂)時會話的變更版本號,沒有變化過為 0。客戶端據此增量獲取發生變化的訊息 |
reactions每一項為{ "key": "thumbs_up", "count": 12, "users": ["lisi", null, "zhaoliu"] }:key是表情的標識,由你的客戶端定義;count是回應的人數;users是前 3 個回應的人,已刪除的使用者為null。表情回應由使用者在客戶端新增,需要應用在執行策略中開啟message_reaction_enabled。recalled.role為撤回者的身份:sender傳送者本人 /owner群主 /admin群管理員 /server服務端或控制檯 /platform平臺。內容安全按你的規則自動撤回、或你的稽核人員確認違規後撤回的,為server;按平臺規則撤回的,為platform。recalled.by為撤回的使用者,server和platform撤回時為null。- 撤回和擦除之後,
body、ext、mentions、reply_to、reactions、pinned都為null,其他欄位保留。
一條引用了其他訊息、@ 了成員、帶擴充套件欄位的群訊息:
{
"conversation_id": "99582580415791104",
"conversation_type": "group",
"seq": 9,
"message_id": "99584445836689408",
"client_msg_id": "5f0c2a7e-91b4-4d2e-a0c3-6b1e8f2d4c19",
"sender": "bob",
"sender_type": "user",
"recipient": null,
"type": "text",
"body": { "text": "@carol 文档已更新,请确认" },
"ext": { "biz_id": "PRD-2041" },
"mentions": { "usernames": ["carol"], "all": false },
"reply_to": { "seq": 3, "sender": "alice" },
"need_receipt": false,
"exclude_from_unread": false,
"reactions": null,
"pinned": null,
"edited": null,
"recalled": null,
"erased": false,
"via": "openapi",
"created_at": "2026-10-02T19:13:02.076Z",
"message_version": 0
}一條已被服務端撤回的單聊訊息:
{
"conversation_id": "99583031936811008",
"conversation_type": "single",
"seq": 3,
"message_id": "99583385822822400",
"client_msg_id": "d83eb893f17d57d202db27cb79f46ef0",
"sender": "carol",
"sender_type": "user",
"recipient": "dave",
"type": "text",
"body": null,
"ext": null,
"mentions": null,
"reply_to": null,
"need_receipt": false,
"exclude_from_unread": false,
"reactions": null,
"pinned": null,
"edited": null,
"recalled": { "by": null, "role": "server", "at": "2026-10-02T19:08:59.798Z" },
"erased": false,
"via": "openapi",
"created_at": "2026-10-02T19:08:49.350Z",
"message_version": 22
}系統訊息
sender_type 為 system、sender 為 null 的訊息是系統訊息,有兩種:
- 以系統身份傳送的群訊息:服務端傳送群訊息時省略
from,訊息顯示為群裡的系統通知,via為openapi。 - 群提示:見下文,
type為tip,via為system。
群通話的發起人已不在群裡時,通話記錄也以系統身份寫入。
群提示
群建立、成員加入或離開、資料變化、解散時,服務自動在群會話中寫入一條群提示(type 為 tip)。body 是結構化的資料,顯示的文字由客戶端按 kind 生成,方便做多語言(Web SDK 的 renderTip() 已經實現)。
- 離線的成員上線後在聊天記錄中能看到;被移出的成員能看到移出他的那條,新成員能看到自己入群的那條。
- 不計入未讀數(
exclude_from_unread總是true),不佔群的傳送限流。 - 你不能傳送群提示(返回
unknown_type),但可以撤回它。 - 提示通常比群的變化晚幾百毫秒寫入,極少數情況下先後順序相反,客戶端可以按
body.occurred_at排序。
body 中都有 kind(提示的種類)和 occurred_at(變化發生的時間),其他欄位如下。使用者一律以使用者名稱錶示,已刪除的使用者為 null:
kind | 含義 | 其他欄位 |
|---|---|---|
group_created | 建立了群聊 | operator:群主 |
members_joined | 成員加入 | operator:邀請人,沒有邀請人的(服務端建群的初始成員、申請加入、服務端新增)為 null;members:加入的成員,最多列出前 20 個;joined_count:加入的人數;joined_via:加入方式,create 建群 / invite 邀請 / apply 申請 / link 入群連結或二維碼 / server 服務端新增 |
members_left | 成員退出,或成員的賬號被刪除 | operator:為 null;members:離開的成員,最多前 20 個;removed_count:離開的人數 |
members_removed | 成員被移出(包括被加入群黑名單) | operator:操作人,由服務端操作時為 null;members、removed_count 同上 |
group_renamed | 修改了群名稱 | operator;name:新的群名稱 |
announcement_updated | 更新了群公告 | operator |
owner_changed | 轉讓了群主 | operator;owner:新群主 |
mute_all_changed | 開啟或關閉全員禁言 | operator;enabled:是否開啟 |
group_status_changed | 群被封禁或解封 | operator;status:disabled 已封禁 / active 已解封 |
group_dismissed | 群已解散 | dismissed_by:owner 群主 / tenant 你的服務端或控制檯 / platform 平臺 / system 系統 |
由服務端建群后的兩條群提示:
[
{
"conversation_id": "99582580415791104",
"conversation_type": "group",
"seq": 1,
"message_id": "99582580659060736",
"client_msg_id": "evt_group_created",
"sender": null,
"sender_type": "system",
"recipient": null,
"type": "tip",
"body": { "kind": "group_created", "occurred_at": "2026-10-02T19:05:37.326Z", "operator": "alice" },
"ext": null,
"mentions": null,
"reply_to": null,
"need_receipt": false,
"exclude_from_unread": true,
"reactions": null,
"pinned": null,
"edited": null,
"recalled": null,
"erased": false,
"via": "system",
"created_at": "2026-10-02T19:05:37.384Z",
"message_version": 0
},
{
"conversation_id": "99582580415791104",
"conversation_type": "group",
"seq": 2,
"message_id": "99582580872970240",
"client_msg_id": "evt_99582580453539840",
"sender": null,
"sender_type": "system",
"recipient": null,
"type": "tip",
"body": {
"kind": "members_joined",
"occurred_at": "2026-10-02T19:05:37.326Z",
"operator": null,
"members": ["bob", "carol"],
"joined_count": 2,
"joined_via": "create"
},
"ext": null,
"mentions": null,
"reply_to": null,
"need_receipt": false,
"exclude_from_unread": true,
"reactions": null,
"pinned": null,
"edited": null,
"recalled": null,
"erased": false,
"via": "system",
"created_at": "2026-10-02T19:05:37.435Z",
"message_version": 0
}
]只推線上的訊息
傳送時設定 online_only 為 true 的訊息只推給接收者此刻線上的裝置,適合不需要儲存的自定義信令,如“對方正在錄音”、白板操作:
- 只能是
custom型別,不能帶mentions、reply_to、need_receipt、exclude_from_unread和push; - 單聊推給接收者,群聊推給當前的群成員;服務端傳送時按
sync_to_sender決定是否同時推給傳送者的線上裝置; - 不儲存、不分配序號、不計入未讀數,也不會建立會話;離線的裝置收不到,之後也拉取不到;
- 不能按 ID 查詢、撤回或編輯,也不去重:接收方請按“傳送者 +
client_msg_id”自行去重; - 傳送前的檢查和限流與普通訊息相同。
傳送成功返回的是精簡的結果,見傳送訊息。
訊息保留期
服務端儲存應用執行策略中 message_retention_days 天內的訊息,預設 90 天,可設 1 到 3650 天,見執行策略;實際不超過應用套餐的訊息保留天數,見套餐與賬單。
- 超過保留期的訊息不能再拉取、查詢、匯出,按 ID 查詢返回
404 not_found;也不能再被引用、撤回、編輯和置頂,已置頂的隨之移出置頂列表。過期的訊息隨後由後臺任務刪除。 - 會話本身、使用者的已讀位置和會話設定不隨訊息過期刪除,兩人很久以後再聊天仍是同一個會話。
- 訊息中上傳到本服務的附件另按
attachment_retention_days(預設 30 天,從上傳時算起)保留。附件先到期時,訊息仍在,下載附件時提示檔案已過期,見附件的地址。 - 調短保留期不可撤銷:調短後(包括更換為訊息保留天數更短的套餐),更早的訊息立即無法讀取並隨後被刪除,再改回原值也不能恢復。
- 訊息被撤回後內容立即清除,服務端也無法再查到原內容。需要留檔的,請在撤回前透過匯出或查詢自行儲存。
