> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stmlink.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> 对外开放的服务端接口有两组前缀，都用同一套鉴权：`/server/v1/...`（SRTC 与 SMeeting 的主接口）和 `/stm/srvapi/v1/...`（SMeeting 的用户体系，服务端极简对接会用到）。鉴权是 app_id + nonce + timestamp + signature 四个请求头，用 app_key 做 HMAC-SHA256 签名，只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口，不要建议客户调用。 Public server APIs use two path prefixes with the same authentication: `/server/v1/...` (the main APIs of both SRTC and SMeeting) and `/stm/srvapi/v1/...` (the SMeeting user system, used by server-side low-code integration). Authenticate with four request headers, app_id + nonce + timestamp + signature, where signature is HMAC-SHA256 keyed with app_key; call these APIs only from the customer's own backend. Any other path is internal: never suggest calling it.
> app_key 是服务端密钥，绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发（SRTC 走 `/server/v1/channel/grant`，SMeeting 走 `/stm/srvapi/v1/member/grant`）。 app_key is a server-side secret and must never appear in client code, frontend config, or a mobile app. The token a client uses to join must be issued by the customer's backend and passed down to the client (SRTC: `/server/v1/channel/grant`; SMeeting: `/stm/srvapi/v1/member/grant`).
> SRTC 与 SMeeting 是上下两层不同的产品，术语不通用：SRTC 是音视频底座，说「频道 channel」「加入 / 退出」；SMeeting 建在 SRTC 之上，说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语，不要把「房间」「会议」安到 SRTC 的接口上，也不要用「频道」「加入 / 离开」描述 SMeeting 的概念（接口标识符原样保留）。 SRTC and SMeeting are two separate layers with different terminology. SRTC is the audio/video foundation: it has channels, and users join and leave a channel. SMeeting is built on top of SRTC: it has rooms and meetings, and members enter and exit a meeting. Answer in the terms of the layer the user is working with: never apply "room" or "meeting" to SRTC APIs, and never describe SMeeting concepts in prose with "channel", "join", or "leave" (API identifiers such as `force_join` keep their literal names).
> 同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API，不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK（Swift 原生与 Objective-C），两套 API 不能混用。 Package, class, and method names differ between platform SDKs for the same capability. In sample code, use the API documented for that platform; never carry one platform's code over to another. On Apple platforms each product ships two SDKs (native Swift and Objective-C) whose APIs must not be mixed.

# Error codes

> The SEAError enum of the iOS SMeeting SDK (Objective-C): every case with its value and meaning, covering server API errors passed through (1xxx, 2xxx, 10xxx) and SDK system, common, network, and client errors (100xxx, 103xxx). Read when handling or troubleshooting an error code.

### SEAError

Error codes

