Skip to main content
Velma Triage analyzes conversations rather than audio characteristics. It evaluates a configured set of behaviors against the transcript and reports which ones were detected, with the clips that triggered each detection, alongside a conversation type, per-speaker roles, topics, per-topic sentiment, and a summary. Behaviors come from a catalog of presets, from definitions written for the deployment, or from both. Velma transcribes as part of its analysis. The diarized transcript is returned as clips, so a separate transcription call on the same audio is redundant.

Velma Triage (batch)

Returns application/json. duration_ms, clips, and behaviors are always present. The rest depend on configuration. Each entry in clips carries clip_uuid, text, start_ms, duration_ms, speaker_label, language, and the optional emotion, accent, and deepfake_score signals, which are null unless enabled in the stt block. Each entry in behaviors carries behavior_uuid, behavior_name, speaker_label, detected, confidence, evidence_clip_uuids, definitive_clip_uuid, and reasoning. Entries appear for every behavior evaluated, so detected: false means the behavior was checked and not found. conversation_type_pick and each entry in participant_role_picks carry a confidence and a selection_source of inferred, auto_selected_single_option, or default, which distinguishes a real inference from a fallback.

Try it

What you can configure

Configuration travels in one config form field, holding either the literal string default or a JSON-encoded object.
Passing a custom config without a behaviors key evaluates no behaviors. There is no implicit run-everything. This differs from conversation_types and participant_roles, which do fall back to built-in defaults when omitted.Omitting config entirely, or sending the literal default, loads a curated built-in configuration that does include behaviors. To evaluate against a broad set, list the preset:<identifier> references explicitly.
Preset identifiers come from GET /api/velma-2-batch/list-presets, which returns each preset’s identifier, name, short_description, and detailed_description:
A malformed config, an unknown preset identifier, or a definition missing a required field is rejected with 422.

Audio formats

Accepted extensions: .aac, .aiff, .flac, .mov, .mp3, .mp4, .ogg, .opus, .wav, .webm. Maximum file size is 100 MB. Empty files are rejected with 400.

Velma Triage (streaming)

The same analysis, emitted as typed JSON events while the conversation is still running. Connect, send the config as the first text frame, then stream audio. Three events have update semantics worth building for:
  • partial_clip is a transient preview. Multiple partials share one clip_uuid, and the eventual clip reuses it, so a run of partials correlates with its final clip.
  • clip_update can arrive any number of times for a finalized clip, always before done. The latest value for each field supersedes the value on the clip event and on any earlier update.
  • topics and summary fully replace the previous event of that type. Never merge them. topic_sentiment supersedes an earlier event for the same topic and speaker.

Try it

Python
WebSocket endpoints cannot be exercised with cURL. For command-line testing use websocat.

What you can configure

The config object is the same one used by batch, sent as the first text frame instead of a form field. Because it rides on that frame, language and custom_terms in the stt block travel with it and need no separate transport.
The config frame must arrive before any audio. Sending audio first closes the connection with 1003.This endpoint reports authentication failure as close code 4003. It does not use 4001.

Audio formats

Self-describing formats. aac, aiff, flac, mp3, ogg, wav, webm. Auto-detected when audio_format is omitted. Raw formats. s8, s16le, s16be, s24le, s24be, s32le, s32be, u8, u16le, u16be, u24le, u24be, u32le, u32be, f32le, f32be, f64le, f64be, mulaw, alaw. Headerless, so audio_format, sample_rate, and num_channels are all required. sample_rate accepts 8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000.

Behaviors

Combining with Deepfake Detection

Behavior detections say what a caller did, not whether the voice was synthetic. Screen a call for voice fraud runs Velma Triage alongside Deepfake Detection on one recording and combines both outputs into a single decision.

API reference