跳到主要内容

回调列表

业务回调接口通过 HTTP POST 接收以下 JSON 正文,并以 HTTP 2xx 确认接收。地址配置、请求头、验签和重试见回调接入。

支持以下 10 类回调。示例中的 ID、名称、地址、时间和错误文案仅用于说明格式。可选字段无值时省略,完整资源信息通过对应查询接口获取。

事件索引​

事件含义示例中的状态
classroom.created课堂创建完成pending
classroom.updated课堂资料更新pending
classroom.started课堂开课live
classroom.ended课堂结束ended
classroom.expired未开课课堂过期expired
classroom.stage_changed成员上下台live
courseware.created课件创建queued
courseware.processing课件开始转码processing
courseware.ready课件转码完成ready
courseware.failed课件转码失败failed

公共结构与课堂字段​

字段类型必填含义
eventIdstring是事件唯一标识;重试不变
typestring是完整事件名称
appIdstring是所属应用
timestampstring是事件产生时间,ISO 8601
dataobject是随事件变化的数据

课堂事件的 data 均包含以下公共字段:

字段类型必填含义
classroomIdstring是课堂 ID
namestring是事件产生时的课堂名称
statusstring是变更后状态:creating、pending、live、ended、expired
teacherEduUserIdstring否已分配老师时的用户 ID

课堂创建完成​

classroom.created

创建流程完成并保存课堂状态后发送。可用于关联业务课程与平台课堂;不表示客户端已进课。

data 附加字段类型必填含义
fromStatusstring是创建流程的前态,当前为 creating。

立即开课会另发 classroom.started;此时本事件的 status 也可以为 live。

{
"eventId": "evt_example_classroom_created",
"type": "classroom.created",
"appId": "app_example",
"timestamp": "2026-10-09T02:00:00.000Z",
"data": {
"classroomId": "cls_example",
"name": "数学课堂",
"status": "pending",
"teacherEduUserId": "eu_teacher",
"fromStatus": "creating"
}
}

课堂资料更新​

classroom.updated

更新课堂名称或配置后发送。可用来触发业务侧刷新课堂详情。

data 附加字段类型必填含义
teacherChangedboolean是本次更新是否变更老师。

通知只携带课堂公共字段和 teacherChanged,不会返回所有变更配置;完整详情通过课堂查询接口获取。

{
"eventId": "evt_example_classroom_updated",
"type": "classroom.updated",
"appId": "app_example",
"timestamp": "2026-10-09T02:00:00.000Z",
"data": {
"classroomId": "cls_example",
"name": "数学课堂",
"status": "pending",
"teacherEduUserId": "eu_teacher",
"teacherChanged": false
}
}

课堂开课​

classroom.started

课堂从未开课状态进入 live 后发送。可用于更新业务课程状态或启动课中流程。

data 附加字段类型必填含义
fromStatusstring是开课前的课堂状态。
sourcestring是开课来源,见下方取值。
startsAt / endsAtstring否计划起止时间,ISO 8601。
actualStartedAtstring否实际开课时间,ISO 8601。
effectiveEndsAtstring否按实际开课、课时和拖堂计算的结束时间,ISO 8601。

source 取值:create_immediate(创建即开课)、manual(手动)、auto_reconcile(状态协调)、auto_job(定时任务)、lazy_refresh(查询时刷新)。时间字段有值时才发送。通知不代表客户端 IM、RTC 和白板均已就绪。

{
"eventId": "evt_example_classroom_started",
"type": "classroom.started",
"appId": "app_example",
"timestamp": "2026-10-09T02:00:00.000Z",
"data": {
"classroomId": "cls_example",
"name": "数学课堂",
"status": "live",
"teacherEduUserId": "eu_teacher",
"fromStatus": "pending",
"source": "manual",
"startsAt": "2026-10-09T02:00:00.000Z",
"endsAt": "2026-10-09T03:00:00.000Z",
"actualStartedAt": "2026-10-09T02:00:00.000Z",
"effectiveEndsAt": "2026-10-09T03:00:00.000Z"
}
}

