hyapp-server/docs/openapi/gateway.swagger.yaml
2026-07-17 16:55:22 +08:00

7854 lines
218 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

swagger: "2.0"
info:
title: HY Gateway Service API
version: "1.0.0"
description: |
gateway-service 对外暴露 HTTP + JSON API。
`/api/v1/**` 业务接口统一返回 `code/message/request_id/data` 外壳;`request_id` 和响应 `X-Request-ID` 均由服务端生成,并透传到内部 gRPC RequestMeta。
`/healthz/**` 是健康检查接口,不使用业务响应外壳。
host: localhost:13000
basePath: /
schemes:
- http
consumes:
- application/json
produces:
- application/json
tags:
- name: health
description: Gateway 进程和依赖探测。
- name: auth
description: 登录、刷新、登出和密码初始化。
- name: tencent-im
description: 腾讯云 IM 登录票据和服务端回调入口。
- name: tencent-rtc
description: 腾讯 RTC 语音进房票据入口。
- name: files
description: App 文件和头像上传入口。
- name: users
description: 当前展示短号查询和变更。
- name: countries
description: App 注册页国家选择公开读接口。
- name: app-config
description: App 运行时配置公开读接口。
- name: devices
description: App 设备推送 token 绑定和失效。
- name: rooms
description: 房间命令入口,最终由 room-service 执行。
- name: wallet
description: App 钱包余额、币商转账和充值口径入口。
- name: vip
description: App 维度 VIP 套餐、有效权益、体验卡和功能开关Fami 使用 tiered_privilege_v1Lalu 保持 legacy_timed。
- name: resources
description: App 资源库、资源组、礼物配置和我的资源入口。
- name: manager-center
description: H5 经理中心入口;服务端校验业务身份,客户端不能自报经理权限。
- name: business
description: 带业务场景权限裁剪的通用能力入口。
- name: messages
description: App 消息 tab后端只负责 system/activity inbox用户私聊来自腾讯云 IM SDK。
securityDefinitions:
BearerAuth:
type: apiKey
name: Authorization
in: header
description: 使用 `Bearer <JWT>`JWT 使用 HS256claims 中的 `user_id` 是数值型用户 ID 的字符串,避免 64 位 ID 精度丢失。
parameters:
DisplayUserIDPath:
name: display_user_id
in: path
required: true
type: string
description: 当前有效展示短号。
ResourceGroupIDPath:
name: group_id
in: path
required: true
type: integer
format: int64
description: 资源组 ID。
ResourceIDPath:
name: resource_id
in: path
required: true
type: integer
format: int64
description: 资源 ID。
TencentIMSDKAppID:
name: SdkAppid
in: query
required: true
type: integer
format: int64
description: 腾讯云 IM 回调携带的 SDKAppID当前入口接受 `SdkAppid` 查询名。
TencentIMCallbackCommand:
name: CallbackCommand
in: query
required: false
type: string
enum:
- Group.CallbackBeforeApplyJoinGroup
- Group.CallbackBeforeSendMsg
description: 腾讯云 IM 回调命令;如果 query 和 body 同时存在,二者必须一致。
TencentIMCallbackAuthToken:
name: CallbackAuthToken
in: query
required: false
type: string
description: 腾讯云 IM 回调鉴权 token也可通过 `X-Tencent-IM-Callback-Token` header 传入。
TencentIMCallbackTokenHeader:
name: X-Tencent-IM-Callback-Token
in: header
required: false
type: string
description: 腾讯云 IM 回调鉴权 token header。
TencentRTCSDKAppIDHeader:
name: SdkAppId
in: header
required: true
type: integer
format: int64
description: 腾讯 RTC 事件回调 header 中的 SDKAppID。
TencentRTCSignHeader:
name: Sign
in: header
required: true
type: string
description: 腾讯 RTC 事件回调签名,计算方式为 `base64(hmacsha256(callback_sign_key, raw_body))`。
responses:
BadRequest:
description: 请求体不是合法 JSON或下游返回非法参数常见 `code` 为 `INVALID_JSON`、`INVALID_ARGUMENT`、`DISPLAY_USER_ID_INVALID`。
schema:
$ref: "#/definitions/ErrorEnvelope"
Unauthorized:
description: 未通过 access token 校验,或下游返回认证失败。
schema:
$ref: "#/definitions/ErrorEnvelope"
Forbidden:
description: 已认证但资料未完成、被禁用、封禁或无权限;常见 `code` 为 `PROFILE_REQUIRED`、`USER_DISABLED`、`PERMISSION_DENIED`。
schema:
$ref: "#/definitions/ErrorEnvelope"
NotFound:
description: 下游实体不存在。
schema:
$ref: "#/definitions/ErrorEnvelope"
Conflict:
description: 下游唯一键、状态、租约或冷却期冲突。
schema:
$ref: "#/definitions/ErrorEnvelope"
Internal:
description: gateway 或下游返回不可细分的内部错误。
schema:
$ref: "#/definitions/ErrorEnvelope"
UpstreamError:
description: gateway 调内部服务失败,或内部服务返回不可映射错误。
schema:
$ref: "#/definitions/ErrorEnvelope"
paths:
/healthz/live:
get:
tags:
- health
summary: 进程存活探测
operationId: gatewayLive
responses:
"200":
description: Gateway HTTP runtime 正在服务。
schema:
$ref: "#/definitions/HealthResponse"
"500":
description: Gateway HTTP runtime 不可用。
schema:
$ref: "#/definitions/HealthResponse"
/healthz/ready:
get:
tags:
- health
summary: 接流量就绪探测
operationId: gatewayReady
responses:
"200":
description: Gateway 可接新请求。
schema:
$ref: "#/definitions/HealthResponse"
"503":
description: Gateway 不应接新请求,失败详情在 `checks`。
schema:
$ref: "#/definitions/HealthResponse"
/api/v1/auth/account/login:
post:
tags:
- auth
summary: 账号密码登录
description: 账号就是用户当前有效短号。
operationId: loginAccountPassword
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/LoginPasswordRequest"
responses:
"200":
description: 登录成功,`data` 返回 token 集合。
schema:
$ref: "#/definitions/AuthTokenEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/auth/third-party/login:
post:
tags:
- auth
summary: 三方登录或注册
operationId: loginThirdParty
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/LoginThirdPartyRequest"
responses:
"200":
description: 登录或注册成功,`data` 返回 token 集合和 `is_new_user`。
schema:
$ref: "#/definitions/AuthTokenEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/auth/password/set:
post:
tags:
- auth
summary: 已登录用户首次设置密码
operationId: setPassword
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/SetPasswordRequest"
responses:
"200":
description: 密码设置成功。
schema:
$ref: "#/definitions/PasswordSetEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/auth/token/refresh:
post:
tags:
- auth
summary: 刷新 token
operationId: refreshToken
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/RefreshTokenRequest"
responses:
"200":
description: 刷新成功,`data` 返回新的 token 集合。
schema:
$ref: "#/definitions/AuthTokenEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/auth/logout:
post:
tags:
- auth
summary: 登出并失效 refresh session
operationId: logout
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/LogoutRequest"
responses:
"200":
description: 登出处理完成。
schema:
$ref: "#/definitions/LogoutEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/countries:
get:
tags:
- countries
summary: 获取 App 注册页可选国家
operationId: listRegistrationCountries
description: 公开读接口,只返回 user-service 判定的 `enabled=true` 国家,并按 `sort_order,country_code` 排序。
parameters:
responses:
"200":
description: 查询成功,`data.countries` 返回当前开放国家。
schema:
$ref: "#/definitions/CountryListEnvelope"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/app/bootstrap:
get:
tags:
- app-config
summary: 获取 App 启动配置摘要
operationId: getAppBootstrap
description: 公开读接口只返回版本、维护、feature flags、底部 tab 和配置版本号,不返回 banner、礼物或资源大列表。
parameters:
responses:
"200":
description: 查询成功,`data` 返回 App 启动状态机需要的轻量配置摘要。
schema:
$ref: "#/definitions/AppBootstrapEnvelope"
/api/v1/app/version:
get:
tags:
- app-config
summary: 获取 App 最新版本信息
operationId: getAppVersion
description: 公开读接口gateway 根据 App 平台返回后台 APP配置/版本管理 中最高 `build_number` 版本,并按客户端当前 `build_number` 计算是否需要提示更新。
parameters:
- name: platform
in: query
required: false
type: string
enum: [android, ios]
description: 可选平台覆盖值;不传时读取 `X-App-Platform` / `X-Platform`。
- name: build_number
in: query
required: false
type: integer
format: int64
description: 当前客户端编译版本号;不传时读取 `X-App-Build-Number` / `X-Build-Number`。
- name: X-App-Platform
in: header
required: false
type: string
enum: [android, ios]
- name: X-App-Build-Number
in: header
required: false
type: integer
format: int64
responses:
"200":
description: 查询成功,`data` 返回最新版本和更新判定。
schema:
$ref: "#/definitions/AppVersionEnvelope"
"400":
$ref: "#/responses/BadRequest"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/app/h5-links:
get:
tags:
- app-config
summary: 获取 App H5 入口地址
operationId: listAppH5Links
description: 公开读接口,返回后台管理系统 APP配置/H5配置 维护的 H5 地址。未配置 URL 的入口仍按固定 key 返回空字符串。
parameters:
responses:
"200":
description: 查询成功,`data.items` 返回固定 H5 入口集合。
schema:
$ref: "#/definitions/H5LinkListEnvelope"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/app/splash-screens:
get:
tags:
- app-config
summary: 获取 App 开屏配置
operationId: listSplashScreens
description: 公开读接口,返回后台 APP配置/开屏配置 中当前有效的开屏列表,客户端按列表顺序取最高优先级配置展示。
parameters:
- name: platform
in: query
required: false
type: string
enum: [android, ios]
description: 可选平台覆盖值;不传时读取 `X-App-Platform` / `X-Platform`。
- name: region_id
in: query
required: false
type: integer
format: int64
description: 当前用户区域 ID0 或不传只命中全区域配置。
- name: country
in: query
required: false
type: string
description: 当前用户国家码;不传时读取 `X-Country-Code` / `X-App-Country`。
- name: X-App-Platform
in: header
required: false
type: string
enum: [android, ios]
- name: X-Country-Code
in: header
required: false
type: string
responses:
"200":
description: 查询成功,`data.items` 返回当前可展示的开屏配置。
schema:
$ref: "#/definitions/SplashScreenListEnvelope"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/app/popups:
get:
tags:
- app-config
summary: 获取 App 弹窗配置
operationId: listAppPopups
description: 公开读接口,返回后台 APP配置/弹窗配置 中当前有效的弹窗列表。客户端按列表顺序选择弹窗,并按 display_period_days 做本地展示频控。
parameters:
responses:
"200":
description: 查询成功,`data.items` 返回当前可展示的弹窗配置。
schema:
$ref: "#/definitions/PopupListEnvelope"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/im/usersig:
get:
tags:
- tencent-im
summary: 获取腾讯云 IM UserSig
operationId: issueTencentIMUserSig
security:
- BearerAuth: []
parameters:
responses:
"200":
description: 签发成功,`data.user_id` 使用内部长 `user_id` 的十进制字符串。
schema:
$ref: "#/definitions/TencentIMUserSigEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"500":
description: 腾讯云 IM SDKAppID、SecretKey 或 TTL 配置缺失fail-closed。
schema:
$ref: "#/definitions/ErrorEnvelope"
/api/v1/rtc/token:
post:
tags:
- tencent-rtc
summary: 获取腾讯 RTC 进房 UserSig
operationId: issueTencentRTCToken
description: |
gateway 使用 access token 中的内部 `user_id` 签发腾讯 RTC UserSig并在签发前调用 room-service `VerifyRoomPresence`。
当前只支持 TRTC 字符串房间 `strRoomId`,客户端不能把 `room_id` 转成数字 `roomId`。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/TencentRTCTokenRequest"
responses:
"200":
description: 签发成功,`data.user_id` 和 `data.rtc_user_id` 都是内部长 `user_id` 的十进制字符串。
schema:
$ref: "#/definitions/TencentRTCTokenEnvelope"
"400":
description: "`room_id` 为空或不满足 `^[A-Za-z0-9_-]{1,48}$`。"
schema:
$ref: "#/definitions/ErrorEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
description: 用户不在房间、已被踢出或被封禁gateway 不返回 UserSig。
schema:
$ref: "#/definitions/ErrorEnvelope"
"404":
description: room-service guard 返回 `room_not_found`。
schema:
$ref: "#/definitions/ErrorEnvelope"
"500":
description: 腾讯 RTC 未启用、SDKAppID、SecretKey、TTL 或固定策略配置缺失fail-closed。
schema:
$ref: "#/definitions/ErrorEnvelope"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/tencent-rtc/callback:
post:
tags:
- tencent-rtc
summary: 腾讯 RTC 服务端事件回调
operationId: handleTencentRTCCallback
description: |
腾讯 RTC 控制台配置的房间/媒体事件回调入口。gateway 校验 `SdkAppId` 与 `Sign` 后,只消费房间退出 `104`、开始推送音频 `203`、停止推送音频 `204`。
该接口不使用业务 envelope成功或可忽略业务错误返回 `{"code":0}`。
parameters:
- $ref: "#/parameters/TencentRTCSDKAppIDHeader"
- $ref: "#/parameters/TencentRTCSignHeader"
- name: app_code
in: query
required: false
type: string
description: 多 App 部署时建议把腾讯控制台回调 URL 配置为携带 `app_code`,用于 room-service 租户路由。
- name: body
in: body
required: true
schema:
$ref: "#/definitions/TencentRTCCallbackRequest"
responses:
"200":
description: 回调已接受,未知事件或不可恢复业务错误也按成功 ACK避免无意义重试。
schema:
$ref: "#/definitions/TencentRTCCallbackResponse"
"400":
description: 回调 body 非法。
schema:
$ref: "#/definitions/TencentRTCCallbackResponse"
"403":
description: SDKAppID 不匹配或签名校验失败。
schema:
$ref: "#/definitions/TencentRTCCallbackResponse"
"500":
description: room-service 暂时不可用,返回非 200 让腾讯 RTC 按平台策略重试。
schema:
$ref: "#/definitions/TencentRTCCallbackResponse"
/api/v1/files/upload:
post:
tags:
- files
summary: 上传 App 通用文件
operationId: uploadFile
description: 上传到腾讯云 COS返回可直接写入业务资料的公开访问 URL该接口只要求已登录不要求注册资料已完成。
consumes:
- multipart/form-data
security:
- BearerAuth: []
parameters:
- name: file
in: formData
required: true
type: file
description: 文件字段;单文件最大 20 MiB。
responses:
"200":
description: 上传成功,`data.url` 为 `tencent-cos.access-url` 下的对象访问地址。
schema:
$ref: "#/definitions/UploadFileEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/files/avatar/upload:
post:
tags:
- files
summary: 上传用户头像
operationId: uploadAvatar
description: 上传头像到腾讯云 COS服务端按文件头嗅探只接受 JPEG、PNG、WebP单文件最大 5 MiB。
consumes:
- multipart/form-data
security:
- BearerAuth: []
parameters:
- name: file
in: formData
required: true
type: file
description: 头像文件字段,也兼容字段名 `avatar`。
responses:
"200":
description: 上传成功,`data.url` 可作为注册资料或用户资料里的 `avatar`。
schema:
$ref: "#/definitions/UploadFileEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/devices/push-token:
post:
tags:
- devices
summary: 绑定设备推送 token
operationId: bindPushToken
description: 资料完成后由客户端上报系统推送 tokengateway 只使用 access token 中的用户身份user-service 负责落库。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/BindPushTokenRequest"
responses:
"200":
description: 绑定成功。
schema:
$ref: "#/definitions/BindPushTokenEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
delete:
tags:
- devices
summary: 删除设备推送 token
operationId: deletePushToken
description: 登出、关闭通知或 token 失效时调用;`push_token` 可为空,为空时按当前用户和 `device_id` 失效。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/DeletePushTokenRequest"
responses:
"200":
description: 删除或失效处理完成。
schema:
$ref: "#/definitions/DeletePushTokenEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/tencent-im/callback:
post:
tags:
- tencent-im
summary: 腾讯云 IM 服务端回调
operationId: handleTencentIMCallback
description: |
该接口不使用项目业务 envelope直接返回腾讯云 IM 要求的 `ActionStatus/ErrorCode/ErrorInfo`。
当前支持入群前守卫 `Group.CallbackBeforeApplyJoinGroup` 和发言前守卫 `Group.CallbackBeforeSendMsg`。
白名单外回调在通过来源校验和 SDKAppID 校验后返回允许,避免阻断腾讯云新增回调。
parameters:
- $ref: "#/parameters/TencentIMSDKAppID"
- $ref: "#/parameters/TencentIMCallbackCommand"
- $ref: "#/parameters/TencentIMCallbackAuthToken"
- $ref: "#/parameters/TencentIMCallbackTokenHeader"
- name: body
in: body
required: false
schema:
$ref: "#/definitions/TencentIMCallbackRequest"
responses:
"200":
description: 腾讯云 IM 回调处理结果;业务拒绝也返回 HTTP 200通过 `ErrorCode=1` 表示拒绝。
schema:
$ref: "#/definitions/TencentIMCallbackResponse"
"405":
description: 非 POST 请求会返回腾讯云原生结构,`ErrorCode=1`。
schema:
$ref: "#/definitions/TencentIMCallbackResponse"
/api/v1/users/by-display-user-id/{display_user_id}:
get:
tags:
- users
summary: 通过当前展示短号解析用户
operationId: resolveDisplayUserID
parameters:
- $ref: "#/parameters/DisplayUserIDPath"
responses:
"200":
description: 解析成功,`data` 返回短号归属。
schema:
$ref: "#/definitions/UserIdentityEnvelope"
"400":
$ref: "#/responses/BadRequest"
"404":
$ref: "#/responses/NotFound"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/profiles:batch:
get:
tags:
- users
summary: 批量查询会话展示资料
operationId: batchUserProfiles
description: 用于腾讯云 IM 会话列表补头像、昵称和短号;只返回展示字段,不返回登录、实名或后台身份信息。
security:
- BearerAuth: []
parameters:
- name: user_ids
in: query
required: true
type: string
description: 逗号分隔或重复传入的用户 ID最多 100 个。
responses:
"200":
description: 查询成功。
schema:
$ref: "#/definitions/UserProfilesBatchEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/identity:
get:
tags:
- users
summary: 查询当前用户展示短号状态
operationId: getMyIdentity
security:
- BearerAuth: []
parameters:
responses:
"200":
description: 查询成功,`data` 返回当前用户短号状态。
schema:
$ref: "#/definitions/UserIdentityEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"404":
$ref: "#/responses/NotFound"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/host-identity:
get:
tags:
- users
summary: 查询当前用户 Host/Agency/BD 身份
operationId: getMyHostIdentity
description: App 用于判断是否展示 H5 入口;不存在的身份返回 false不按 404 处理。
security:
- BearerAuth: []
parameters:
responses:
"200":
description: 查询成功,`data` 返回当前用户身份开关。
schema:
$ref: "#/definitions/UserHostIdentityEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/overview:
get:
tags:
- users
summary: 我的页首屏聚合摘要
operationId: getMyOverview
description: 聚合当前用户资料、顶部计数、金币钱包卡片、VIP、Host/Agency/BD/币商身份和入口显隐。该接口不查消息红点、邀请码、钻石、美元余额、流水、成员或工资钱包、VIP、计数和角色上游失败时按字段 `unavailable=true` 局部降级。
security:
- BearerAuth: []
parameters:
responses:
"200":
description: 查询成功,`data` 返回我的页首屏渲染摘要。
schema:
$ref: "#/definitions/MyOverviewEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/invite-overview:
get:
tags:
- users
summary: 查询当前用户邀请概览
operationId: getMyInviteOverview
description: 返回当前登录用户自己的邀请码和邀请计数;该接口只服务私有 H5 分享页,不并入我的页首屏聚合摘要。
security:
- BearerAuth: []
parameters:
responses:
"200":
description: 查询成功,`data` 返回当前用户邀请概览。
schema:
$ref: "#/definitions/MyInviteOverviewEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/onboarding/complete:
post:
tags:
- users
summary: 完成注册页必填资料
operationId: completeMyOnboarding
description: 三方登录即注册后唯一资料提交入口;`username/avatar/gender/country` 在 user-service 同事务校验并写入。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/CompleteOnboardingRequest"
responses:
"200":
description: 注册资料完成,`data.profile_completed=true``data.token.access_token` 是替换旧 JWT 的新 access token。
schema:
$ref: "#/definitions/CompleteOnboardingEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"404":
$ref: "#/responses/NotFound"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/profile/update:
post:
tags:
- users
summary: 修改当前用户基础资料
operationId: updateMyProfile
description: 只修改 `username`、`avatar`、`birth`;主页背景图和国家修改都走独立接口。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/UpdateUserProfileRequest"
responses:
"200":
description: 修改成功,`data` 返回最新用户资料。
schema:
$ref: "#/definitions/UserProfileEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"404":
$ref: "#/responses/NotFound"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/profile-bg-img:
post:
tags:
- users
summary: 修改当前用户主页背景图
operationId: updateMyProfileBackground
description: App 先自行上传图片,本接口只接收图片 URL 并保存到 `profile_bg_img`,和背包、`profile_card`、佩戴无关。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/UpdateUserProfileBackgroundRequest"
responses:
"200":
description: 修改成功,`data.profile_bg_img` 返回最新背景图 URL。
schema:
$ref: "#/definitions/UpdateUserProfileBackgroundEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"404":
$ref: "#/responses/NotFound"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/country/change:
post:
tags:
- users
summary: 修改当前用户国家
operationId: changeMyCountry
description: 国家修改单独写变更日志;同一用户按滚动 30 天冷却窗口只能成功修改一次。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/ChangeUserCountryRequest"
responses:
"200":
description: 修改成功,`data.next_country_change_allowed_at_ms` 返回下一次可修改时间。
schema:
$ref: "#/definitions/UserProfileEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/display-id/change:
post:
tags:
- users
summary: 修改当前用户默认短号
operationId: changeMyDisplayUserID
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/ChangeDisplayUserIDRequest"
responses:
"200":
description: 修改成功,`data` 返回最新短号状态。
schema:
$ref: "#/definitions/UserIdentityEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/display-id/pretty/apply:
post:
tags:
- users
summary: 申请临时靓号
operationId: applyMyPrettyDisplayUserID
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/ApplyPrettyDisplayUserIDRequest"
responses:
"200":
description: 申请成功,`data` 返回最新短号状态和租约 ID。
schema:
$ref: "#/definitions/UserIdentityEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/{user_id}/visit:
post:
tags:
- users
summary: 记录一次主页访问并返回目标资料展示状态
operationId: recordProfileVisit
description: >-
匿名身份在写入时按访问者当时生效的 anonymous_profile_visit 权益与开关固化;历史记录不会因开关变化反向改名。
目标用户当前 hide_profile_data 生效时返回 target_stats_hidden=true并完全省略 target_stats。
当前 App 访问链路无好友或管理员白名单,所有非本人查看者使用同一隐藏结论。
security:
- BearerAuth: []
parameters:
- name: user_id
in: path
required: true
type: string
pattern: "^[1-9][0-9]*$"
description: 被访问用户的系统 user_id不是展示短号。
responses:
"200":
description: 访问事实已写入或命中同一访客聚合记录。
schema:
$ref: "#/definitions/ProfileVisitEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
description: 极低概率的匿名展示 ID 碰撞code=CONFLICT本次事务已回滚不会降级写入公开访问记录。
schema:
$ref: "#/definitions/ErrorEnvelope"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/visitors:
get:
tags:
- users
summary: 查询访问我的主页的公开与匿名访客
operationId: listMyProfileVisitors
description: 匿名记录只返回 anonymous_visit_id省略真实 visitor_user_idanonymous_visit_id 仅在同一目标用户下稳定,不能用于资料查询。
security:
- BearerAuth: []
parameters:
- name: page
in: query
required: false
type: integer
format: int32
default: 1
minimum: 1
maximum: 100
- name: page_size
in: query
required: false
type: integer
format: int32
default: 20
minimum: 1
maximum: 100
responses:
"200":
description: 查询成功,公开和匿名记录按最后访问时间统一排序、分别聚合。
schema:
$ref: "#/definitions/ProfileVisitorListEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/appearance:
get:
tags:
- users
- resources
summary: 查询当前用户已佩戴外观资源
operationId: getMyAppearance
description: >-
返回 wallet 已过滤过期状态后的当前佩戴快照。mic_seat_animation.format 只来自资源 metadata_json 的显式
format/animation_format字段缺省表示格式未配置客户端不得从素材 URL 后缀推断。
security:
- BearerAuth: []
responses:
"200":
description: 查询成功;没有佩戴的单资源槽位返回空对象。
schema:
$ref: "#/definitions/AppearanceEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/by-id/{user_id}/appearance:
get:
tags:
- users
- resources
summary: 查询指定用户的公开已佩戴外观资源
operationId: getUserAppearance
description: 房间外用户资料展示入口;返回结构与当前用户 appearance 相同,不返回未佩戴或已过期资源。
parameters:
- name: user_id
in: path
required: true
type: string
pattern: "^[1-9][0-9]*$"
responses:
"200":
description: 查询成功。
schema:
$ref: "#/definitions/AppearanceEnvelope"
"400":
$ref: "#/responses/BadRequest"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/filters:
get:
tags:
- rooms
summary: 首页房间区域与国家筛选目录
operationId: listRoomFilters
description: >-
返回可直接用于房间发现列表的筛选项。每个 option 的 query_key/query_value 可原样作为
GET /api/v1/rooms 的查询参数All 的两个字段为空,表示不附加 region_id/country_code。
Huwaa 返回当前 app scope 的全部 active 区域及其 enabled 国家,其他 App 只返回当前登录用户所在 active 区域,防止下发不可用的跨区选项。
该路由要求 access token 有效且用户资料已完成;资料未完成返回 403/PROFILE_REQUIRED。
security:
- BearerAuth: []
responses:
"200":
description: 查询成功;国家项只包含 enabled 国家与 active 区域映射的交集。
schema:
$ref: "#/definitions/RoomFilterCatalogEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms:
get:
tags:
- rooms
summary: 房间发现列表
operationId: listRooms
description: >-
Huwaa 不传 region_id/country_code 时查询 All传 region_id 时查指定 active 区域,传 country_code 时查指定 enabled 国家,两者互斥。
非 Huwaa App 仍按当前登录用户的服务端 region_id 隔离,不接受客户端 region_id。
置顶之后的普通房依次是本国家有人、其他国家/区域有人、本国家没人、其他国家/区域没人。
响应卡片显式返回 im_group_id当前值等于 room_id但客户端不能硬编码该映射。
security:
- BearerAuth: []
parameters:
- name: tab
in: query
required: false
type: string
enum:
- hot
- new
- name: cursor
in: query
required: false
type: string
- name: limit
in: query
required: false
type: integer
format: int32
- name: q
in: query
required: false
type: string
description: 房间标题或用户 ID 搜索词;`query` 是兼容别名。
- name: query
in: query
required: false
type: string
- name: region_id
in: query
required: false
type: integer
format: int64
minimum: 1
description: Huwaa 区域筛选;必须原样使用 `/api/v1/rooms/filters` 的 active `region_id`,不得与 `country_code` 同传。
- name: country_code
in: query
required: false
type: string
description: Huwaa 国家筛选;必须原样使用 `/api/v1/rooms/filters` 的 enabled 大写国家码,不得与 `region_id` 同传。
- name: country
in: query
required: false
type: string
description: 旧客户端兼容别名,等价于 `country_code`;新客户端统一使用 `country_code`。
responses:
"200":
description: 查询成功,`data.rooms[*].im_group_id` 是 JoinRoom 成功后客户端加入的腾讯 IM 房间群 ID。
schema:
$ref: "#/definitions/RoomListEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/feeds:
get:
tags:
- rooms
summary: Mine 房间关系流
operationId: listRoomFeeds
description: 查询 Mine 页下方 Visited/Friend/Following/Followed 房间流;`visited` 读取 JoinRoom 写入的房间访问索引,`friend/following` 由 gateway 先读取 user-service 关系事实,`followed` 读取 room-service 房间关注关系,再让 room-service 返回 active 房间卡片和 `im_group_id`,不作为公共房间发现列表。
security:
- BearerAuth: []
parameters:
- name: tab
in: query
required: true
type: string
enum:
- visited
- friend
- following
- followed
- name: cursor
in: query
required: false
type: string
- name: limit
in: query
required: false
type: integer
format: int32
responses:
"200":
description: 查询成功;`visited` 由 JoinRoom 成功写入,`friend/following` 同步使用 user-service 好友/关注关系,`followed` 同步使用 room-service 房间关注关系,不依赖 Redis 缓存命中。
schema:
$ref: "#/definitions/RoomListEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/me:
get:
tags:
- rooms
summary: 查询我的房间卡片
operationId: getMyRoom
description: Mine 顶部“我的房间”权威查询gateway 使用 access token user_idroom-service 直接读取 rooms 元数据并用 Room Cell 快照补齐卡片字段,不依赖发现页 `room_list_entries` 投影命中。
security:
- BearerAuth: []
parameters:
responses:
"200":
description: 查询成功,`data.has_room=false` 表示当前用户尚未创建房间;有房间时 `data.room.im_group_id` 显式返回腾讯 IM 房间群 ID。
schema:
$ref: "#/definitions/MyRoomEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/current:
get:
tags:
- rooms
summary: 查询当前可恢复房间
operationId: getCurrentRoom
description: App 启动、回前台或网络恢复时调用gateway 使用 access token user_idroom-service 用 presence 读模型和 Room Cell 快照二次校验,不会隐式 JoinRoom。
security:
- BearerAuth: []
parameters:
responses:
"200":
description: 查询成功,`data.has_current_room=false` 表示无需恢复。
schema:
$ref: "#/definitions/CurrentRoomEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/snapshot:
get:
tags:
- rooms
summary: 查询房间完整快照
operationId: getRoomSnapshot
description: 房间页主动同步当前 Room Cell 快照;只读,不刷新 heartbeat不隐式 JoinRoom。gateway 使用 access token user_id 作为 viewerroom-service 要求 viewer 仍在该房间。
security:
- BearerAuth: []
parameters:
- name: room_id
in: query
required: true
type: string
pattern: "^[A-Za-z0-9_-]{1,48}$"
maxLength: 48
responses:
"200":
description: 查询成功,`data.room` 返回完整房间快照。
schema:
$ref: "#/definitions/RoomSnapshotEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/{room_id}/detail:
get:
tags:
- rooms
summary: 查询房间详情最终快照
operationId: getRoomDetail
description: 房间首屏、IM 断线重连和版本断层时的权威恢复入口;返回当前背景、房间边框和彩色房名最终态,不依赖历史 IM 是否到达。
security:
- BearerAuth: []
parameters:
- name: room_id
in: path
required: true
type: string
pattern: "^[A-Za-z0-9_-]{1,48}$"
maxLength: 48
responses:
"200":
description: 查询成功;`data.room.active_background/room_border/room_name_style` 缺省表示当前没有对应有效素材。
schema:
$ref: "#/definitions/RoomDetailEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/{room_id}/banned-users:
get:
tags:
- rooms
summary: 查询房间黑名单列表
operationId: listRoomBannedUsers
description: 房主或房管分页查看当前仍有效的房间踢人列表;已过期和已解封用户不返回。
security:
- BearerAuth: []
parameters:
- name: room_id
in: path
required: true
type: string
pattern: "^[A-Za-z0-9_-]{1,48}$"
maxLength: 48
- name: page
in: query
required: false
type: integer
format: int32
default: 1
- name: page_size
in: query
required: false
type: integer
format: int32
default: 20
responses:
"200":
description: 返回房间当前仍有效的黑名单用户及展示资料。
schema:
$ref: "#/definitions/RoomBannedUsersEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/{room_id}/contribution-rank:
get:
tags:
- rooms
summary: 查询房内用户贡献周期榜
operationId: getRoomContributionRank
description: 房间内 day/week/month 三个 tab 使用的用户贡献榜gateway 使用 access token user_id 作为 viewerroom-service 要求 viewer 仍在该房间。查询只读周期统计表,不刷新 presence。
security:
- BearerAuth: []
parameters:
- name: room_id
in: path
required: true
type: string
pattern: "^[A-Za-z0-9_-]{1,48}$"
maxLength: 48
- name: period
in: query
required: false
type: string
default: day
enum:
- day
- week
- month
- name: limit
in: query
required: false
type: integer
format: int32
default: 20
minimum: 1
maximum: 100
responses:
"200":
description: 返回当前房间指定周期的用户贡献榜和榜单用户展示资料。
schema:
$ref: "#/definitions/RoomContributionRankEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/{room_id}/follow:
post:
tags:
- rooms
summary: 关注房间
operationId: followRoom
description: 使用 access token user_id 建立当前用户对房间的关注关系;重复关注幂等,`followed_at_ms` 不因重复点击刷新。
security:
- BearerAuth: []
parameters:
- name: room_id
in: path
required: true
type: string
pattern: "^[A-Za-z0-9_-]{1,48}$"
maxLength: 48
responses:
"200":
description: 关注成功,`data.is_followed=true`。
schema:
$ref: "#/definitions/RoomFollowEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
delete:
tags:
- rooms
summary: 取消关注房间
operationId: unfollowRoom
description: 使用 access token user_id 取消当前用户对房间的关注关系;未关注时按幂等成功返回 `is_followed=false`。
security:
- BearerAuth: []
parameters:
- name: room_id
in: path
required: true
type: string
pattern: "^[A-Za-z0-9_-]{1,48}$"
maxLength: 48
responses:
"200":
description: 取消成功,`data.is_followed=false`。
schema:
$ref: "#/definitions/RoomFollowEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/create:
post:
tags:
- rooms
summary: 创建房间
operationId: createRoom
description: |
gateway 从 access token 取当前 `user_id` 写入 room-service `RequestMeta.actor_user_id`room-service 由该 actor 确定 owner。
请求体不接收 `room_id` 或 `owner_user_id``command_id` 由客户端按创建动作生成gateway 生成内部 room_id。
room-service 会在返回前同步确保腾讯 IM 房间群存在;创建成功后 `data.room.im_group_id` 可直接用于 JoinRoom 成功后的腾讯 IM SDK joinGroup。
同一个登录用户只能作为 owner 创建一个房间;已有房间时返回 409 Conflict。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/CreateRoomRequest"
responses:
"200":
description: 创建成功,`data` 返回房间首屏基础数据和已存在的腾讯 IM 群 ID。
schema:
$ref: "#/definitions/CreateRoomEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/profile/update:
post:
tags:
- rooms
summary: 修改房间资料和座位数
operationId: updateRoomProfile
description: |
App 房主在房间内修改房间名、头像、简介和座位数。所有状态变更经过 room-service Room Cell缩小座位数时被删除的高编号麦位必须全部空闲且未锁。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/UpdateRoomProfileRequest"
responses:
"200":
description: 修改成功,`data` 返回最新房间信息和麦位列表。
schema:
$ref: "#/definitions/UpdateRoomProfileEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/join:
post:
tags:
- rooms
summary: 加入房间
operationId: joinRoom
description: JoinRoom 是业务 presence、IM 入群和 RTC 进房的权限分界点。成功后响应返回首屏房间数据、`im.group_id` 和内嵌 `rtc.token`RTC 签发失败时仍返回房间数据,并设置 `rtc.available=false`。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/JoinRoomRequest"
responses:
"200":
description: 加入成功,`data` 返回首屏初始化数据和可选 RTC token。
schema:
$ref: "#/definitions/JoinRoomEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/heartbeat:
post:
tags:
- rooms
summary: 刷新房间业务 presence
operationId: roomHeartbeat
description: 心跳只刷新已经存在的房间 presence用户不在房间时返回 404不会隐式 JoinRoom。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/RoomHeartbeatRequest"
responses:
"200":
description: 心跳成功,`data` 返回刷新后的用户房间态和房间快照。
schema:
$ref: "#/definitions/RoomHeartbeatEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/leave:
post:
tags:
- rooms
summary: 离开房间
operationId: leaveRoom
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/LeaveRoomRequest"
responses:
"200":
description: 离房成功,`data` 返回最新房间快照。
schema:
$ref: "#/definitions/LeaveRoomEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/mic/up:
post:
tags:
- rooms
summary: 上麦
operationId: micUp
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/MicUpRequest"
responses:
"200":
description: 上麦成功,`data` 返回目标麦位和最新房间快照。
schema:
$ref: "#/definitions/MicUpEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/mic/down:
post:
tags:
- rooms
summary: 下麦
operationId: micDown
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/MicDownRequest"
responses:
"200":
description: 下麦成功,`data` 返回目标麦位和最新房间快照。
schema:
$ref: "#/definitions/MicDownEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/mic/change:
post:
tags:
- rooms
summary: 调整麦位
operationId: changeMicSeat
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/ChangeMicSeatRequest"
responses:
"200":
description: 调整成功,`data` 返回最新房间快照。
schema:
$ref: "#/definitions/ChangeMicSeatEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/mic/publishing/confirm:
post:
tags:
- rooms
summary: 确认 RTC 音频发布成功
operationId: confirmMicPublishing
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/ConfirmMicPublishingRequest"
responses:
"200":
description: 确认成功或旧事件被安全忽略,`data` 返回最新房间快照。
schema:
$ref: "#/definitions/ConfirmMicPublishingEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/mic/lock:
post:
tags:
- rooms
summary: 锁定或解锁麦位
operationId: setMicSeatLock
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/SetMicSeatLockRequest"
responses:
"200":
description: 锁麦状态修改成功,`data` 返回最新房间快照。
schema:
$ref: "#/definitions/SetMicSeatLockEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/chat/enabled:
post:
tags:
- rooms
summary: 开启或关闭房间公屏
operationId: setChatEnabled
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/SetChatEnabledRequest"
responses:
"200":
description: 公屏开关修改成功,`data` 返回最新房间快照。
schema:
$ref: "#/definitions/SetChatEnabledEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/password:
post:
tags:
- rooms
summary: 设置或清空房间密码
operationId: setRoomPassword
description: 仅房主可调用。`locked=true` 时 `password` 必须非空;`locked=false` 清空密码并解除锁房。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/SetRoomPasswordRequest"
responses:
"200":
description: 密码状态修改成功,`data.room.locked` 返回最新锁房标识。
schema:
$ref: "#/definitions/SetRoomPasswordEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/admin/set:
post:
tags:
- rooms
summary: 添加或移除房间管理员
operationId: setRoomAdmin
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/SetRoomAdminRequest"
responses:
"200":
description: 管理员集合修改成功,`data` 返回最新房间快照。
schema:
$ref: "#/definitions/SetRoomAdminEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/user/mute:
post:
tags:
- rooms
summary: 设置房间内禁言
operationId: muteUser
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/MuteUserRequest"
responses:
"200":
description: 禁言状态修改成功,`data` 返回最新房间快照。
schema:
$ref: "#/definitions/MuteUserEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/user/kick:
post:
tags:
- rooms
summary: 踢出房间用户
operationId: kickUser
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/KickUserRequest"
responses:
"200":
description: 踢人成功,`data` 返回最新房间快照。
schema:
$ref: "#/definitions/KickUserEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/user/unban:
post:
tags:
- rooms
summary: 解除房间 ban
operationId: unbanUser
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/UnbanUserRequest"
responses:
"200":
description: 解封成功,`data` 返回最新房间快照,不自动恢复 presence、麦位或管理员身份。
schema:
$ref: "#/definitions/UnbanUserEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/gift/send:
post:
tags:
- rooms
summary: 发送礼物
operationId: sendGift
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/SendGiftRequest"
responses:
"200":
description: 送礼成功,`data` 返回账单凭证、热度、本地礼物榜和房间快照。
schema:
$ref: "#/definitions/SendGiftEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/{room_id}/backgrounds:
get:
tags:
- rooms
summary: 查询房间已保存背景与当前生效背景
operationId: listRoomBackgrounds
security:
- BearerAuth: []
parameters:
- name: room_id
in: path
required: true
type: string
responses:
"200":
description: 查询成功selected_background 返回完整可信媒体快照。
schema:
$ref: "#/definitions/RoomBackgroundListEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/{room_id}/backgrounds/upload:
post:
tags:
- rooms
summary: 校验权益后上传房间背景媒体
operationId: uploadRoomBackground
description: 只接受文件头、multipart MIME 和扩展名一致的 JPEG/PNG/GIF/WebPAPNG 不支持。上传不改变房间背景。
consumes:
- multipart/form-data
security:
- BearerAuth: []
parameters:
- name: room_id
in: path
required: true
type: string
- name: command_id
in: formData
required: true
type: string
maxLength: 128
description: 本次“上传并保存背景”的业务幂等键;后续 save 复用同一个值。
- name: file
in: formData
required: true
type: file
description: 最大 12MiB宽不超过 2160、高不超过 3840、总像素不超过 8294400动画最多 120 帧且最长 15 秒。
responses:
"200":
description: 对象已上传,返回后续保存必须原样提交的 media。
schema:
$ref: "#/definitions/RoomMediaUploadEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
description: 非房主,或缺少 custom_room_background后者返回 VIP_BENEFIT_REQUIREDdata.action=upload_room_background。
schema:
$ref: "#/definitions/ErrorEnvelope"
"413":
description: 文件超过 12MiBcode=FILE_TOO_LARGE。
schema:
$ref: "#/definitions/ErrorEnvelope"
"415":
description: 文件签名、MIME 或扩展名不一致code=UNSUPPORTED_MEDIA_TYPE。
schema:
$ref: "#/definitions/ErrorEnvelope"
"409":
description: 同一 command_id 更换文件,或房间已关闭;更换文件时 code=IDEMPOTENCY_CONFLICT。
schema:
$ref: "#/definitions/ErrorEnvelope"
"502":
$ref: "#/responses/UpstreamError"
"503":
description: 上传依赖未配置。
schema:
$ref: "#/definitions/ErrorEnvelope"
/api/v1/rooms/backgrounds/save:
post:
tags:
- rooms
summary: 把专用上传结果保存为房间背景素材
operationId: saveRoomBackground
description: Fami 必须提交 command_id 与完整 mediaLalu legacy_timed 继续兼容历史 image_url-only 请求。该动作不切换背景、不发 IM。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/SaveRoomBackgroundRequest"
responses:
"200":
description: 保存成功或命中同 command_id 的相同素材。
schema:
$ref: "#/definitions/SaveRoomBackgroundEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
description: 非房主,或 Fami 缺少 custom_room_background后者返回 data.action=save_room_background。
schema:
$ref: "#/definitions/ErrorEnvelope"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/backgrounds/set:
post:
tags:
- rooms
summary: 在 Room Cell 中切换当前房间背景
operationId: setRoomBackground
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/SetRoomBackgroundRequest"
responses:
"200":
description: 切换成功或幂等重放;随后异步投递 room_background_changed。
schema:
$ref: "#/definitions/SetRoomBackgroundEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
description: 非房主,或 Fami 缺少 custom_room_background后者返回 data.action=set_room_background。
schema:
$ref: "#/definitions/ErrorEnvelope"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/{room_id}/decorations/apply:
post:
tags:
- rooms
summary: 应用房间边框或彩色房名资源
operationId: applyRoomDecoration
description: 房主专用wallet 会同时复验当前 VIP benefit、对应 resource_id 和有效 entitlement再由 Room Cell 固化快照。
security:
- BearerAuth: []
parameters:
- name: room_id
in: path
required: true
type: string
- name: body
in: body
required: true
schema:
$ref: "#/definitions/ApplyRoomDecorationRequest"
responses:
"200":
description: 应用成功或幂等重放;随后异步投递 room_decoration_changed。
schema:
$ref: "#/definitions/ApplyRoomDecorationEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
description: 非房主或对应 VIP 权益未生效VIP 拒绝包含结构化 data。
schema:
$ref: "#/definitions/ErrorEnvelope"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/rooms/{room_id}/messages/images/upload:
post:
tags:
- rooms
summary: 校验发言权限与 VIP 权益后上传房间图片
operationId: uploadRoomImage
description: 只接受 JPEG/PNG/GIF/WebP上传前校验房间 active、用户仍在房、未 ban/禁言、公屏开启且 room_image_message 生效。
consumes:
- multipart/form-data
security:
- BearerAuth: []
parameters:
- name: room_id
in: path
required: true
type: string
- name: command_id
in: formData
required: true
type: string
maxLength: 128
description: 本次“上传并发送图片”的业务幂等键;后续 send 复用同一个值。
- name: file
in: formData
required: true
type: file
description: 最大 8MiB宽高各不超过 4096、总像素不超过 16777216动画最多 120 帧且最长 15 秒。
responses:
"200":
description: 对象已上传,返回发送接口必须原样提交的 media。
schema:
$ref: "#/definitions/RoomMediaUploadEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
description: 不在房、已 ban/禁言,或缺少 room_image_messageVIP 拒绝包含结构化 data。
schema:
$ref: "#/definitions/ErrorEnvelope"
"409":
$ref: "#/responses/Conflict"
"413":
description: 文件超过 8MiBcode=FILE_TOO_LARGE。
schema:
$ref: "#/definitions/ErrorEnvelope"
"415":
description: 文件签名、MIME 或扩展名不一致code=UNSUPPORTED_MEDIA_TYPE。
schema:
$ref: "#/definitions/ErrorEnvelope"
"502":
$ref: "#/responses/UpstreamError"
"503":
description: 上传依赖未配置。
schema:
$ref: "#/definitions/ErrorEnvelope"
/api/v1/rooms/{room_id}/messages/image:
post:
tags:
- rooms
summary: 通过 Room Cell 与 durable outbox 发送房间图片
operationId: sendRoomImage
security:
- BearerAuth: []
parameters:
- name: room_id
in: path
required: true
type: string
- name: body
in: body
required: true
schema:
$ref: "#/definitions/SendRoomImageRequest"
responses:
"200":
description: 发送事实已提交accepted=true 不代表腾讯云 IM 已到达所有客户端。
schema:
$ref: "#/definitions/SendRoomImageEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
description: 发言权限或 room_image_message 权益未生效VIP 拒绝包含结构化 data。
schema:
$ref: "#/definitions/ErrorEnvelope"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/vip/me:
get:
tags:
- vip
summary: 查询当前用户的付费、体验卡与最终生效 VIP 状态
operationId: getMyVIP
description: Flutter 必须以 state.effective_vip 和 state.effective_benefits 授权展示;根层 level/name/active 仅保留旧客户端兼容。
security:
- BearerAuth: []
responses:
"200":
description: 查询成功。
schema:
$ref: "#/definitions/VIPMeEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/vip/packages:
get:
tags:
- vip
summary: 查询当前 App 可购买 VIP 套餐和每级完整权益
operationId: listVIPPackages
description: >-
benefits[].resource 只有在 resource_id 指向同 App、active 且 resource_type 匹配的真实资源时返回;
为空时客户端不得根据 resource_id 或权益名拼接素材 URL。套餐目录不代表用户已经拥有权益。
security:
- BearerAuth: []
responses:
"200":
description: 查询成功Fami program_type=tiered_privilege_v1Lalu 保持 legacy_timed。
schema:
$ref: "#/definitions/VIPPackageListEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/vip/purchase:
post:
tags:
- vip
summary: 购买、同级续期或升级 VIP
operationId: purchaseVIP
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/VIPPurchaseRequest"
responses:
"200":
description: 购买成功;客户端用 data.state 原子替换 VIP store并用 coin_balance 替换 COIN 余额。
schema:
$ref: "#/definitions/VIPPurchaseEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/vip/trial-cards/{entitlement_id}/equip:
post:
tags:
- vip
summary: 佩戴一张 VIP 体验卡
operationId: equipVIPTrialCard
security:
- BearerAuth: []
parameters:
- name: entitlement_id
in: path
required: true
type: string
description: 背包权益实例 ID不能用 resource_id 代替。
responses:
"200":
description: 佩戴成功;客户端使用返回 state不自行合并付费 VIP。
schema:
$ref: "#/definitions/VIPTrialCardMutationEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/vip/trial-cards/equipped:
delete:
tags:
- vip
summary: 卸下当前 VIP 体验卡
operationId: unequipVIPTrialCard
security:
- BearerAuth: []
responses:
"200":
description: 卸下成功或当前无卡;卡实例和绝对到期时间不会被删除。
schema:
$ref: "#/definitions/VIPTrialCardMutationEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/vip/settings:
get:
tags:
- vip
summary: 查询当前 App 的 VIP 功能开关
operationId: getVIPSettings
security:
- BearerAuth: []
responses:
"200":
description: 查询成功;开关是偏好,不单独授予权益。
schema:
$ref: "#/definitions/VIPSettingsEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"502":
$ref: "#/responses/UpstreamError"
patch:
tags:
- vip
summary: 局部更新当前 App 的 VIP 功能开关
operationId: patchVIPSettings
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/VIPSettingsPatchRequest"
responses:
"200":
description: 更新成功;显式 false 与字段未提交语义不同。
schema:
$ref: "#/definitions/VIPSettingsEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/vip/online-notice:
post:
tags:
- vip
summary: 请求服务端创建 VIP 上线全服通知
operationId: triggerVIPOnlineNotice
description: 服务端执行前重新校验 online_global_notice 权益和用户开关Flutter 不能自行向全局群发消息。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/CommandIDRequest"
responses:
"200":
description: 已创建或命中相同 command_id 的异步播报事实。
schema:
$ref: "#/definitions/VIPOnlineNoticeEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
description: 权益或用户开关未生效;返回 VIP_BENEFIT_REQUIRED 结构化 data。
schema:
$ref: "#/definitions/VIPBenefitRequiredErrorEnvelope"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/resources:
get:
tags:
- resources
summary: App 资源列表
operationId: listResources
parameters:
- name: resource_type
in: query
required: false
type: string
enum: [avatar_frame, profile_card, coin, vehicle, chat_bubble, badge, floating_screen, gift, mic_seat_icon, mic_seat_animation, room_border, room_name_style, emoji_pack, vip_trial_card]
- name: keyword
in: query
required: false
type: string
- name: page
in: query
required: false
type: integer
format: int32
- name: page_size
in: query
required: false
type: integer
format: int32
- name: region_id
in: query
required: false
type: integer
format: int64
description: 区域 ID传入后返回该区域和 GLOBAL 兜底礼物,不传时只返回 GLOBAL 兜底礼物。
responses:
"200":
description: 返回当前 App active 资源列表。
schema:
$ref: "#/definitions/ResourceListEnvelope"
"400":
$ref: "#/responses/BadRequest"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/manager-center/resource-grants/resources:
get:
tags:
- manager-center
summary: 经理中心可赠送资源列表
operationId: listManagerGrantResources
description: gateway 先校验当前用户拥有 `manager_resource_grant` capability再从 wallet-service 查询 `status=active AND grantable=TRUE AND manager_grant_enabled=TRUE` 的资源。
security:
- BearerAuth: []
parameters:
- name: resource_type
in: query
required: false
type: string
enum: [avatar_frame, profile_card, coin, vehicle, chat_bubble, badge, floating_screen, gift, mic_seat_icon, mic_seat_animation, room_border, room_name_style, emoji_pack, vip_trial_card]
- name: page
in: query
required: false
type: integer
format: int32
- name: page_size
in: query
required: false
type: integer
format: int32
maximum: 20
responses:
"200":
description: 返回 H5 展示和提交所需的最小资源字段。
schema:
$ref: "#/definitions/ManagerGrantResourceListEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/manager-center/resource-grants:
post:
tags:
- manager-center
summary: 经理中心赠送单个资源
operationId: grantManagerResource
description: 客户端提交命令 ID、目标用户、资源 ID 和可选有效期;数量固定为 1有效期只能是 7/30/90 天,未传默认 7 天,`grant_source` 固定为 `manager_center`。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/ManagerResourceGrantRequest"
responses:
"200":
description: 赠送成功,返回资源赠送事实。
schema:
$ref: "#/definitions/ManagerResourceGrantEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/business/users/lookup:
get:
tags:
- business
summary: 业务场景用户查询
operationId: lookupBusinessUsers
description: 首版只支持 `scene=manager_resource_grant`。user-service 会按 scene 校验 actor 能力,并只返回同 app_code 的 active 用户最小资料。
security:
- BearerAuth: []
parameters:
- name: scene
in: query
required: true
type: string
enum: [manager_resource_grant]
- name: keyword
in: query
required: true
type: string
description: 展示短号、用户 ID 或至少 2 个字符的昵称片段。
- name: page_size
in: query
required: false
type: integer
format: int32
maximum: 20
responses:
"200":
description: 查询成功。
schema:
$ref: "#/definitions/BusinessUserLookupEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/resource-groups/{group_id}:
get:
tags:
- resources
summary: App 资源组详情
operationId: getResourceGroup
parameters:
- $ref: "#/parameters/ResourceGroupIDPath"
responses:
"200":
description: 返回 active 资源组及组内资源。
schema:
$ref: "#/definitions/ResourceGroupEnvelope"
"400":
$ref: "#/responses/BadRequest"
"404":
$ref: "#/responses/NotFound"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/gifts:
get:
tags:
- resources
summary: App 礼物列表
operationId: listGifts
parameters:
- name: keyword
in: query
required: false
type: string
- name: page
in: query
required: false
type: integer
format: int32
- name: page_size
in: query
required: false
type: integer
format: int32
- name: region_id
in: query
required: false
type: integer
format: int64
description: 区域 ID返回该区域和 GLOBAL 兜底礼物。
responses:
"200":
description: 返回当前 active、区域可用且在有效期内的礼物配置礼物资源必须来自 `resource_type=gift`。
schema:
$ref: "#/definitions/GiftListEnvelope"
"400":
$ref: "#/responses/BadRequest"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/gift-tabs:
get:
tags:
- resources
summary: App 礼物 Tab 配置列表
operationId: listGiftTabs
parameters:
- name: region_id
in: query
required: false
type: integer
format: int64
description: 不传时预加载全部 active 礼物;传入时只返回 GLOBAL 和该区域可用礼物。
responses:
"200":
description: 返回后台启用的礼物 Tab 配置和当前 active 礼物;不按礼物数量过滤 Tab即使 Tab 下当前没有礼物也返回 gifts 空数组。
schema:
$ref: "#/definitions/GiftTabListEnvelope"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/resources:
get:
tags:
- resources
summary: 我的资源权益
operationId: listMyResources
security:
- BearerAuth: []
parameters:
- name: resource_type
in: query
required: false
type: string
enum: [avatar_frame, profile_card, coin, vehicle, chat_bubble, badge, floating_screen, gift, mic_seat_icon, mic_seat_animation, room_border, room_name_style, emoji_pack, vip_trial_card]
responses:
"200":
description: 返回当前用户有效资源权益。
schema:
$ref: "#/definitions/UserResourceListEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/users/me/resources/{resource_id}/equip:
post:
tags:
- resources
summary: 佩戴我的资源
description: >-
Fami 请求必须带 command_id同一动作重试复用wallet 在写入前重新校验当前 VIP benefit 与 resource_id 的绑定。
vip_trial_card 会委托 VIP 专用状态机;该通用响应不含完整 VipStateVIP 客户端应使用 /api/v1/vip/trial-cards/{entitlement_id}/equip。
operationId: equipMyResource
security:
- BearerAuth: []
parameters:
- $ref: "#/parameters/ResourceIDPath"
- name: body
in: body
required: false
schema:
$ref: "#/definitions/EquipUserResourceRequest"
responses:
"200":
description: 返回被佩戴的有效资源权益。
schema:
$ref: "#/definitions/UserResourceEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
description: VIP 绑定资源的对应权益已失效时返回 VIP_BENEFIT_REQUIRED并包含 benefit_code/required_level/current_effective_level/action。
schema:
$ref: "#/definitions/ErrorEnvelope"
"404":
$ref: "#/responses/NotFound"
"409":
description: 同一 command_id 改变 resource_id 或 entitlement_idcode=IDEMPOTENCY_CONFLICT。
schema:
$ref: "#/definitions/ErrorEnvelope"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/messages/tabs:
get:
tags:
- messages
summary: 消息 tab 分区摘要
operationId: listMessageTabs
description: 返回 user/system/activity 三个分区user 分区只声明来源为腾讯云 IM SDK不返回私聊内容。
security:
- BearerAuth: []
parameters:
responses:
"200":
description: 查询成功。
schema:
$ref: "#/definitions/MessageTabsEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/messages:
get:
tags:
- messages
summary: system/activity 消息列表
operationId: listInboxMessages
description: 只读取当前 app_code 和当前用户下 visible、未删除、未过期的 system/activity 消息,按 sent_at_ms 倒序游标分页。
security:
- BearerAuth: []
parameters:
- name: section
in: query
required: true
type: string
enum: [system, activity]
- name: page_size
in: query
required: false
type: integer
format: int32
- name: page_token
in: query
required: false
type: string
responses:
"200":
description: 查询成功。
schema:
$ref: "#/definitions/MessageListEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/messages/read-all:
post:
tags:
- messages
summary: 标记分区全部已读
operationId: markInboxSectionRead
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/MessageReadAllRequest"
responses:
"200":
description: 已读成功;重复请求成功且 read_count 可为 0。
schema:
$ref: "#/definitions/MessageReadAllEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/messages/{message_id}/read:
post:
tags:
- messages
summary: 标记单条消息已读
operationId: markInboxMessageRead
security:
- BearerAuth: []
parameters:
- name: message_id
in: path
required: true
type: string
responses:
"200":
description: 已读成功;重复请求不覆盖首次 read_at_ms。
schema:
$ref: "#/definitions/MessageReadEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/messages/{message_id}:
delete:
tags:
- messages
summary: 删除单条消息
operationId: deleteInboxMessage
description: 删除是当前用户侧隐藏,不物理删除 inbox 事实;不存在、已删除或不属于当前用户均返回 NOT_FOUND。
security:
- BearerAuth: []
parameters:
- name: message_id
in: path
required: true
type: string
responses:
"200":
description: 删除成功。
schema:
$ref: "#/definitions/MessageDeleteEnvelope"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/wallet/recharge/products:
get:
tags:
- wallet
summary: 获取充值商品列表
operationId: listRechargeProducts
description: gateway 根据当前登录用户资料中的 `region_id` 和 App 平台筛选已上架内购商品;平台可通过 `platform` query 覆盖,默认读取 `X-App-Platform` / `X-Platform` 请求头。
security:
- BearerAuth: []
parameters:
- name: platform
in: query
required: false
type: string
enum: [android, ios]
description: 可选平台覆盖值;不传时读取 App 平台请求头。
- name: X-App-Platform
in: header
required: false
type: string
enum: [android, ios]
description: App 平台请求头。
- name: X-Platform
in: header
required: false
type: string
enum: [android, ios]
description: 兼容平台请求头。
responses:
"200":
description: 返回当前用户区域和平台可购买的上架商品。
schema:
$ref: "#/definitions/RechargeProductListEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/wallet/payments/google/confirm:
post:
tags:
- wallet
summary: 确认 Google Play 充值支付
operationId: confirmGooglePayment
description: App 支付成功后提交 Google purchase token后端调用 Google Play Developer API 校验成功后写入钱包账本、充值记录、payment_orders 审计并尝试 consume。接口支持按 purchase token 幂等重试。
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/GooglePaymentConfirmRequest"
responses:
"200":
description: 校验成功并已入账;`consume_state=consume_pending` 也表示已入账成功,只是 Google consume 待后续重试。
schema:
$ref: "#/definitions/GooglePaymentConfirmEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
/api/v1/wallet/coin-seller/transfer:
post:
tags:
- wallet
summary: 币商给玩家转金币
operationId: transferCoinFromSeller
security:
- BearerAuth: []
parameters:
- name: body
in: body
required: true
schema:
$ref: "#/definitions/CoinSellerTransferRequest"
responses:
"200":
description: 转账成功,`data` 返回账务交易、双方账后余额和充值金额口径。
schema:
$ref: "#/definitions/CoinSellerTransferEnvelope"
"400":
$ref: "#/responses/BadRequest"
"401":
$ref: "#/responses/Unauthorized"
"403":
$ref: "#/responses/Forbidden"
"404":
$ref: "#/responses/NotFound"
"409":
$ref: "#/responses/Conflict"
"500":
$ref: "#/responses/Internal"
"502":
$ref: "#/responses/UpstreamError"
definitions:
GatewayOKEnvelopeBase:
type: object
required:
- code
- message
- request_id
properties:
code:
type: string
enum:
- OK
message:
type: string
enum:
- ok
request_id:
type: string
description: gateway 业务 API 成功响应外壳。
ErrorEnvelope:
type: object
required:
- code
- message
- request_id
properties:
code:
type: string
enum:
- INVALID_JSON
- UNAUTHORIZED
- UPSTREAM_ERROR
- INTERNAL_ERROR
- INVALID_ARGUMENT
- RATE_LIMITED
- AUTH_FAILED
- SESSION_EXPIRED
- SESSION_REVOKED
- PASSWORD_ALREADY_SET
- DISPLAY_USER_ID_INVALID
- DISPLAY_USER_ID_EXISTS
- DISPLAY_USER_ID_COOLDOWN
- COUNTRY_CHANGE_COOLDOWN
- DISPLAY_USER_ID_NOT_FOUND
- DISPLAY_USER_ID_PRETTY_NOT_AVAILABLE
- DISPLAY_USER_ID_PRETTY_ACTIVE
- DISPLAY_USER_ID_LEASE_EXPIRED
- DISPLAY_USER_ID_PAYMENT_REQUIRED
- USER_DISABLED
- PROFILE_REQUIRED
- PERMISSION_DENIED
- NOT_FOUND
- CONFLICT
- ROOM_CLOSED
- INSUFFICIENT_BALANCE
- IDEMPOTENCY_CONFLICT
- FILE_TOO_LARGE
- UNSUPPORTED_MEDIA_TYPE
- INVALID_MEDIA_DIMENSIONS
- VIP_BENEFIT_REQUIRED
- VIP_PROGRAM_INACTIVE
- VIP_PACKAGE_NOT_PURCHASABLE
- VIP_DOWNGRADE_NOT_ALLOWED
- VIP_RECHARGE_REQUIRED
- VIP_INSUFFICIENT_COIN
- VIP_TRIAL_CARD_NOT_FOUND
- VIP_TRIAL_CARD_EXPIRED
- VIP_COIN_REBATE_NOT_FOUND
- VIP_COIN_REBATE_EXPIRED
message:
type: string
description: 稳定的短错误说明,仅用于兜底展示;客户端业务分支必须使用 code。
request_id:
type: string
data:
type: object
additionalProperties: {}
description: 可选的安全结构化业务详情;当前 `VIP_BENEFIT_REQUIRED` 返回 benefit_code、required_level、current_effective_level 和 action。不得包含内部错误。
description: gateway 业务 API 失败响应外壳;多数失败省略 `data`,需要客户端执行动作的错误可返回安全结构化详情。
HealthResponse:
type: object
properties:
status:
type: string
enum:
- ok
- fail
service:
type: string
example: gateway-service
node_id:
type: string
time_unix_ms:
type: integer
format: int64
checks:
type: array
items:
$ref: "#/definitions/HealthCheck"
HealthCheck:
type: object
properties:
name:
type: string
example: room_grpc
status:
type: string
enum:
- ok
- fail
message:
type: string
LoginPasswordRequest:
type: object
required:
- account
- password
- device_id
description: 账号就是用户当前有效短号。
properties:
account:
type: string
example: "123456"
password:
type: string
example: "1234567"
device_id:
type: string
LoginThirdPartyRequest:
type: object
description: 三方登录即注册;首次注册时资料字段写入 user-service users 主记录。`ip`、`user_agent` 和 `country_by_ip` 由 gateway/服务端上下文生成,不接受客户端 JSON。
required:
- provider
- credential
- device_id
- platform
properties:
provider:
type: string
example: firebase
credential:
type: string
description: Firebase Auth ID token不能提交 Google account id、email 或 access token。
username:
type: string
maxLength: 64
gender:
type: string
maxLength: 32
country:
type: string
maxLength: 3
pattern: "^[A-Za-z]{2,3}$"
description: 国家主数据 country_code支持 2 到 3 位英文,服务端会转大写并要求 active。
invite_code:
type: string
maxLength: 64
description: 可选邀请码。
device_id:
type: string
maxLength: 128
device:
type: string
maxLength: 128
os_version:
type: string
maxLength: 64
avatar:
type: string
maxLength: 512
description: 绝对 http/https URL。
birth:
type: string
description: yyyy-mm-dd。
app_version:
type: string
maxLength: 64
build_number:
type: string
maxLength: 64
source:
type: string
maxLength: 64
install_channel:
type: string
maxLength: 64
campaign:
type: string
maxLength: 128
platform:
type: string
maxLength: 16
enum:
- android
- ios
language:
type: string
maxLength: 32
description: BCP 47 language tag subset例如 en-US。
timezone:
type: string
maxLength: 64
description: IANA timezone name例如 America/Los_Angeles。
SetPasswordRequest:
type: object
properties:
password:
type: string
RefreshTokenRequest:
type: object
properties:
refresh_token:
type: string
description: 登录和 refresh 响应返回CompleteOnboarding 不轮换 refresh token可能为空或缺失。
device_id:
type: string
LogoutRequest:
type: object
properties:
refresh_token:
type: string
session_id:
type: string
AuthTokenData:
type: object
properties:
user_id:
type: string
description: 数值型用户 ID 的字符串形式。
display_user_id:
type: string
default_display_user_id:
type: string
display_user_id_kind:
type: string
display_user_id_expires_at_ms:
type: integer
format: int64
session_id:
type: string
access_token:
type: string
refresh_token:
type: string
expires_in_sec:
type: integer
format: int64
token_type:
type: string
example: Bearer
is_new_user:
type: boolean
profile_completed:
type: boolean
onboarding_status:
type: string
enum:
- profile_required
- completed
PasswordSetData:
type: object
properties:
password_set:
type: boolean
LogoutData:
type: object
properties:
revoked:
type: boolean
TencentIMUserSigData:
type: object
properties:
sdk_app_id:
type: integer
format: int64
user_id:
type: string
description: 腾讯云 IM identifier当前固定使用内部长 `user_id` 的十进制字符串。
user_sig:
type: string
expire_at_ms:
type: integer
format: int64
description: 客户端登录腾讯云 IM SDK 所需票据。
TencentRTCTokenRequest:
type: object
required:
- room_id
properties:
room_id:
type: string
pattern: "^[A-Za-z0-9_-]{1,48}$"
maxLength: 48
description: 内部房间 ID同时作为腾讯 RTC `strRoomId` 使用。
TencentRTCTokenData:
type: object
properties:
sdk_app_id:
type: integer
format: int64
user_id:
type: string
description: 腾讯 RTC UserID当前固定使用内部长 `user_id` 的十进制字符串。
rtc_user_id:
type: string
description: 与 `user_id` 相同,帮助客户端显式区分业务身份和 RTC SDK 身份。
user_sig:
type: string
description: 腾讯 RTC UserSig客户端用它进入腾讯 RTC不是 SecretKey。
expire_at_ms:
type: integer
format: int64
room_id:
type: string
description: 内部房间 ID。
rtc_room_id:
type: string
description: 腾讯 RTC 字符串房间 ID值等于 `room_id`。
rtc_room_id_type:
type: string
enum:
- string
str_room_id:
type: string
description: 客户端调用 TRTC enterRoom 时使用的 `strRoomId`。
app_scene:
type: string
enum:
- voice_chat_room
role:
type: string
enum:
- audience
description: 首版固定返回 audience上麦成功后客户端再切换发布角色。
description: 客户端进入腾讯 RTC 语音房所需票据和字符串房间映射。
UploadFileData:
type: object
properties:
url:
type: string
description: 公开访问 URL可写入用户头像、房间头像或其他业务资料字段。
object_key:
type: string
description: COS object key便于后续服务端删除或审计。
content_type:
type: string
description: 服务端确认后的文件 MIME 类型。
size_bytes:
type: integer
format: int64
description: 上传文件字节数。
BindPushTokenRequest:
type: object
required:
- device_id
- push_token
- platform
properties:
device_id:
type: string
maxLength: 128
description: App 安装级稳定 ID。
push_token:
type: string
maxLength: 512
description: APNS/FCM 等系统推送 token。
provider:
type: string
maxLength: 32
description: 可选;为空时 android 默认 fcmios 默认 apns。
platform:
type: string
enum:
- android
- ios
app_version:
type: string
maxLength: 64
language:
type: string
maxLength: 32
timezone:
type: string
maxLength: 64
DeletePushTokenRequest:
type: object
required:
- device_id
properties:
device_id:
type: string
maxLength: 128
push_token:
type: string
maxLength: 512
description: 可选;为空时按当前用户和 device_id 失效 active token。
BindPushTokenData:
type: object
required:
- bound
- updated_at_ms
properties:
bound:
type: boolean
updated_at_ms:
type: integer
format: int64
gifts:
type: array
description: 当前 Tab 下的 active 礼物列表;没有礼物时返回空数组。
items:
$ref: "#/definitions/GiftConfigData"
DeletePushTokenData:
type: object
required:
- deleted
- updated_at_ms
properties:
deleted:
type: boolean
updated_at_ms:
type: integer
format: int64
TencentIMCallbackRequest:
type: object
properties:
CallbackCommand:
type: string
enum:
- Group.CallbackBeforeApplyJoinGroup
- Group.CallbackBeforeSendMsg
GroupId:
type: string
description: 映射为内部 `room_id`。
Requestor_Account:
type: string
description: 入群申请用户;必须是内部长 `user_id` 的十进制字符串。
From_Account:
type: string
description: 发言用户;必须是内部长 `user_id` 的十进制字符串。
Operator_Account:
type: string
description: 腾讯云 IM 回调操作者账号字段。
TencentIMCallbackResponse:
type: object
properties:
ActionStatus:
type: string
enum:
- OK
ErrorInfo:
type: string
ErrorCode:
type: integer
format: int32
enum:
- 0
- 1
description: 腾讯云 IM 原生回调响应;`ErrorCode=0` 允许,`ErrorCode=1` 拒绝本次入群或发言。
TencentRTCCallbackRequest:
type: object
properties:
EventGroupId:
type: integer
format: int32
enum:
- 1
- 2
description: 1 为房间事件组2 为媒体事件组。
EventType:
type: integer
format: int32
enum:
- 104
- 203
- 204
description: 当前只消费退出房间、开始推送音频、停止推送音频。
CallbackTs:
type: integer
format: int64
EventInfo:
type: object
properties:
RoomId:
description: 腾讯 RTC 房间 ID本系统要求等于内部字符串 `room_id`。
UserId:
type: string
description: 腾讯 RTC UserID必须是内部长 `user_id` 的十进制字符串。
EventTs:
type: integer
format: int64
EventMsTs:
type: integer
format: int64
Reason:
type: integer
format: int32
description: 腾讯 RTC 原生回调请求;签名必须基于原始 body不要重新序列化后计算。
TencentRTCCallbackResponse:
type: object
properties:
code:
type: integer
format: int32
enum:
- 0
- 1
message:
type: string
description: 腾讯 RTC 回调响应;`code=0` 表示 gateway 已接受或安全忽略该事件。
UserIdentityData:
type: object
properties:
user_id:
type: string
description: 数值型用户 ID 的字符串形式。
display_user_id:
type: string
status:
type: string
default_display_user_id:
type: string
display_user_id_kind:
type: string
display_user_id_expires_at_ms:
type: integer
format: int64
lease_id:
type: string
UserHostIdentityData:
type: object
properties:
is_host:
type: boolean
description: 用户是否拥有 active host profile。
is_agent:
type: boolean
description: 用户是否拥有 Agency 入口身份active Agency owner 或 Agency 来源主播都可能为 true。
is_manager:
type: boolean
description: 用户是否拥有经理中心身份;首版等价于 active Agency owner。
is_bd:
type: boolean
description: 用户是否拥有 active BD 或 BD Leader 身份。
is_bd_leader:
type: boolean
description: 用户是否拥有 active BD Leader 身份。
is_coin_seller:
type: boolean
description: 用户是否拥有 active 币商身份。
MyOverviewRolesData:
type: object
required:
- is_host
- is_agency
- is_manager
- is_bd
- is_bd_leader
- is_coin_seller
- pending_role_invitations
properties:
is_host:
type: boolean
is_agency:
type: boolean
is_manager:
type: boolean
is_bd:
type: boolean
is_bd_leader:
type: boolean
is_coin_seller:
type: boolean
host_status:
type: string
agency_id:
type: integer
format: int64
bd_id:
type: integer
format: int64
bd_status:
type: string
coin_seller_status:
type: string
pending_role_invitations:
type: integer
format: int64
unavailable:
type: boolean
description: 角色上游不可用时为 true此时所有特权身份按 false 返回。
MyOverviewProfileStatsData:
type: object
required:
- visitors_count
- following_count
- friends_count
- updated_at_ms
properties:
visitors_count:
type: integer
format: int64
following_count:
type: integer
format: int64
friends_count:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
unavailable:
type: boolean
description: 计数 read model 上游不可用时为 true客户端可按 0 展示。
MyOverviewWalletData:
type: object
required:
- coin_amount
- updated_at_ms
properties:
coin_amount:
type: integer
format: int64
description: 我的页首屏只展示金币余额。
updated_at_ms:
type: integer
format: int64
unavailable:
type: boolean
description: 钱包上游不可用时为 true。
MyOverviewVIPData:
type: object
properties:
level:
type: integer
format: int32
name:
type: string
active:
type: boolean
started_at_ms:
type: integer
format: int64
expires_at_ms:
type: integer
format: int64
unavailable:
type: boolean
description: VIP 上游不可用时为 true。
MyOverviewEntryData:
type: object
required:
- key
- visible
- enabled
- route
- icon_key
- badge_count
- order
properties:
key:
type: string
enum:
- store
- bag
- level
- task
- apply_host
- host_center
- agency_center
- bd_center
- superadmin_center
- coin_seller_center
- settings
- language
visible:
type: boolean
enabled:
type: boolean
route:
type: string
icon_key:
type: string
badge_count:
type: integer
format: int64
order:
type: integer
format: int32
MyOverviewData:
type: object
required:
- profile
- profile_stats
- wallet
- vip
- roles
- entries
- server_time_ms
properties:
profile:
$ref: "#/definitions/UserProfileData"
profile_stats:
$ref: "#/definitions/MyOverviewProfileStatsData"
wallet:
$ref: "#/definitions/MyOverviewWalletData"
vip:
$ref: "#/definitions/MyOverviewVIPData"
roles:
$ref: "#/definitions/MyOverviewRolesData"
entries:
type: array
items:
$ref: "#/definitions/MyOverviewEntryData"
server_time_ms:
type: integer
format: int64
MyInviteOverviewData:
type: object
required:
- my_invite_code
- invite_enabled
- invite_count
- valid_invite_count
- valid_invite_threshold_coin
properties:
my_invite_code:
type: string
invite_enabled:
type: boolean
invite_count:
type: integer
format: int64
valid_invite_count:
type: integer
format: int64
valid_invite_threshold_coin:
type: integer
format: int64
UserProfileData:
type: object
properties:
user_id:
type: string
description: 数值型用户 ID 的字符串形式。
display_user_id:
type: string
default_display_user_id:
type: string
display_user_id_kind:
type: string
display_user_id_expires_at_ms:
type: integer
format: int64
username:
type: string
gender:
type: string
country:
type: string
maxLength: 3
description: 用户选择的国家主数据 country_code。
country_id:
type: integer
format: int64
description: 国家主数据内部 ID0 表示未命中国家表。
country_name:
type: string
country_display_name:
type: string
iso_numeric:
type: string
description: ISO numeric / UNSD M49 三位字符串,客户端不能按数字解析。
phone_country_code:
type: string
description: E.164 国家呼叫码,例如 `+86`;可能为空或多个国家共享。
country_enabled:
type: boolean
description: 当前国家是否仍对 App 注册和改国家开放。
region_id:
type: integer
format: int64
description: 国家映射出的区域 ID0 表示无区域归属。
region_code:
type: string
region_name:
type: string
avatar:
type: string
birth:
type: string
description: yyyy-mm-dd。
language:
type: string
profile_completed:
type: boolean
profile_completed_at_ms:
type: integer
format: int64
onboarding_status:
type: string
enum:
- profile_required
- completed
updated_at_ms:
type: integer
format: int64
profile_bg_img:
type: string
description: 用户主页信息卡背景图片 URL来自 users.profile_bg_img和 `profile_card` 装扮资源无关,未设置时为空字符串。
next_country_change_allowed_at_ms:
type: integer
format: int64
UserProfileBatchData:
type: object
required:
- user_id
- display_user_id
- username
- app_code
properties:
user_id:
type: string
description: 数值型用户 ID 的字符串形式,避免客户端 JS 精度丢失。
display_user_id:
type: string
username:
type: string
avatar:
type: string
gender:
type: string
country:
type: string
region_id:
type: integer
format: int64
app_code:
type: string
description: 腾讯云 IM 会话列表展示资料;不包含手机号、登录凭证、实名或后台身份字段。
UserProfilesBatchData:
type: object
required:
- profiles
properties:
profiles:
type: array
items:
$ref: "#/definitions/UserProfileBatchData"
MessageTabSectionData:
type: object
required:
- section
- title
- unread_count
- source
properties:
section:
type: string
enum:
- user
- system
- activity
title:
type: string
unread_count:
type: integer
format: int64
source:
type: string
enum:
- tencent_im_sdk
- backend
MessageTabsData:
type: object
required:
- sections
properties:
sections:
type: array
items:
$ref: "#/definitions/MessageTabSectionData"
InboxMessageData:
type: object
required:
- message_id
- title
- summary
- read
- sent_at_ms
properties:
message_id:
type: string
title:
type: string
summary:
type: string
body:
type: string
icon_url:
type: string
image_url:
type: string
action_type:
type: string
description: 服务端白名单动作,例如 wallet_withdraw_detail、activity_detail、room_detail。
action_param:
type: string
read:
type: boolean
sent_at_ms:
type: integer
format: int64
MessageListData:
type: object
required:
- section
- items
- next_page_token
properties:
section:
type: string
enum:
- system
- activity
items:
type: array
items:
$ref: "#/definitions/InboxMessageData"
next_page_token:
type: string
MessageReadAllRequest:
type: object
required:
- section
properties:
section:
type: string
enum:
- system
- activity
MessageReadData:
type: object
required:
- message_id
- read
- read_at_ms
properties:
message_id:
type: string
read:
type: boolean
read_at_ms:
type: integer
format: int64
MessageReadAllData:
type: object
required:
- section
- read_count
properties:
section:
type: string
enum:
- system
- activity
read_count:
type: integer
format: int64
MessageDeleteData:
type: object
required:
- message_id
- deleted
properties:
message_id:
type: string
deleted:
type: boolean
CountryData:
type: object
properties:
country_id:
type: integer
format: int64
country_name:
type: string
country_code:
type: string
maxLength: 3
iso_alpha3:
type: string
maxLength: 3
iso_numeric:
type: string
description: 三位 numeric 字符串。
country_display_name:
type: string
phone_country_code:
type: string
enabled:
type: boolean
flag:
type: string
sort_order:
type: integer
format: int32
CountryListData:
type: object
properties:
countries:
type: array
items:
$ref: "#/definitions/CountryData"
H5LinkData:
type: object
properties:
key:
type: string
description: 后台 H5 配置 keyApp 只对已接入的 key 做入口展示,例如 rank、explore_game_rank、game_rock、game_dice、vip、level、task。
label:
type: string
url:
type: string
description: 后台配置的 H5 URL未配置时为空字符串。
updated_at_ms:
type: integer
format: int64
description: 该入口最近更新时间;未配置时为 0。
H5LinkListData:
type: object
properties:
items:
type: array
items:
$ref: "#/definitions/H5LinkData"
total:
type: integer
format: int32
SplashScreenData:
type: object
properties:
id:
type: integer
format: uint64
cover_url:
type: string
background_url:
type: string
description: 开屏图片 URL。
type:
type: string
enum: [h5, app]
description: h5 表示 param 是 H5 链接app 表示 param 由客户端解释。
param:
type: string
platform:
type: string
enum: [android, ios]
sort_order:
type: integer
format: int32
region_id:
type: integer
format: int64
country_code:
type: string
description:
type: string
starts_at_ms:
type: integer
format: int64
ends_at_ms:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
SplashScreenListData:
type: object
properties:
items:
type: array
items:
$ref: "#/definitions/SplashScreenData"
total:
type: integer
format: int32
PopupData:
type: object
properties:
id:
type: integer
format: uint64
code:
type: string
description: 弹窗编码,同一个 App 下唯一,用于客户端本地频控和埋点识别。
name:
type: string
description: 弹窗名字。
image_url:
type: string
description: 弹窗图片 URL为空表示无图片。
jump_type:
type: string
enum: [h5, app]
description: h5 表示 jump_url 是 H5 链接app 表示 jump_url 由客户端解释。
jump_url:
type: string
display_period_days:
type: integer
format: int32
description: 展示周期天数0 表示每次打开都展示。
sort_order:
type: integer
format: int32
starts_at_ms:
type: integer
format: int64
ends_at_ms:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
PopupListData:
type: object
properties:
items:
type: array
items:
$ref: "#/definitions/PopupData"
total:
type: integer
format: int32
AppBootstrapTab:
type: object
properties:
key:
type: string
enum:
- rooms
- messages
- me
title:
type: string
enabled:
type: boolean
AppBootstrapData:
type: object
properties:
app_code:
type: string
server_time_ms:
type: integer
format: int64
force_upgrade:
type: boolean
maintenance:
type: boolean
minimum_version:
type: string
latest_version:
type: string
feature_flags:
type: object
additionalProperties:
type: boolean
bottom_tabs:
type: array
items:
$ref: "#/definitions/AppBootstrapTab"
config_versions:
type: object
additionalProperties:
type: string
AppVersionData:
type: object
properties:
app_code:
type: string
platform:
type: string
enum: [android, ios]
version:
type: string
description: 最新版本号,例如 1.2.0。
build_number:
type: integer
format: int64
description: 最新编译版本号App 使用它和本地 build number 比较。
force_update:
type: boolean
description: 当前客户端落后且后台最新版本要求强更时为 true。
download_url:
type: string
description:
type: string
has_update:
type: boolean
current_build_number:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
server_time_ms:
type: integer
format: int64
CompleteOnboardingRequest:
type: object
required:
- username
- avatar
- gender
- country
properties:
username:
type: string
avatar:
type: string
description: HTTP/HTTPS 头像 URL。
gender:
type: string
maxLength: 32
country:
type: string
maxLength: 3
pattern: "^[A-Za-z]{2,3}$"
description: 注册页从 `/api/v1/countries` 取得的 country_code。
invite_code:
type: string
maxLength: 64
description: 可选邀请码;非空时必须解析到有效邀请人。
CompleteOnboardingData:
allOf:
- $ref: "#/definitions/UserProfileData"
- type: object
properties:
invite:
type: object
properties:
bound:
type: boolean
invite_code:
type: string
inviter_user_id:
type: string
description: 64 位用户 ID 使用字符串返回,未绑定时为空。
token:
$ref: "#/definitions/AuthTokenData"
description: 注册完成后替换旧 access tokenrefresh_token 为空或不返回。
UpdateUserProfileRequest:
type: object
properties:
username:
type: string
avatar:
type: string
birth:
type: string
description: yyyy-mm-dd传空字符串表示清空生日。
UpdateUserProfileBackgroundRequest:
type: object
required:
- url
properties:
url:
type: string
description: App 已上传好的个人主页背景图 URL。
UpdateUserProfileBackgroundData:
type: object
properties:
profile_bg_img:
type: string
profile:
$ref: "#/definitions/UserProfileData"
UpdateUserProfileBackgroundEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UpdateUserProfileBackgroundData"
ChangeUserCountryRequest:
type: object
properties:
country:
type: string
maxLength: 3
pattern: "^[A-Za-z]{2,3}$"
description: 国家主数据 country_code服务端会转大写并要求 `enabled=true`。
ChangeDisplayUserIDRequest:
type: object
properties:
new_display_user_id:
type: string
reason:
type: string
ApplyPrettyDisplayUserIDRequest:
type: object
properties:
pretty_display_user_id:
type: string
lease_duration_ms:
type: integer
format: int64
payment_receipt_id:
type: string
ResourceData:
type: object
properties:
resource_id:
type: integer
format: int64
resource_code:
type: string
resource_type:
type: string
enum: [avatar_frame, profile_card, coin, vehicle, chat_bubble, badge, floating_screen, gift, mic_seat_icon, mic_seat_animation, room_border, room_name_style, emoji_pack, vip_trial_card]
name:
type: string
status:
type: string
grantable:
type: boolean
grant_strategy:
type: string
wallet_asset_type:
type: string
wallet_asset_amount:
type: integer
format: int64
price_type:
type: string
coin_price:
type: integer
format: int64
gift_point_amount:
type: integer
format: int64
usage_scopes:
type: array
items:
type: string
asset_url:
type: string
preview_url:
type: string
animation_url:
type: string
format:
type: string
description: 可选的客户端渲染格式。由 metadata_json.format 读取,缺省时兼容读取 metadata_json.animation_format并统一转为小写两个字段都没有时省略。mic_seat_animation 与 room_border 后台创建值限于 png/jpeg/webp/gif/svga/pag/mp4其他资源类型可以返回自身样式标识。客户端不得根据 asset_url、preview_url 或 animation_url 的 URL 后缀推断格式。
metadata_json:
type: string
sort_order:
type: integer
format: int32
created_at_ms:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
AppearanceResourceData:
type: object
description: >-
wallet 当前佩戴资源的客户端展示快照单资源槽位没有佩戴时返回空对象。format 只来自 metadata_json
的显式 format/animation_format字段缺省时客户端不得从任一 URL 后缀推断。
properties:
resource_id:
type: integer
format: int64
resource_code:
type: string
resource_type:
type: string
enum: [avatar_frame, profile_card, vehicle, badge, mic_seat_animation]
name:
type: string
asset_url:
type: string
preview_url:
type: string
animation_url:
type: string
format:
type: string
description: mic_seat_animation 当前只允许 png/jpeg/webp/gif/svga/pag/mp4其它外观类型保留自身显式格式值。
metadata_json:
type: string
entitlement_id:
type: string
expires_at_ms:
type: integer
format: int64
badge_form:
type: string
badge_kind:
type: string
level_track:
type: string
AppearanceData:
type: object
required:
- user_id
- avatar_frame
- profile_card
- vehicle
- mic_seat_animation
- level
- level_badges
- equipped_badges
- badges
- badge_profile
- resources
- server_time_ms
properties:
user_id:
type: string
avatar_frame:
$ref: "#/definitions/AppearanceResourceData"
profile_card:
$ref: "#/definitions/AppearanceResourceData"
vehicle:
$ref: "#/definitions/AppearanceResourceData"
mic_seat_animation:
$ref: "#/definitions/AppearanceResourceData"
level:
type: object
level_badges:
type: object
equipped_badges:
type: array
items:
$ref: "#/definitions/AppearanceResourceData"
badges:
type: array
items:
type: object
badge_profile:
type: object
resources:
type: array
items:
$ref: "#/definitions/AppearanceResourceData"
server_time_ms:
type: integer
format: int64
AppearanceEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
required:
- data
properties:
data:
$ref: "#/definitions/AppearanceData"
ResourceListData:
type: object
properties:
items:
type: array
items:
$ref: "#/definitions/ResourceData"
total:
type: integer
format: int64
page:
type: integer
format: int32
page_size:
type: integer
format: int32
ManagerGrantResourceData:
type: object
properties:
resource_id:
type: string
description: 资源 ID按字符串返回避免 64 位整数在客户端丢精度。
resource_type:
type: string
enum: [avatar_frame, profile_card, coin, vehicle, chat_bubble, badge, floating_screen, gift, mic_seat_icon, mic_seat_animation, room_border, room_name_style, emoji_pack, vip_trial_card]
name:
type: string
asset_url:
type: string
preview_url:
type: string
wallet_asset_type:
type: string
wallet_asset_amount:
type: integer
format: int64
sort_order:
type: integer
format: int32
ManagerGrantResourceListData:
type: object
properties:
items:
type: array
items:
$ref: "#/definitions/ManagerGrantResourceData"
total:
type: integer
format: int64
page:
type: integer
format: int32
page_size:
type: integer
format: int32
BusinessUserLookupItem:
type: object
properties:
user_id:
type: string
description: 用户 ID按字符串返回避免 64 位整数在客户端丢精度。
display_user_id:
type: string
username:
type: string
avatar:
type: string
status:
type: string
enum: [active, disabled, banned, unspecified]
region_id:
type: integer
format: int64
region_code:
type: string
region_name:
type: string
BusinessUserLookupData:
type: object
properties:
items:
type: array
items:
$ref: "#/definitions/BusinessUserLookupItem"
total:
type: integer
format: int32
page_size:
type: integer
format: int32
ManagerResourceGrantRequest:
type: object
required:
- command_id
- target_user_id
- resource_id
properties:
command_id:
type: string
description: 客户端按用户动作生成的幂等命令 ID同一动作重试必须复用。
target_user_id:
type: string
description: 目标用户 IDgateway 会校验用户存在且 active。
resource_id:
type: string
description: 资源 IDwallet-service 会在事务内复验 `manager_grant_enabled`。
duration_ms:
type: integer
format: int64
enum: [604800000, 2592000000, 7776000000]
default: 604800000
description: 资源有效期,仅允许 7/30/90 天;未传时 gateway 默认 7 天。
reason:
type: string
default: manager_center
description: 不接受 `quantity`、`wallet_asset_amount` 等客户端计算字段。
ManagerResourceGrantData:
type: object
properties:
grant_id:
type: string
command_id:
type: string
target_user_id:
type: string
resource_id:
type: string
status:
type: string
grant_source:
type: string
enum: [manager_center]
operator_user_id:
type: string
created_at_ms:
type: integer
format: int64
ResourceGroupItemData:
type: object
properties:
group_item_id:
type: integer
format: int64
item_type:
type: string
enum: [resource, wallet_asset]
resource_id:
type: integer
format: int64
resource:
$ref: "#/definitions/ResourceData"
wallet_asset_type:
type: string
enum: [COIN, DIAMOND]
wallet_asset_amount:
type: integer
format: int64
quantity:
type: integer
format: int64
duration_ms:
type: integer
format: int64
sort_order:
type: integer
format: int32
ResourceGroupData:
type: object
properties:
group_id:
type: integer
format: int64
group_code:
type: string
name:
type: string
status:
type: string
description:
type: string
sort_order:
type: integer
format: int32
items:
type: array
items:
$ref: "#/definitions/ResourceGroupItemData"
GiftConfigData:
type: object
properties:
gift_id:
type: string
resource_id:
type: integer
format: int64
resource:
$ref: "#/definitions/ResourceData"
status:
type: string
name:
type: string
presentation_json:
type: string
price_version:
type: string
gift_type_code:
type: string
enum:
- normal
- cp
- lucky
- super_lucky
- exclusive
- noble
- flag
- activity
- magic
- custom
charge_asset_type:
type: string
enum:
- COIN
- DIAMOND
coin_price:
type: integer
format: int64
gift_point_amount:
type: integer
format: int64
heat_value:
type: integer
format: int64
effective_from_ms:
type: integer
format: int64
description: 0 表示不限制开始时间。
effective_to_ms:
type: integer
format: int64
description: 0 表示不限制结束时间。
effect_types:
type: array
items:
type: string
enum:
- animation
- music
- global_broadcast
region_ids:
type: array
items:
type: integer
format: int64
GiftListData:
type: object
properties:
items:
type: array
items:
$ref: "#/definitions/GiftConfigData"
total:
type: integer
format: int64
page:
type: integer
format: int32
page_size:
type: integer
format: int32
GiftTabData:
type: object
properties:
key:
type: string
description: Tab 稳定 key等同于礼物类型编码。
gift_type_code:
type: string
description: 礼物类型编码,用于和 gifts[].gift_type_code 对齐。
name:
type: string
description: 后台配置的中文显示名。
label:
type: string
description: App Tab 展示名,来源于后台 tab_key。
tab_key:
type: string
description: 后台配置的 Tab Name。
status:
type: string
order:
type: integer
format: int32
description: App 排序值,等同于 sort_order。
sort_order:
type: integer
format: int32
created_at_ms:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
GiftTabListData:
type: object
properties:
items:
type: array
items:
$ref: "#/definitions/GiftTabData"
total:
type: integer
format: int32
UserResourceData:
type: object
properties:
entitlement_id:
type: string
resource_id:
type: integer
format: int64
resource:
$ref: "#/definitions/ResourceData"
status:
type: string
quantity:
type: integer
format: int64
remaining_quantity:
type: integer
format: int64
effective_at_ms:
type: integer
format: int64
expires_at_ms:
type: integer
format: int64
source_grant_id:
type: string
created_at_ms:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
equipped:
type: boolean
description: 当前权益是否是该资源类型的已佩戴项。
UserResourceListData:
type: object
properties:
items:
type: array
items:
$ref: "#/definitions/UserResourceData"
total:
type: integer
format: int32
EquipUserResourceRequest:
type: object
required:
- command_id
properties:
entitlement_id:
type: string
description: 可选;不传时服务端自动选择当前用户该资源最新有效权益。
command_id:
type: string
maxLength: 128
description: Fami 必填的业务幂等键同一佩戴动作重试必须复用。Lalu 旧客户端未传时仅保留单请求兼容,不承诺跨请求重放。
RechargeProductData:
type: object
properties:
product_id:
type: integer
format: int64
product_code:
type: string
product_name:
type: string
description:
type: string
platform:
type: string
enum: [android, ios]
channel:
type: string
enum: [google, apple]
currency_code:
type: string
example: USDT
coin_amount:
type: integer
format: int64
amount_minor:
type: integer
format: int64
amount_micro:
type: integer
format: int64
description: USDT 微单位金额1 USDT = 1000000。
policy_version:
type: string
region_ids:
type: array
items:
type: integer
format: int64
resource_asset_type:
type: string
example: COIN
status:
type: string
enum: [active, disabled]
enabled:
type: boolean
sort_order:
type: integer
format: int32
RechargeProductListData:
type: object
properties:
channels:
type: array
description: 当前结果涉及的充值渠道,例如 google、apple。
items:
type: string
products:
type: array
items:
$ref: "#/definitions/RechargeProductData"
GooglePaymentConfirmRequest:
type: object
required:
- command_id
- product_id
- package_name
- purchase_token
properties:
command_id:
type: string
description: 客户端确认支付幂等键;同一 purchase token 重试建议复用。
product_id:
type: integer
format: int64
description: 后端充值商品 ID。
product_code:
type: string
description: 后端返回的 Google productId必须与 Play Console 商品 ID 一致。
package_name:
type: string
description: Android 包名。
purchase_token:
type: string
description: Google Play Billing 返回的 serverVerificationData服务端只保存 SHA256。
order_id:
type: string
description: Google orderId客户端拿不到时可不传。
purchase_time_ms:
type: integer
format: int64
description: 客户端购买时间UTC epoch ms仅用于排障。
GooglePaymentConfirmData:
type: object
properties:
payment_order_id:
type: string
transaction_id:
type: string
status:
type: string
enum: [credited]
product_id:
type: integer
format: int64
product_code:
type: string
coin_amount:
type: integer
format: int64
balance:
type: object
properties:
asset_type:
type: string
example: COIN
available_amount:
type: integer
format: int64
frozen_amount:
type: integer
format: int64
version:
type: integer
format: int64
idempotent_replay:
type: boolean
consume_state:
type: string
enum: [consume_pending, consumed]
CoinSellerTransferRequest:
type: object
required:
- command_id
- amount
- reason
description: "`target_user_id` 和 `target_display_user_id` 至少传一个;两者都是玩家短 ID/展示号,不是 user-service 内部长 ID。"
properties:
command_id:
type: string
description: 钱包命令幂等键;客户端按用户转账动作生成,同一动作重试必须复用。
target_user_id:
type: integer
format: int64
description: 目标玩家短 ID/展示号gateway 会先解析成内部 user_id 再调用 wallet-service。
target_display_user_id:
type: string
description: 目标玩家短 ID/展示号;推荐新客户端使用该字段。
amount:
type: integer
format: int64
minimum: 1
description: 转给玩家的普通金币数量。
reason:
type: string
description: 转账原因或线下凭证摘要。
CoinSellerTransferResponse:
type: object
properties:
transaction_id:
type: string
seller_balance_after:
type: integer
format: int64
description: 币商 `COIN_SELLER_COIN` 账后余额。
target_balance_after:
type: integer
format: int64
description: 目标玩家 `COIN` 账后余额。
amount:
type: integer
format: int64
recharge_usd_minor:
type: integer
format: int64
description: 本次转账按区域充值政策折算的美元最小单位金额100 表示 1 美元。
recharge_currency_code:
type: string
example: USD
recharge_policy_id:
type: integer
format: int64
recharge_policy_version:
type: string
recharge_policy_coin_amount:
type: integer
format: int64
description: 政策快照里的金币数量,例如 80000。
recharge_policy_usd_minor_amount:
type: integer
format: int64
description: 政策快照里的美元最小单位数量,例如 100。
CreateRoomRequest:
type: object
required:
- command_id
- mode
- room_name
properties:
command_id:
type: string
description: 房间创建命令幂等键;客户端按创建房间动作生成,同一动作的 HTTP 重试必须复用。
seat_count:
type: integer
format: int32
minimum: 0
description: 麦位数量,可省略;不传或传 0 时使用后台房间配置默认值,正数必须命中后台启用座位数。
mode:
type: string
minLength: 1
description: 房间模式,不能为空;当前服务只保存并透出该值,不在 gateway 做枚举分发。
room_name:
type: string
minLength: 1
maxLength: 128
description: 房间展示名称必填room-service 写入 `room_ext.title` 并投影到房间列表。
room_avatar:
type: string
maxLength: 512
description: 房间头像,可选;为空时 room-service 写入默认系统头像 `hyapp://room/default-avatar`。
room_description:
type: string
maxLength: 512
description: 房间简介,可选;只写入 `room_ext.description`,不进入房间高频核心字段。
UpdateRoomProfileRequest:
type: object
required:
- room_id
- command_id
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
room_name:
type: string
minLength: 1
maxLength: 128
description: 可选;传入时更新房间标题。
room_avatar:
type: string
maxLength: 512
description: 可选;传空字符串时 room-service 恢复系统默认头像。
room_description:
type: string
maxLength: 512
description: 可选;允许传空字符串清空简介。
seat_count:
type: integer
format: int32
enum:
- 10
- 15
- 20
- 25
- 30
description: 可选;必须是后台已启用座位数。缩容时高编号麦位必须空闲且未锁。
JoinRoomRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
role:
type: string
enum:
- audience
description: 首版固定 audience上麦成功后客户端再切换发布角色。
password:
type: string
maxLength: 64
description: 锁房时必填;只用于本次 JoinRoom 校验,服务端不保存明文。
RoomHeartbeatRequest:
type: object
required:
- room_id
properties:
room_id:
type: string
command_id:
type: string
description: 心跳命令幂等键客户端按单次心跳动作生成HTTP 重试同一次心跳必须复用。
LeaveRoomRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
MicUpRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
seat_no:
type: integer
format: int32
MicDownRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
target_user_id:
type: integer
format: int64
reason:
type: string
description: 主动下麦可为空;系统自动下麦会使用 publish_timeout 等稳定原因。
ChangeMicSeatRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
target_user_id:
type: integer
format: int64
seat_no:
type: integer
format: int32
ConfirmMicPublishingRequest:
type: object
required:
- room_id
- mic_session_id
- room_version
- event_time_ms
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键客户端按单次确认事件生成HTTP 重试同一确认事件必须复用。
target_user_id:
type: integer
format: int64
description: 为空时默认确认当前登录用户RTC webhook 编排可显式传目标用户。
mic_session_id:
type: string
room_version:
type: integer
format: int64
event_time_ms:
type: integer
format: int64
source:
type: string
description: 例如 client 或 rtc_webhook。
SetMicSeatLockRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
seat_no:
type: integer
format: int32
locked:
type: boolean
SetChatEnabledRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
enabled:
type: boolean
SetRoomPasswordRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
locked:
type: boolean
password:
type: string
description: "`locked=true` 时必填;`locked=false` 时忽略。"
SetRoomAdminRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
target_user_id:
type: integer
format: int64
enabled:
type: boolean
MuteUserRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
target_user_id:
type: integer
format: int64
muted:
type: boolean
KickUserRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
target_user_id:
type: integer
format: int64
duration_ms:
type: integer
format: int64
description: 0 表示永久禁止进房;大于 0 表示从服务端当前 UTC 时间起禁止进房的毫秒时长。
UnbanUserRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
target_user_id:
type: integer
format: int64
SendGiftRequest:
type: object
properties:
room_id:
type: string
command_id:
type: string
description: 房间命令幂等键;客户端按用户动作生成,同一动作的 HTTP 重试必须复用。
target_user_id:
type: integer
format: int64
gift_id:
type: string
gift_count:
type: integer
format: int32
CommandResult:
type: object
properties:
applied:
type: boolean
room_version:
type: integer
format: int64
server_time_ms:
type: integer
format: int64
RoomUser:
type: object
properties:
user_id:
type: integer
format: int64
role:
type: string
joined_at_ms:
type: integer
format: int64
last_seen_at_ms:
type: integer
format: int64
SeatState:
type: object
properties:
seat_no:
type: integer
format: int32
user_id:
type: integer
format: int64
locked:
type: boolean
publish_state:
type: string
enum:
- pending_publish
- publishing
- idle
description: pending_publish 表示业务占麦成功但 RTC 尚未确认发流publishing 表示已确认发布音频。
mic_session_id:
type: string
publish_deadline_ms:
type: integer
format: int64
mic_session_room_version:
type: integer
format: int64
last_publish_event_time_ms:
type: integer
format: int64
RankItem:
type: object
properties:
user_id:
type: integer
format: int64
score:
type: integer
format: int64
gift_value:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
RoomSnapshot:
type: object
properties:
room_id:
type: string
description: App 作用域房间长 ID格式为 `<app_code>_<uuid>`。
room_short_id:
type: string
description: 房间短 ID首版等于创建者当前 `display_user_id`。
owner_user_id:
type: integer
format: int64
mode:
type: string
status:
type: string
chat_enabled:
type: boolean
locked:
type: boolean
mic_seats:
type: array
items:
$ref: "#/definitions/SeatState"
online_users:
type: array
items:
$ref: "#/definitions/RoomUser"
admin_user_ids:
type: array
items:
type: integer
format: int64
ban_user_ids:
type: array
items:
type: integer
format: int64
ban_states:
type: array
description: 房间 ban 的时间边界expires_at_ms 为 0 表示永久。
items:
$ref: "#/definitions/RoomBanState"
mute_user_ids:
type: array
items:
type: integer
format: int64
gift_rank:
type: array
items:
$ref: "#/definitions/RankItem"
room_ext:
type: object
description: 扩展字段集合;创建房间展示资料固定使用 `title`、`cover_url`、`description`。
additionalProperties:
type: string
heat:
type: integer
format: int64
version:
type: integer
format: int64
online_count:
type: integer
format: int32
room_border:
$ref: "#/definitions/RoomDecorationData"
room_name_style:
$ref: "#/definitions/RoomDecorationData"
active_background:
$ref: "#/definitions/RoomBackgroundData"
RoomBanState:
type: object
properties:
user_id:
type: integer
format: int64
actor_user_id:
type: integer
format: int64
created_at_ms:
type: integer
format: int64
expires_at_ms:
type: integer
format: int64
description: 0 表示永久;非 0 表示该 UTC 毫秒后可重新进房。
RoomBannedUserData:
type: object
properties:
user_id:
type: string
display_user_id:
type: string
username:
type: string
avatar:
type: string
country:
type: string
country_name:
type: string
country_display_name:
type: string
country_flag:
type: string
actor_user_id:
type: string
created_at_ms:
type: integer
format: int64
unban_at_ms:
type: integer
format: int64
description: 0 表示永久,需要手动解除;非 0 表示自动解封 UTC 毫秒。
remaining_ms:
type: integer
format: int64
permanent:
type: boolean
RoomBannedUsersData:
type: object
properties:
room_id:
type: string
items:
type: array
items:
$ref: "#/definitions/RoomBannedUserData"
total:
type: integer
format: int64
page:
type: integer
format: int32
page_size:
type: integer
format: int32
server_time_ms:
type: integer
format: int64
RoomListItemData:
type: object
required:
- room_id
- im_group_id
properties:
room_id:
type: string
im_group_id:
type: string
description: 腾讯 IM 房间群 ID。当前等于 `room_id`,只代表目标群,不代表入群授权。
owner_user_id:
type: string
title:
type: string
cover_url:
type: string
mode:
type: string
status:
type: string
locked:
type: boolean
description: true 表示该房间需要入房密码;列表和搜索只返回标识,不返回密码。
heat:
type: integer
format: int64
online_count:
type: integer
format: int32
seat_count:
type: integer
format: int32
occupied_seat_count:
type: integer
format: int32
visible_region_id:
type: integer
format: int64
app_code:
type: string
room_short_id:
type: string
country_code:
type: string
description: 房主国家投影的大写国家码,首页国家筛选和卡片展示均以该字段为准。
country_flag:
type: string
description: 根据 `country_code` 派生的国旗 emoji无有效国家投影时省略。
RoomListData:
type: object
properties:
rooms:
type: array
items:
$ref: "#/definitions/RoomListItemData"
next_cursor:
type: string
countries:
type: array
description: 兼容旧客户端的当前用户区域国家列表;完整跨区域目录请使用 `/api/v1/rooms/filters`。
items:
$ref: "#/definitions/RoomListCountryData"
RoomListCountryData:
type: object
required:
- country_code
properties:
country_id:
type: integer
format: int64
country_code:
type: string
country_name:
type: string
country_display_name:
type: string
country_flag:
type: string
sort_order:
type: integer
format: int32
RoomFilterAllData:
type: object
required:
- filter_type
- query_key
- query_value
properties:
filter_type:
type: string
enum: [all]
query_key:
type: string
description: 固定为空字符串;客户端不附加筛选参数。
query_value:
type: string
description: 固定为空字符串。
RoomFilterRegionData:
type: object
required:
- filter_type
- query_key
- query_value
- region_id
- region_code
- region_name
- sort_order
properties:
filter_type:
type: string
enum: [region]
query_key:
type: string
enum: [region_id]
query_value:
type: string
description: region_id 的十进制字符串,可原样回传。
region_id:
type: integer
format: int64
region_code:
type: string
region_name:
type: string
sort_order:
type: integer
format: int32
RoomFilterCountryData:
type: object
required:
- filter_type
- query_key
- query_value
- parent_region_id
- country_id
- country_code
- country_name
- country_display_name
- country_flag
- sort_order
properties:
filter_type:
type: string
enum: [country]
query_key:
type: string
enum: [country_code]
query_value:
type: string
description: 规范化后的大写 country_code可原样回传。
parent_region_id:
type: integer
format: int64
description: 仅用于客户端把国家分组到区域;筛选国家时不要同时传 region_id。
country_id:
type: integer
format: int64
country_code:
type: string
country_name:
type: string
country_display_name:
type: string
country_flag:
type: string
sort_order:
type: integer
format: int32
RoomFilterCatalogData:
type: object
required:
- all
- regions
- countries
properties:
all:
$ref: "#/definitions/RoomFilterAllData"
regions:
type: array
items:
$ref: "#/definitions/RoomFilterRegionData"
countries:
type: array
items:
$ref: "#/definitions/RoomFilterCountryData"
MyRoomData:
type: object
required:
- has_room
- server_time_ms
properties:
has_room:
type: boolean
room:
$ref: "#/definitions/RoomListItemData"
server_time_ms:
type: integer
format: int64
RoomInitialData:
type: object
required:
- room_id
- im_group_id
- chat_enabled
- online_count
- seat_count
- version
properties:
room_id:
type: string
im_group_id:
type: string
room_short_id:
type: string
title:
type: string
cover_url:
type: string
background_url:
type: string
description:
type: string
owner_user_id:
type: string
mode:
type: string
status:
type: string
chat_enabled:
type: boolean
locked:
type: boolean
description: true 表示该房间需要入房密码。
heat:
type: integer
format: int64
online_count:
type: integer
format: int32
seat_count:
type: integer
format: int32
occupied_seat_count:
type: integer
format: int32
visible_region_id:
type: integer
format: int64
version:
type: integer
format: int64
active_background:
$ref: "#/definitions/RoomBackgroundData"
room_border:
$ref: "#/definitions/RoomDecorationData"
room_name_style:
$ref: "#/definitions/RoomDecorationData"
RoomViewerData:
type: object
properties:
user_id:
type: string
role:
type: string
joined_at_ms:
type: integer
format: int64
last_seen_at_ms:
type: integer
format: int64
RoomSeatData:
type: object
properties:
seat_no:
type: integer
format: int32
user_id:
type: string
locked:
type: boolean
publish_state:
type: string
mic_session_id:
type: string
publish_deadline_ms:
type: integer
format: int64
mic_muted:
type: boolean
seat_status:
type: string
mic_heartbeat_at_ms:
type: integer
format: int64
gift_value:
type: integer
format: int64
RoomRankItemData:
type: object
properties:
user_id:
type: string
score:
type: integer
format: int64
gift_value:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
RoomContributionRankItemData:
type: object
properties:
rank:
type: integer
format: int64
user_id:
type: string
score:
type: integer
format: int64
gift_value:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
profile:
$ref: "#/definitions/RoomUserProfileData"
RoomUserProfileData:
type: object
properties:
user_id:
type: string
display_user_id:
type: string
pretty_id:
type: string
pretty_display_user_id:
type: string
username:
type: string
avatar:
type: string
gender:
type: string
age:
type: integer
format: int32
country:
type: string
country_name:
type: string
country_display_name:
type: string
country_flag:
type: string
vip:
type: object
level:
type: object
level_badges:
type: object
badges:
type: array
items:
type: object
avatar_frame:
$ref: "#/definitions/AppearanceResourceData"
profile_card:
$ref: "#/definitions/AppearanceResourceData"
vehicle:
$ref: "#/definitions/AppearanceResourceData"
mic_seat_animation:
$ref: "#/definitions/AppearanceResourceData"
description: 当前麦位动效佩戴快照空对象表示未佩戴format 缺省表示后台没有配置受支持 renderer。
charm:
type: integer
format: int64
RoomIMData:
type: object
properties:
group_id:
type: string
need_join_group:
type: boolean
RoomRTCData:
type: object
required:
- need_token
- available
properties:
need_token:
type: boolean
available:
type: boolean
token:
$ref: "#/definitions/TencentRTCTokenData"
reason:
type: string
enum:
- rtc_token_unavailable
CurrentRoomData:
type: object
required:
- has_current_room
- room_id
- room_version
- role
- mic_session_id
- publish_state
- need_join_im_group
- need_rtc_token
- server_time_ms
properties:
has_current_room:
type: boolean
room_id:
type: string
room_version:
type: integer
format: int64
role:
type: string
enum:
- owner
- host
- admin
- audience
mic_session_id:
type: string
publish_state:
type: string
enum:
- ""
- pending_publish
- publishing
need_join_im_group:
type: boolean
need_rtc_token:
type: boolean
server_time_ms:
type: integer
format: int64
RoomSnapshotData:
type: object
required:
- room
- server_time_ms
properties:
room:
$ref: "#/definitions/RoomSnapshot"
is_followed:
type: boolean
description: 当前 token 用户是否已关注该房间;来自 room-service 房间关注关系,不属于 Room Cell 核心状态。
server_time_ms:
type: integer
format: int64
RoomPermissionsData:
type: object
properties:
is_owner:
type: boolean
is_admin:
type: boolean
is_muted:
type: boolean
can_speak:
type: boolean
can_send_gift:
type: boolean
can_mic_up:
type: boolean
can_manage_room:
type: boolean
can_leave_room:
type: boolean
can_close_room:
type: boolean
can_mute_mic:
type: boolean
can_open_gift_box:
type: boolean
RoomDetailData:
type: object
required:
- room
- viewer
- is_followed
- seats
- rank_top
- online_count
- permissions
- im
- rtc
- server_time_ms
properties:
room:
$ref: "#/definitions/RoomInitialData"
viewer:
$ref: "#/definitions/RoomViewerData"
is_followed:
type: boolean
seats:
type: array
items:
$ref: "#/definitions/RoomSeatData"
rank_top:
type: array
items:
$ref: "#/definitions/RoomRankItemData"
online_count:
type: integer
format: int32
permissions:
$ref: "#/definitions/RoomPermissionsData"
profiles:
type: array
items:
$ref: "#/definitions/RoomUserProfileData"
im:
$ref: "#/definitions/RoomIMData"
rtc:
$ref: "#/definitions/RoomRTCData"
server_time_ms:
type: integer
format: int64
RoomContributionRankData:
type: object
required:
- room_id
- period
- start_at_ms
- end_at_ms
- total
- contribution_rank
- profiles
- server_time_ms
properties:
room_id:
type: string
period:
type: string
enum:
- day
- week
- month
start_at_ms:
type: integer
format: int64
description: 周期开始 UTC epoch ms包含。
end_at_ms:
type: integer
format: int64
description: 周期结束 UTC epoch ms不包含。
total:
type: integer
format: int64
contribution_rank:
type: array
items:
$ref: "#/definitions/RoomContributionRankItemData"
profiles:
type: array
items:
$ref: "#/definitions/RoomUserProfileData"
server_time_ms:
type: integer
format: int64
RoomFollowData:
type: object
required:
- room_id
- is_followed
- server_time_ms
properties:
room_id:
type: string
is_followed:
type: boolean
followed_at_ms:
type: integer
format: int64
description: POST 关注成功时返回DELETE 取消关注时省略。
server_time_ms:
type: integer
format: int64
CreateRoomResponse:
type: object
required:
- result
- room
- seats
- im
- server_time_ms
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomInitialData"
seats:
type: array
items:
$ref: "#/definitions/RoomSeatData"
im:
$ref: "#/definitions/RoomIMData"
server_time_ms:
type: integer
format: int64
JoinRoomResponse:
type: object
required:
- result
- room
- viewer
- seats
- contribution_rank
- profiles
- im
- rtc
- server_time_ms
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomInitialData"
viewer:
$ref: "#/definitions/RoomViewerData"
seats:
type: array
items:
$ref: "#/definitions/RoomSeatData"
contribution_rank:
type: array
description: 首屏贡献榜,当前最多返回前 10 名;完整榜单后续走分页接口。
items:
$ref: "#/definitions/RoomRankItemData"
profiles:
type: array
description: 只包含房主、当前用户、麦位用户和首屏贡献榜用户的展示资料。
items:
$ref: "#/definitions/RoomUserProfileData"
im:
$ref: "#/definitions/RoomIMData"
rtc:
$ref: "#/definitions/RoomRTCData"
server_time_ms:
type: integer
format: int64
UpdateRoomProfileResponse:
type: object
required:
- result
- room
- seats
- server_time_ms
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomInitialData"
seats:
type: array
items:
$ref: "#/definitions/RoomSeatData"
server_time_ms:
type: integer
format: int64
RoomHeartbeatResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
user:
$ref: "#/definitions/RoomUser"
room:
$ref: "#/definitions/RoomSnapshot"
LeaveRoomResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomSnapshot"
MicUpResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
seat_no:
type: integer
format: int32
room:
$ref: "#/definitions/RoomSnapshot"
mic_session_id:
type: string
publish_deadline_ms:
type: integer
format: int64
MicDownResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
seat_no:
type: integer
format: int32
room:
$ref: "#/definitions/RoomSnapshot"
ChangeMicSeatResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomSnapshot"
ConfirmMicPublishingResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
seat_no:
type: integer
format: int32
room:
$ref: "#/definitions/RoomSnapshot"
SetMicSeatLockResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomSnapshot"
SetChatEnabledResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomSnapshot"
SetRoomAdminResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomSnapshot"
MuteUserResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomSnapshot"
KickUserResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomSnapshot"
rtc_kicked:
type: boolean
description: room-service 是否已通过 TRTC 服务端接口移除目标用户;失败不回滚踢人事实。
rtc_kick_error:
type: string
description: TRTC 服务端踢人失败原因,仅用于排障和告警。
UnbanUserResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomSnapshot"
SendGiftResponse:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
billing_receipt_id:
type: string
room_heat:
type: integer
format: int64
gift_rank:
type: array
items:
$ref: "#/definitions/RankItem"
room:
$ref: "#/definitions/RoomSnapshot"
AuthTokenEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/AuthTokenData"
PasswordSetEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/PasswordSetData"
LogoutEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/LogoutData"
TencentIMUserSigEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/TencentIMUserSigData"
TencentRTCTokenEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/TencentRTCTokenData"
UploadFileEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UploadFileData"
BindPushTokenEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/BindPushTokenData"
DeletePushTokenEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/DeletePushTokenData"
UserIdentityEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UserIdentityData"
UserHostIdentityEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UserHostIdentityData"
MyOverviewEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MyOverviewData"
MyInviteOverviewEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MyInviteOverviewData"
UserProfileEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UserProfileData"
UserProfilesBatchEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UserProfilesBatchData"
MessageTabsEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MessageTabsData"
MessageListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MessageListData"
MessageReadEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MessageReadData"
MessageReadAllEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MessageReadAllData"
MessageDeleteEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MessageDeleteData"
CompleteOnboardingEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/CompleteOnboardingData"
CountryListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/CountryListData"
AppBootstrapEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/AppBootstrapData"
AppVersionEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/AppVersionData"
H5LinkListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/H5LinkListData"
SplashScreenListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/SplashScreenListData"
PopupListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/PopupListData"
ResourceListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/ResourceListData"
ManagerGrantResourceListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/ManagerGrantResourceListData"
BusinessUserLookupEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/BusinessUserLookupData"
ManagerResourceGrantEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/ManagerResourceGrantData"
ResourceGroupEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/ResourceGroupData"
GiftListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/GiftListData"
GiftTabListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/GiftTabListData"
UserResourceListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UserResourceListData"
UserResourceEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UserResourceData"
CreateRoomEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/CreateRoomResponse"
UpdateRoomProfileEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UpdateRoomProfileResponse"
RoomListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RoomListData"
RoomFilterCatalogEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RoomFilterCatalogData"
MyRoomEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MyRoomData"
CurrentRoomEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/CurrentRoomData"
RoomSnapshotEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RoomSnapshotData"
RoomDetailEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RoomDetailData"
RoomContributionRankEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RoomContributionRankData"
RoomFollowEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RoomFollowData"
JoinRoomEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/JoinRoomResponse"
RoomHeartbeatEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RoomHeartbeatResponse"
LeaveRoomEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/LeaveRoomResponse"
MicUpEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MicUpResponse"
MicDownEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MicDownResponse"
ChangeMicSeatEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/ChangeMicSeatResponse"
ConfirmMicPublishingEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/ConfirmMicPublishingResponse"
SetMicSeatLockEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/SetMicSeatLockResponse"
SetChatEnabledEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/SetChatEnabledResponse"
SetRoomPasswordEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UpdateRoomProfileResponse"
SetRoomAdminEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/SetRoomAdminResponse"
MuteUserEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/MuteUserResponse"
KickUserEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/KickUserResponse"
UnbanUserEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/UnbanUserResponse"
RoomBannedUsersEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RoomBannedUsersData"
SendGiftEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/SendGiftResponse"
RechargeProductListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RechargeProductListData"
GooglePaymentConfirmEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/GooglePaymentConfirmData"
CoinSellerTransferEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/CoinSellerTransferResponse"
ProfileVisitData:
type: object
required:
- recorded
- target_stats_hidden
properties:
recorded:
type: boolean
target_stats_hidden:
type: boolean
description: true 时 target_stats 字段完全省略;该值按目标用户当前 VIP 权益实时判定。
target_stats:
$ref: "#/definitions/MyOverviewProfileStatsData"
target_profile:
$ref: "#/definitions/UserProfileData"
ProfileVisitEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/ProfileVisitData"
ProfileVisitorRecordData:
type: object
required:
- visitor_identity_hidden
- target_user_id
- visit_count
- last_visited_at_ms
properties:
visitor_user_id:
type: string
description: 只在 visitor_identity_hidden=false 时返回。
anonymous_visit_id:
type: string
description: 只在 visitor_identity_hidden=true 时返回;随机且仅在同一目标用户下稳定,不能查询资料。
visitor_identity_hidden:
type: boolean
target_user_id:
type: string
visit_count:
type: integer
format: int64
last_visited_at_ms:
type: integer
format: int64
ProfileVisitorListData:
type: object
required:
- records
- total
properties:
records:
type: array
items:
$ref: "#/definitions/ProfileVisitorRecordData"
total:
type: integer
format: int64
ProfileVisitorListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/ProfileVisitorListData"
VIPStatusData:
type: object
required:
- level
- name
- active
- started_at_ms
- expires_at_ms
properties:
level:
type: integer
format: int32
name:
type: string
active:
type: boolean
started_at_ms:
type: integer
format: int64
expires_at_ms:
type: integer
format: int64
program_type:
type: string
enum: [tiered_privilege_v1, legacy_timed]
config_version:
type: integer
format: int64
VIPProgramConfigData:
type: object
properties:
app_code:
type: string
program_type:
type: string
enum: [tiered_privilege_v1, legacy_timed]
level_count:
type: integer
format: int32
same_level_expiry_policy:
type: string
upgrade_expiry_policy:
type: string
downgrade_purchase_policy:
type: string
benefit_inheritance_policy:
type: string
grant_mode:
type: string
trial_card_enabled:
type: boolean
status:
type: string
config_version:
type: integer
format: int64
updated_by_admin_id:
type: integer
format: int64
created_at_ms:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
VIPBenefitPreviewItemData:
type: object
properties:
preview_id:
type: string
title:
type: string
media_type:
type: string
asset_url:
type: string
preview_url:
type: string
animation_url:
type: string
composition_type:
type: string
sort_order:
type: integer
format: int32
VIPBenefitNumericRewardData:
type: object
properties:
label:
type: string
value:
type: integer
format: int64
unit:
type: string
period:
type: string
VIPBenefitPresentationData:
type: object
required:
- description
- preview_items
- numeric_reward
properties:
description:
type: string
preview_items:
type: array
items:
$ref: "#/definitions/VIPBenefitPreviewItemData"
numeric_reward:
$ref: "#/definitions/VIPBenefitNumericRewardData"
x-nullable: true
description: 非数值奖励权益返回 null。
VIPBenefitData:
type: object
required:
- benefit_code
- name
- benefit_type
- unlock_level
- status
- trial_enabled
- resource_id
- resource_type
- execution_scope
- auto_equip
- sort_order
- metadata_json
- presentation
properties:
benefit_code:
type: string
name:
type: string
benefit_type:
type: string
unlock_level:
type: integer
format: int32
status:
type: string
trial_enabled:
type: boolean
resource_id:
type: integer
format: int64
resource_type:
type: string
execution_scope:
type: string
auto_equip:
type: boolean
sort_order:
type: integer
format: int32
metadata_json:
type: string
created_at_ms:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
presentation:
$ref: "#/definitions/VIPBenefitPresentationData"
x-nullable: true
description: metadata_json 没有结构化 presentation 时固定返回 null。
resource:
$ref: "#/definitions/ResourceData"
description: 仅在 wallet 已确认资源真实、同 App、active 且类型匹配时返回;否则字段省略。真实资源缺失时 benefit 必须保持 disabled 且 resource_id=0后台应先建 resource 再绑定。
VIPRewardItemData:
type: object
properties:
resource_id:
type: integer
format: int64
resource_code:
type: string
resource_type:
type: string
name:
type: string
quantity:
type: integer
format: int64
expires_at_ms:
type: integer
format: int64
cover_url:
type: string
asset_url:
type: string
preview_url:
type: string
animation_url:
type: string
VIPPackageData:
type: object
properties:
level:
type: integer
format: int32
name:
type: string
status:
type: string
price_coin:
type: integer
format: int64
duration_ms:
type: integer
format: int64
reward_resource_group_id:
type: integer
format: int64
reward_items:
type: array
items:
$ref: "#/definitions/VIPRewardItemData"
can_purchase:
type: boolean
sort_order:
type: integer
format: int32
recharge_gate_required:
type: boolean
required_recharge_coin_amount:
type: integer
format: int64
user_recharge_coin_amount:
type: integer
format: int64
purchase_locked_reason:
type: string
benefits:
type: array
items:
$ref: "#/definitions/VIPBenefitData"
config_version:
type: integer
format: int64
VIPTrialCardData:
type: object
properties:
trial_card_id:
type: string
entitlement_id:
type: string
resource_id:
type: integer
format: int64
user_id:
type: integer
format: int64
level:
type: integer
format: int32
name:
type: string
status:
type: string
equipped:
type: boolean
duration_ms:
type: integer
format: int64
effective_at_ms:
type: integer
format: int64
expires_at_ms:
type: integer
format: int64
remaining_duration_ms:
type: integer
format: int64
grant_source:
type: string
source_grant_id:
type: string
created_at_ms:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
VIPUserSettingsData:
type: object
required:
- app_code
- user_id
- room_entry_notice_enabled
- online_global_notice_enabled
- hide_profile_data_enabled
- anonymous_profile_visit_enabled
- leaderboard_invisible_enabled
- updated_at_ms
properties:
app_code:
type: string
user_id:
type: integer
format: int64
room_entry_notice_enabled:
type: boolean
online_global_notice_enabled:
type: boolean
hide_profile_data_enabled:
type: boolean
anonymous_profile_visit_enabled:
type: boolean
leaderboard_invisible_enabled:
type: boolean
updated_at_ms:
type: integer
format: int64
VIPStateData:
type: object
required:
- paid_vip
- equipped_trial_card
- effective_vip
- effective_source
- effective_benefits
- evaluated_at_ms
- program_config
- user_settings
properties:
paid_vip:
$ref: "#/definitions/VIPStatusData"
equipped_trial_card:
$ref: "#/definitions/VIPTrialCardData"
x-nullable: true
description: 当前没有佩戴体验卡时固定返回 null。
effective_vip:
$ref: "#/definitions/VIPStatusData"
effective_source:
type: string
effective_benefits:
type: array
items:
$ref: "#/definitions/VIPBenefitData"
evaluated_at_ms:
type: integer
format: int64
program_config:
$ref: "#/definitions/VIPProgramConfigData"
user_settings:
$ref: "#/definitions/VIPUserSettingsData"
VIPMeData:
allOf:
- $ref: "#/definitions/VIPStatusData"
- type: object
required:
- program_config
- state
properties:
program_config:
$ref: "#/definitions/VIPProgramConfigData"
state:
$ref: "#/definitions/VIPStateData"
VIPMeEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/VIPMeData"
VIPPackageListData:
type: object
required:
- current_vip
- packages
- program_config
- state
properties:
current_vip:
$ref: "#/definitions/VIPStatusData"
packages:
type: array
items:
$ref: "#/definitions/VIPPackageData"
program_config:
$ref: "#/definitions/VIPProgramConfigData"
state:
$ref: "#/definitions/VIPStateData"
VIPPackageListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/VIPPackageListData"
CommandIDRequest:
type: object
required:
- command_id
properties:
command_id:
type: string
minLength: 1
maxLength: 128
description: 业务幂等键;同一用户动作的超时或 5xx 重试必须复用。
VIPPurchaseRequest:
allOf:
- $ref: "#/definitions/CommandIDRequest"
- type: object
required:
- level
properties:
level:
type: integer
format: int32
minimum: 1
VIPAssetBalanceData:
type: object
properties:
asset_type:
type: string
available_amount:
type: integer
format: int64
frozen_amount:
type: integer
format: int64
version:
type: integer
format: int64
VIPPurchaseData:
type: object
properties:
order_id:
type: string
transaction_id:
type: string
vip:
$ref: "#/definitions/VIPStatusData"
coin_spent:
type: integer
format: int64
coin_balance_after:
type: integer
format: int64
coin_balance:
$ref: "#/definitions/VIPAssetBalanceData"
reward_items:
type: array
items:
$ref: "#/definitions/VIPRewardItemData"
program_config:
$ref: "#/definitions/VIPProgramConfigData"
state:
$ref: "#/definitions/VIPStateData"
VIPPurchaseEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/VIPPurchaseData"
VIPTrialCardMutationData:
type: object
properties:
trial_card:
$ref: "#/definitions/VIPTrialCardData"
unequipped:
type: boolean
program_config:
$ref: "#/definitions/VIPProgramConfigData"
state:
$ref: "#/definitions/VIPStateData"
server_time_ms:
type: integer
format: int64
VIPTrialCardMutationEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/VIPTrialCardMutationData"
VIPSettingsPatchRequest:
type: object
minProperties: 1
properties:
room_entry_notice_enabled:
type: boolean
online_global_notice_enabled:
type: boolean
hide_profile_data_enabled:
type: boolean
anonymous_profile_visit_enabled:
type: boolean
leaderboard_invisible_enabled:
type: boolean
VIPSettingsData:
type: object
required:
- settings
properties:
settings:
$ref: "#/definitions/VIPUserSettingsData"
evaluated_at_ms:
type: integer
format: int64
server_time_ms:
type: integer
format: int64
VIPSettingsEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/VIPSettingsData"
VIPOnlineNoticeData:
type: object
required:
- event_id
- group_id
- status
- created
- evaluated_at_ms
properties:
event_id:
type: string
group_id:
type: string
status:
type: string
enum: [pending]
created:
type: boolean
evaluated_at_ms:
type: integer
format: int64
VIPOnlineNoticeEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/VIPOnlineNoticeData"
VIPBenefitRequiredData:
type: object
required:
- benefit_code
- required_level
- current_effective_level
- action
properties:
benefit_code:
type: string
required_level:
type: integer
format: int32
description: 当前 App 首个显式配置该权益的 active 等级0 表示未配置。
current_effective_level:
type: integer
format: int32
action:
type: string
description: 稳定的被拒绝动作标识;背景链路分别为 upload_room_background、save_room_background、set_room_background。
VIPBenefitRequiredErrorEnvelope:
type: object
required:
- code
- message
- request_id
- data
properties:
code:
type: string
enum: [VIP_BENEFIT_REQUIRED]
message:
type: string
enum: [vip benefit is required]
request_id:
type: string
data:
$ref: "#/definitions/VIPBenefitRequiredData"
RoomMediaData:
type: object
required:
- url
- object_key
- content_type
- format
- size_bytes
- width
- height
- animated
- frame_count
- duration_ms
- sha256
- status
properties:
url:
type: string
description: 专用上传入口返回的 HTTPS 对象地址;提交 save/send 时必须原样回传。
object_key:
type: string
description: 专用上传入口返回的对象 key绑定 App、用户、房间和用途。
content_type:
type: string
enum: [image/jpeg, image/png, image/gif, image/webp]
format:
type: string
enum: [jpeg, png, gif, webp]
size_bytes:
type: integer
format: int64
width:
type: integer
format: int32
height:
type: integer
format: int32
animated:
type: boolean
frame_count:
type: integer
format: int32
duration_ms:
type: integer
format: int64
description: 静态图固定为 0。
poster_url:
type: string
description: 当前上传链路不生成 posterHTTP 空值时省略。
thumbnail_url:
type: string
description: 当前上传链路不生成 thumbnailHTTP 空值时省略。
sha256:
type: string
pattern: "^[0-9a-f]{64}$"
status:
type: string
enum: [active]
RoomMediaUploadData:
type: object
required:
- purpose
- room_id
- command_id
- room_version
- media
- server_time_ms
properties:
purpose:
type: string
enum: [room_background, room_image]
room_id:
type: string
command_id:
type: string
room_version:
type: integer
format: int64
description: 上传授权时观察到的房间版本,不是后续 send/set 的成功版本。
media:
$ref: "#/definitions/RoomMediaData"
server_time_ms:
type: integer
format: int64
RoomMediaUploadEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RoomMediaUploadData"
RoomBackgroundData:
type: object
required:
- background_id
- room_id
- image_url
- created_at_ms
- updated_at_ms
properties:
background_id:
type: integer
format: int64
room_id:
type: string
image_url:
type: string
created_by_user_id:
type: string
created_at_ms:
type: integer
format: int64
updated_at_ms:
type: integer
format: int64
command_id:
type: string
media:
$ref: "#/definitions/RoomMediaData"
SaveRoomBackgroundRequest:
type: object
required:
- room_id
properties:
room_id:
type: string
command_id:
type: string
maxLength: 128
description: Fami 必填与专用上传复用。Lalu image_url-only 兼容请求可省略。
image_url:
type: string
description: Fami 可省略并由 media.url 补齐Lalu 旧协议必填。
media:
$ref: "#/definitions/RoomMediaData"
description: Fami 必填,必须原样使用专用背景上传返回对象。
SaveRoomBackgroundData:
type: object
properties:
background:
$ref: "#/definitions/RoomBackgroundData"
server_time_ms:
type: integer
format: int64
SaveRoomBackgroundEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/SaveRoomBackgroundData"
RoomBackgroundListData:
type: object
required:
- backgrounds
- server_time_ms
properties:
backgrounds:
type: array
items:
$ref: "#/definitions/RoomBackgroundData"
selected_background_url:
type: string
selected_background:
$ref: "#/definitions/RoomBackgroundData"
server_time_ms:
type: integer
format: int64
RoomBackgroundListEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/RoomBackgroundListData"
SetRoomBackgroundRequest:
type: object
required:
- room_id
- command_id
- background_id
properties:
room_id:
type: string
command_id:
type: string
maxLength: 128
background_id:
type: string
pattern: "^[1-9][0-9]*$"
description: 支持 JSON 数字或数字字符串;这里按字符串建模避免 64 位精度丢失。
RoomDecorationData:
type: object
required:
- resource_id
- resource_code
- resource_type
- name
- asset_url
- entitlement_id
properties:
resource_id:
type: integer
format: int64
resource_code:
type: string
resource_type:
type: string
enum: [room_border, room_name_style]
name:
type: string
asset_url:
type: string
preview_url:
type: string
animation_url:
type: string
format:
type: string
metadata_json:
type: string
entitlement_id:
type: string
text_colors:
type: array
maxItems: 8
items:
type: string
pattern: "^#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?$"
stops:
type: array
items:
type: number
format: double
angle_degrees:
type: number
format: double
expires_at_ms:
type: integer
format: int64
SetRoomBackgroundData:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomInitialData"
background:
$ref: "#/definitions/RoomBackgroundData"
server_time_ms:
type: integer
format: int64
SetRoomBackgroundEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/SetRoomBackgroundData"
ApplyRoomDecorationRequest:
type: object
required:
- command_id
- decoration_type
- resource_id
properties:
command_id:
type: string
maxLength: 128
decoration_type:
type: string
enum: [room_border, colored_room_name]
description: colored_room_name 对应资源目录类型 room_name_style。
resource_id:
type: string
pattern: "^[1-9][0-9]*$"
description: 支持 JSON 数字或数字字符串。
entitlement_id:
type: string
description: 可选;建议传背包实例 ID省略时服务端选择一个当前有效实例。
ApplyRoomDecorationData:
type: object
properties:
result:
$ref: "#/definitions/CommandResult"
room:
$ref: "#/definitions/RoomInitialData"
decoration_type:
type: string
enum: [room_border, colored_room_name]
resource:
$ref: "#/definitions/RoomDecorationData"
server_time_ms:
type: integer
format: int64
ApplyRoomDecorationEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/ApplyRoomDecorationData"
SendRoomImageRequest:
type: object
required:
- command_id
- image
properties:
command_id:
type: string
maxLength: 128
description: 与专用图片上传复用;同一动作重试不得更换。
image:
$ref: "#/definitions/RoomMediaData"
description: 必须原样使用专用图片上传返回的 media。
SendRoomImageData:
type: object
required:
- result
- accepted
- message_id
- room_id
- sender_user_id
- server_time_ms
- image
properties:
result:
$ref: "#/definitions/CommandResult"
accepted:
type: boolean
message_id:
type: string
description: 由 app_code、room_id 和 command_id 稳定生成IM 去重优先使用 event_id消息展示去重也可使用 message_id。
room_id:
type: string
sender_user_id:
type: string
server_time_ms:
type: integer
format: int64
image:
$ref: "#/definitions/RoomMediaData"
SendRoomImageEnvelope:
allOf:
- $ref: "#/definitions/GatewayOKEnvelopeBase"
- type: object
properties:
data:
$ref: "#/definitions/SendRoomImageData"