Indexing & engines
Arrow is Niravi’s engine: it indexes videos, photos and documents in the cloud and answers search with the moment, the page, the passage and the box. What it extracts is up to you, per upload or per workspace.
Engines
| Engine | Upload with | Search with | Status |
|---|---|---|---|
| Arrow | pipeline=arrow (images and documents always) | "engine": "arrow" | Current. Everything new (images, documents, pages, regions, People, index options) is Arrow-only |
| NiNo (Lite / Pro / Max) | pipeline=lite | pro | max or nino_* | Deprecated | |
NiQu (classic) | "engine": "classic" | Deprecated |
GET /api/v1/engines lists the search engines, their status and which one is the default for your workspace. If you omit engine, your workspace’s default answers. That is still classic for libraries indexed before Arrow, so pass "engine": "arrow" explicitly for anything you upload with Arrow. See Deprecations for what that means and what to change.
Stages
An Arrow run is made of stages. Each one can be switched on or off, and some take values:
| Stage | Default | Values | Produces |
|---|---|---|---|
transcript | on | language (auto or an ISO code, e.g. hi) | Timed transcript |
captions | on | A description per shot (and per picture page) + a summary | |
speakers | on | min_speakers, max_speakers | Who spoke when, speaker on each transcript segment |
sounds | on | min_confidence (0.25) | Sound events (AudioSet labels) |
labels | on | min_confidence (0.5), top_k (5) | Scene labels per frame |
ocr | on | fps (0.5), languages (en, hi) | On-screen and on-page text with boxes |
faces | on | fps (1), min_face_px (32) | Faces with boxes and quality |
objects | on | min_confidence (0.45), max_regions (50), vocabulary | Object boxes on photos and picture pages |
people | on | Faces grouped into workspace People (needs faces) | |
music | off | Not available on this deployment |
A stage that does not apply reports not_applicable (no audio stages on a photo; no objects on video).
Objects
Objects come from a closed-set detector (people, vehicles, animals, screens and other everyday things) and an open-vocabulary detector asked for logo, sign, screen, flag, chart, diagram, map, poster and helmet. Add your own phrases with vocabulary (up to 40; each costs a detector pass, so keep it short):
{ "objects": { "vocabulary": ["hard hat", "forklift", "safety vest"] } }
Per upload
Send pipeline=arrow and, optionally, an options form field holding JSON. Fields you omit fall back to your workspace’s defaults, then to the deployment’s.
curl https://api.niravi.io/api/v1/videos \
-H "X-API-Key: $NIRAVI_API_KEY" \
-F "[email protected]" -F "pipeline=arrow" \
-F 'options={"ocr": {"languages": ["en", "hi"]}, "objects": false}'
The upload acknowledgement echoes the effective index_options. A stage takes true / false or an object of its values. Bad options answer 422 invalid_options before anything is stored.
Per workspace
GET /api/v1/index-options lists every stage with its description, default, availability and values, plus your workspace’s overrides (workspace) and the result (effective). PUT the same shape to set the workspace’s defaults (write scope; {} clears them):
curl -X PUT https://api.niravi.io/api/v1/index-options \
-H "X-API-Key: $NIRAVI_API_KEY" -H "Content-Type: application/json" \
-d '{"ocr": {"languages": ["en", "hi"]}, "people": false}'
What ran
GET /api/v1/videos/{id} returns index.options (what the run was asked to do) and index.report (what each stage did: ok, off, not_applicable or failed with the reason, counts and timings). A failed stage never fails the whole run: the rest of the index is still written and searchable.