---
name: suki-dictation
description: >-
  Use when building real-time clinical Dictation with Suki: embed Dictation
  with the Dictation SDK or Web SDK, or use the Dictation APIs to create a
  transcription session, stream PCM audio over /ws/transcribe, receive partial
  and final transcript text, and end the session.
license: SUKI_Proprietary
metadata:
  author: suki
  version: "2.4"
---

## Dictation

Use **Dictation** to convert spoken audio into text in real time.

Dictation is a transcription workflow. It does not generate a full Ambient
clinical note or populate Suki Medical form templates.

Use:

- **Ambient** for clinical note generation from visit conversations.
- **Form filling** for structured Medical form output.
- **Dictation** for real-time speech-to-text.
- **Audio streaming** for shared WebSocket and audio wire-format details.

## Accuracy rules

- Do not invent endpoints, SDK methods, request fields, response fields, or
  WebSocket message types.
- Use `/ws/transcribe` for Dictation API audio streaming.
- Do not use Ambient `/ws/stream` message formats on `/ws/transcribe`.
- Dictation audio messages use `audioData`, not `data`.
- Dictation ends an audio stream with the `AUDIO_END` event.
- Do not use Ambient `START_TIME` or `RU9G` on the Dictation WebSocket.
- Create a transcription session before opening `/ws/transcribe`.
- Open a Dictation WebSocket only when the transcription session is in a state
  that allows streaming, such as `READY` or `IDLE`.
- Do not assume that a single WebSocket connection represents the entire
  transcription session. Suki supports multiple streams under the same
  `transcription_session_id`.
- Treat `is_final: false` transcript frames as intermediate text that can
  change.
- Treat `is_final: true` transcript frames as final text for that segment.
- Treat a transcript whose text is `EOF` as the end of results for that
  WebSocket.
- Close the WebSocket before calling the REST end-session API.
- For browser integrations, prefer the Dictation SDK or Web SDK rather than
  building the REST and WebSocket flow yourself.
- Do not mix Dictation SDK instructions with Headless Web SDK Ambient hooks.
- If this skill does not define a required detail, read the linked Dictation
  documentation or use the documentation MCP before generating code.

## Choose an integration path

Once the path is known, **fetch that dedicated skill** and implement from it.

| Path | Choose when | Dedicated skill |
| --- | --- | --- |
| **Dictation SDK** | You want Suki's hosted Dictation experience embedded in your application | `suki-dictation-sdk` |
| **Web SDK Dictation** | You already use the Headed Web SDK and want its Dictation component | `suki-web-sdk` |
| **Dictation API** | Your application owns audio capture and needs direct `/ws/transcribe` control | `suki-dictation-api` |

Skill URLs:

- Dictation SDK: https://developer.suki.ai/.well-known/agent-skills/suki-dictation-sdk/SKILL.md
- Web SDK: https://developer.suki.ai/.well-known/agent-skills/suki-web-sdk/SKILL.md
- Dictation API: https://developer.suki.ai/.well-known/agent-skills/suki-dictation-api/SKILL.md

For browser applications, use the SDK or Web SDK unless you specifically need
direct control over the Dictation API.

### Environment

For direct API integrations, use staging unless the user explicitly requests
production.

<!-- SKILL-AUTO:START environments -->
| Environment | REST | WebSocket |
| --- | --- | --- |
| Staging | `https://sdp.suki-stage.com` | `wss://sdp.suki-stage.com` |
| Production | `https://sdp.suki.ai` | `wss://sdp.suki.ai` |
<!-- SKILL-AUTO:END environments -->

## Dictation API workflow

The API workflow is:

```text
authenticate
→ create transcription session
→ wait until session is ready for streaming
→ connect to /ws/transcribe
→ send AUDIO messages
→ receive partial and final transcripts
→ send AUDIO_END
→ receive EOF
→ close WebSocket
→ end transcription session
```

### API endpoints

<!-- SKILL-AUTO:START endpoint-table -->
| Operation | Method | Path |
| --- | --- | --- |
| Login | `POST` | `/api/v1/auth/login` |
| Register | `POST` | `/api/v1/auth/register` |
| Create session | `POST` | `/api/v1/transcription/session/create` |
| Stream audio | `WebSocket` | `/ws/transcribe` |
| End session | `POST` | `/api/v1/transcription/session/{transcription_session_id}/end` |
<!-- SKILL-AUTO:END endpoint-table -->

