Files
archived-vdo.ninja/examples/httpwssapi.md
2025-10-21 20:52:45 -04:00

10 KiB

VDO.Ninja Remote Control API Documentation

Overview

VDO.Ninja's Remote Control API allows programmatic control of VDO.Ninja sessions via HTTP or WebSocket connections. This powerful API enables integration with stream decks, custom applications, and automation tools for controlling cameras, microphones, layouts, and other features.

Basic Setup

To enable the API on any VDO.Ninja instance, add the &api parameter with a unique API key:

https://vdo.ninja/?api=YOUR_UNIQUE_API_KEY&webcam

This key must be kept private and will be used to authenticate API requests. The same key must be used when making API calls to control this specific VDO.Ninja instance.

Connection Methods

The API supports three connection methods:

  1. WebSocket API (recommended for real-time control)
  2. HTTP GET API (good for simple controllers and hotkeys)
  3. Server-Sent Events (SSE) for one-way event monitoring

WebSocket API

Connect to wss://api.vdo.ninja:443 and authenticate with your API key:

const socket = new WebSocket("wss://api.vdo.ninja:443");

socket.onopen = function() {
    // Join with your API key
    socket.send(JSON.stringify({"join": "YOUR_UNIQUE_API_KEY"}));
    
    // After joining, you can send commands
    socket.send(JSON.stringify({
        "action": "mic", 
        "value": false // mute microphone
    }));
};

// Listen for responses and events
socket.onmessage = function(event) {
    const data = JSON.parse(event.data);
    console.log("Received:", data);
};

HTTP GET API

Structure: https://api.vdo.ninja/{apiKey}/{action}/{target}/{value}

Examples:

https://api.vdo.ninja/YOUR_UNIQUE_API_KEY/mic/false       // Mute microphone
https://api.vdo.ninja/YOUR_UNIQUE_API_KEY/camera/toggle   // Toggle camera

Server-Sent Events (SSE)

For monitoring events without sending commands:

const eventSource = new EventSource(`https://api.vdo.ninja/sse/YOUR_UNIQUE_API_KEY`);
eventSource.onmessage = function(event) {
    console.log(JSON.parse(event.data));
};

API Commands Reference

Self-Targeted Commands

These commands affect the local VDO.Ninja instance that has the API key enabled.

Action Value Options Description
mic true, false, toggle Control microphone state
camera true, false, toggle Control camera state
speaker true, false, toggle Control speaker state
volume 0 to 200 Set playback volume (percentage)
bitrate Integer (kbps), -1 for auto Set video bitrate
record true, false Control local recording
hangup N/A Disconnect current session
reload N/A Reload the page
sendChat Text string Send a chat message
togglehand N/A Toggle raised hand status
togglescreenshare N/A Toggle screen sharing
forceKeyframe N/A Force video keyframes ("rainbow puke fix")
getDetails N/A Get detailed state information
getGuestList N/A Get list of connected guests with IDs

Layout Control Commands

Action Value Description
layout 0 or false Switch to auto-mixer layout
layout Integer (1, 2, etc.) Switch to specific predefined layout
layout Layout object/array Apply custom layout configuration

Camera Control (PTZ) Commands

Action Value Description
zoom -1.0 to 1.0 Adjust zoom level (relative)
zoom 0.0 to 1.0 with value2="abs" Set absolute zoom level
focus -1.0 to 1.0 Adjust focus (relative)
pan -1.0 to 1.0 Adjust camera pan (negative=left)
tilt -1.0 to 1.0 Adjust camera tilt (negative=down)
exposure 0.0 to 1.0 Adjust camera exposure

Group Communication Commands

Action Value Description
group 1 to 8 Toggle participation in specified group
joinGroup 1 to 8 Join a specific group
leaveGroup 1 to 8 Leave a specific group
viewGroup 1 to 8 Toggle view of specified group
joinViewGroup 1 to 8 View a specific group
leaveViewGroup 1 to 8 Stop viewing a specific group

Timer Commands

Action Value Description
startRoomTimer Integer (seconds) Start countdown timer for room
pauseRoomTimer N/A Pause the room timer
stopRoomTimer N/A Stop and reset the room timer

Presentation Control