课堂结束​

classroom.ended

已开课课堂手动结课或被自动结束后发送。可用于结束业务课中状态和后续归档。

data 附加字段类型必填含义
fromStatusstring否结束前状态;批量结束路径可省略。

当前事件不包含出勤统计、录制地址或实际结束时间字段。不要将通知投递时间直接作为课程统计结果。

{
"eventId": "evt_example_classroom_ended",
"type": "classroom.ended",
"appId": "app_example",
"timestamp": "2026-10-09T02:00:00.000Z",
"data": {
"classroomId": "cls_example",
"name": "数学课堂",
"status": "ended",
"teacherEduUserId": "eu_teacher",
"fromStatus": "live"
}
}

未开课课堂过期​

classroom.expired

未开课课堂到达服务端过期条件、状态变为 expired 后发送。可用于标记该预约课堂已失效。

data 附加字段类型必填含义
fromStatusstring否过期前状态;批量过期路径可省略。

该事件与已开课后的 classroom.ended 含义不同。通知不包含过期原因枚举或重新预约结果。

{
"eventId": "evt_example_classroom_expired",
"type": "classroom.expired",
"appId": "app_example",
"timestamp": "2026-10-09T02:00:00.000Z",
"data": {
"classroomId": "cls_example",
"name": "数学课堂",
"status": "expired",
"teacherEduUserId": "eu_teacher",
"fromStatus": "pending"
}
}

成员上下台​

classroom.stage_changed

成员在占席 on 与非占席状态之间切换后发送。可用于同步台上成员或记录上下台行为。

data 附加字段类型必填含义
actionstring是on:上台;off:下台。
eduUserIdstring是发生变化的成员 ID。
rolestring是成员在本课堂中的角色。
fromStageStatus / stageStatusstring是变更前后状态:off、hand_raised、on。
actorEduUserIdstring否已知操作发起人时返回。
sourcestring是变化来源,见下方取值。
onStageCountnumber是变化后的台上人数,整数。

source 取值:invite、accept_hand、join、fill_on_start、backfill、leave_stage、leave_classroom、roster_removed、trtc_exit、im_offline、im_timeout。举手、取消或拒绝举手不会产生此事件。join 只表示进课导致占席变化,并非所有成员进课通知。

{
"eventId": "evt_example_classroom_stage_changed",
"type": "classroom.stage_changed",
"appId": "app_example",
"timestamp": "2026-10-09T02:00:00.000Z",
"data": {
"classroomId": "cls_example",
"name": "数学课堂",
"status": "live",
"teacherEduUserId": "eu_teacher",
"action": "on",
"eduUserId": "eu_student",
"role": "student",
"fromStageStatus": "hand_raised",
"stageStatus": "on",
"actorEduUserId": "eu_teacher",
"source": "accept_hand",
"onStageCount": 2
}
}

课件公共字段​

四类课件事件的 data 使用下列字段,各事件的附加参数在对应小节列出。

字段类型必填含义
coursewareIdstring是课件 ID
namestring是课件名称
formatstring是文件格式,例如 pdf
statusstring是queued、processing、ready、failed
progressnumber是转码进度,0–100
ownerEduUserIdstring否记录中的课件所有者 ID
jobIdstring否已有转码任务时的任务 ID
errorCode / errorMessagestring否记录中的错误码与说明
resultManifestUrlstring否已有转码结果时的 manifest 地址
coursewareBaseUrlstring否已有转码结果时的资源根地址

只有创建事件附加课堂绑定 ID,不应要求后续转码事件均携带该字段。

课件创建​

courseware.created

课件主记录入库后发送。可用于关联上传任务与课件 ID。