## 1. Authenticate

Dictation API requests use a Suki Token.

The authentication flow is:

```text
Partner Token
→ Suki authentication
→ Suki Token
→ Dictation API
```

Follow the Partner Authentication documentation for the authentication flow
that applies to your partner type.

Use the resulting token as:

```http
sdp_suki_token: {sdp_suki_token}
```

for Dictation REST requests and the WebSocket handshake.

Send:

```http
sdp_provider_id: {provider_id}
```

when required by your partner configuration.

### Keep authentication separate from the SDK

For the Dictation API, your application manages the Suki Token and sends it to
the REST and WebSocket APIs.

For the Dictation SDK or Web SDK, use the SDK's `SukiAuthManager`.

Do not copy the raw API authentication flow into SDK code unless the SDK
documentation explicitly requires it.

## 2. Create a transcription session

Create a parent transcription session before opening the WebSocket:

```http
POST /api/v1/transcription/session/create
```

Include:

```http
Content-Type: application/json
sdp_suki_token: {sdp_suki_token}
```

The request body is optional.

You can provide an audio configuration:

```json
{
  "audio_config": {
    "audio_encoding": "LINEAR16",
    "audio_language": "en-US",
    "sample_rate_hertz": 16000
  }
}
```

The documented defaults are:

| Setting | Value |
| --- | --- |
| `audio_encoding` | `LINEAR16` |
| `audio_language` | `en-US` |
| `sample_rate_hertz` | `16000` |

Currently, Dictation supports English (`en-US`).

`audio_config` is optional. If omitted, Suki uses the documented defaults.

The response contains:

```json
{
  "transcription_session_id": "..."
}
```

Save this identifier.

Use the same `transcription_session_id` when:

- Connecting to `/ws/transcribe`.
- Reconnecting a WebSocket.
- Opening multiple streams for the same parent session.
- Ending the transcription session.

## 3. Wait for a streamable session

After creating the transcription session, check the session state before
opening `/ws/transcribe`.

Open the WebSocket when the session is:

```text
READY
```

or:

```text
IDLE
```

Do not open the WebSocket when the session is already:

```text
RUNNING
```

or:

```text
COMPLETED
```

The WebSocket handshake can fail with `FailedPrecondition` when the session is
not ready for a new stream.

### Multiple streams

A transcription session can contain multiple WebSocket streams.

All streams use the same:

```text
transcription_session_id
```

Suki combines transcripts from the streams into the parent transcription
session.

This is useful for:

- Reconnecting after a dropped WebSocket.
- Push-to-talk workflows.
- Streaming from multiple audio sources.
- Workflows that contain multiple speech segments.

Do not create a new parent transcription session simply because a WebSocket
connection needs to be reopened.

## 4. Connect to `/ws/transcribe`

Connect to:

```text
wss://sdp.suki-stage.com/ws/transcribe
```

for staging or:

```text
wss://sdp.suki.ai/ws/transcribe
```

for production.

### Browser authentication

Browser clients authenticate during the WebSocket handshake with the
`Sec-WebSocket-Protocol` header:

```http
Sec-WebSocket-Protocol: SukiTranscriptionAuth,<sdp_suki_token>,<transcription_session_id>
```

Use the exact protocol name:

```text
SukiTranscriptionAuth
```

The order is:

```text
SukiTranscriptionAuth
→ sdp_suki_token
→ transcription_session_id
```

Do not replace `SukiTranscriptionAuth` with the Ambient WebSocket protocol.

### Non-browser authentication

Non-browser clients send the following headers during the WebSocket upgrade:

```http
sdp_suki_token: {sdp_suki_token}
transcription_session_id: {transcription_session_id}
```

Do not send authentication credentials as ordinary WebSocket messages after
the connection is established.

## 5. Stream audio

Send audio as JSON text frames.

The message format is:

```json
{
  "type": "AUDIO",
  "audioData": "<base64-encoded PCM_S16LE bytes>"
}
```

The audio field is:

```text
audioData
```

not:

```text
data
```

### Audio requirements

Use the audio configuration specified when creating the transcription
session.

The standard configuration is:

