---
title: "Speech-to-text turn boundary"
method: POST
path: "stt.turn"
---

# Speech-to-text turn boundary

`POST stt.turn` (webhook)

## Payload

- object: Event envelope delivered via HTTP POST to registered webhook URLs. Event-specific fields are flattened into the top-level object (no "data" wrapper). Includes X-Signature-256 header when a secret is configured, and an X-Event-Id header equal to the event_id field.
  - `type` 'leg.ringing' | 'leg.early_media' | 'leg.connected' | 'leg.disconnected' | 'leg.joined_room' | 'leg.left_room' | 'leg.muted' | 'leg.unmuted' | 'leg.deaf' | 'leg.undeaf' | 'leg.hold' | 'leg.unhold' | 'leg.command_failed' | 'leg.ice_interrupted' | 'leg.ice_restored' | 'leg.stream_added' | 'leg.stream_removed' | 'leg.stream_rejected' | 'leg.stream_failed' | 'leg.stream_room_changed' | 'leg.stream_role_changed' | 'siprec.session_started' | 'siprec.session_ended' | 'siprec.metadata_updated' | 'siprec.participant_joined' | 'siprec.participant_left' | 'dtmf.received' | 'rtt.received' | 'speaking.started' | 'speaking.stopped' | 'playback.started' | 'playback.finished' | 'playback.error' | 'tts.started' | 'tts.finished' | 'tts.error' | 'tts.staged' | 'tts.discarded' | 'recording.started' | 'recording.finished' | 'recording.paused' | 'recording.resumed' | 'leg.transfer_initiated' | 'leg.transfer_requested' | 'leg.transfer_progress' | 'leg.transfer_completed' | 'leg.transfer_failed' | 'room.created' | 'room.deleted' | 'room.bridged' | 'room.bridge_updated' | 'room.unbridged' | 'room.routing_changed' | 'leg.role_changed' | 'stt.text' | 'stt.turn' | 'agent.connected' | 'agent.disconnected' | 'agent.user_transcript' | 'agent.agent_response' | 'amd.result' | 'amd.beep' | 'sip.registration_attempt' | 'sip.registration_active' | 'sip.registration_expired' | 'sip.outbound_registration_active' | 'sip.outbound_registration_failed' | 'sip.outbound_registration_expired' | 'sip.trunk_up' | 'sip.trunk_down', required
  - `timestamp` string, date-time, required
  - `event_id` string, uuid: Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
  - `instance_id` string: Instance identifier
  - `custom_data` unknown
  - `leg_id` string: Leg identifier
  - `room_id` string: Room identifier
  - `app_id` string
  - `stream_id` string: Which of the leg's audio streams this turn belongs to. Empty when the leg's audio is the call itself. See stt.text.stream_id
  - `event` string: Turn boundary: start_of_turn, update, eager_end_of_turn, turn_resumed or end_of_turn (Deepgram Flux), or utterance_end (Deepgram, when utterance_end_ms is set). New values may be added
  - `turn_index` integer: Index of the turn within the session, incrementing after each end_of_turn
  - `text` string: Transcript of the turn so far. Empty on utterance_end
  - `end_of_turn_confidence` number: How confident the model is that the turn has ended
  - `audio_window_start_ms` integer: Start of the audio window this transcript covers
  - `audio_window_end_ms` integer: End of the audio window this transcript covers
  - `last_word_end_ms` integer: When the last word ended (utterance_end only)
  - `words` STTWord[]: Per-word transcript with timings and confidence, when the provider supplies it
    - `word` string, required
    - `confidence` number, required
    - `start_ms` integer, required
    - `end_ms` integer, required
  - `languages` string[]: Languages detected in the turn

---

[API](https://skmtc.dev/voiceblender/apis/voiceblender-api.md) - [All operations](https://skmtc.dev/voiceblender/apis/voiceblender-api/llms.txt) - [OpenAPI document](https://skmtc.dev/voiceblender/apis/voiceblender-api/revisions/fa6da4e6a00b?raw)
