Apply authenticated room-level controls to a conference room

POST https://z.u1v.ru/api/v1/calls/conferences/room/action

Apply a room-scoped schedule, recording, or end-room action to an authenticated live conference room for the active Zulip account.

This endpoint only operates on the caller-owned live conference record already exposed through POST /calls/recovery, and it fails closed when the authenticated room contract does not grant the requested capability.

Usage examples

The -u line implements HTTP Basic authentication. See the Authorization header documentation for how to get those credentials for Zulip users and bots.

curl -sSX POST https://z.u1v.ru/api/v1/calls/conferences/room/action \
    -u EMAIL_ADDRESS:API_KEY \
    --data-urlencode owner_user_id=42 \
    --data-urlencode room_id=room-1 \
    --data-urlencode action=schedule \
    --data-urlencode scheduled_start_at=2026-04-10T08:30:00Z

Parameters

owner_user_id string required

Example: "42"

Stringified Zulip user ID that owns the authenticated live conference record.


room_id string required

Example: "room-1"

Authenticated conference room identifier.


action string required

Example: "schedule"

Room-level control action to apply.

Must be one of: "schedule", "clear_schedule", "start_recording", "stop_recording", "enable_join_muted", "disable_join_muted", "enable_messages", "disable_messages", "end_room".


scheduled_start_at string | null optional

Example: "2026-04-10T08:30:00Z"

ISO 8601 timestamp used for the schedule room action.


Response

Return values

  • room_closed: boolean

    Whether the server-authoritative room_closed condition is true. * conference_presence: object | null

    Server-authoritative conference_presence details. * roomId: string

    Server-authoritative `roomId` value.
    
    • appCallId: string

      Server-authoritative appCallId value. * mediaType: string

      Server-authoritative mediaType value. * displayName: string

      Server-authoritative displayName value. * avatarUrl: string | null

      Server-authoritative avatarUrl value. * conversation: object | null

      Server-authoritative conversation details. * kind: string

      Server-authoritative `kind` value.
      
      • dmUserIds: (integer)[]

        Server-authoritative dmUserIds list. * streamId: integer | null

        Server-authoritative streamId value. * topic: string | null

        Server-authoritative topic value. * title: string

        Server-authoritative title value. * participantCount: integer | null

      Server-authoritative participantCount value. * isResumable: boolean

      Whether the server-authoritative isResumable condition is true. * participants: (object)[]

      Server-authoritative participants list. * userId: integer

      Server-authoritative `userId` value.
      
      • displayName: string

        Server-authoritative displayName value. * avatarUrl: string | null

        Server-authoritative avatarUrl value. * isSelf: boolean

        Whether the server-authoritative isSelf condition is true. * isActiveSpeaker: boolean

        Whether the server-authoritative isActiveSpeaker condition is true. * isSpeaking: boolean

        Whether the server-authoritative isSpeaking condition is true. * hasVideo: boolean

        Whether the server-authoritative hasVideo condition is true. * isScreenSharing: boolean

        Whether the server-authoritative isScreenSharing condition is true. * isMuted: boolean

        Whether the server-authoritative isMuted condition is true. * metadata: object

        Server-authoritative metadata details. * Server-authoritative mapping value. * isHandRaised: boolean

        Whether the server-authoritative isHandRaised condition is true. * isAllowedToSpeak: boolean

        Whether the server-authoritative isAllowedToSpeak condition is true. * reactionKey: string

        Server-authoritative reactionKey value. * roomContract: object | null

      Server-authoritative roomContract details. * shareUrl: string | null

      Server-authoritative `shareUrl` value.
      
      • scheduledStartAt: string | null

        Server-authoritative scheduledStartAt value. * recordingState: string

        Server-authoritative recordingState value. * audioTopology: string

        Server-authoritative audioTopology value. * participantGainSemantic: string

        Server-authoritative participantGainSemantic value. * joinMuted: boolean | null

        Whether the server-authoritative joinMuted condition is true. * messagesEnabled: boolean | null

        Whether the server-authoritative messagesEnabled condition is true. * canInvite: boolean

        Whether the server-authoritative canInvite condition is true. * canShare: boolean

        Whether the server-authoritative canShare condition is true. * canSchedule: boolean

        Whether the server-authoritative canSchedule condition is true. * canRecord: boolean

        Whether the server-authoritative canRecord condition is true. * canManage: boolean

        Whether the server-authoritative canManage condition is true. * canChangeJoinMuted: boolean

        Whether the server-authoritative canChangeJoinMuted condition is true. * canChangeMessagesEnabled: boolean

        Whether the server-authoritative canChangeMessagesEnabled condition is true. * adminUserIds: (integer)[]

        Server-authoritative adminUserIds list. * metadata: object

      Server-authoritative metadata details. * Server-authoritative mapping value.

Example response(s)

Changes: As of Zulip 7.0 (feature level 167), if any parameters sent in the request are not supported by this endpoint, a successful JSON response will include an ignored_parameters_unsupported array.

A typical successful JSON response may look like:

{
    "conference_presence": {
        "appCallId": "conference-app-call-1",
        "avatarUrl": null,
        "conversation": {
            "kind": "topic",
            "streamId": 9,
            "title": "General > Launch plan",
            "topic": "Launch plan"
        },
        "displayName": "General > Launch plan",
        "isResumable": true,
        "mediaType": "audio",
        "metadata": {
            "conversation_kind": "topic",
            "conversation_stream_id": "9",
            "conversation_topic": "Launch plan"
        },
        "participantCount": 2,
        "participants": [
            {
                "avatarUrl": null,
                "displayName": "King Hamlet",
                "hasVideo": true,
                "isActiveSpeaker": false,
                "isMuted": false,
                "isScreenSharing": false,
                "isSelf": true,
                "isSpeaking": false,
                "metadata": {},
                "userId": 10
            },
            {
                "avatarUrl": null,
                "displayName": "Othello, the Moor of Venice",
                "hasVideo": true,
                "isActiveSpeaker": true,
                "isMuted": false,
                "isScreenSharing": true,
                "isSelf": false,
                "isSpeaking": true,
                "metadata": {},
                "userId": 12
            }
        ],
        "roomContract": {
            "adminUserIds": [
                10,
                12
            ],
            "audioTopology": "confbridge_mixed",
            "canChangeJoinMuted": true,
            "canChangeMessagesEnabled": true,
            "canManage": true,
            "canRecord": true,
            "canSchedule": true,
            "joinMuted": true,
            "messagesEnabled": false,
            "participantGainSemantic": "participant_global_speaker_gain",
            "recordingState": "active",
            "scheduledStartAt": "2026-04-10T08:30:00Z"
        },
        "roomId": "room-1"
    },
    "msg": "",
    "result": "success",
    "room_closed": false
}