Skip to main content

Video API

Video endpoints exposed by the Devotel CPaaS API Base path: /api/v1/video Endpoint count: 21

List avatar-agent personas

GET /api/v1/video/avatar-agents
List the calling tenant’s registered AI video-avatar-agent (‘digital human’) personas. Each persona binds one of the tenant’s existing conversational agents to a rendered-avatar provider (tavus / heygen / did) plus a display config, so the avatar-runtime can join a self-hosted WebRTC room as a talking-head participant. Read-only; scoped on video:read (or video:write as a superset).

Compose an avatar-agent join plan

GET /api/v1/video/avatar-agents/{id}/join-plan
Compose the deterministic dispatch descriptor the avatar-runtime consumes to join the given room as this persona. Read-only: it resolves the persona and composes the join contract; it does not mint the SFU token or call the avatar provider (the runtime does that with its own credentials). A disabled persona returns 409. Scoped on video:read (or video:write as a superset).
string
required
The vaa_-prefixed persona id.
string
required
Name of the WebRTC room the avatar will join.

List avatar-video render jobs

GET /api/v1/video/avatar-video-renders
List the calling tenant’s async AI avatar video-message render jobs, newest first. Optionally filter by status or persona_id. Read-only; scoped on video:read (or video:write as a superset).
string (enum: queued|rendering|completed|failed)
Filter to render jobs in this lifecycle state.
string
Filter to render jobs scripted from this vaa_-prefixed persona.

Get an avatar-video render job

GET /api/v1/video/avatar-video-renders/{id}
Poll a single avatar-video render job’s status by its vavr_-prefixed id. Read-only; scoped on video:read (or video:write as a superset).
string
required
The vavr_-prefixed render job id.

List room-config templates

GET /api/v1/video/room-templates
List the calling tenant’s saved reusable video room-config templates (‘meeting templates’). Each template stores a NON-SECRET room-config preset (participant cap, recording/egress defaults, media policy, E2EE, region, waiting-room lobby) that a new room can be created from via POST /:id/instantiate. Read-only; scoped on video:read (or video:write as a superset).

Get a room-config template

GET /api/v1/video/room-templates/{id}
Fetch a single saved room-config template by id. Read-only; scoped on video:read (or video:write as a superset).
string
required
The vrtpl_-prefixed template id.

Room usage analytics

GET /api/v1/video/rooms-analytics/usage
Aggregate video room usage + engagement for the calling tenant over a date window (default last 30 days): total sessions, room-minutes, average/peak concurrent participants, recording success rate, and join failures. Returns an org-wide summary plus a per-UTC-day daily time series for sessions-over-time charts. Read-only; scoped on video:read (or video:write as a superset).
string
Window start (ISO 8601 date-time). Defaults to 30 days before to.
string
Window end (ISO 8601 date-time). Defaults to now.

Register an avatar-agent persona

POST /api/v1/video/avatar-agents
Register a new AI video-avatar-agent persona for the calling tenant, binding an existing conversational agent to a rendered-avatar provider and display config. Owner/admin/developer only; scoped on video:write. Persona names must be unique within the tenant (case-insensitive) and the registry is capped per tenant.
string
required
Tenant-supplied label rendered in the picker. Unique within the tenant (case-insensitive).
string
required
The conversational agent that drives the dialog (agt_-prefixed).
string (enum: tavus|heygen|did)
required
Rendered-avatar provider this persona uses.
string
required
The tenant’s own opaque persona/replica reference id at that provider.
string | null
Optional opening line the avatar speaks on join.
string | null
Optional BCP-47-ish locale hint for TTS (e.g. en-US).
boolean
Whether the persona is dispatchable to rooms. Defaults to true.

Script an avatar-video render job

POST /api/v1/video/avatar-video-renders
Script a new async avatar-video render job for an existing, enabled avatar persona — merges merge_fields into script_template and persists the request as a pollable job. Does not call the provider render API directly; the tenant’s render runtime performs the actual render and reports back via PATCH /api/v1/video/avatar-video-renders/. Owner/admin/developer only; scoped on video:write.
string
required
The vaa_-prefixed avatar persona to render from. Must be an existing, enabled persona.
string
required
The operator-authored script, with optional tokens.
string | null
Optional BCP-47-ish locale override for TTS; falls back to the persona’s locale when omitted.
object
Values for every referenced by script_template. A referenced token with no supplied value rejects the request.

Create a room-config template

POST /api/v1/video/room-templates
Save a new reusable room-config template for the calling tenant. Owner/admin/developer only; scoped on video:write. Template names must be unique within the tenant (case-insensitive) and the library is capped at 100 templates per tenant. The config preset carries only non-secret room knobs — recording-storage credentials and consent receipts are never persisted on a template.
string
required
Tenant-supplied label rendered in the template picker. Unique within the tenant (case-insensitive).
string
Optional operator description.
any
required

Create a room from a template

POST /api/v1/video/room-templates/{id}/instantiate
Create a live (or scheduled) video room from a saved template, mapping the template’s stored config onto the room-create path with the SAME per-tier participant-cap gate, required-captions deployment guard, media/E2EE/region knobs, waiting-room lobby, recording-consent gate + auto-start, inbox backlink, and audit trail as POST /video/rooms-scheduled. Owner/admin/developer only; scoped on video:write.
string
required
The vrtpl_-prefixed template id.
string
required
Label for the new room (per-instance).
string | null
Optional ISO 8601 date-time to schedule the room for; omit or null to create it live now.
Consent-receipt id threaded into the recording-consent gate when the template auto-starts a recording in a two-party-consent jurisdiction.

