# Stream transcripts Subscribe to real-time transcript segments using Server-Sent Events (SSE). Opens a persistent SSE connection that delivers live transcript segments as they are produced during an active meeting. The response uses the `text/event-stream` content type. Both **partial** (in-progress) and **final** (confirmed) transcript segments are delivered. Partial segments have `is_partial: true` and may be replaced by a subsequent final segment covering the same audio range. The server sends a keepalive comment (`: keepalive`) every 15 seconds to prevent proxy timeouts. When the session reaches a terminal state, a `close` event is sent and the stream ends. #### Path Parameters **`session_id`** string required The session identifier. Must start with `mbsess_`. #### Event Types **`transcript`** — Transcript segment Sent when a new transcript segment (partial or final) is available. | Field | Type | Description | | --- | --- | --- | | `session_id` | string | Session identifier | | `transcript_id` | string or null | Transcript record ID (null for partial) | | `text` | string | Transcribed text content | | `speaker` | string or null | Speaker name (if identified) | | `start_time` | number | Audio start time in seconds | | `end_time` | number | Audio end time in seconds | | `confidence` | number or null | Confidence score 0.0-1.0 (null for partial) | | `language_code` | string | Language code (e.g., `"en"`) | | `is_partial` | boolean | `true` for in-progress, `false` for final | | `timestamp` | string | ISO 8601 timestamp | **`close`** — Stream termination Sent when the session reaches a terminal state. The stream closes after this event. | Field | Type | Description | | --- | --- | --- | | `reason` | string | Always `"session_ended"` | ## Returns A `text/event-stream` response. Each event is formatted as: ``` event: data: ``` A keepalive comment is sent every 15 seconds: ``` : keepalive ``` Request ```bash cURL curl -N -H "Authorization: Bearer $ACCESS_TOKEN" \ "https://api.aitronos.com/v1/meeting-buddy/sessions/mbsess_abc123def456/transcripts/stream" ``` ```python Python SDK from aitronos import Aitronos client = Aitronos(api_key="your-api-key") # Stream live transcripts for event in client.meeting_buddy.stream_transcripts("mbsess_abc123def456"): if event.type == "transcript": data = event.data prefix = "[partial]" if data["is_partial"] else "[final]" speaker = data.get("speaker") or "Unknown" print(f"{prefix} {speaker}: {data['text']}") elif event.type == "close": print("Session ended") break ``` ```python Python import os import requests import json access_token = os.environ["ACCESS_TOKEN"] session_id = "mbsess_abc123def456" url = f"https://api.aitronos.com/v1/meeting-buddy/sessions/{session_id}/transcripts/stream" headers = {"Authorization": f"Bearer {access_token}"} with requests.get(url, headers=headers, stream=True) as response: event_type = None for line in response.iter_lines(decode_unicode=True): if not line: event_type = None continue if line.startswith(":"): continue if line.startswith("event: "): event_type = line[7:] elif line.startswith("data: "): data = json.loads(line[6:]) if event_type == "transcript": prefix = "[partial]" if data["is_partial"] else "[final]" speaker = data.get("speaker") or "Unknown" print(f"{prefix} {speaker}: {data['text']}") elif event_type == "close": print("Stream closed:", data["reason"]) break ``` ```javascript JavaScript const accessToken = process.env.ACCESS_TOKEN; const sessionId = 'mbsess_abc123def456'; const eventSource = new EventSource( `https://api.aitronos.com/v1/meeting-buddy/sessions/${sessionId}/transcripts/stream`, { headers: { 'Authorization': `Bearer ${accessToken}` } } ); eventSource.addEventListener('transcript', (e) => { const data = JSON.parse(e.data); const prefix = data.is_partial ? '[partial]' : '[final]'; const speaker = data.speaker || 'Unknown'; console.log(`${prefix} ${speaker}: ${data.text}`); }); eventSource.addEventListener('close', (e) => { const data = JSON.parse(e.data); console.log('Stream closed:', data.reason); eventSource.close(); }); eventSource.onerror = (e) => { console.error('SSE error:', e); eventSource.close(); }; ``` Response ```text 200 OK (text/event-stream) event: transcript data: {"session_id":"mbsess_abc123def456","transcript_id":null,"text":"Hello every","speaker":"Alice","start_time":0.0,"end_time":1.2,"confidence":null,"language_code":"en","is_partial":true,"timestamp":"2025-12-11T10:01:05Z"} event: transcript data: {"session_id":"mbsess_abc123def456","transcript_id":"mbtrans_xyz123","text":"Hello everyone, welcome to the meeting.","speaker":"Alice","start_time":0.0,"end_time":3.5,"confidence":0.95,"language_code":"en","is_partial":false,"timestamp":"2025-12-11T10:01:06Z"} : keepalive event: transcript data: {"session_id":"mbsess_abc123def456","transcript_id":"mbtrans_xyz124","text":"Thank you for joining us today.","speaker":"Alice","start_time":3.5,"end_time":6.2,"confidence":0.92,"language_code":"en","is_partial":false,"timestamp":"2025-12-11T10:01:09Z"} event: close data: {"reason":"session_ended"} ``` ```json 404 Not Found { "success": false, "error": { "code": "SESSION_NOT_FOUND", "message": "Session not found", "type": "client_error", "status": 404, "details": { "session_id": "mbsess_abc123def456" }, "trace_id": "abc-123-def", "timestamp": "2025-12-11T10:00:00Z" } } ``` ```json 422 Validation Error { "success": false, "error": { "code": "INVALID_SESSION_ID_FORMAT", "message": "Invalid session_id format. Must start with 'mbsess_'", "type": "client_error", "status": 422, "details": { "session_id": "invalid_id" }, "trace_id": "abc-123-def", "timestamp": "2025-12-11T10:00:00Z" } } ``` ## Related Resources - [Stream Session Status](/docs/api-reference/meeting-buddy/session-status-stream) - [Stream Logs](/docs/api-reference/meeting-buddy/log-stream) - [Get Transcripts](/docs/api-reference/meeting-buddy/get-transcripts) - [Export Transcript](/docs/api-reference/meeting-buddy/export-transcript) - [Start Session](/docs/api-reference/meeting-buddy/start-session) - [Get Session Details](/docs/api-reference/meeting-buddy/get-session)