{"openapi":"3.1.0","info":{"title":"VoiceOpenRouter Speech-to-Speech API","version":"1.0.0","description":"Provider-independent v1 control plane and vor-realtime-v1 WebSocket attach contract."},"servers":[{"url":"https://api.voiceopenrouter.com"}],"security":[{"bearerAuth":[]}],"paths":{"/v1/models":{"get":{"summary":"List enabled speech-to-speech models available to your application.","operationId":"listModels","security":[],"responses":{"200":{"description":"Public model catalog"},"503":{"description":"Model catalog unavailable"}}}},"/v1/voice/sessions":{"post":{"summary":"Reserve a bounded wallet amount and create a server-owned speech-to-speech session.","operationId":"createVoiceSession","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Session created and preauthorized"},"401":{"description":"Invalid VR_SK"},"402":{"description":"Insufficient wallet balance"},"404":{"description":"Model unavailable"},"409":{"description":"Idempotency conflict"}}}},"/v1/voice/sessions/{session_id}":{"get":{"summary":"Read the current lifecycle state and server-measured usage for an owned session.","operationId":"getVoiceSession","parameters":[{"$ref":"#/components/parameters/SessionId"}],"responses":{"200":{"description":"Current session and server usage"},"401":{"description":"Invalid VR_SK"},"404":{"description":"Session not found"},"410":{"description":"Session expired"}}}},"/v1/voice/sessions/{session_id}/end":{"post":{"summary":"Close the session and settle from accepted server/provider usage.","operationId":"endVoiceSession","parameters":[{"$ref":"#/components/parameters/SessionId"}],"responses":{"200":{"description":"Terminal session; repeated calls are idempotent"},"400":{"description":"Invalid close request"},"401":{"description":"Invalid VR_SK"},"404":{"description":"Session not found"},"409":{"description":"Session settlement conflict"},"503":{"description":"Session store unavailable"}}}},"/v1/realtime":{"get":{"summary":"Upgrade an owned session to the provider-independent vor-realtime-v1 WebSocket protocol.","operationId":"upgradeRealtime","parameters":[{"$ref":"#/components/parameters/SessionIdQuery"}],"responses":{"101":{"description":"WebSocket upgrade; vor-realtime-v1 events follow"},"401":{"description":"Invalid VR_SK"},"404":{"description":"Session not found"},"410":{"description":"Session expired"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"VoiceOpenRouter VR_SK. Server-side only."}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"}},"SessionId":{"name":"session_id","in":"path","required":true,"schema":{"type":"string","minLength":1}},"SessionIdQuery":{"name":"session_id","in":"query","required":true,"schema":{"type":"string","minLength":1}}},"schemas":{"AudioFormat":{"type":"object","required":["type","encoding","sample_rate_hz","channels"],"properties":{"type":{"const":"audio/pcm"},"encoding":{"const":"pcm16le"},"sample_rate_hz":{"const":24000},"channels":{"const":1}}},"CreateSessionRequest":{"type":"object","required":["model","mode"],"properties":{"model":{"type":"string"},"mode":{"const":"speech_to_speech"}}},"EndSessionRequest":{"type":"object","properties":{"reason":{"type":"string","enum":["client_closed","timeout","error"]}}},"ErrorResponse":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["type","code","message","request_id"],"properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}}}}}}}