| Setting | Value |
| --- | --- |
| Encoding | `LINEAR16` |
| Sample rate | `16000` Hz |
| Channels | Match the supported source configuration |
| Transport | Base64 inside a JSON text frame |

Encode the raw PCM audio bytes with standard Base64.

Do not send:

- Raw binary WebSocket frames.
- WAV container data.
- Base64 of a WAV file.
- Hex-encoded audio.
- Ambient `AUDIO.data` messages.

### Stream in chunks

Send audio in small, regular chunks rather than sending the complete
recording in one message.

Chunked streaming reduces latency and allows Suki to return transcript updates
while the provider is speaking.

For audio chunking and performance guidance, use the current Dictation
streaming documentation.

## 6. Receive transcript messages

Suki sends transcript messages over the WebSocket.

A partial transcript can look like:

```json
{
  "transcript": {
    "transcript": "the recognized text so far",
    "words": []
  },
  "is_final": false,
  "transcript_id": "..."
}
```

A final transcript can look like:

```json
{
  "transcript": {
    "transcript": "The patient reports feeling better today.",
    "words": []
  },
  "is_final": true,
  "transcript_id": "..."
}
```

### Partial transcripts

When:

```json
"is_final": false
```

the transcript is intermediate.

It can change as more audio is processed.

Use partial transcripts for live UI updates, but do not treat them as final
clinical text.

### Final transcripts

When:

```json
"is_final": true
```

the transcript for that segment is final.

The recognizer will not revise that segment.

Use final transcripts when your application needs stable transcript text.

### `transcript_id`

Transcript messages can contain:

```text
transcript_id
```

Use this identifier when your application needs to correlate or track
individual transcript segments.

Do not invent transcript IDs.

## 7. End an audio stream

When the current speech stream is finished, send:

```json
{
  "type": "EVENT",
  "event": "AUDIO_END"
}
```

`AUDIO_END` tells Suki that the current audio stream has ended.

Do not use the Ambient stream terminator:

```text
RU9G
```

Do not send:

```json
{
  "type": "AUDIO",
  "data": "RU9G"
}
```

That format belongs to the Ambient-style `/ws/stream` protocol.

## 8. Wait for `EOF`

After sending `AUDIO_END`, continue reading WebSocket messages.

Suki sends an end-of-results message:

```json
{
  "transcript": {
    "transcript": "EOF"
  }
}
```

Treat:

```text
transcript.transcript == "EOF"
```

as the end of results for the current WebSocket stream.

The WebSocket closes shortly after `EOF`.

Do not treat the literal text `EOF` as clinical transcript content.

## 9. Close the WebSocket

After receiving `EOF`, close the WebSocket.

Do not call the REST end-session endpoint while the WebSocket is still being
used for the current stream.

The normal sequence is:

```text
AUDIO_END
→ receive final transcript messages
→ receive EOF
→ close WebSocket
→ REST end session
```

## 10. End the transcription session

When the complete Dictation workflow is finished, call:

```http
POST /api/v1/transcription/session/{transcription_session_id}/end
```

Include:

```http
sdp_suki_token: {sdp_suki_token}
```

The response can include:

```json
{
  "transcription_session_id": "...",
  "status": "completed",
  "final_transcript": "...",
  "duration": 300,
  "ended_at": "2024-11-26T10:35:00Z"
}
```

Use `final_transcript` when your application needs the final session-level
transcript.

Do not assume that every intermediate WebSocket transcript is identical to the
final session transcript.

## Push-to-talk workflow

Dictation supports multiple streaming connections under one parent
transcription session.

For push-to-talk:

```text
create transcription session
→ wait for READY / IDLE
→ open WebSocket
→ stream speech
→ AUDIO_END
→ receive EOF
→ close WebSocket
→ wait for READY / IDLE
→ open a new WebSocket
→ stream next speech segment
→ ...
→ end parent transcription session
```

Reuse the same:

```text
transcription_session_id
```

for the speech segments.

Do not create a new parent session for every push-to-talk segment unless your
application specifically needs separate transcription sessions.

## WebSocket reconnection

WebSocket connections can drop.

If the parent transcription session is still active:

1. Detect the dropped connection.
2. Check that the transcription session can accept another stream.
3. Reconnect using the same `transcription_session_id`.
4. Resume streaming.
5. Continue processing transcript messages.

