Jumper Public API v1
Base URL:http://localhost:6699/api/v1
Jumper analyzes your media files locally on your machine. This API lets external tools (MAM systems, automation scripts, custom integrations) tap into those capabilities: semantic search across video, speech transcription, face detection and clustering, and more.
Authentication
Every endpoint except/health requires a Jumper Pro license key. Pass it one of two ways:
The key is validated on the first request and cached for the session — subsequent requests with the same key skip the network check.
/auth_by_settings is an internal bootstrap endpoint and does not authenticate later /api/v1 calls by itself. Public API clients should still send X-License-Key or license_key on each /api/v1 request.
Error responses:
Typical Workflow
Most integrations follow this pattern:- Check health — verify the backend is running
- Analyze media — run visual and/or speech analysis on your files
- Load analysis data — load analysis results into memory for searching
- Search — find matching moments by text, image, or frame similarity
- Get transcriptions — retrieve speech-to-text results
- Get thumbnails — fetch preview images for specific timestamps
Endpoints
Health
GET /health
No authentication required. Use this to check if the backend is running.
Response:
Models
GET /models/loaded
Returns which visual and speech analysis models are currently loaded in memory.
Example request:
GET /models/available
Lists all models supported on this hardware, which are downloaded, and which is active.
Example request:
model_info is an array of single-key objects, where each key is a model_key from supported_models. current_system is one of mac-arm, mac-x86, windows, or linux.
POST /models/load
Switches to a different visual model. The model must already be downloaded. This clears loaded analysis data from memory — you’ll need to reload it afterwards.
Example request:
Media Metadata
POST /media/metadata
Returns file properties (duration, FPS, timecode) and analysis status for each file. This is the way to check which files have been analyzed and to get their hash_str identifiers.
Example request:
video_cached—trueif visual analysis data exists (for videos/images)audio_cached—trueif a transcription exists (for videos/audio)hash_str— unique identifier for this file, used internally and in other endpoints
Analysis
POST /analyze
Starts analyzing media files. This is asynchronous — it returns immediately with a task_id, and the actual work runs in the background.
You can combine visual analysis, transcription, and face clustering in one call.
Batching matters: one request with 50 files is much faster than 50 one-file requests on the same backend, because Jumper loads the ML models per analysis request.
Only one analysis task can run at a time per backend instance. A new /analyze request first tries to stop any current task. If the previous task is still unwinding, the new request returns 409.
Example request — visual + transcription + face clustering:
detect_speakers is optional and defaults to true. Set it to false to skip final speaker diarization for the speech batch. speaker_count is optional and defaults to "auto"; accepted values are "auto", 1, 2, 3, 4, and "5+". For pyannote, 1-4 becomes num_speakers, while "5+" becomes min_speakers=5, max_speakers=12. preferred_qwen_model_key is optional and applies to Qwen-supported languages; use "faster" for the 0.6B model, "more accurate" for the 1.7B model, or "auto"/omit it for Jumper’s default. detect_speakers, speaker_count, and preferred_qwen_model_key can also be supplied on individual transcription_jobs to override the batch setting.
Example request — with face clustering:
http://localhost:6699, emit join with the returned task_id, then listen for progress events:
Transcription job fields:
POST /analyze/cancel
Cancels any running analysis task.
Analysis Data Management
Before you can search, the analysis data needs to be loaded into memory. There are two approaches:POST /analysis-data/load
Loads all analysis data from the folder into memory — visual embeddings, people metadata, and transcriptions. Best when you want to search across everything.
POST /analysis-data/load-for-media
Loads visual analysis data for specific video/image files only. More efficient when working with a subset. Skips files already in memory.
This endpoint does not load transcriptions. Use /analysis-data/load to load everything, or /analysis-data/load-transcriptions for transcript-only workflows.
POST /analysis-data/load-transcriptions
Loads transcription data into memory separately. This is useful if you only need transcript search and don’t want to load visual analysis data. Transcriptions are also loaded automatically by /analysis-data/load.
Metadata Filters
POST /metadata/facets
Returns curated metadata filter facets and coverage for a searchable scope. Call this when you need to render metadata filter options, then pass selected filters to search as metadata_filter_request.
For search_all: true or scope.mode: "global", the response is scoped to the backend’s loaded searchable media for the requested media_type (visual, speech, or any), not every row in the local metadata database.
Example request:
media_paths and hash_strs are index-aligned. If you omit scope, Jumper derives it from search_all, media_type, media_paths, hash_strs, and expected_count.
Response:
is_any_of, is_not, include_any_of, include_all_of, exclude_any_of, exclude_all_of, before, after, greater_than, and less_than.
Search
All search endpoints require analysis data to be loaded into memory first (see above). The visual search endpoints (/search/text, /search/image, /search/frame) return the same match structure and order results best-first. Jumper does not return similarity scores in the response payload. The optional exclude field is a soft ranking signal, not a hard filter. metadata_filter_request applies hard metadata filters from /metadata/facets.
POST /search/text
Semantic visual search — describe what you’re looking for in plain language.
Example request:
frame_idx is the frame number on the 1-FPS embedding grid, returned as a string. original_index is the result’s position in the underlying ranking before per-video grouping.
Parameters:
Filtering by people:
If you’ve run face clustering, you can restrict results to frames containing specific people:
POST /search/image
Find moments visually similar to a reference image. Optionally combine with a text query.
Example request:
POST /search/frame
Find moments similar to a specific frame in a video — a “find more like this” search.
Example request:
POST /search/transcript
Search through loaded transcriptions for segments containing a query string. Uses case-insensitive substring matching. To search only within one named transcript speaker, pass speaker or speaker_name.
Example request:
people_filter.
Parameters:
Transcriptions
POST /transcriptions
Returns speech transcriptions for media files that have been transcribed via /analyze.
Example request:
[start_seconds, text, end_seconds, media_path]
Thumbnails
POST /thumbnails
Get base64-encoded JPEG thumbnail images for specific media/timestamp pairs.
Example request:
thumbnail is a base64-encoded JPEG string, or null for audio files.
POST /thumbnails/scene
Get a strip of thumbnails spanning a time range. Useful for timeline scrubbers.
Example request:
[base64_jpeg, timestamp]. For ranges longer than 100 seconds, Jumper samples 100 evenly-spaced frames instead of one per second.
Face Clustering
Jumper detects faces across video frames and automatically groups them by identity. These endpoints let you inspect, name, and refine those groups.GET /faces/clusters
Lists all clustering jobs and their statistics.
Example request:
face_storage_version reports the on-disk face storage format for the job. Newer jobs use the packed format; older legacy jobs may not be mutable for reclustering or merges.
POST /faces/clusters/samples
Get sample face thumbnail images for each cluster. Useful for building a “who is this?” UI.
Example request:
POST /faces/clusters/faces
Get paginated face images for specific cluster(s). For browsing all faces in a cluster.
Example request:
PUT /faces/clusters/names
Assign human-readable names to clusters.
Example request:
POST /faces/recluster
Re-runs face clustering with different parameters. Useful for tuning how aggressively faces are grouped. Runs asynchronously.
Example request:
POST /faces/clusters/modify
Merge clusters or move individual faces between clusters. Useful for correcting mistakes.
Example — merge two clusters:
Watch Folders
Watch folders let Jumper automatically analyze new media files as they appear in a directory.GET /watch-folders
Lists all configured watch folders and the background service status.
POST /watch-folders
Add a new watch folder. The folder must exist on disk.
excluded_filename_globs apply to the basename only, not the relative or absolute path.
excluded_folder_globs entries without a path separator match any folder name; for example, finished skips files inside any folder named finished or Finished. Entries with / or \ match relative folder paths under the watched folder; for example, client_a/finished_* skips matching folders under client_a only. Backslashes are normalized to /. Path patterns match segment by segment, so */folder2/finished matches one parent folder above folder2, while folder2/finished matches only from the watch-folder root.
PUT /watch-folders/{id}
Update settings for an existing watch folder. Only include the fields you want to change.
DELETE /watch-folders/{id}
Remove a watch folder. Does not delete any analysis data.
POST /watch-folders/service/start
Start the background service that monitors watch folders. This uses the enabled watch-folder configuration already stored in settings; it does not require prior UI interaction in the current session.
POST /watch-folders/service/stop
Stop the background service.
GET /watch-folders/service/status
Check if the service is running.
Cache Paths
POST /cache-paths
Get the visual and audio cache folder paths for a specific media file. Useful for inspecting or managing analysis data on disk.
null if the corresponding analysis hasn’t been run yet.
Export
POST /export/clips
Export trimmed video clips to a folder using ffmpeg.
Example request:
POST /export/premiere-xml
Generate a Premiere Pro compatible XML sequence file (XMEML v4). Can be imported into Premiere Pro, DaVinci Resolve, Avid, and other NLEs.
Example request:
POST /export/transcript
Export transcript segments to a file (TXT, CSV, DOCX, or PDF).
Example request:
Error Format
All errors follow the same structure:SocketIO Progress Tracking
For long-running operations (/analyze, /faces/recluster), connect to the SocketIO server at http://localhost:6699 and join the room matching the returned task_id.
In Socket.IO terms, emit join with the returned task_id, then listen for progress.
Event: progress
progress— numeric percentagevideo_path— the file currently being processed, ornullfor some clustering updatesdone—truewhen the task is completetype—"video"for visual analysis,"speech"for transcriptionis_cluster_job— present for face-clustering progresscluster_job_name— present for face-clustering progresscluster_media_hashes— present on some clustering completion events

