# Changelog: RTMS - JavaScript - 1.1.0

**URL:** <https://devforum.zoom.us/t/changelog-rtms-javascript-1-1-0/143105>\
**Category:** rtms\
**Created:** [April 21, 2026, 5:45pm UTC](https://devforum.zoom.us/t/changelog-rtms-javascript-1-1-0/143105 "2026-04-21T17:45:24Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/6/1/614bdd549b610bbaa46ff934617683a02bdaa03c.png) [@system](https://devforum.zoom.us/u/system)\
**Post date:** [April 21, 2026, 5:45pm UTC](https://devforum.zoom.us/t/changelog-rtms-javascript-1-1-0/143105/1 "2026-04-21T17:45:24Z")

</div>

Released: 2026-04-16 Updated: 2026-04-20

[Visit Changelog](https://developers.zoom.us/changelog/rtms/javascript/1.1.0)

Summary: New RTMS SDK version.

RTMS SDK v1.1.0. For more information, see the [Changelog](https://github.com/zoom/rtms/blob/main/CHANGELOG.md) on _GitHub_.

## Added

### ZCC (Zoom Contact Center) Support

- **`engagement_id` in `join()`**: ZCC voice engagements identify sessions with an `engagement_id` instead of `meeting_uuid`; `join()` now accepts `engagement_id` as an alternative identifier  
(all bindings)
- **ZCC event constants** : `EVENT_CONSUMER_ANSWERED`, `EVENT_CONSUMER_END`, `EVENT_USER_ANSWERED`, `EVENT_USER_END`, `EVENT_USER_HOLD`, `EVENT_USER_UNHOLD` exported as flat module-level  
constants in both Node.js and Python

### Transcript Configuration

- **`TranscriptParams`** : New parameter class for configuring transcript streams (language hint, content type, language detection)
- **`TranscriptLanguage` constants** : Full set of language constants (`ENGLISH`, `SPANISH`, `JAPANESE`, `CHINESE_SIMPLIFIED`, and many more) for skipping auto-detection (~3s delay) by hinting  
the source language
- **`setTranscriptParams()`/`set_transcript_params()`**: New method on Client to apply transcript configuration before joining (Node.js and Python)

### HTTP Proxy Support

- **`setProxy()`/`set_proxy()`**: New method on Client for configuring HTTP and HTTPS proxies for RTMS connections (Node.js and Python)

### Individual Video Streams

- **`subscribeVideo()`/`subscribe_video()`**: Subscribe or unsubscribe per-participant video when using `VIDEO_SINGLE_INDIVIDUAL_STREAM` mode
- **`onParticipantVideo()`/`on_participant_video()`**: Callback fired when a participant’s video turns on or off
- **`onVideoSubscribed()`/`on_video_subscribed()`**: Callback fired with the result of each `subscribeVideo()` call
- **`EVENT_PARTICIPANT_VIDEO_ON` / `EVENT_PARTICIPANT_VIDEO_OFF`** : Exported as flat module-level constants in both Node.js and Python

### Python — Concurrency & Scaling

- **`EventLoop` / `EventLoopPool`** : New primitives for fine-grained control over polling threads; `EventLoop` wraps a dedicated background thread, `EventLoopPool` balances clients across a  
pool of threads
- **`run_async()`**: Drop-in async replacement for `run()` using `asyncio.sleep()` between polls; composes naturally with aiohttp, FastAPI, asyncpg
- **Executor dispatch** : `Client(executor=...)` and `run(executor=...)` / `run_async(executor=...)` dispatch data callbacks to a `concurrent.futures.Executor`, keeping the poll loop fast for  
CPU-bound or I/O-heavy callbacks
- **Async callback detection** : Coroutine callbacks are detected automatically and scheduled on the running event loop via `asyncio.run_coroutine_threadsafe`
- **GIL release in `poll()`**: The C++ poll call now releases the GIL, allowing other Python threads (e.g. the webhook HTTP server) to run freely during polling
- **Context manager support** : `with rtms.Client() as client:` guarantees `leave()` is called on exit
- **Lazy `alloc()` / thread affinity**: `Client()` construction is safe from any thread; the C SDK handle is allocated lazily on the EventLoop’s own thread to satisfy the C SDK’s  
thread-affinity constraint
- **Snake\_case aliases** : All `camelCase` methods have `snake_case` aliases (`on_audio_data`, `set_audio_params`, `subscribe_event`, etc.)

### Metadata & AI Interpreter Fields

- **Full metadata fields** : `Metadata` now exposes `userId`, `userName`, `startTs`, `endTs` in both bindings
- **`AiInterpreter` fields** : `Metadata` now exposes `aiInterpreter` with language pair targets from the AI language interpreter SDK feature

### Constants & Enums

- **`IntEnum` for Python codec/rate/option types** : `AudioCodec`, `VideoCodec`, `AudioSampleRate`, `AudioChannel`, `DataOption` are now proper Python `IntEnum` values (comparisons with  
integers still work)
- **`DataOption`** : Unified stream delivery mode enum covering both audio (`AUDIO_MIXED_STREAM`, `AUDIO_MULTI_STREAMS`) and video (`VIDEO_SINGLE_ACTIVE_STREAM`,  
`VIDEO_SINGLE_INDIVIDUAL_STREAM`, `VIDEO_MIXED_GALLERY_VIEW`) options — mirrors the C++ `MEDIA_DATA_OPTION` enum directly; `AudioDataOption` and `VideoDataOption` kept as backward-compat  
aliases
- **Bidirectional param aliases** : All four param structs (`AudioParams`, `VideoParams`, `DeskshareParams`, `TranscriptParams`) now accept both `snake_case` and `camelCase` field names so  
existing code continues to work regardless of convention

## Fixed

- **Spurious configure warnings on leave** : `updateMediaConfiguration` was called during callback teardown after the session was already closed, printing 4 `"Failed to update media configuration"` warnings on every clean leave; suppressed by tracking `sdk_opened_` state and calling `markClosed()` before stopping callbacks

## Changed

- **Protocol enums moved to `rtms.h`** : `EVENT_TYPE`, `ZCC_VOICE_EVENT_TYPE`, `SESSION_STATE`, `STREAM_STATE`, `MESSAGE_TYPE`, `STOP_REASON`, and `TRANSCRIPT_LANGUAGE` are now defined in the  
shared C++ header, making them automatically available to both Node.js and Python bindings
