Videos & processing
List your corpus, drill into a single video’s analysis, upload new footage, and export.
List & fetch
GET /api/v1/videos is paginated (limit, offset → pagination.has_more). GET /api/v1/videos/{id} returns one video’s full detail.
for v in client.videos(all_pages=True):
print(v.video_id, v.filename)
video = client.get_video(video_id)
const videos = await niravi.videos({ allPages: true });
const video = await niravi.getVideo(videoId);
Analysis sub-resources
Each video exposes its derived analysis as separate endpoints (GET /api/v1/videos/{id}/<resource>), grouped under Analysis in the reference:
| Resource | What you get |
|---|---|
transcript | Time-coded transcription segments |
scenes | Detected scenes with descriptions |
faces | Face detections + character clusters |
speakers | Diarized speakers |
sounds / sound-events | Non-speech audio events |
music-tracks | Identified music |
characters | Named/linked characters |
v = client.get_video(video_id)
v.transcript(); v.scenes(); v.faces(); v.speakers(); v.sounds(); v.music_tracks()
const v = await niravi.getVideo(videoId);
await v.transcript(); await v.scenes(); await v.faces(); await v.speakers(); await v.sounds();
Exports
Render a video’s analysis into deliverables (under Exports in the reference): screenplay, subtitles.srt, subtitles.vtt, and storyboard.
print(v.screenplay())
Upload (write scope)
POST /api/v1/videos ingests a local file for processing. Requires a key with the write scope.
created = client.upload("/path/to/clip.mp4")
print(created.video_id) # poll get_video(...) until processing completes
const created = await niravi.upload("/path/to/clip.mp4"); // Node
Processing is asynchronous — the video becomes searchable as each stage completes. Poll get_video(id) for status.