[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"article-doc:docs\u002Frealtime\u002F3.connection-lifecycle":3},"---\ntitle: Connection Lifecycle\ndescription: Connect → configure → stream audio → receive events → close\u002Freconnect.\n---\nThe full lifecycle of a realtime WebSocket connection.\n\n## Stages\n\n```\n1. Connect → 2. session.created → 3. Configure (optional) → 4. Stream audio\n                                                           ↓\n6. Close\u002FReconnect ← 5. Receive events ←\n```\n\n## 1. Connect\n\nWebSocket handshake:\n\n- Server-side: `Authorization: Bearer sk-...` header\n- Browser: `?access_token=rt_...` query parameter\n\nConditions checked on connect:\n- WebSocket upgrade required (else 426)\n- Gateway enabled (else 503 `gateway_disabled`)\n- Circuit breaker closed (else 503 `upstream_unavailable` + `Retry-After`)\n- Connection quota passes (concurrent + rate)\n\n## 2. session.created\n\nReceived immediately on connect:\n\n```json\n{\n  \"type\": \"session.created\",\n  \"session_id\": \"sess_...\",\n  \"limits\": {\n    \"max_concurrent_utterances\": 2,\n    \"max_session_seconds\": 900,\n    \"idle_timeout_seconds\": 60,\n    \"remaining_audio_seconds\": 3600\n  }\n}\n```\n\n## 3. Configure (optional)\n\nSend `session.update` to set parameters:\n\n```json\n{ \"type\": \"session.update\", \"language\": \"zh\" }\n```\n\nReceive `session.updated` confirmation.\n\n## 4. Stream audio\n\nContinuously send PCM16LE audio frames:\n\n- Text frames: `input_audio_buffer.append` (base64)\n- Binary frames: raw PCM data\n- End of speech segment: `input_audio_buffer.flush`\n\n## 5. Receive events\n\n```\ninput_audio_buffer.speech_started\n  → input_audio_buffer.speech_stopped\n  → conversation.item.input_audio_transcription.completed\n```\n\nThis cycle repeats for each speech segment.\n\n## 6. Close \u002F Reconnect\n\n### Normal close\n\nClient calls `ws.close()`. Server flushes final meter data.\n\n### Timeout close\n\n| Close code | Cause \u002F close reason | Trigger |\n|---|---:|---|\n| 4408 | `idle_timeout` | No audio received within `idle_timeout_seconds` |\n| 1008 | `session_duration_limit` | Exceeded `max_session_seconds` |\n| 1008 | `session_audio_limit` | Exceeded `max_audio_seconds_per_session` |\n| 1008 | `audio_quota_exhausted` | Billing-window audio budget exhausted |\n| 1009 | `frame_too_large` | Single frame exceeds 1 MiB |\n| 1011 | `client_error` \u002F internal error | Client socket error or unexpected gateway failure |\n| 1013 | `upstream_unavailable` | Circuit breaker open |\n| 1013 | `upstream_backpressure` | Upstream is not draining fast enough |\n| 1013 | `client_backpressure` | Client is not reading events fast enough |\n\n## Idle timeout\n\nTo avoid idle timeout, either:\n- Send silent frames to keep the connection alive\n- Or close explicitly and reconnect when needed\n\n## Recommended reconnect design\n\n1. Listen for `close` events, decide reconnect based on close code\n2. 4408 (idle) and 1008 (duration limit): reconnect directly\n3. 1013 (upstream): exponential backoff before reconnect\n4. 1000 (normal): do not reconnect\n5. After reconnect, re-send `session.update` to restore configuration\n\nSee [Reconnect a Live Session](\u002Fdocs\u002Fguides\u002Freconnection) for a detailed guide.\n\n## Related\n\n- [Realtime API](\u002Fdocs\u002Fapi-reference\u002Frealtime-api) — endpoint reference\n- [Reconnection & Retries](\u002Fdocs\u002Fproduction\u002Freconnection-retries) — retry strategies\n- [Rate Limits](\u002Fdocs\u002Fapi-reference\u002Frate-limits) — plan timeout parameters\n",1790059118957]