Do not blindly reconnect to a session that has already reached a terminal
state.

## Dictation SDK

Use the Dictation SDK when you want Suki's hosted Dictation UI rather than
building the complete REST and WebSocket workflow.

The Dictation SDK embeds Dictation through a Suki-hosted iframe.

The SDK handles the Dictation UI and provides callbacks for the text returned
to your application.

Read the current Dictation SDK documentation for the exact packages and APIs
available to your partner.

## Dictation Web SDK

The Suki Web SDK also supports Dictation.

For React applications, the current Web SDK documentation uses:

```text
@suki-sdk/core
@suki-sdk/react
```

Install:

```bash
pnpm add @suki-sdk/core @suki-sdk/react
```

The React Web SDK exposes:

```text
SukiAuthManager
DictationClient
DictationProvider
Dictation
```

Use the Web SDK path when your application already uses the Suki Web SDK.

## Web SDK authentication

Create one `SukiAuthManager` with your partner credentials.

Example:

```ts
import { SukiAuthManager } from "@suki-sdk/core";

const authManager = new SukiAuthManager({
  partnerId: "YOUR_PARTNER_ID",
  partnerToken: "YOUR_PARTNER_TOKEN",
  environment: "staging",
  loginOnInitialize: true,
  autoRegister: false,
  providerId: "YOUR_PROVIDER_ID",
  providerName: "YOUR_PROVIDER_NAME",
  providerOrgId: "YOUR_PROVIDER_ORG_ID",
  providerSpecialty: "YOUR_PROVIDER_SPECIALTY",
});
```

Use only the provider fields required by your partner configuration.

Do not expose partner credentials in client-side source when your integration
architecture requires server-side credential handling.

## Create a Web SDK Dictation client

Create one `DictationClient` and reuse it for the page or application scope.

For React, create it with `useMemo` so it is not recreated on every render.

Example:

```tsx
import { useMemo } from "react";
import { SukiAuthManager } from "@suki-sdk/core";
import { DictationClient } from "@suki-sdk/react";

const client = useMemo(() => {
  const authManager = new SukiAuthManager({
    partnerId: "YOUR_PARTNER_ID",
    partnerToken: "YOUR_PARTNER_TOKEN",
    environment: "staging",
    loginOnInitialize: true,
    autoRegister: false,
    providerId: "YOUR_PROVIDER_ID",
    providerName: "YOUR_PROVIDER_NAME",
    providerOrgId: "YOUR_PROVIDER_ORG_ID",
    providerSpecialty: "YOUR_PROVIDER_SPECIALTY",
  });

  return new DictationClient({ authManager });
}, []);
```

Do not create a new `DictationClient` for every field or React render.

## Render Dictation in React

Wrap the Dictation component with:

```tsx
<DictationProvider client={client}>
```

Example:

```tsx
import { useMemo, useState } from "react";
import { SukiAuthManager } from "@suki-sdk/core";
import {
  DictationClient,
  DictationProvider,
  Dictation,
} from "@suki-sdk/react";

export function NotesWithDictation() {
  const client = useMemo(() => {
    const authManager = new SukiAuthManager({
      partnerId: "YOUR_PARTNER_ID",
      partnerToken: "YOUR_PARTNER_TOKEN",
      environment: "staging",
      loginOnInitialize: true,
      autoRegister: false,
      providerId: "YOUR_PROVIDER_ID",
      providerName: "YOUR_PROVIDER_NAME",
      providerOrgId: "YOUR_PROVIDER_ORG_ID",
      providerSpecialty: "YOUR_PROVIDER_SPECIALTY",
    });

    return new DictationClient({ authManager });
  }, []);

  const [notes, setNotes] = useState("");
  const [dictationActive, setDictationActive] = useState(false);

  return (
    <DictationProvider client={client}>
      <textarea
        id="clinical-notes"
        value={notes}
        onChange={(event) => setNotes(event.target.value)}
      />

      <button
        type="button"
        onClick={() => setDictationActive((active) => !active)}
      >
        {dictationActive ? "Stop dictation" : "Start dictation"}
      </button>

      {dictationActive && (
        <Dictation
          fieldId="clinical-notes"
          mode="in-field"
          initialText={notes}
          onSubmit={({ text }) => setNotes(text)}
          onCancel={() => setDictationActive(false)}
        />
      )}
    </DictationProvider>
  );
}
```