data 附加字段类型必填含义
fromStatusstring是固定为 queued。
classroomIdstring否创建时指定绑定的课堂。

本事件固定使用 status: queued、progress: 0 的创建快照。即使紧接着转码失败,也先产生本事件,再产生独立的失败事件。

{
"eventId": "evt_example_courseware_created",
"type": "courseware.created",
"appId": "app_example",
"timestamp": "2026-10-09T02:00:00.000Z",
"data": {
"coursewareId": "cw_example",
"name": "lesson.pdf",
"format": "pdf",
"status": "queued",
"ownerEduUserId": "eu_teacher",
"progress": 0,
"fromStatus": "queued",
"classroomId": "cls_example"
}
}

课件开始转码​

courseware.processing

创建、重试或转码状态更新使课件进入 processing 后发送。可用于显示转码中状态。

data 附加字段类型必填含义
fromStatusstring是变更前状态;重试时可以为 failed。

同为 processing 时的进度变化不会逐次产生通知。重试不会重新发送 courseware.created。

{
"eventId": "evt_example_courseware_processing",
"type": "courseware.processing",
"appId": "app_example",
"timestamp": "2026-10-09T02:00:00.000Z",
"data": {
"coursewareId": "cw_example",
"name": "lesson.pdf",
"format": "pdf",
"status": "processing",
"ownerEduUserId": "eu_teacher",
"progress": 0,
"jobId": "job_example",
"fromStatus": "queued"
}
}

课件转码完成​

courseware.ready

转码结果使课件进入 ready 后发送。可用于刷新课件可用状态和资源入口。

data 附加字段类型必填含义
fromStatusstring是进入 ready 前的状态。

资源地址由转码结果提供,有值时才包含。课堂绑定信息需另行查询,不保证带 classroomId。资源 URL 仍需按其访问权限和有效期处理。

{
"eventId": "evt_example_courseware_ready",
"type": "courseware.ready",
"appId": "app_example",
"timestamp": "2026-10-09T02:00:00.000Z",
"data": {
"coursewareId": "cw_example",
"name": "lesson.pdf",
"format": "pdf",
"status": "ready",
"ownerEduUserId": "eu_teacher",
"progress": 100,
"jobId": "job_example",
"fromStatus": "processing",
"resultManifestUrl": "https://assets.example.com/courseware/manifest.json",
"coursewareBaseUrl": "https://assets.example.com/courseware/"
}
}

课件转码失败​

courseware.failed

启动转码失败或转码结果使课件进入 failed 后发送。可用于展示失败信息并决定是否重试。

data 附加字段类型必填含义
fromStatusstring是失败前状态,可能为 queued 或 processing 等。

errorCode、errorMessage 有记录时才携带;不要按示例文案匹配业务分支。启动失败时可能没有 jobId。

{
"eventId": "evt_example_courseware_failed",
"type": "courseware.failed",
"appId": "app_example",
"timestamp": "2026-10-09T02:00:00.000Z",
"data": {
"coursewareId": "cw_example",
"name": "lesson.pdf",
"format": "pdf",
"status": "failed",
"ownerEduUserId": "eu_teacher",
"progress": 0,
"fromStatus": "queued",
"errorMessage": "Conversion could not be started."
}
}

预留事件​

下列事件为订阅目录预留项,暂不发送通知。

目录项名称对应的含义当前投递状态
edu_user.registered用户注册不产生通知
classroom.member_added添加课堂成员不产生通知
classroom.joined用户进入课堂不产生通知
classroom.permission_granted授予课堂权限不产生通知
classroom.permission_revoked撤销课堂权限不产生通知
classroom.feature_status_changed课堂功能状态变化不产生通知

media.im_callback、media.trtc_callback、media.live_callback 是内部媒体事件,不在客户订阅目录。客户端回调见客户端 API 与事件。

回调中的用户标识、课堂名称和资源地址需要纳入接收方的信息处理清单,见信息采集清单。