API reference

Base URL https://whisper.thundera.eu. JSON in, JSON out.

Authentication

Send the thundera_token cookie (browser), Authorization: Bearer <access token> (native), or X-API-Key: sk_sus_… (organization key). Tokens come from auth.thundera.eu; native clients refresh with POST https://auth.thundera.eu/api/v1/auth/refresh.

Errors

Errors are {"error": "CODE", "message": "..."} with the matching HTTP status: 400 BAD_REQUEST, 401 UNAUTHORIZED, 403 FORBIDDEN, 404 NOT_FOUND, 413 PAYLOAD_TOO_LARGE, 429 (rate limit). Authenticated request bodies are limited to 2 MB.

Public

MethodPathAuthDescription
GET/api/v1/healthnoneHealth check.
GET/api/plansnoneWhisper plans, proxied from the central catalogue (also /api/v1/plans). Cached 60 s.
GET/api/v1/updates/macosnonemacOS update manifest with verified size and SHA-256.
GET/api/v1/updates/macos/filenonemacOS update artifact (no-store).
GET/api/v1/updates/windowsnoneWindows update manifest.
GET/api/v1/updates/windows/filenoneWindows update artifact.

Account and usage

MethodPathAuthDescription
GET/api/v1/auth/meuserCurrent user from the token.
GET/api/v1/usageuser{words_used, word_limit, plan_tier, reset_date}.
GET/api/v1/downloadsuserAvailable client downloads.
GET/api/v1/downloads/file?platform=macos|windows|ios|androiduserDownload a client. 400 without platform, 404 if none.

Dictation

MethodPathAuthDescription
GET/api/v1/streamuserWebSocket upgrade for streaming dictation (see below).
POST/api/v1/polishuserBody {text, source_language, target_language, tone, developer_mode, naming_convention, custom_vocab[]}. Returns {text, polished, source_language, target_language, translated}. On any model failure returns the raw text with polished:false.
POST/api/v1/transcribeuserBody {audio (base64, ≤ 25 MB), language, tone}. Batch transcription plus cleanup.

WebSocket protocol

Client → server:

{"type":"control","action":"start","language":"en","mode":"dictation"}
{"type":"audio","data":"<base64-pcm>","sequence":1}
{"type":"control","action":"command_mode","selected_text":"text to transform"}
{"type":"control","action":"stop"}
{"type":"heartbeat"}

Server → client: session, transcript (text, is_final, sequence), command_result (original, transformed, preview), heartbeat, error (code such as QUOTA_EXCEEDED).

Dictionary, snippets, notes

MethodPathAuthDescription
GET/api/v1/vocabularyuserList terms (paginated).
POST/api/v1/vocabularyuser{term, pronunciation_hint, category}.
PUT/api/v1/vocabulary/{id}userUpdate a term.
DELETE/api/v1/vocabulary/{id}userDelete a term.
GET/api/v1/snippetsuserList snippets (paginated).
POST/api/v1/snippetsuser{trigger_phrase, expansion_text, category}.
PUT/api/v1/snippets/{id}userUpdate a snippet.
DELETE/api/v1/snippets/{id}userDelete a snippet.
GET/api/v1/notesuserList notes.
POST/api/v1/notesuser{title?, text}.
PATCH/api/v1/notes/{id}userPartial update {title?, text?}.
DELETE/api/v1/notes/{id}userDelete a note.

Settings

MethodPathAuthDescription
GET / PUT/api/v1/settingsuserUser settings (tone, language, translation).
GET / PUT/api/v1/settings/developeruserDeveloper mode and naming convention.
PUT/api/v1/settings/hipaauserHIPAA mode switch.
GET / POST/api/v1/settings/appsuserPer-application settings.
PUT / DELETE/api/v1/settings/apps/{appId}userUpdate or remove one application’s settings.

Organizations (admin role)

MethodPathAuthDescription
GET/api/v1/org/settingsorg adminOrganization settings.
PUT/api/v1/org/settings/hipaaorg admin{hipaa_mode: bool}.
GET / POST/api/v1/org/membersorg adminList or invite {email, role}.
DELETE/api/v1/org/members/{userId}org adminRemove a member.
GET / POST/api/v1/org/api-keysorg adminList or create {name} (key shown once).
DELETE/api/v1/org/api-keys/{id}org adminRevoke a key.
GET / PUT/api/v1/admin/polish/statussystem adminRead or set the AI-cleanup kill switch {enabled: bool}.

Example: polish a transcript

curl -X POST https://whisper.thundera.eu/api/v1/polish \
  -H "X-API-Key: $WHISPER_KEY" -H "Content-Type: application/json" \
  -d '{"text":"um so the meeting is uh at three","tone":"concise"}'