Every modality ships with a runnable example in the typescript-sdk repo. Copy → tweak → ship.

Voice — browser caller

import { Voice, captureMicrophone, OpusPlayer } from "@clutchcall/sdk/voice";

const v      = new Voice({ baseUrl: BASE_URL, browserToken: TOKEN });
const call   = await v.calls.originate({ to: "+1...", trunkId: "trunk_main",
                                          agent: "demo" });
const bridge = await v.audioBridge.attach(call.sid, { codec: "opus" });

const mic    = await captureMicrophone({ onFrame: f => bridge.publishUplink(f) });
const player = new OpusPlayer();
bridge.onDownlink(f => player.play(f));
voice_browser_caller.ts

Streams — browser MSE viewer + camera publisher

import { Streams, BroadcastPublisher } from "@clutchcall/sdk/streams";

const cam = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
const rec = new MediaRecorder(cam, { mimeType: "video/mp4; codecs=avc1.42E01F,mp4a.40.2" });

const streams = new Streams({ baseUrl: BASE_URL, apiKey: KEY, orgId: ORG });
const { input, streamKey } = await streams.liveInputs.create({ name: "Live" });

const pub = await BroadcastPublisher.open({
  inputId: input.external_input_id, streamKey,
  codecs:  { video: "avc1.42E01F", audio: "opus" },
});

rec.ondataavailable = e => e.data.arrayBuffer().then(b => pub.write(new Uint8Array(b)));
rec.start(100);
streams_publisher.ts · streams_viewer.ts

Robotics — robot side publishes odometry

import { Robotics } from "@clutchcall/sdk/robotics";

const r = new Robotics({ relayHost: "relay.clutchcall.dev", token, robotId: "tb-7" });
const odom = await r.publishTelemetry({
  topic: "odom", typeName: "nav_msgs/msg/Odometry",
  qos:   { reliability: "reliable", depth: 10 },
});
setInterval(() => odom.write(serializeOdom()), 100);
robotics_telemetry.ts · robotics_command.ts

Games — Node authoritative server

import { Games } from "@clutchcall/sdk/games";

const auth  = new Games({ relayHost: "relay.clutchcall.dev", token, roomId: "duel-42" });
const state = await auth.publishState({ tickHz: 30 });

await auth.subscribeInputs((pid, bytes) => world.applyInput(pid, bytes));
setInterval(() => state.write(world.snapshot()), 1000 / 30);
games_server.ts · games_client.ts

Data — fleet dashboard

import { Data } from "@clutchcall/sdk/data";

const d = new Data({ relayHost: "relay.clutchcall.dev", token, clientId: "dash" });

await d.subscribe({ topicFilter: "sensors/+/temperature" }, msg => {
  charts.temperature.push({
    room: msg.topic.split("/")[1],
    v:    parseFloat(new TextDecoder().decode(msg.payload)),
  });
});
await d.subscribe({ topicFilter: "alerts/#" }, msg => alert.flash(msg));
data_publisher.ts · data_dashboard.ts