Velma Batch
Run full conversation analysis on an uploaded audio file — transcription, conversation type, participant roles, behaviors, topics, sentiment, and summary in one response.
curl --request POST \
--url https://platform.modulate.ai/api/velma-2-batch \
--header 'Content-Type: multipart/form-data' \
--header 'X-API-Key: <api-key>' \
--form upload_file='@example-file' \
--form config=defaultimport requests
url = "https://platform.modulate.ai/api/velma-2-batch"
files = { "upload_file": ("example-file", open("example-file", "rb")) }
payload = { "config": "default" }
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('upload_file', '<string>');
form.append('config', 'default');
const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
options.body = form;
fetch('https://platform.modulate.ai/api/velma-2-batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://platform.modulate.ai/api/velma-2-batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upload_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"config\"\r\n\r\ndefault\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://platform.modulate.ai/api/velma-2-batch"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upload_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"config\"\r\n\r\ndefault\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://platform.modulate.ai/api/velma-2-batch")
.header("X-API-Key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upload_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"config\"\r\n\r\ndefault\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.modulate.ai/api/velma-2-batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upload_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"config\"\r\n\r\ndefault\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"duration_ms": 1,
"clips": [
{
"clip_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"text": "<string>",
"start_ms": 1,
"duration_ms": 1,
"speaker_label": "<string>",
"language": "<string>",
"emotion": "<string>",
"accent": "<string>",
"deepfake_score": 0.5
}
],
"behaviors": [
{
"behavior_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"behavior_name": "<string>",
"speaker_label": "<string>",
"detected": true,
"confidence": 0.5,
"evidence_clip_uuids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"definitive_clip_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reasoning": "<string>"
}
],
"conversation_type_pick": {
"conversation_type_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"confidence": 0.5,
"detail": "<string>",
"reasoning": "<string>"
},
"participant_role_picks": [
{
"speaker_label": "<string>",
"participant_role_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"confidence": 0.5,
"detail": "<string>",
"reasoning": "<string>"
}
],
"topics": [
"<string>"
],
"topic_sentiments": [
{
"topic": "<string>",
"speaker_label": "<string>",
"sentiment_score": 0,
"sentiment_label": "<string>"
}
],
"summary": "<string>"
}Authorizations
API key used for authentication and usage tracking.
Body
Audio file. Max 100 MB. Supported extensions: aac, aiff, flac, mp3, mp4, mov, ogg, opus, wav, webm.
Either the literal string default (which loads a
built-in default configuration) or a JSON-encoded
BatchConfig object (whose structure is given by
contentSchema). When omitted the default
configuration is used. Sent as a string form field
because multipart/form-data has no first-class object
type.
Response
Batch processing completed.
x >= 0Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
curl --request POST \
--url https://platform.modulate.ai/api/velma-2-batch \
--header 'Content-Type: multipart/form-data' \
--header 'X-API-Key: <api-key>' \
--form upload_file='@example-file' \
--form config=defaultimport requests
url = "https://platform.modulate.ai/api/velma-2-batch"
files = { "upload_file": ("example-file", open("example-file", "rb")) }
payload = { "config": "default" }
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('upload_file', '<string>');
form.append('config', 'default');
const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
options.body = form;
fetch('https://platform.modulate.ai/api/velma-2-batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://platform.modulate.ai/api/velma-2-batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upload_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"config\"\r\n\r\ndefault\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://platform.modulate.ai/api/velma-2-batch"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upload_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"config\"\r\n\r\ndefault\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://platform.modulate.ai/api/velma-2-batch")
.header("X-API-Key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upload_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"config\"\r\n\r\ndefault\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.modulate.ai/api/velma-2-batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upload_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"config\"\r\n\r\ndefault\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"duration_ms": 1,
"clips": [
{
"clip_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"text": "<string>",
"start_ms": 1,
"duration_ms": 1,
"speaker_label": "<string>",
"language": "<string>",
"emotion": "<string>",
"accent": "<string>",
"deepfake_score": 0.5
}
],
"behaviors": [
{
"behavior_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"behavior_name": "<string>",
"speaker_label": "<string>",
"detected": true,
"confidence": 0.5,
"evidence_clip_uuids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"definitive_clip_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reasoning": "<string>"
}
],
"conversation_type_pick": {
"conversation_type_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"confidence": 0.5,
"detail": "<string>",
"reasoning": "<string>"
},
"participant_role_picks": [
{
"speaker_label": "<string>",
"participant_role_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"confidence": 0.5,
"detail": "<string>",
"reasoning": "<string>"
}
],
"topics": [
"<string>"
],
"topic_sentiments": [
{
"topic": "<string>",
"speaker_label": "<string>",
"sentiment_score": 0,
"sentiment_label": "<string>"
}
],
"summary": "<string>"
}