Post a chat message into a video room

POST /api/v1/video/rooms-scheduled/{id}/chat
Broadcasts a chat message to every participant on the room’s orbit.chat data-channel topic. Any joined participant may post (mirrors reactions / Q&A) — an SDK bot or webinar viewer included. Chat is transient: the message is fanned out, never persisted, so there is no list to read back. The sender identity is SERVER-stamped from the auth context and is never a body field; the caller mints the message_id UUID so the stateless send → delete lifecycle correlates client-side. Scoped on video:read (or video:write as a superset).
string
required
Scheduled room id.
string
required
Client-minted UUID correlating the send → delete lifecycle.
string
required
The message text. The sender identity is never a body field — the server stamps it.
string
Optional message_id of the message being replied to (threaded replies).

Configure a video room’s chat content-safety policy

POST /api/v1/video/rooms-scheduled/{id}/chat-policy
Sets the room’s PROACTIVE chat content-safety policy — a pre-broadcast screen the send handler (POST /chat) applies BEFORE a message is fanned out or persisted. Under mode: block a matched message is rejected and never reaches another participant or the replay history; flag delivers it but marks it for moderator review; log delivers it unchanged and only records the match. Disabling the policy (enabled: false) preserves the default deliver-first behaviour. Host-only — requires the video:write role (owner | admin | developer) and is audited. Complements the reactive moderation endpoints (/chat/delete, /chat/clear).
string
required
Scheduled room id.
boolean
required
Master switch. When false the send handler behaves exactly as before (deliver-first).
string (enum: block|flag|log)
required
What to do with a matched message. block rejects it pre-broadcast; flag delivers-and-marks it for review; log delivers it unchanged and records the match.
string (enum: profanity|pii|toxicity)[]
required
Built-in content-safety categories to screen for (deduped server-side).
string[]
required
Operator-curated exact / word-boundary terms, applied whenever the policy is enabled regardless of categories.

Clear the entire room chat (host-only)

POST /api/v1/video/rooms-scheduled/{id}/chat/clear
Host moderation action: broadcasts a clear event so every client hides all messages posted before the clear timestamp. Host-only — requires the video:write role (owner | admin | developer) and is audited. The moderator identity is SERVER-stamped from the auth context. Carries no body fields; a stray payload is rejected.
string
required
Scheduled room id.

Delete a single chat message (host-only)

POST /api/v1/video/rooms-scheduled/{id}/chat/delete
Host moderation action: broadcasts a delete event so every client hides the message with the matching message_id. Host-only — requires the video:write role (owner | admin | developer) and is audited. The moderator identity is SERVER-stamped from the auth context, never a body field.
string
required
Scheduled room id.
string
required
The message to remove (matches a prior send’s message_id).

Update an avatar-agent persona

PATCH /api/v1/video/avatar-agents/{id}
Apply a partial update to an avatar persona. Only supplied fields change; a null greeting or locale clears it. Owner/admin/developer only; scoped on video:write.
string
required
The vaa_-prefixed persona id.
string
string
string (enum: tavus|heygen|did)
string
string | null
string | null
boolean

Report an avatar-video render job’s status

PATCH /api/v1/video/avatar-video-renders/{id}
The render runtime’s callback reporting a job’s status transition once it has an outcome (e.g. an output clip URL, or a failure reason). Owner/admin/developer only; scoped on video:write.
string
required
The vavr_-prefixed render job id.
string (enum: rendering|completed|failed)
required
The new lifecycle state. Must be a valid transition from the job’s current status.
string
The rendered clip’s HTTPS URL. Required when transitioning to completed.
string
Human-readable failure reason. Set when transitioning to failed.

Update a room-config template

PATCH /api/v1/video/room-templates/{id}
Apply a partial update to a room-config template. At least one of name / description / config must be supplied; a null description clears it. config is a FULL replacement of the stored preset (validated in whole so the cross-field codec/SVC guard always runs), not a deep-merge. Owner/admin/developer only; scoped on video:write.
string
required
The vrtpl_-prefixed template id.
string
string | null
any

Delete an avatar-agent persona

DELETE /api/v1/video/avatar-agents/{id}
Remove an avatar persona from the tenant’s registry. Owner/admin/developer only; scoped on video:write. A missing id returns 404, so a delete never silently no-ops a mistyped id.
string
required
The vaa_-prefixed persona id.

Delete an avatar-video render job

DELETE /api/v1/video/avatar-video-renders/{id}
Remove a render job from history. A missing id returns 404, so a delete never silently no-ops a mistyped id. Owner/admin/developer only; scoped on video:write.
string
required
The vavr_-prefixed render job id.

Delete a room-config template

DELETE /api/v1/video/room-templates/{id}
Remove a room-config template from the tenant’s library. Owner/admin/developer only; scoped on video:write. A missing id returns 404, so a delete never silently no-ops a mistyped id.
string
required
The vrtpl_-prefixed template id.