Private video visits, built as an API — not a platform.
VonLinkage hands out private video rooms and role-based join tokens over a small HTTP API, hosted and ready to call. Cloud recording, medical transcription, and signed webhooks included. No vendor lock-in, no SDK to fight, no per-seat billing.
# 1. Create a private room
curl -X POST /rooms \
-H "Authorization: Bearer $TOKEN" \
-d '{"roomName":"appointment-123"}'
# 2. One role-based token per participant
curl -X POST /rooms/appointment-123/token \
-H "Authorization: Bearer $TOKEN" \
-d '{"identity":"doctor-1","role":"doctor"}'
# 3. Client connects to joinUrl with its token
# — VonLinkage never touches the media.A communication microservice, hosted for you.
One contract, no vendor concepts leaking into your app. Rooms, tokens, and participants have no database by design — LiveKit already owns the only state worth having, so any instance can answer for any room.
| Not | Because |
|---|---|
| An SDK | It's a service with an HTTP contract, not a library to link against. |
| An EMR | It stores no clinical data. Rooms and tokens store nothing at all. |
| A billing system | It isolates tenants and their credentials; plans and invoicing live upstream. |
Everything a telehealth call needs, nothing it doesn't.
Private rooms with real lifecycle, role-based access, cloud recording with an audit trail, batch medical transcription, and signed outbound webhooks.
Private rooms, no auto-create
LiveKit runs with auto_create: false. A room must be created through the API before anyone can join — verified against a live server with a forged token that still gets refused.
Role-based join tokens
doctor, patient, nurse, staff, interpreter, and a publish-nothing observer role. Grants are derived server-side — a caller can’t ask for more than its role allows.
Cloud recording
One call to LiveKit Egress starts a room-composite recording straight to S3-compatible storage. VonLinkage never touches the bytes.
Integrity & retention
A background sweep verifies every finished recording actually exists in storage at the right size. Retention purge is opt-in, never a default.
Medical transcription
Finished recordings are batch-transcribed with AWS Transcribe Medical — full text, per-segment timing, and speaker diarization.
Signed outbound webhooks
recording.completed, recording.failed, transcript.completed, transcript.failed — HMAC-signed, retried, and deduped with a stable delivery id.
Two tokens. Confusing them is the main way to get this wrong.
A service token proves which system is calling. A join token proves which person may enter which room. Full detail — including role grants and token minting — lives in the API docs.
Service token
- Signed by
- Your backend, with a shared JWT_SECRET
- Verified by
- VonLinkage
- Proves
- Which system is calling
- Required on
- Every endpoint except /health*, guarded globally
Join token
- Signed by
- VonLinkage, with the LiveKit API secret
- Verified by
- LiveKit
- Proves
- Which person may enter which room, with which role
- Lifetime
- Short-lived — default 5 minutes