curl --request POST \
--url http://localhost:6699/api/v1/analyze \
--header 'Content-Type: application/json' \
--header 'X-License-Key: <api-key>' \
--data '
{
"cache_dir": "<string>",
"detect_speakers": true,
"speaker_count": "auto",
"preferred_qwen_model_key": "auto",
"visual_media_paths": [
"<string>"
],
"transcription_jobs": [
{
"path": "<string>",
"language": "english",
"detect_speakers": true,
"speaker_count": "auto",
"preferred_qwen_model_key": "auto",
"channels": null
}
],
"face_clustering_jobs": [
{
"cluster_job_name": "<string>",
"face_media_paths": [
"<string>"
],
"face_eps": 123,
"face_min_samples": 123
}
]
}
'import requests
url = "http://localhost:6699/api/v1/analyze"
payload = {
"cache_dir": "<string>",
"detect_speakers": True,
"speaker_count": "auto",
"preferred_qwen_model_key": "auto",
"visual_media_paths": ["<string>"],
"transcription_jobs": [
{
"path": "<string>",
"language": "english",
"detect_speakers": True,
"speaker_count": "auto",
"preferred_qwen_model_key": "auto",
"channels": None
}
],
"face_clustering_jobs": [
{
"cluster_job_name": "<string>",
"face_media_paths": ["<string>"],
"face_eps": 123,
"face_min_samples": 123
}
]
}
headers = {
"X-License-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-License-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
cache_dir: '<string>',
detect_speakers: true,
speaker_count: 'auto',
preferred_qwen_model_key: 'auto',
visual_media_paths: ['<string>'],
transcription_jobs: [
{
path: '<string>',
language: 'english',
detect_speakers: true,
speaker_count: 'auto',
preferred_qwen_model_key: 'auto',
channels: null
}
],
face_clustering_jobs: [
{
cluster_job_name: '<string>',
face_media_paths: ['<string>'],
face_eps: 123,
face_min_samples: 123
}
]
})
};
fetch('http://localhost:6699/api/v1/analyze', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "6699",
CURLOPT_URL => "http://localhost:6699/api/v1/analyze",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'cache_dir' => '<string>',
'detect_speakers' => true,
'speaker_count' => 'auto',
'preferred_qwen_model_key' => 'auto',
'visual_media_paths' => [
'<string>'
],
'transcription_jobs' => [
[
'path' => '<string>',
'language' => 'english',
'detect_speakers' => true,
'speaker_count' => 'auto',
'preferred_qwen_model_key' => 'auto',
'channels' => null
]
],
'face_clustering_jobs' => [
[
'cluster_job_name' => '<string>',
'face_media_paths' => [
'<string>'
],
'face_eps' => 123,
'face_min_samples' => 123
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-License-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 := "http://localhost:6699/api/v1/analyze"
payload := strings.NewReader("{\n \"cache_dir\": \"<string>\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"visual_media_paths\": [\n \"<string>\"\n ],\n \"transcription_jobs\": [\n {\n \"path\": \"<string>\",\n \"language\": \"english\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"channels\": null\n }\n ],\n \"face_clustering_jobs\": [\n {\n \"cluster_job_name\": \"<string>\",\n \"face_media_paths\": [\n \"<string>\"\n ],\n \"face_eps\": 123,\n \"face_min_samples\": 123\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-License-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:6699/api/v1/analyze")
.header("X-License-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"cache_dir\": \"<string>\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"visual_media_paths\": [\n \"<string>\"\n ],\n \"transcription_jobs\": [\n {\n \"path\": \"<string>\",\n \"language\": \"english\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"channels\": null\n }\n ],\n \"face_clustering_jobs\": [\n {\n \"cluster_job_name\": \"<string>\",\n \"face_media_paths\": [\n \"<string>\"\n ],\n \"face_eps\": 123,\n \"face_min_samples\": 123\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:6699/api/v1/analyze")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["X-License-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"cache_dir\": \"<string>\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"visual_media_paths\": [\n \"<string>\"\n ],\n \"transcription_jobs\": [\n {\n \"path\": \"<string>\",\n \"language\": \"english\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"channels\": null\n }\n ],\n \"face_clustering_jobs\": [\n {\n \"cluster_job_name\": \"<string>\",\n \"face_media_paths\": [\n \"<string>\"\n ],\n \"face_eps\": 123,\n \"face_min_samples\": 123\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "Analysis started",
"task_id": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Start media analysis
Starts an asynchronous analysis pipeline. Returns immediately with a task_id
that can be used to track progress via SocketIO.
You can run visual analysis, speech transcription, and face clustering in a single call.
For throughput, batch many files into one request instead of sending many single-file requests. Jumper loads ML models per analysis request, so one 50-file request is much faster than 50 one-file requests on the same node.
Only one analysis task can run at a time per backend instance. A new analyze
request first asks the current task to stop. If the previous task is still
unwinding, Jumper returns 409.
curl --request POST \
--url http://localhost:6699/api/v1/analyze \
--header 'Content-Type: application/json' \
--header 'X-License-Key: <api-key>' \
--data '
{
"cache_dir": "<string>",
"detect_speakers": true,
"speaker_count": "auto",
"preferred_qwen_model_key": "auto",
"visual_media_paths": [
"<string>"
],
"transcription_jobs": [
{
"path": "<string>",
"language": "english",
"detect_speakers": true,
"speaker_count": "auto",
"preferred_qwen_model_key": "auto",
"channels": null
}
],
"face_clustering_jobs": [
{
"cluster_job_name": "<string>",
"face_media_paths": [
"<string>"
],
"face_eps": 123,
"face_min_samples": 123
}
]
}
'import requests
url = "http://localhost:6699/api/v1/analyze"
payload = {
"cache_dir": "<string>",
"detect_speakers": True,
"speaker_count": "auto",
"preferred_qwen_model_key": "auto",
"visual_media_paths": ["<string>"],
"transcription_jobs": [
{
"path": "<string>",
"language": "english",
"detect_speakers": True,
"speaker_count": "auto",
"preferred_qwen_model_key": "auto",
"channels": None
}
],
"face_clustering_jobs": [
{
"cluster_job_name": "<string>",
"face_media_paths": ["<string>"],
"face_eps": 123,
"face_min_samples": 123
}
]
}
headers = {
"X-License-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-License-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
cache_dir: '<string>',
detect_speakers: true,
speaker_count: 'auto',
preferred_qwen_model_key: 'auto',
visual_media_paths: ['<string>'],
transcription_jobs: [
{
path: '<string>',
language: 'english',
detect_speakers: true,
speaker_count: 'auto',
preferred_qwen_model_key: 'auto',
channels: null
}
],
face_clustering_jobs: [
{
cluster_job_name: '<string>',
face_media_paths: ['<string>'],
face_eps: 123,
face_min_samples: 123
}
]
})
};
fetch('http://localhost:6699/api/v1/analyze', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "6699",
CURLOPT_URL => "http://localhost:6699/api/v1/analyze",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'cache_dir' => '<string>',
'detect_speakers' => true,
'speaker_count' => 'auto',
'preferred_qwen_model_key' => 'auto',
'visual_media_paths' => [
'<string>'
],
'transcription_jobs' => [
[
'path' => '<string>',
'language' => 'english',
'detect_speakers' => true,
'speaker_count' => 'auto',
'preferred_qwen_model_key' => 'auto',
'channels' => null
]
],
'face_clustering_jobs' => [
[
'cluster_job_name' => '<string>',
'face_media_paths' => [
'<string>'
],
'face_eps' => 123,
'face_min_samples' => 123
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-License-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 := "http://localhost:6699/api/v1/analyze"
payload := strings.NewReader("{\n \"cache_dir\": \"<string>\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"visual_media_paths\": [\n \"<string>\"\n ],\n \"transcription_jobs\": [\n {\n \"path\": \"<string>\",\n \"language\": \"english\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"channels\": null\n }\n ],\n \"face_clustering_jobs\": [\n {\n \"cluster_job_name\": \"<string>\",\n \"face_media_paths\": [\n \"<string>\"\n ],\n \"face_eps\": 123,\n \"face_min_samples\": 123\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-License-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:6699/api/v1/analyze")
.header("X-License-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"cache_dir\": \"<string>\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"visual_media_paths\": [\n \"<string>\"\n ],\n \"transcription_jobs\": [\n {\n \"path\": \"<string>\",\n \"language\": \"english\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"channels\": null\n }\n ],\n \"face_clustering_jobs\": [\n {\n \"cluster_job_name\": \"<string>\",\n \"face_media_paths\": [\n \"<string>\"\n ],\n \"face_eps\": 123,\n \"face_min_samples\": 123\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:6699/api/v1/analyze")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["X-License-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"cache_dir\": \"<string>\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"visual_media_paths\": [\n \"<string>\"\n ],\n \"transcription_jobs\": [\n {\n \"path\": \"<string>\",\n \"language\": \"english\",\n \"detect_speakers\": true,\n \"speaker_count\": \"auto\",\n \"preferred_qwen_model_key\": \"auto\",\n \"channels\": null\n }\n ],\n \"face_clustering_jobs\": [\n {\n \"cluster_job_name\": \"<string>\",\n \"face_media_paths\": [\n \"<string>\"\n ],\n \"face_eps\": 123,\n \"face_min_samples\": 123\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "Analysis started",
"task_id": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Jumper Pro license key passed via header
Body
Where to store analysis results
Set to false to skip final speaker diarization for transcription jobs.
Optional speaker-count hint for pyannote diarization. Use auto for unconstrained detection, 1-4 for num_speakers, or 5+ for min_speakers=5 and max_speakers=12.
auto, auto-detect, 5+ Optional Qwen ASR preference for Qwen-supported languages. Use faster for the 0.6B model, more accurate for the 1.7B model, or auto/default to use Jumper's default.
auto, faster, more accurate, qwen3-asr-0.6b, qwen3-asr-1.7b Files to run visual analysis on
Files to transcribe, with optional language and channel hints
Show child attributes
Show child attributes
Face detection and clustering job definitions
Show child attributes
Show child attributes
Was this page helpful?