## Dictation component options

The Dictation component supports configuration such as:

```text
mode
fieldId
initialText
onSubmit
onCancel
onDraft
```

Use the current SDK configuration documentation for the complete list and
exact behavior of each option.

### `fieldId`

Give each Dictation target a stable, unique `fieldId`.

A simple pattern is to use the target input's DOM ID:

```tsx
fieldId="clinical-notes"
```

The callback result includes the field ID and text:

```ts
{
  fieldId: string;
  text: string;
}
```

This lets your application determine which field should receive the dictated
text.

### `mode`

Use the mode documented for the Dictation UI you are building.

For an in-field experience:

```tsx
mode="in-field"
```

Do not invent mode values.

### `initialText`

Use `initialText` when the target field already contains text and Dictation
should start with that text as context.

Example:

```tsx
<Dictation
  fieldId="clinical-notes"
  mode="in-field"
  initialText={notes}
  onSubmit={({ text }) => setNotes(text)}
/>
```

### `onSubmit`

Handle `onSubmit` so your application receives the committed dictated text.

Example:

```tsx
onSubmit={({ text }) => setNotes(text)}
```

The callback result includes:

```text
fieldId
text
```

### `onCancel`

Use `onCancel` to restore the UI when the provider cancels Dictation.

Example:

```tsx
onCancel={() => setDictationActive(false)}
```

### `onDraft`

`onDraft` can be used when the provider leaves the Dictation flow without
submitting.

Use the current SDK callback documentation for the exact callback behavior.

## One active Dictation component

Use one shared `DictationClient` and keep only the required Dictation UI
active.

For multiple fields, track the active field:

```text
activeFieldId
```

and render Dictation for the active field.

Do not create a separate `DictationClient` for every field.

In React, unmounting `<Dictation>` is the normal way to hide the Dictation UI.
The SDK handles the corresponding `hide()` behavior when the component
unmounts.

## Dictation UI layout

For an in-field Dictation experience, provide a real DOM element with enough
height for the hosted UI when `rootElement` is used.

Example:

```tsx
<div
  id="clinical-notes-dictation-root"
  style={{ minHeight: 120 }}
/>
```

A container with no usable height can make the Dictation UI appear blank.

The browser application must also meet the required:

- HTTPS requirements.
- Microphone permissions.
- CSP requirements.
- Suki hosted-iframe requirements.

Read the current SDK prerequisites and error-handling documentation before
production deployment.

## SDK vs API

Choose the **Dictation SDK or Web SDK** when:

- You want Suki's hosted Dictation UI.
- You are building a browser application.
- You want SDK callbacks instead of managing transcript WebSocket messages
  yourself.
- You want Suki to handle the browser recording experience.

Choose the **Dictation API** when:

- Your application owns audio capture.
- You need direct access to the transcription WebSocket.
- You need to process partial and final transcript messages yourself.
- You need server-side transcription workflows.
- You need control over reconnection and multiple streams.

Do not use the REST and WebSocket workflow just to recreate the hosted SDK UI
unless your integration requires that level of control.

## Common mistakes

### Using Ambient `/ws/stream`

Wrong:

```text
/ws/stream
```

Dictation uses:

```text
/ws/transcribe
```

### Using Ambient audio fields

Wrong:

```json
{
  "type": "AUDIO",
  "data": "<audio>"
}
```

Dictation uses:

```json
{
  "type": "AUDIO",
  "audioData": "<base64 PCM audio>"
}
```

### Using `RU9G`

Do not end Dictation audio with:

```text
RU9G
```

That is used by the Ambient-style `/ws/stream` protocol.

Dictation ends the audio stream with:

```json
{
  "type": "EVENT",
  "event": "AUDIO_END"
}
```

### Using `AUDIO_END` on Ambient

Do not use the Dictation:

```json
{
  "type": "EVENT",
  "event": "AUDIO_END"
}
```

message on Ambient `/ws/stream`.

Ambient and Dictation use different WebSocket wire formats.

### Opening the WebSocket too early

Do not connect to `/ws/transcribe` immediately after creating a session if
the session is not ready.

