Sessions and Recordings
Read and manage the authenticated user's Desktop Services session history, transcript results, and recordings.
Internal API
The Desktop API is internal and must not be used for customer integrations. Compatibility is not guaranteed, and these endpoints may change without notice.
Base path: /api/v1/desktop-services/sessions
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/desktop-services/sessions |
List Sessions |
GET |
/api/v1/desktop-services/sessions/{sessionId} |
Get a Session |
GET |
/api/v1/desktop-services/sessions/{sessionId}/results |
Get Transcript Results |
PATCH |
/api/v1/desktop-services/sessions/{sessionId} |
Rename a Session |
DELETE |
/api/v1/desktop-services/sessions/{sessionId} |
Permanently Delete a Session |
GET |
/api/v1/desktop-services/sessions/{sessionId}/recording |
Download a Recording |
Endpoints that address a specific session return 404 Not Found when it does not exist or is not owned by the authenticated user.
List Sessions
GET /api/v1/desktop-services/sessions
Requires Authentication - Scopes: desktop:app:use
Return a page of completed sessions that contain at least one recognized word, ordered by newest startTime first. The default view contains persisted history; set transientSession=true to request transient sessions instead.
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
page |
integer |
No | 0 |
Zero-based page number. Minimum: 0. |
size |
integer |
No | 20 |
Page size. Range: 1–100. |
nameContains |
string |
No | - | Return sessions whose name contains this text. Blank values do not filter. |
caseInsensitive |
boolean |
No | true |
Apply nameContains without case sensitivity. |
transientSession |
boolean |
No | false |
false returns persisted history; true returns transient sessions. |
DesktopSessionListResponse
| Field | Type | Nullable | Description |
|---|---|---|---|
items |
DesktopSession[] |
No | Sessions in the current page. Default: empty array. |
page |
integer |
No | Current zero-based page number. Default: 0. |
size |
integer |
No | Page size used for this response. Default: 20. |
total |
integer |
No | Total matching sessions across all pages. Default when none match: 0. |
| Status | Description |
|---|---|
200 OK |
Session page returned. |
400 Bad Request |
Pagination or query value is invalid. |
401 Unauthorized |
Access token is missing or invalid. |
403 Forbidden |
Scope is missing or session history is unavailable. |
Get a Session
GET /api/v1/desktop-services/sessions/{sessionId}
Requires Authentication - Scopes: desktop:app:use
Return metadata for one owned session.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
sessionId |
string (UUID) |
Yes | Session identifier. |
DesktopSession
| Status | Description |
|---|---|
200 OK |
Session returned. |
401 Unauthorized |
Access token is missing or invalid. |
403 Forbidden |
Scope is missing or session history is unavailable. |
404 Not Found |
Session was not found for the current user. |
Get Transcript Results
GET /api/v1/desktop-services/sessions/{sessionId}/results
Requires Authentication - Scopes: desktop:app:use
Return the finalized transcript segments in recognition order. Results are available only when the session state is FINISHED.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
sessionId |
string (UUID) |
Yes | Session identifier. |
DesktopSessionResultsResponse
| Field | Type | Nullable | Description |
|---|---|---|---|
sessionId |
string (UUID) |
No | Session identifier. |
totalSegments |
integer |
No | Number of entries in items. Default: 0. |
items |
DesktopSessionSegment[] |
No | Ordered finalized transcript segments. Default: empty array. |
{
"sessionId": "3f13e99a-5f5c-4b50-bf02-f9fb45d74cd2",
"totalSegments": 1,
"items": [
{
"index": 0,
"transcript": "Good morning.",
"confidence": 0.97,
"words": [
{ "...": "..." }
]
}
]
}
| Status | Description |
|---|---|
200 OK |
Transcript results returned. |
401 Unauthorized |
Access token is missing or invalid. |
403 Forbidden |
Scope is missing or session history is unavailable. |
404 Not Found |
Session was not found for the current user. |
409 Conflict |
Session has not reached FINISHED. |
500 Internal Server Error |
Transcript content could not be read. |
Rename a Session
PATCH /api/v1/desktop-services/sessions/{sessionId}
Requires Authentication - Scopes: desktop:app:use
Rename a completed session. Leading and trailing whitespace is removed. An empty name is accepted and is returned as Untitled Session by subsequent reads.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
sessionId |
string (UUID) |
Yes | Session identifier. |
DesktopSessionRenameRequest
| Field | Type | Required | Description |
|---|---|---|---|
name |
string |
Yes | New session name. Maximum: 255 characters. |
DesktopSession
Returns the updated session.
| Status | Description |
|---|---|
200 OK |
Session renamed. |
400 Bad Request |
Name is missing or exceeds 255 characters. |
401 Unauthorized |
Access token is missing or invalid. |
403 Forbidden |
Scope is missing or session history is unavailable. |
404 Not Found |
Session was not found for the current user. |
409 Conflict |
Session has not reached FINISHED. |
Permanently Delete a Session
DELETE /api/v1/desktop-services/sessions/{sessionId}
Requires Authentication - Scopes: desktop:app:use
Permanently delete the session record and its transcript, summaries, and recording. This action cannot be undone.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
sessionId |
string (UUID) |
Yes | Session identifier. |
Response
This endpoint returns no body on success.
| Status | Description |
|---|---|
204 No Content |
Session and associated content permanently deleted. |
401 Unauthorized |
Access token is missing or invalid. |
403 Forbidden |
Scope is missing or session history is unavailable. |
404 Not Found |
Session was not found for the current user. |
409 Conflict |
The session or its post-processing is still active. |
500 Internal Server Error |
Associated content could not be deleted. The operation can be retried. |
Download a Recording
GET /api/v1/desktop-services/sessions/{sessionId}/recording
Requires Authentication - Scopes: desktop:app:use
Stream the session recording as mono, 16 kHz, 16-bit PCM. Download the entire object, one standard HTTP byte range, or a time range.
Path and Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
sessionId |
string (UUID) |
Yes | - | Session identifier. (path) |
startMilliseconds |
integer |
No | 0 |
Inclusive start offset in milliseconds. Must be non-negative. (query) |
endMilliseconds |
integer |
No | End of recording | Exclusive end offset in milliseconds. 0 or omission reads to the end. A value beyond the recording is clamped to its duration. (query) |
Alternatively, send a single Range: bytes=<start>-<end> header. HTTP byte-range end offsets are inclusive. Suffix ranges such as bytes=-32000 are supported.
Choose one range form
Do not combine the Range header with startMilliseconds or endMilliseconds. The API returns 400 Bad Request when both forms are supplied.
Binary Response
| Header | Example | Description |
|---|---|---|
Content-Type |
audio/x-raw;format=S16LE;rate=16000;channels=1 |
Raw signed 16-bit little-endian PCM audio. |
Content-Length |
32000 |
Bytes returned. |
Accept-Ranges |
bytes |
Byte-range support. |
Content-Range |
bytes 32000-63999/320000 |
Present on 206 Partial Content. |
Content-Disposition |
inline; filename="{sessionId}.pcm" |
Suggested file name. |
X-Audio-Sample-Rate |
16000 |
Sample rate in hertz. |
X-Audio-Channels |
1 |
Channel count. |
X-Audio-Sample-Format |
S16LE |
Signed 16-bit little-endian sample format. |
X-Audio-Duration-Milliseconds |
10000 |
Full recording duration, not just the selected range. |
| Status | Description |
|---|---|
200 OK |
Entire recording returned. |
206 Partial Content |
Requested byte or time range returned. |
400 Bad Request |
Range forms were combined, a time is negative or reversed, or a time value is too large. |
401 Unauthorized |
Access token is missing or invalid. |
403 Forbidden |
Scope is missing or session history is unavailable. |
404 Not Found |
Session or recording was not found for the current user. |
416 Range Not Satisfiable |
The byte range is malformed or contains multiple ranges, or the requested byte/time range does not overlap the recording. Content-Range is bytes */{totalLength}. |
500 Internal Server Error |
Recording metadata or content could not be read. |
Data Models
DesktopSession
| Field | Type | Nullable | Description |
|---|---|---|---|
id |
string (UUID) |
No | Session identifier. |
name |
string |
No | Display name. Defaults to Untitled Session when no non-blank name is stored. |
nameModifiedByUser |
boolean |
No | Whether the user explicitly renamed the session. Default: false. |
startTime |
string (ISO 8601) |
No | Session start time. |
endTime |
string (ISO 8601) |
Yes | Terminal-state time; null while the session is not terminal. |
durationMilliseconds |
integer |
No | Recorded session duration in milliseconds. Default: 0. |
wordsCount |
integer |
No | Recognized word count. Default: 0. |
speakersCount |
integer |
No | Detected speaker count. Default: 0. |
segmentCount |
integer |
No | Final transcript segment count. Default: 0. |
mode |
string enum |
No | Session mode: DICTATION or CONVERSATION. |
hasRecording |
boolean |
No | Whether a downloadable recording is available. Default: false. |
state |
string enum |
No | Lifecycle state: CREATED, ACTIVE, FINISHED, CANCELLED, or FAILED. Initial value: CREATED. |
failureReason |
string |
Yes | Failure or cancellation detail, when available. |
lastStateUpdate |
string (ISO 8601) |
No | Most recent state transition or heartbeat time. |
postDiarizationStatus |
string enum |
Yes | Post-processing state: SKIPPED, SCHEDULED, PROCESSING, COMPLETED, or FAILED. null when not evaluated. |
postDiarizationFailureReason |
string |
Yes | Post-processing failure detail. Present only when postDiarizationStatus is FAILED. |
postDiarizationCompletedAt |
string (ISO 8601) |
Yes | Post-processing completion time. Present only when postDiarizationStatus is COMPLETED. |
diarizationEnabled |
boolean |
No | Whether speaker diarization was requested. Default: false. |
transientSession |
boolean |
No | Whether the session was created as transient. Default: false. |
diarizationRequestedMaxSpeakersCount |
integer |
No | Requested maximum speaker count. -1 means automatic detection without a configured maximum. Default: -1. |
modelName |
string |
Yes | Recognition model name, or null before a model is resolved. |
{
"id": "3f13e99a-5f5c-4b50-bf02-f9fb45d74cd2",
"name": "Follow-up visit",
"nameModifiedByUser": true,
"startTime": "2026-09-26T08:10:00Z",
"endTime": "2026-09-26T08:12:14Z",
"durationMilliseconds": 134000,
"wordsCount": 327,
"speakersCount": 2,
"segmentCount": 18,
"mode": "CONVERSATION",
"hasRecording": true,
"state": "FINISHED",
"failureReason": null,
"lastStateUpdate": "2026-09-26T08:12:14Z",
"postDiarizationStatus": "COMPLETED",
"postDiarizationFailureReason": null,
"postDiarizationCompletedAt": "2026-09-26T08:13:02Z",
"diarizationEnabled": true,
"transientSession": false,
"diarizationRequestedMaxSpeakersCount": 4,
"modelName": "he-medical-v2"
}
DesktopSessionSegment
| Field | Type | Nullable | Description |
|---|---|---|---|
index |
integer |
No | Zero-based segment position. |
transcript |
string |
No | Final text for the segment. |
confidence |
number |
No | Segment confidence score. |
words |
DesktopSessionWord[] |
No | Word-level text, timing, confidence, and speaker assignment. Default: empty array. |
DesktopSessionWord
| Field | Type | Nullable | Description |
|---|---|---|---|
word |
string |
No | Recognized word text. |
punctuation |
string |
Yes | Punctuation associated with the word. |
startSeconds |
number |
No | Start time relative to the beginning of the session. |
endSeconds |
number |
No | End time relative to the beginning of the session. |
confidence |
number |
No | Word confidence score. |
speakerTag |
integer |
Yes | One-based speaker tag when diarization is available. |