Released: 2026-03-26 Updated: 2026-03-30
Summary: Adds detailed QoS statistics for Web SDK consistency, multi-language telephony “welcome” messages, and AI-friendly API documentation. It establishes Ubuntu 20 as the new minimum for Linux support and requires clients to be on version 2.2.10 or later for reliable cross-version communication. Additionally, a breaking change ensures that the cleanup function returns a specific error code when called during an active session.
Important notes
- Video SDK versions prior to 2.2.10 will not be compatible with versions 2.5.5 or later for command channel, message exchange. It’s recommended that you upgrade all clients to new version 2.2.10 or later to ensure reliable command channel, message exchange, and consistent chat experience.
- Starting from version 2.5.5, the Linux SDK only supports Ubuntu 20 (u20) and later.
- AI-Friendly Documentation
- This SDK release ships AI-friendly API documentation in a structured, machine-readable format to help developers and AI-assisted workflows discover and understand the Zoom Video SDK public APIs faster. For more information, see Using AI assistants with the Video SDK.
Breaking Changes
- Add new error code for the
cleanupfunction to returnZoomVideoSDKErrors_Cannot_Call_Cleanup_In_Sessionwhen it’s called during a session.- New enum in
ZoomVideoSDKErrors.
typedef enum { ...... ZoomVideoSDKErrors_Cannot_Call_Cleanup_In_Session = 7700, }ZoomVideoSDKErrors; - New enum in
Added
-
New user QoS statistics data to be consistent with web SDK.
- Add new enum
ZoomVideoSDKStatisticsDirection.
typedef enum { ZoomVideoSDKStatisticsDirection_Send = 0, ZoomVideoSDKStatisticsDirection_Receive = 1, } ZoomVideoSDKStatisticsDirection;- Add new struct
ZoomVideoSDKQOSStatistics.
struct ZoomVideoSDKQOSStatistics { /** * @brief Direction of statistics (send or receive). */ ZoomVideoSDKStatisticsDirection direction; /** * @brief Timestamp of the statistics. */ unsigned int timestamp; /** * @brief Name of the codec. Valid only during callback. For video/share: "h264", "av1". For audio: "silk", "opus", "pcm", "G722", "G729". */ const zchar_t* codecName; /** * @brief Round-trip time in milliseconds. */ unsigned int rtt; /** * @brief Jitter in milliseconds. */ unsigned int jitter; /** * @brief Frame width (sent or received per direction). */ unsigned int width; /** * @brief Frame height (sent or received per direction). */ unsigned int height; /** * @brief Frame rate in FPS (sent or received per direction). */ unsigned int fps; /** * @brief Bits per second. */ unsigned int bps; /** * @brief Bits per frame. Same as bps for backward compatibility. * @deprecated Use ZoomVideoSDKQOSStatistics::bps instead. */ int bpf; /** * @brief Total bytes transferred (sent or received per direction). */ unsigned int bytesTransferred; /** * @brief Number of packets lost during transmission. */ unsigned int packetsLost; /** * @brief Total number of packets transferred (sent or received per direction). */ unsigned int packetsTransferred; /** * @brief Network quality level. */ ZoomVideoSDKNetworkStatus networkLevel; /** * @brief Statistics type (Audio, Video, or Share). */ ZoomVideoSDKDataType statisticsType; /** * @brief Average packet loss ratio in per thousand (e.g. 100 means 10%). */ unsigned int avg_loss; /** * @brief Maximum packet loss ratio in per thousand (e.g. 100 means 10%). */ unsigned int max_loss; /** * @brief Estimated bandwidth in bps. */ unsigned int bandwidth; ZoomVideoSDKQOSStatistics() { reset(); } void reset() { direction = ZoomVideoSDKStatisticsDirection_Send; timestamp = 0; codecName = nullptr; rtt = 0; jitter = 0; width = 0; height = 0; fps = 0; bps = 0; bpf = 0; bytesTransferred = 0; packetsLost = 0; packetsTransferred = 0; networkLevel = ZoomVideoSDKNetwork_None; statisticsType = ZoomVideoSDKDataType_Unknown; avg_loss = 0; max_loss = 0; bandwidth = 0; } };- Add new struct
ZoomVideoSDKQOSSendStatistics.
struct ZoomVideoSDKQOSSendStatistics : ZoomVideoSDKQOSStatistics { /** * @brief Width of the input frame (send only). */ unsigned int frameWidthInput; /** * @brief Height of the input frame (send only). */ unsigned int frameHeightInput; /** * @brief Frame rate of input (send only). */ unsigned int frameRateInput; /** * @brief Total bytes sent. */ unsigned int bytesSent; /** * @brief Total number of packets sent. */ unsigned int packetsSent; /** * @brief Total packet send delay in milliseconds (send only). */ unsigned int totalPacketSendDelay; /** * @brief Total time spent encoding in milliseconds (send only). */ unsigned int totalEncodeTime; /** * @brief Total number of frames encoded (send only). */ unsigned int framesEncoded; ZoomVideoSDKQOSSendStatistics() { ZoomVideoSDKQOSStatistics::direction = ZoomVideoSDKStatisticsDirection_Send; reset(); } void reset() { ZoomVideoSDKQOSStatistics::reset(); direction = ZoomVideoSDKStatisticsDirection_Send; frameWidthInput = 0; frameHeightInput = 0; frameRateInput = 0; bytesSent = 0; packetsSent = 0; totalPacketSendDelay = 0; totalEncodeTime = 0; framesEncoded = 0; } };- Add new struct
ZoomVideoSDKQOSRecvStatistics.
struct ZoomVideoSDKQOSRecvStatistics : ZoomVideoSDKQOSStatistics { /** * @brief Total bytes received (receive only). */ unsigned int bytesReceived; /** * @brief Total number of packets received (receive only). */ unsigned int packetsReceived; /** * @brief Estimated playout timestamp (receive only). */ unsigned int estimatedPlayoutTimestamp; /** * @brief Total time spent decoding in milliseconds (receive only). */ unsigned int totalDecodeTime; /** * @brief Total number of frames decoded (receive only). */ unsigned int framesDecoded; /** * @brief Jitter buffer delay in milliseconds (receive only). */ unsigned int jitterBufferDelay; /** * @brief Number of samples emitted from jitter buffer (receive only). */ unsigned int jitterBufferEmittedCount; ZoomVideoSDKQOSRecvStatistics() { ZoomVideoSDKQOSStatistics::direction = ZoomVideoSDKStatisticsDirection_Receive; reset(); } void reset() { ZoomVideoSDKQOSStatistics::reset(); direction = ZoomVideoSDKStatisticsDirection_Receive; bytesReceived = 0; packetsReceived = 0; estimatedPlayoutTimestamp = 0; totalDecodeTime = 0; framesDecoded = 0; jitterBufferDelay = 0; jitterBufferEmittedCount = 0; } };- Add new struct
ZoomVideoSDKVideoStatisticInfo.
struct ZoomVideoSDKVideoStatisticInfo : ZoomVideoSDKQOSStatistics { /** @brief Gets the video network status. Same as \link ZoomVideoSDKQOSStatistics::networkLevel \endlink. * @deprecated Use ZoomVideoSDKQOSStatistics::networkLevel instead. */ ZoomVideoSDKNetworkStatus videoNetworkStatus; ZoomVideoSDKVideoStatisticInfo() { reset(); } void reset() { ZoomVideoSDKQOSStatistics::reset(); videoNetworkStatus = ZoomVideoSDKNetwork_None; } };- Add new struct
ZoomVideoSDKShareStatisticInfo.
struct ZoomVideoSDKShareStatisticInfo : ZoomVideoSDKQOSStatistics { /** @brief Gets the share network status. Same as \link ZoomVideoSDKQOSStatistics::networkLevel \endlink. * @deprecated Use ZoomVideoSDKQOSStatistics::networkLevel instead. */ ZoomVideoSDKNetworkStatus shareNetworkStatus; ZoomVideoSDKShareStatisticInfo() { reset(); } void reset() { ZoomVideoSDKQOSStatistics::reset(); shareNetworkStatus = ZoomVideoSDKNetwork_None; } };- Add new callback in
IZoomVideoSDKDelegate.
virtual void onQOSStatisticsReceived(const ZoomVideoSDKQOSStatistics& statistics, IZoomVideoSDKUser* pUser) = 0; - Add new enum
-
Add support for multiple languages versions of telephony “welcome” message.
-
Add new class
IZoomVideoSDKPhoneWelcomeMessageInfo.class IZoomVideoSDKPhoneWelcomeMessageInfo { public: virtual ~IZoomVideoSDKPhoneWelcomeMessageInfo() {} virtual const zchar_t* getLanguageCode() = 0; virtual const zchar_t* getLanguageName() = 0; virtual const zchar_t* getVariantId() = 0; }; -
Add new value in struct
InvitePhoneUserInfo.struct InvitePhoneUser { public: ... /** Optional: The welcome message's language code, such as "en-US", "zh-CN". */ const zchar_t* languageCode; /** Optional: The welcome message's variant ID (e.g., "variant_001"). */ const zchar_t* variantId; }; -
Add new interface in class
IZoomVideoSDKPhoneHelper.virtual IVideoSDKVector* getPhoneWelcomeMessageInfoList() = 0;
-