Sinch Voice API: Choosing between v1 and v2
For all new projects, please use Voice API v2. This is especially important for projects involving:

- AI capabilities like Streams and Voice Relay
- Voice campaigns like Batch calling


You should only use the older Voice API v1 if one of the following is a strict requirement:

- The project must be in General Availability (GA).
- The project requires In-App voice or Conferencing (until these features are available in v2).


## Voice Stream Control

Commands that can be executed on an ongoing stream.

### Connection Flow Diagram

```mermaid
sequenceDiagram
    title Voice Stream WebSocket Flow (Sinch Platform - Customer WebSocket Server)
    participant SP as Sinch Platform
    participant CS as Customer WebSocket Server

    Note over SP,CS: WebSocket Connection
    SP->>CS: WS connect request
    alt WS accepted
        CS-->>SP: Accept connection
    else WS rejected
        CS--xSP: Non-success response
        rect rgb(255, 204, 204)
        Note over SP,CS: Stream ended
        end
    end

    Note over SP,CS: Session Start
    SP->>CS: ConnectRequest<br/>{command: connect}
    Note right of CS: First protocol message.<br/>Server decides to accept,<br/>reject, or signal busy.

    alt Accepted
        CS->>SP: ConnectResponse<br/>{command: answer}
    else Busy
        CS->>SP: ConnectResponse<br/>{command: busy}
        rect rgb(255, 204, 204)
        Note over SP,CS: Stream ended
        end
    else Rejected
        CS->>SP: ConnectResponse<br/>{command: reject}
        rect rgb(255, 204, 204)
        Note over SP,CS: Stream ended
        end
    end

    Note over SP,CS: Bidirectional Audio Streaming
    loop While call is active
        rect rgb(240, 240, 240)
        Note over SP,CS: Platform to Server Audio
        SP->>CS: [binary] AudioFrame<br/>(16-bit signed PCM, mono, little-endian)
        Note right of CS: Recommended: 20ms frames.<br/>8 kHz = 320 bytes/frame,<br/>16 kHz = 640 bytes/frame.
        end

        rect rgb(240, 240, 240)
        Note over SP,CS: Server to Platform Audio
        CS->>SP: [binary] AudioFrame<br/>(16-bit signed PCM, mono, little-endian)
        Note left of SP: Queued in playback buffer.<br/>Max buffer: 5 MB per call.
        end

        rect rgb(240, 240, 240)
        Note over SP,CS: Stream Control (Server to Platform)
        alt Flush unplayed audio (e.g. interrupt)
            CS->>SP: StreamControl<br/>{command: clear}
            Note left of SP: Discards buffered audio<br/>not yet played to caller.
        else Keep-alive during silence
            CS->>SP: StreamControl<br/>{command: heartbeat}
            Note left of SP: Prevents 1-minute<br/>no-audio timeout.
        end
        end
    end

    Note over SP,CS: Call End
    Note over SP,CS: No reconnection mechanism.<br/>Connection loss = call hung up.

    alt Customer closes connection
        CS->>SP: WebSocket close
        rect rgb(255, 204, 204)
        Note over SP,CS: Stream ended
        end
    else Sinch ends call
        SP->>CS: WebSocket close
        rect rgb(255, 204, 204)
        Note over SP,CS: Stream ended
        end
    end
```