Wait for a streamable state such as:

```text
READY
```

or:

```text
IDLE
```

### Treating partial transcripts as final

Do not persist or submit:

```json
"is_final": false
```

as final text.

Intermediate text can change.

Use final frames where your application requires stable transcript segments.

### Treating `EOF` as dictated text

This:

```json
{
  "transcript": {
    "transcript": "EOF"
  }
}
```

is a protocol marker.

Do not add `EOF` to the user's transcript.

### Ending the session before closing the WebSocket

Use:

```text
AUDIO_END
→ EOF
→ close WebSocket
→ REST end session
```

Do not call the REST end endpoint while the current audio stream is still
active.

### Creating a new parent session for every reconnect

A dropped WebSocket does not necessarily require a new transcription session.

Reuse the same:

```text
transcription_session_id
```

when reconnecting to an active parent session.

### Creating a new SDK client per field

Do not create:

```text
DictationClient
→ field A
DictationClient
→ field B
DictationClient
→ field C
```

Create one client and reuse it.

### Mixing SDK and API authentication

The API uses the Suki Token in REST and WebSocket requests.

The SDK uses `SukiAuthManager`.

Do not combine the two authentication patterns without a documented reason.

### Mixing Web SDK Ambient hooks into Dictation

Do not add Ambient-specific hooks or session logic to a Dictation integration
just because both features use Suki's Web SDK.

Dictation has its own client, component, and transcription workflow.

## Non-negotiable rules

Before generating or reviewing Dictation API code, verify:

- [ ] The integration uses Dictation, not Ambient or Form filling.
- [ ] The correct environment is being used.
- [ ] A transcription session is created before the WebSocket is opened.
- [ ] `transcription_session_id` is saved and reused correctly.
- [ ] The WebSocket endpoint is `/ws/transcribe`.
- [ ] Browser authentication uses `SukiTranscriptionAuth`.
- [ ] Non-browser authentication uses `sdp_suki_token` and
      `transcription_session_id` headers.
- [ ] The WebSocket opens only when the session can accept a stream.
- [ ] Audio messages use `audioData`.
- [ ] Audio is Base64-encoded PCM.
- [ ] The configured encoding is `LINEAR16`.
- [ ] Audio is streamed in chunks.
- [ ] Raw binary WebSocket frames are not sent.
- [ ] Ambient `START_TIME`, `data`, and `RU9G` are not used.
- [ ] `AUDIO_END` is sent to end the Dictation stream.
- [ ] Partial transcripts are not treated as final.
- [ ] Final transcripts use `is_final: true`.
- [ ] `EOF` is treated as the end-of-results marker.
- [ ] The WebSocket is closed before the REST end call.
- [ ] The parent session is ended when the Dictation workflow is complete.
- [ ] Reconnection reuses the same parent session when appropriate.
- [ ] Multiple streams use the same `transcription_session_id`.
- [ ] SDK integrations reuse one `SukiAuthManager` and one `DictationClient`.
- [ ] SDK integrations handle `onSubmit`.
- [ ] Only the intended Dictation component is active at a time.
- [ ] The Dictation host has usable layout dimensions.
- [ ] HTTPS, CSP, iframe, and microphone requirements are met.

## Implementation checklist

### Dictation API

- [ ] Authenticate the provider.
- [ ] Obtain a valid Suki Token.
- [ ] Create a transcription session.
- [ ] Save `transcription_session_id`.
- [ ] Configure `LINEAR16` and the required sample rate when needed.
- [ ] Wait for `READY` or `IDLE`.
- [ ] Open `/ws/transcribe`.
- [ ] Authenticate during the WebSocket handshake.
- [ ] Send Base64-encoded PCM audio in `audioData`.
- [ ] Process partial transcript messages.
- [ ] Process final transcript messages.
- [ ] Send `AUDIO_END`.
- [ ] Wait for `EOF`.
- [ ] Close the WebSocket.
- [ ] Call the REST end-session endpoint.
- [ ] Store the final transcript when required.

### Dictation SDK / Web SDK

