Agentic video primitives
Four layers behind one API, from the first frame to your agent. Use the ones you need, in our cloud or yours.
- About 0.5 sfrom a question to the frames that answer it
- 100,000 hourschecked and cut into samples in under a week
- 300+ TBof video processed
- 1,000+developers and agents use VideoDB every week
Primitives
Files, buckets, cameras and screens go through one pipeline. Ask for any frame or window and get exactly that.
- In
- RTSP cameras, screens, microphones, files, links, S3, GCS and Azure buckets
- Transcoding
- In-house and distributed. Seeking costs the same anywhere in the file.
- Frames
- Any frame or window on request. Tiling packs a window into one image for a model.
Understanding
Any model, open-weight, proprietary or your own, writes what it sees into your own JSON fields.
understand_video
{
"segmentation": { "type": "time", "seconds": 2 },
"analyzers": [{
"type": "vlm",
"name": "scene",
"sampling": { "strategy": "uniform",
"frame_count": 3 },
"config": { "model": "pro",
"prompt": "Describe what is visible…" }
}]
}
Done: 19 records, one for every 2 seconds of the homepage video
scene: 19 records, 6 shown
- 0:00–0:02
A small round robot in the foreground looks out over a misty mountain valley with a winding river and a cluster of illuminated village houses below…
- 0:06–0:08
A color landscape of snow-capped mountains and a misty valley, partially obscured by a semi-transparent, regular grid of colored dots…
- 0:12–0:14
Abstract, densely layered contour-like lines and swirls that look like a topographic map or fingerprint patterns…
- 0:22–0:24
Closely spaced curved contour lines that form a jagged, fractal edge on the left and broad sweeping arcs to the right…
- 0:28–0:30
A high-contrast black-and-white halftone pattern of evenly spaced dark dots on a pale background…
- 0:36–0:37.8
A small white spherical robot stands in the foreground overlooking a mist-filled mountain valley while the village windows glow…
On WGO-Bench, a VLM pipeline reaches 28.9% semantic F1 at IoU 0.5, against a 19.9% public baseline. Read the annotation benchmark
Indexes
Ask in plain language across a whole collection, then filter and count. Every result is a clip sized to the question.
4 moments from the scene index, best first
| 0:00–0:02 | …a winding river and a cluster of illuminated village houses below | 0.45 | |
| 0:02–0:04 | …a winding river and a cluster of lit village houses, while jagged snow-capped peaks in the distance catch warm alpenglow | 0.38 | |
| 0:04–0:06 | …warm pink/orange highlights on the summits and house windows | 0.36 | |
| 0:36–0:37.8 | …bathed in warm alpenglow against a deep blue sky and the village windows glow | 0.35 |
Answers come from five searches saved from real runs over the 37.8-second video at the top of the homepage, on Oct 30, 2026. Type your own words and the closest saved search answers.
VideoDB puts the right moment first 73.1% of the time, against 65.8% for a commercial video-native engine. Read the technical report
Delivery
Every answer can be a playable stream, an event or a file. Nothing is rendered ahead.
Run in our cloud or yours
The files can stay in your bucket, in the region you choose. Same SDK and MCP server either way.
SecurityRuns onAWSGoogle CloudAzureor your own cloud
Quickstart
Get your API key at console.videodb.io. Then upload a file, understand it, index it, search it and play the result.
pip install videodbPythonnpm install videodbNodenpx skills add video-db/skillsCoding agentsfrom videodb import connect
# uses your API key from console.videodb.io
conn = connect()
coll = conn.get_collection()
video = coll.upload(url="s3://lab/run-0412.mp4")
u = video.understand(analyzers=[{"type": "vlm", "name": "scene",
"config": {"prompt": "What happens, and with what result?"}}])
u.wait_until_complete()
idx = video.index(name="scene", source=u.get_analyzer("scene"))
res = video.semantic_search(query="the gripper drops the bottle",
index_ids=[idx.index_id], top_k=5)
for shot in res.get_shots():
print(shot.start, shot.end, shot.metadata)
# the result, as a playable stream
stream = res.compile()