DictaWhisper docs

HTTP

Force/delete/read only accept realpaths under configured watch roots.

Method Path Purpose
GET /health Shared doctor report, queues, Whisper worker, ollanet reachability (?fresh=1 to skip cache)
GET /status pending / raw / done / unreadable counts
GET /tools/probe Last audio-probe job (running, bad files)
POST /tools/probe { "apply": false } scan pending audio; { "apply": true } mark unreadable. 202; 409 if already running
GET /notes/index Inbox summaries (path, tags, preview). Default: holding + unfiled + newest year. ?year= ?month= ?unreadable=1 ?all=1
GET /notes/search ?q= ?tag= ?since= ?until= `?mode=lex\ semantic\ hybrid ?limit= ?unreadable=1`
GET /notes/years Year counts from the SQLite index
GET /notes/tags Tag counts (?includeSingletons=1)
GET /notes/stats Index size, embed coverage, last rebuild
GET /note?file= Full sidecar (allowlisted)
GET /audio?file= Stream allowlisted audio (sidecar or audio path)
POST /audio Multipart file (or audio) + optional clipName → drop folder, process immediately
POST /transcribe/force { "file": "..." } retry transcription
POST /process/force Re-run cleanup on an existing note
POST /process/skip Leave the raw transcript; skip later cleanup
POST /holding/resolve `{ "file", "action": "overwrite" \ "rename" \ "unfile" }`
POST /tags/consolidate/preview Merge plan (useModel, default true)
POST /tags/consolidate/apply { "groups": [{ "keep", "drop" }] }