Voice — outbound originate
Streams — record-to-disk viewer
Robotics — telemetry publisher
Games — Unity-friendly authoritative server
com.clutchcall.transport
UPM package. It exposes UTP’s INetworkInterface over the same wire.
Documentation Index
Fetch the complete documentation index at: /llms.txt
Use this file to discover all available pages before exploring further.
The SDK split repo contains runnable examples for each modality.
var v = new Voice(BASE_URL, apiKey: KEY, orgId: ORG);
var call = await v.Calls.OriginateAsync(new Voice.OriginateArgs {
To = "+15551234567",
From = "+15558675309",
TrunkId = "trunk_main",
Agent = "healthcare-assistant",
});
Console.WriteLine($"call sid: {call.Sid}");
await using var out_ = File.Create("recording.mp4");
await using var viewer = await Streams.BroadcastViewer.OpenAsync(signedUrl,
new Streams.ViewerOpts {
OnChunk = (init, chunk) => out_.Write(chunk),
});
var r = new Robotics(HOST, token, "tb-7");
var qos = new Robotics.QoSProfile {
Reliability = Robotics.Reliability.Reliable,
Depth = 10,
};
await using var pub = await r.PublishTelemetryAsync("odom",
"nav_msgs/msg/Odometry", qos);
while (true) {
pub.Write(SerializeOdom());
await Task.Delay(100);
}
var g = new Games(HOST, token, "duel-42", playerId: null);
var state = await g.PublishStateAsync(new Games.StateOpts { TickHz = 30 });
g.SubscribeInputs((pid, p) => world.Apply(pid, p));
var timer = new PeriodicTimer(TimeSpan.FromMilliseconds(33));
while (await timer.WaitForNextTickAsync()) state.Write(world.Snapshot());
com.clutchcall.transport
UPM package. It exposes UTP’s INetworkInterface over the same wire.
var d = new Data(HOST, token, "ingest");
await using var sub = await d.SubscribeAsync("sensors/+/temperature", msg =>
Console.WriteLine($"{msg.Topic} ← {msg.FromClientId} = " +
$"{Encoding.UTF8.GetString(msg.Payload)}"));
