Niravi Docs
GitHub ↗ Get a key ↗

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, offsetpagination.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:

ResourceWhat you get
transcriptTime-coded transcription segments
scenesDetected scenes with descriptions
facesFace detections + character clusters
speakersDiarized speakers
sounds / sound-eventsNon-speech audio events
music-tracksIdentified music
charactersNamed/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.