Action Value Description
nextSlide N/A Advance to next slide (for PowerPoint integration)
prevSlide N/A Go to previous slide
soloVideo true, false, toggle Highlight video for all guests

Director-Only Guest Commands

These commands target specific guests when you are the director.

Action Target Value Description
forward Guest ID/slot Room name Transfer guest to another room
addScene Guest ID/slot Scene ID (1-8) Toggle guest in/out of scene
muteScene Guest ID/slot Scene ID Toggle guest's audio in scene
mic Guest ID/slot true, false, toggle Control guest's microphone
hangup Guest ID/slot N/A Disconnect a specific guest
soloChat Guest ID/slot N/A Private chat with guest
soloChatBidirectional Guest ID/slot N/A Two-way private chat
speaker Guest ID/slot N/A Toggle guest's speaker
display Guest ID/slot N/A Toggle guest's display
forceKeyframe Guest ID/slot N/A Fix video artifacts for guest
soloVideo Guest ID/slot N/A Highlight specific guest's video
volume Guest ID/slot 0 to 200 Set guest's microphone volume
mixorder Guest ID/slot -1 or 1 Change guest's position in mixer

Target Parameter Explanation

When using director commands, you can specify targets in two ways:

  1. Slot number: Simple integers like 1, 2, 3 (corresponds to position in room)
  2. Stream ID: The unique ID for a specific guest (more reliable as slots can change)

Examples:

// Target guest in slot 1
{"action": "mic", "target": 1, "value": false}

// Target guest with specific stream ID
{"action": "mic", "target": "abc123xyz", "value": false}

Callbacks and Responses

API commands receive callbacks with the current state after execution:

// WebSocket example response when toggling mic
{
  "callback": {
    "action": "mic",
    "value": "toggle",
    "result": false  // Indicates mic is now muted
  }
}

Custom Layout Format

The layout API supports complex scene configurations. Layouts can be arrays of objects with properties:

// Simple layout with two videos
{
  "action": "layout",
  "value": [
    {"x": 0, "y": 0, "w": 50, "h": 100, "slot": 0},
    {"x": 50, "y": 0, "w": 50, "h": 100, "slot": 1}
  ]
}

Layout object properties:

  • x, y: Position (percentage of canvas)
  • w, h: Width and height (percentage)
  • slot: Which video slot to display (0-indexed)
  • z: Z-index for layering (optional)
  • c: Cover mode (true/false, optional)

Implementation Examples

Python Example

import websockets
import asyncio
import json

async def control_camera():
    async with websockets.connect("wss://api.vdo.ninja:443") as websocket:
        # Join with API key
        await websocket.send(json.dumps({"join": "YOUR_API_KEY"}))
        
        # Zoom in camera
        await websocket.send(json.dumps({
            "action": "zoom",
            "value": 0.5,
            "value2": "abs"
        }))
        
        # Wait for response
        response = await websocket.recv()
        print(f"Response: {response}")

asyncio.run(control_camera())

JavaScript HTTP Example

// Toggle microphone via HTTP
fetch("https://api.vdo.ninja/YOUR_API_KEY/mic/toggle")
    .then(response => response.text())
    .then(result => console.log("Mic toggled, new state:", result));

Integration with Automation Tools

The API integrates well with:

  1. BitFocus Companion: Official module available at github.com/bitfocus/companion-module-vdo-ninja
  2. Stream Deck: Can use HTTP requests for button actions
  3. Node-RED: Great for complex automation workflows
  4. Home Assistant: For smart home integration

Security Considerations

  • Keep your API key private
  • Consider using unique keys for different productions
  • The API has full control over the VDO.Ninja instance it's connected to
  • All connections are encrypted over SSL/TLS

Troubleshooting

  • Ensure the API key matches exactly between VDO.Ninja and your requests
  • For WebSocket connections, implement reconnection logic (connections timeout after ~1 minute of inactivity)
  • When using HTTP API, a timeout response means the request couldn't reach the target

Additional Resources

Advanced Usage: Self-Hosting the API

For production environments, you can self-host the API server:

  1. Clone the repository from GitHub
  2. Install dependencies with npm install
  3. Modify the server URL in your VDO.Ninja instances:
    session.apiserver = "wss://your-custom-domain:443";
    
  4. Run the server with proper SSL certificates

Note: Self-hosting support is limited and should only be attempted by experienced developers.