- [ ] Use the current SDK package and version.
- [ ] Create one `SukiAuthManager`.
- [ ] Create one `DictationClient`.
- [ ] Reuse the client across fields.
- [ ] Provide a stable `fieldId`.
- [ ] Use a documented `mode`.
- [ ] Provide `onSubmit`.
- [ ] Handle `onCancel` where required.
- [ ] Use `onDraft` when the workflow needs draft text.
- [ ] Provide `initialText` when appropriate.
- [ ] Render only the intended active Dictation UI.
- [ ] Provide a usable UI container.
- [ ] Meet HTTPS, CSP, iframe, and microphone requirements.

## When to read more

<!-- SKILL-AUTO:START canonical-docs -->
- [Dictation SDK Quickstart](https://developer.suki.ai/dictation-sdk/quickstart): Install Dictation SDK packages, create a reusable `SukiAuthManager` and `DictationClient`, and mount your first in-field or scratchpad session
- [Audio Dictation Overview](https://developer.suki.ai/documentation/concepts/dictation/dictation-overview): Decide when Audio Dictation fits versus Aambient clinical notes, and compare Dictation APIs, Web SDK, and Dictation SDK integration paths
- [Dictation Basic Usage](https://developer.suki.ai/documentation/how-to/dictation/dictation-basic-usage): Create a Dictation transcription session, stream audio over WebSocket, receive transcript frames, and end the session when capture finishes
- [Stream Dictation Audio](https://developer.suki.ai/documentation/how-to/audio-streaming/dictation-streaming): Overview: Stream Dictation audio over WebSocket on GET /ws/transcribe for real-time transcript text
- [Read Dictation Transcript Frames](https://developer.suki.ai/documentation/how-to/audio-streaming/dictation-streaming-transcripts): Reference for Dictation /ws/transcribe inbound transcript frames: partial, final, EOF, words, and UI handling
- [Ambient vs Dictation Streaming Comparison](https://developer.suki.ai/documentation/how-to/audio-streaming/audio-stream): Compare Ambient /ws/stream and Dictation /ws/transcribe: purpose, auth, messages, and when to use each
- [Dictation Streaming Wire Format](https://developer.suki.ai/documentation/how-to/audio-streaming/websocket-streaming-wire-format-dictation): Format and send Base64 audio chunks as JSON text frames on GET /ws/transcribe for Dictation sessions, including message types, order, and PCM chunking
- [Build Dictation Session Streaming Client](https://developer.suki.ai/documentation/tutorials/dictation-websocket-code-example): Tutorial: Build an end-to-end Dictation session streaming client from login to final transcript
- [llms-full.txt](https://developer.suki.ai/llms-full.txt): Full-site dump for broad cross-product questions
<!-- SKILL-AUTO:END canonical-docs -->


## Sister skills

<!-- SKILL-AUTO:START sister-skills -->
* Dictation API:
  [https://developer.suki.ai/.well-known/agent-skills/suki-dictation-api/SKILL.md](https://developer.suki.ai/.well-known/agent-skills/suki-dictation-api/SKILL.md)
* Dictation SDK:
  [https://developer.suki.ai/.well-known/agent-skills/suki-dictation-sdk/SKILL.md](https://developer.suki.ai/.well-known/agent-skills/suki-dictation-sdk/SKILL.md)
* Web SDK:
  [https://developer.suki.ai/.well-known/agent-skills/suki-web-sdk/SKILL.md](https://developer.suki.ai/.well-known/agent-skills/suki-web-sdk/SKILL.md)
* Audio streaming:
  [https://developer.suki.ai/.well-known/agent-skills/suki-audio-streaming/SKILL.md](https://developer.suki.ai/.well-known/agent-skills/suki-audio-streaming/SKILL.md)
* Ambient:
  [https://developer.suki.ai/.well-known/agent-skills/suki-ambient/SKILL.md](https://developer.suki.ai/.well-known/agent-skills/suki-ambient/SKILL.md)
* Form filling:
  [https://developer.suki.ai/.well-known/agent-skills/suki-form-filling/SKILL.md](https://developer.suki.ai/.well-known/agent-skills/suki-form-filling/SKILL.md)
* Webhooks:
  [https://developer.suki.ai/.well-known/agent-skills/suki-webhooks/SKILL.md](https://developer.suki.ai/.well-known/agent-skills/suki-webhooks/SKILL.md)
<!-- SKILL-AUTO:END sister-skills -->