| **Enum name** | **Value** | **Description** |
| - | :-: | - |
| SEAErrorOK | `0` | No error |
| **API errors** | | |
| SEAErrorRtcApiHeaderNotAppId | `1001` | Missing APPID in request headers |
| SEAErrorRtcApiHeaderInvalidAppId | `1002` | Invalid APPID in request headers |
| SEAErrorRtcApiHeaderInvalidSignature | `1003` | Invalid signature in request headers |
| SEAErrorRtcApiHeaderInvalidTimestamp | `1004` | Invalid timestamp in request headers |
| SEAErrorApiHeaderInvalidSession | `1005` | Invalid session ID in request headers |
| SEAErrorRtcApiHeaderNotNonce | `1006` | Missing nonce in request headers |
| SEAErrorRtcApiInvalidApplication | `1011` | Invalid app |
| SEAErrorRtcApiInvalidServiceGroup | `1012` | Invalid server group |
| SEAErrorRtcApiInvalidService | `1013` | Invalid service |
| SEAErrorRtcApiInvalidScene | `1014` | Invalid application scenario |
| SEAErrorRtcApiInvalidConfigure | `1015` | Invalid callback configuration |
| SEAErrorRtcApiChannelTokenFailed | `1020` | Failed to generate the channel token |
| SEAErrorRtcApiChannelTokenOccupied | `1021` | Channel token has already been used |
| SEAErrorRtcApiSessionNotFound | `1022` | Session is not in the channel |
| SEAErrorRtcApiMemberNotFound | `1023` | Member is not in the channel |
| SEAErrorRtcApiChannelNotOpen | `1024` | Channel is not open |
| SEAErrorRtcApiChannelOpen | `1025` | Channel is already open |
| SEAErrorRtcApiImTokenFailed | `1030` | Failed to generate the IM token |
| SEAErrorRtcApiImTokenOccupied | `1031` | IM token has already been used |
| SEAErrorRtcApiSessionOffline | `1032` | Session is not online |
| SEAErrorRtcApiInsufficientConcurrency | `1033` | Concurrency limit reached |
| SEAErrorRtcApiNotFoundMcuTask | `1040` | MCU task not found |
| SEAErrorRtcApiRecordTaskUnfinished | `1041` | Recording task has not ended yet |
| SEAErrorRtcApiRecordTaskNotFile | `1042` | Recording task has not produced a recording file yet |
| SEAErrorRtcApiMcuLayoutFailed | `1043` | MCU layout data error |
| SEAErrorRtcApiMcuTaskStoped | `1044` | MCU task has already stopped |
| SEAErrorMeetingApiRemoteLogin | `2040` | This user has logged in elsewhere |
| SEAErrorMeetingApiHeaderNotAppId | `2041` | Missing APPID in request headers |
| SEAErrorMeetingApiHeaderInvalidAppId | `2042` | Invalid APPID in request headers |
| SEAErrorMeetingApiHeaderInvalidSignature | `2043` | Invalid signature in request headers |
| SEAErrorMeetingApiHeaderInvalidTimestamp | `2044` | Invalid timestamp in request headers |
| SEAErrorMeetingApiHeaderInvalidSession | `2045` | Invalid meeting session ID in request headers |
| SEAErrorMeetingApiHeaderNotNonce | `2046` | Missing nonce in request headers |
| SEAErrorMeetingApiHeaderNotUserId | `2047` | Missing user ID in request headers |
| SEAErrorMeetingApiTokenFailed | `2050` | Failed to generate token |
| SEAErrorMeetingApiNotAuthorized | `2051` | Not authorized |
| SEAErrorMeetingApiTokenExpired | `2052` | Authorization expired |
| SEAErrorMeetingApiFailed | `2100` | Internal meeting error |
| SEAErrorMeetingApiNotFound | `2101` | Meeting does not exist |
| SEAErrorMeetingApiNotStarted | `2102` | Meeting has not started |
| SEAErrorMeetingApiFinished | `2103` | Meeting has ended |
| SEAErrorMeetingApiSomeoneSharing | `2104` | Someone is already sharing in the meeting |
| SEAErrorMeetingApiNotSharing | `2105` | No one is sharing in the meeting |
| SEAErrorMeetingApiLocked | `2106` | Meeting is locked |
| SEAErrorMeetingApiKickedout | `2107` | Removed from the meeting; cannot enter again |
| SEAErrorMeetingApiAtOtherMeeting | `2108` | Already in another meeting |
| SEAErrorMeetingApiAlreadyExisted | `2109` | Already in this meeting |
| SEAErrorMeetingApiNotMeeting | `2110` | Not in this meeting |
| SEAErrorMeetingApiMemberNotFound | `2111` | Target is not in this meeting |
| SEAErrorMeetingApiMicDisabled | `2112` | Not allowed to turn on the microphone |
| SEAErrorMeetingApiCameraDisabled | `2113` | Not allowed to turn on the camera |
| SEAErrorMeetingApiChatDisabled | `2114` | Chat not allowed |
| SEAErrorMeetingApiPasswordFailed | `2115` | Incorrect password |
| SEAErrorMeetingApiByInviteOnly | `2116` | This meeting is for invitees only. Contact the host |
| SEAErrorMeetingApiWaitingRoomEnable | `2118` | The meeting has the waiting room enabled; you can enter only after the host or a co-host admits you |
| SEAErrorMeetingApiEnterBeforeHostDisabled | `2120` | Entering the meeting before the host is not allowed |
| SEAErrorApiFailed | `10000` | Unclassified general error |
| SEAErrorApiDatabaseFailed | `10001` | Database error |
| SEAErrorApiRecordNotFound | `10002` | Record not found |
| SEAErrorApiRepeatFound | `10003` | Record already exists |
| SEAErrorApiNotAuthorized | `10040` | Permission denied |
| SEAErrorApiNotInitialized | `10041` | Not logged in |
| SEAErrorApiTokenDisabled | `10042` | Invalid token |
| SEAErrorApiTokenExpired | `10043` | Token has expired |
| SEAErrorApiNetworkFailed | `10051` | Network error |
| SEAErrorApiNetworkTimeout | `10055` | Request timed out |
| SEAErrorApiInvalidParameter | `10070` | Invalid request parameters |
| **System errors** | | |
| SEAErrorSystemError | `100001` | Internal system error |
| SEAErrorNotInitialized | `100002` | Not initialized |
| SEAErrorMediaNotInitialized | `100003` | The media module isn't initialized yet |
| SEAErrorProtocolParsingError | `100004` | Protocol parsing error |
| **Common errors** | | |
| SEAErrorTimeout | `100005` | Timed out |
| SEAErrorInvalidArgs | `100006` | Invalid arguments |
| SEAErrorConflict | `100007` | Conflict from a repeated operation |
| SEAErrorSdkTokenInvalid | `100008` | The SDK token is invalid |
| **Network errors** | | |
| SEAErrorNetError | `100009` | Network error |
| SEAErrorMediaNetError | `100010` | Media network error |
| SEAErrorNotFound | `100011` | Target doesn't exist |
| **Client errors** | | |
| SEAErrorDeviceNoAuthorized | `103001` | No permission to access the device |
| SEAErrorNotJoinedChannel | `103002` | Not in the channel |
| SEAErrorForbidden | `103003` | Operation not allowed |
| SEAErrorStreamNotFound | `103004` | Stream doesn't exist |
| SEAErrorNotAuthorized | `103005` | No permission to perform the operation |
