GoLive gives you a turnkey video-calling backend powered by
LiveKit. You manage
rooms and mint access tokens from your own backend using
the credentials we issued you (api_key + api_secret).
Your end users open the call from their browser, mobile, or desktop app
using the LiveKit Client SDK.
Endpoints
Control plane: https://live.superskynet.com
Signaling (WSS): wss://live.superskynet.com
1. Architecture
┌──────── YOUR BACKEND ──────────┐ ┌─── GoLive control plane ──┐
│ keeps api_key + api_secret │ HTTPS │ /admin/* (operator only) │
│ mints a JWT for each end user │ ──────▶ │ /api/v1/* (your tenant) │
└────────────┬───────────────────┘ └─────────────┬─────────────┘
│ JWT + ws_url │ creates room,
▼ │ mints token
┌─── YOUR END USERS ─────────────┐ ┌─── LiveKit SFU ───────────┐
│ browser / iOS / Android / RN │ ◀──WSS─▶│ signaling + WebRTC media │
└────────────────────────────────┘ └───────────────────────────┘
Never embed your api_secret in a client app. Mint tokens server-side.
Tokens are short-lived JWTs (default 1 hour) scoped to one room + one identity.
Your end users connect directly to LiveKit — calls don't bottleneck through our API.
2. Server side — get a token for an end user
From your backend, call POST /api/v1/rooms/{room}/tokens with HTTP Basic auth using your api_key and api_secret. (Create the room once via POST /api/v1/rooms.)
KEY="lkv_..." # your api_key
SECRET="..." # your api_secret
# 1) create the room (idempotent — 409 if it already exists)
curl -sS -u "$KEY:$SECRET" -X POST https://live.superskynet.com/api/v1/rooms \
-H "Content-Type: application/json" \
-d '{"name":"team-standup","max_participants":25}'
# 2) mint a token for a specific user
curl -sS -u "$KEY:$SECRET" -X POST \
https://live.superskynet.com/api/v1/rooms/team-standup/tokens \
-H "Content-Type: application/json" \
-d '{"identity":"user-123","name":"Jane Doe","ttl_seconds":3600}'
# response:
# { "token": "eyJhbGci…", "ws_url": "wss://live.superskynet.com",
# "room": "<tenant>__team-standup", "identity": "user-123",
# "expires_in": 3600 }
// Node 18+ — uses built-in fetch
const KEY = process.env.GOLIVE_API_KEY;
const SECRET = process.env.GOLIVE_API_SECRET;
const BASE = "https://live.superskynet.com";
const basic = "Basic " + Buffer.from(`${KEY}:${SECRET}`).toString("base64");
async function getToken(roomName, identity, displayName) {
// ensure room exists (ignore 409)
await fetch(`${BASE}/api/v1/rooms`, {
method: "POST",
headers: { Authorization: basic, "Content-Type": "application/json" },
body: JSON.stringify({ name: roomName, max_participants: 25 }),
}).catch(() => {});
const res = await fetch(`${BASE}/api/v1/rooms/${roomName}/tokens`, {
method: "POST",
headers: { Authorization: basic, "Content-Type": "application/json" },
body: JSON.stringify({ identity, name: displayName, ttl_seconds: 3600 }),
});
if (!res.ok) throw new Error(await res.text());
return res.json(); // { token, ws_url, room, identity, expires_in }
}
// Expose this from your own /api/get-call-token endpoint and call it from the client.
{
"identity": "user-123", // REQUIRED — stable unique ID in your system
"name": "Jane Doe", // optional — display name
"can_publish": true, // false for view-only participants
"can_subscribe": true, // false for "broadcast-only" senders
"can_publish_data": true, // data-channel messages
"ttl_seconds": 3600 // 60–86400; default 3600
}
6. Security best practices
Never ship api_secret to the client. Tokens are minted server-side only.
Use a short ttl_seconds (≤ expected call length) so leaked tokens expire quickly.
Use a stable, opaque identity per end user (e.g. your user UUID), not their email.
Set can_publish: false for view-only participants (webinar viewers, observers).
Store credentials in environment variables / a secret manager, not in source control.
Rotate your api_secret from the admin dashboard if you suspect leak.
7. Troubleshooting
Symptom
Likely cause
401 from /api/v1/*
Wrong api_key/secret, or tenant deactivated. Re-check with GET /api/v1/me.
404 minting token
Room doesn't exist. Create it with POST /api/v1/rooms first.
Client connects but no media
Firewall blocks UDP. Client will auto-fall back to TCP on port 7881; ensure outbound 7881 is allowed.
Token works once then 401
TTL expired — refresh by requesting a new token before reconnecting.
Permission denied on join
Token was minted with can_publish: false or wrong room name (rooms are tenant-namespaced internally; use the plain name in our API, not the livekit_name).
Need help? Email the operator who issued your credentials.