Changelog & deprecations
Deprecations
Deprecated features keep working; they get no new capabilities. A removal date will be announced on this page before anything is turned off.
| Deprecated | Since | Use instead | Today |
|---|---|---|---|
NiNo tiers on upload: pipeline=lite, pro, max, nino_lite, nino_pro, nino_max (and older engine names) | 2026-10-14 | Leave pipeline out (Arrow is the default since 2026-10-15) | Still run for videos when named. No pages, regions, People or index options |
nino_tier on GET /videos/{id} | 2026-10-14 | index.options and index.report | Still returned; null for Arrow assets |
NiQu search: "engine": "classic" | 2026-10-14 | "engine": "arrow" | Still answers for libraries indexed by NiNo, and is still the default engine of a workspace that holds NiNo assets. New, empty and Arrow-only workspaces default to Arrow since 2026-10-16. GET /engines shows its status as deprecated |
Moving to Arrow. Every upload runs on Arrow, and a new workspace (or one that is empty or holds only Arrow assets) searches with Arrow by default, so there is nothing to change. A workspace that still holds NiNo assets keeps classic as its default: search its new uploads with "engine": "arrow". Arrow searches only what Arrow indexed, so for an existing library, re-upload the NiNo assets, or write to hello@niravi.io and we will re-index it for you; once it holds only Arrow assets, Arrow becomes its default.
2026-10-16
Media access. Every route that returns a private workspace’s media or content (frames, face crops, video, analysis, evidence, exports) now requires a key or a signed-in member; demo workspaces stay public. Media links in v1 responses (frame_url, thumbnail_url, crop_url) point at v1 routes that take your key, and private media is served Cache-Control: private. New: GET /api/v1/videos/{id}/faces/{face_id}/crop.
Fixed: on-screen text on audio-first files. A video whose picture starts after its audio got a duplicated first keyframe: every keyframe timestamp was one second late and on-screen text and scene labels were lost. Keyframes now carry their real timestamps.
Engines and processing details. GET /engines answers for your workspace (default, workspace_default, deployment_default; Arrow is current). Video details gain index.stages_failed and index.degraded, and the upload’s eta_seconds counts the work queued ahead.
Arrow is the default search engine. Every new workspace searches with Arrow, and so does every workspace that is empty or holds only Arrow assets (existing ones were switched). engine on a request still overrides it. Every ingest path (HTTP, both SDKs, the dashboard, link imports) runs Arrow. → Indexing & engines
Search. → Search
moments_per_video(1 to 10, default 1) returns up to that many moments per video in a library search.- Each hit gains
raw_score(the fused score before pool normalisation; the weakest candidate reads 0);scoreis 0..1 with the best hit 1.0, and a whole-library Arrow search normalises it against the whole candidate pool. - Assets still processing (or failed) never appear in results.
- The first search of a library takes about 4 seconds, then under a second; a finished upload is searchable within seconds of completing (3 to 7 s measured).
- Magic search runs on Arrow workspaces: location, emotion, music and character search Arrow’s captions, scene labels, sound events, audio segments, face clusters and People.
meta.searchlists the legs used and the facets that are unavailable.
.nmap export. GET /videos/{id}/nmap downloads an asset’s whole index as one portable ZIP: manifest.json, raw.json and vectors.npz. 409 not_ready while processing; ETag + If-None-Match. → Videos
Frames and subtitles as files. GET /videos/{id}/frames/{timestamp} returns the nearest stored keyframe (one per second) and says which one; ?format=jpeg or Accept: image/jpeg returns the JPEG. subtitles.srt / subtitles.vtt return the raw file with ?format=file or Accept: application/x-subrip / text/vtt. → Videos
One error envelope. Every /api/v1 failure is {success: false, error: {code, message, status}, meta: {request_id}, detail}, including authentication, scope, workspace and rate-limit errors and unknown paths. detail is a legacy mirror. → Errors
Rate limits. The X-RateLimit-* headers are on every v1 response once the key is recognised (a 401 has none), plus X-RateLimit-Limit / X-RateLimit-Remaining aliases of the minute window. Limits for the paid plans (Starter, Studio, Team, Team Premium) are published, and a key follows its workspace’s current plan. → Rate limits
Chat and recall. Answers are grounded in the workspace’s engine (Arrow included) and carry citations (video_id, timestamp, text). A failure to compose an answer is 502 chat_unavailable, never an empty 200. → Recall & Chat
Processing. A job that cannot finish marks its video failed instead of leaving it processing. Long videos are processed with bounded memory: a 54-minute 1080p episode indexed in about 22 minutes.
Keys. In the dashboard, a workspace owner’s key list and new keys follow the selected workspace.
OpenAPI 1.1.0. The consumer spec adds the .nmap route, moments_per_video, raw_score, the ApiError envelope and ChatCitation. → API Reference
SDKs and MCP 0.2.0. @niravi/sdk 0.2.0: engine and momentsPerVideo on search; upload() takes pipeline, options, language and contentType, streams from disk with no upload timeout and is never resent after a 5xx; rateLimit reads every header; typed errors from the envelope; Video helpers for shots, characters, audio segments, sound events, storyboard, subtitles, frames, regions, .nmap and delete; downloadNmap, engines(), indexOptions(). @niravi/mcp 0.2.0: 37 read-only tools. The Python SDK 0.2.0 has the same surface and is not on PyPI yet.
2026-10-15
Arrow is the default pipeline. An upload without pipeline (or with pipeline=auto) runs on Arrow: the HTTP API, the SDK’s upload() and the dashboard. A NiNo tier runs only when you name it.
Docs. Concepts now gives the real rate-limit headers (X-RateLimit-Limit-Minute, X-RateLimit-Limit-Day, X-RateLimit-Remaining-Minute, X-RateLimit-Reset), the plan limits and the three error body shapes. Examples use the demo workspaces every key can read (demo_newsroom, demo_enterprise, demo_creator) and plain HTTP for Python.
2026-10-14
Images & documents. Upload photos, PDFs, decks, Office and text files with the same POST /videos; the response says kind (video / image / document). Video detail gains kind and page_count. → Images & documents
GET /videos/{id}/pages/{page}: a document page’s text, passages with boxes, render and regions.GET /videos/{id}/regions: every object, face and text box on an asset, normalized top-left.- Search hits (
engine: arrow) gainasset_kind,page,passageandregion.
Objects. A new objects stage boxes everyday things plus logos, signs, screens, flags, charts, diagrams, maps, posters and helmets, and your own vocabulary. → Indexing
People. Faces (now open-source models, on by default) are grouped into people across the whole workspace: GET /people, GET /people/{id}, rename / hide / cover with PATCH, merge, remove, recluster. → People
Delete purges. DELETE /videos/{id} is owner-only (403 for an asset shared into your workspace), hides the asset at once and purges it in the background: search indexes, pages, regions, faces and stored files, with People refreshed. The response adds "purging": true.
Deprecated: NiNo tiers, nino_tier and the NiQu (classic) engine. See Deprecations.
2026-10-13
Index options. Choose stages per upload (options form field) or per workspace (GET / PUT /index-options): transcript language, speakers, sounds, labels, OCR languages (English, Hindi), faces. Each video’s run is reported in index.report. → Indexing
2026-10-12
Engines. POST /search takes "engine": "arrow" | "classic"; GET /engines lists the engines and your default. The response says which engine answered (engine, recipe) and why another one did (engine_fallback).
2026-06-22
Workspaces. Per-key workspace access lists, GET /workspaces, X-Workspace-Id, read-only demo workspaces, and federated search with workspace_ids (each hit tagged with its workspace_id). → Concepts
MCP & SDKs. The TypeScript SDK and the MCP server on npm (@niravi/sdk, @niravi/mcp), and the remote MCP at mcp.niravi.io for Claude. → MCP
2026-06-17
API keys. Self-service keys with scopes and expiry in the dashboard, per-key usage, nv_ keys accepted as X-API-Key or Authorization: Bearer. → Concepts