obs-websocket 5.7.6 · OBS Studio 28 and up · .NET 8 and 10

A complete .NET client for OBS Studio

Switch scenes, mute inputs, start the stream, react to whatever happens in OBS Studio: from any .NET application, on Windows, Linux or macOS. Every request, event and enum of the obs-websocket protocol is a typed, async C# member, checked against the protocol on every build.

dotnet add package OBSClient --prerelease
using OBSStudioClient;

using var client = new ObsClient();

if (await client.ConnectAsync(password: "secret"))
{
    client.CurrentProgramSceneChanged += (_, e) =>
        Console.WriteLine($"On air: {e.SceneName}");

    await client.SetCurrentProgramScene("Gaming Scene");
    await client.StartRecord();
}
4.0 is a release candidate. This site documents OBSClient 4.0, a major update that brings the client to obs-websocket 5.7.6. Using 3.x? Moving from 3.x to 4.0 lists what changes.

Why OBSClient

The whole protocol

Every request, event, batch builder and enum of obs-websocket 5.7.6, including the multi-canvas support of 5.7.0.

Typed and async

Typed requests and responses, async and await throughout, nullable annotations, and XML documentation on every member.

Names or UUIDs

Pass a scene or an input by name, by UUID, or as the object OBS Studio gave you. One method per request, no overload pairs.

Request batches

Send several requests in one round trip, serially or in parallel, in real time or per frame, and stop at the first failure.

A connection you can rely on

Auto-reconnect, retries while OBS Studio is not ready, requests that fail fast, and a connection that tells you when it is lost.

Tested against the real thing

Conformance tests compare every request with the protocol definition, and captures of a real OBS Studio check the nested objects.

A quick tour

using OBSStudioClient;

using var client = new ObsClient();
if (!await client.ConnectAsync(password: "secret")) return;

await client.SetCurrentProgramScene("Gaming Scene");      // by name
await client.SetCurrentProgramScene(sceneUuid);           // by UUID: survives a rename
bool muted = await client.ToggleInputMute("Microphone");  // returns the new state
await client.StartStream();

Compatibility

Area Support
OBS Studio 28 and up. obs-websocket 5 is built into OBS Studio since version 28. The UUIDs of scenes and inputs need OBS Studio 30.1 (obs-websocket 5.4): an older one sends none, so name the scene or the input. CI runs the live tests against OBS Studio 30.0.2 and against the newest release.
Protocol obs-websocket 5.7.6, including the multi-canvas requests and events of 5.7.0.
Target frameworks net8.0 and net10.0, the LTS releases of .NET. An application on .NET 9 or 11 uses them too. .NET 8 reaches the end of its support from Microsoft on 10 November 2026, and its target stays in every 4.x package: dropping a target framework breaks the applications that use it, which is what a major version is for.
Platforms Windows, Linux and macOS: the client only uses System.Net.WebSockets, and its tests run on all three in CI.
Dependencies Microsoft.Extensions.Logging.Abstractions (8.0.0 and up), which has the ILogger that the client logs to.
License MIT