{"openapi":"3.1.0","info":{"title":"Uberduck Text To Speech API","version":"0.1.0"},"servers":[{"url":"https://api.uberduck.ai"}],"paths":{"/v1/text-to-speech":{"post":{"tags":["v1"],"summary":"Text To Speech","operationId":"text_to_speech_v1_text_to_speech_post","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextToSpeechRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextToSpeechResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/voices":{"get":{"tags":["v1"],"summary":"Get Voices","description":"Get information on available voices.\n\nParameters:\n- age: Filter by voice age\n- gender: Filter by voice gender\n- accent: Filter by voice accent\n- mood: Filter by voice mood\n- style: Filter by voice style\n- language: Filter by voice language\n- limit: Maximum number of voices to return\n- offset: Number of voices to skip\n- private: Include private voices\n- name: Filter by voice name\n- uuid: Filter by voice UUID\n- model: Filter by model ID (e.g. \"polly_neural\", \"google_standard\", \"azure_neural\")\n- tag: Filter by voice tag (e.g. \"characters\", \"celebrities\", \"accents\")\n          For Polly voices:\n          - \"polly_neural\" returns voices that support the neural engine\n          - \"polly_standard\" returns voices that support the standard engine\n          For Google voices:\n          - \"google_wavenet\" returns WaveNet voices\n          - \"google_neural2\" returns Neural2 voices\n          - \"google_standard\" returns standard voices\n          For Azure voices:\n          - \"azure_neural\" returns neural voices","operationId":"get_voices_v1_voices_get","parameters":[{"required":false,"schema":{"type":"string","title":"Age"},"name":"age","in":"query"},{"required":false,"schema":{"type":"string","title":"Gender"},"name":"gender","in":"query"},{"required":false,"schema":{"type":"string","title":"Accent"},"name":"accent","in":"query"},{"required":false,"schema":{"type":"string","title":"Mood"},"name":"mood","in":"query"},{"required":false,"schema":{"type":"string","title":"Style"},"name":"style","in":"query"},{"required":false,"schema":{"type":"string","title":"Language"},"name":"language","in":"query"},{"required":false,"schema":{"type":"integer","title":"Limit"},"name":"limit","in":"query"},{"required":false,"schema":{"type":"integer","title":"Offset"},"name":"offset","in":"query"},{"required":false,"schema":{"type":"boolean","title":"Private"},"name":"private","in":"query"},{"required":false,"schema":{"type":"string","title":"Name"},"name":"name","in":"query"},{"required":false,"schema":{"type":"string","title":"Uuid"},"name":"uuid","in":"query"},{"required":false,"schema":{"type":"string","title":"Model"},"name":"model","in":"query"},{"required":false,"schema":{"type":"string","title":"Search Term"},"name":"search_term","in":"query"},{"required":false,"schema":{"type":"string","title":"Tag"},"name":"tag","in":"query"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVoicesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["v1"],"summary":"Instant Voice Clone","description":"Create a zero-shot voice in the database without generating a sample.","operationId":"instant_voice_clone_v1_voices_post","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstantVoiceCloneRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstantVoiceCloneResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/models":{"get":{"tags":["v1"],"summary":"Get Models","description":"Get information about available TTS models.\n\nThis endpoint returns a list of TTS models from supported providers:\n- AWS Polly (standard and neural)\n- Google Cloud TTS\n- Azure Speech Services\n\nParameters:\n- provider: Optional filter to return models only from a specific provider (e.g., \"aws\", \"google\", \"azure\")\n\nReturns:\n- A list of model objects with provider information and capabilities","operationId":"get_models_v1_models_get","parameters":[{"required":false,"schema":{"type":"string","title":"Provider"},"name":"provider","in":"query"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetModelsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/conversational/token":{"post":{"tags":["v1"],"summary":"Generate Conversational Token","description":"Generate a token for joining conversational AI voice calls.\n\nThis endpoint creates a JWT token that allows users to join a LiveKit room\nwhere they can interact with conversational AI voice agents.\n\nParameters:\n- workflow: The workflow identifier for the AI agent\n- draft: Whether to use the draft version of the workflow\n- dynamic_variables: Variables to pass to the workflow\n- identity: User identity (defaults to 'voice_assistant_user')\n- metadata: Additional metadata to include in the token","operationId":"generate_conversational_token_v1_conversational_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationalTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationalTokenResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AgentConfig":{"properties":{"raw":{"type":"string","title":"Raw","description":"Raw agent configuration in YAML format"},"json":{"type":"object","title":"Json","description":"Agent configuration as dictionary/JSON format"},"url":{"type":"string","title":"Url","description":"URL that points to agent configuration in YAML format"},"app":{"allOf":[{"$ref":"#/components/schemas/AppAgentConfig"}],"title":"App","description":"App agent configuration"}},"type":"object","title":"AgentConfig"},"AppAgentConfig":{"properties":{"app_id":{"type":"string","title":"App Id","description":"App ID"},"path":{"type":"string","title":"Path","description":"Path to the app","default":"agent.yaml"}},"type":"object","required":["app_id"],"title":"AppAgentConfig"},"ConversationalTokenRequest":{"properties":{"agent_config":{"allOf":[{"$ref":"#/components/schemas/AgentConfig"}],"title":"Agent Config","description":"Agent configuration"},"identity":{"type":"string","title":"Identity","description":"User identity (defaults to 'voice_assistant_user')"},"metadata":{"type":"object","title":"Metadata","description":"Additional metadata to include in the token"}},"type":"object","title":"ConversationalTokenRequest","description":"Request schema for generating a LiveKit token for AI voice calls."},"ConversationalTokenResponse":{"properties":{"server_url":{"type":"string","title":"Server Url","description":"LiveKit server URL"},"room_name":{"type":"string","title":"Room Name","description":"Room name to join"},"participant_token":{"type":"string","title":"Participant Token","description":"JWT token for authentication"}},"type":"object","required":["server_url","room_name","participant_token"],"title":"ConversationalTokenResponse","description":"Response schema for LiveKit token generation."},"ErrorDetail":{"properties":{"code":{"type":"string","title":"Code","description":"Error code"},"message":{"type":"string","title":"Message","description":"Human-readable error message"},"details":{"type":"object","title":"Details","description":"Additional error details"}},"type":"object","required":["code","message"],"title":"ErrorDetail","description":"Details for an API error."},"ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/ErrorDetail"}},"type":"object","required":["error"],"title":"ErrorResponse","description":"API error response format."},"GetModelsResponse":{"properties":{"models":{"items":{"$ref":"#/components/schemas/Model"},"type":"array","title":"Models","description":"List of available models"},"total":{"type":"integer","title":"Total","description":"Total number of models"}},"type":"object","required":["models","total"],"title":"GetModelsResponse","description":"Response schema for the models endpoint."},"GetVoicesResponse":{"properties":{"total":{"type":"integer","title":"Total"},"voices":{"items":{"$ref":"#/components/schemas/Voice"},"type":"array","title":"Voices"}},"type":"object","required":["total","voices"],"title":"GetVoicesResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InstantVoiceCloneRequest":{"properties":{"paths":{"items":{"type":"string"},"type":"array","title":"Paths","description":"List of paths to audio files"},"name":{"type":"string","maxLength":100,"title":"Name","description":"Name of the voice"},"description":{"type":"string","maxLength":1000,"title":"Description","description":"Description of the voice"}},"type":"object","required":["paths","name"],"title":"InstantVoiceCloneRequest"},"InstantVoiceCloneResponse":{"properties":{"display_name":{"type":"string","title":"Display Name","description":"Display name of the voice"},"voicemodel_uuid":{"type":"string","title":"Voicemodel Uuid","description":"UUID of the voice"}},"type":"object","required":["display_name","voicemodel_uuid"],"title":"InstantVoiceCloneResponse"},"Model":{"properties":{"id":{"type":"string","title":"Id","description":"Unique identifier for the model"},"name":{"type":"string","title":"Name","description":"Display name for the model"},"provider_id":{"type":"string","title":"Provider Id","description":"Provider identifier"},"provider_name":{"type":"string","title":"Provider Name","description":"Provider name (e.g., 'aws', 'google', 'azure')"},"description":{"type":"string","title":"Description","description":"Description of the model"},"features":{"items":{"type":"string"},"type":"array","title":"Features","description":"List of features supported by this model"},"is_default":{"type":"boolean","title":"Is Default","description":"Whether this is a default model for the provider","default":false},"is_open_source":{"type":"boolean","title":"Is Open Source","description":"Whether this model is open source","default":false},"app_path":{"type":"string","title":"App Path","description":"The app path that this model should link to"},"has_voices":{"type":"boolean","title":"Has Voices","description":"Whether this model has associated voices","default":true}},"type":"object","required":["id","name","provider_id","provider_name"],"title":"Model","description":"Schema for a TTS model."},"TextToSpeechRequest":{"properties":{"text":{"type":"string","maxLength":10000,"minLength":1,"title":"Text","description":"The text to convert to speech"},"voice":{"type":"string","title":"Voice","description":"The voice ID to use"},"model":{"type":"string","title":"Model","description":"The model to use for speech generation"},"extended":{"type":"object","title":"Extended","description":"Common parameters supported by many models"},"model_specific":{"type":"object","title":"Model Specific","description":"Parameters specific to the chosen model"},"output_format":{"type":"string","title":"Output Format","description":"Desired output format (mp3, wav, etc.)","default":"mp3"}},"type":"object","required":["text","voice"],"title":"TextToSpeechRequest","description":"Request schema for the text-to-speech endpoint."},"TextToSpeechResponse":{"properties":{"audio_url":{"type":"string","title":"Audio Url","description":"URL to the generated audio"}},"type":"object","required":["audio_url"],"title":"TextToSpeechResponse","description":"Response schema for the text-to-speech endpoint."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"Voice":{"properties":{"display_name":{"type":"string","title":"Display Name"},"voicemodel_uuid":{"type":"string","title":"Voicemodel Uuid"},"is_private":{"type":"boolean","title":"Is Private"},"age":{"type":"string","title":"Age"},"gender":{"type":"string","title":"Gender"},"accent":{"type":"string","title":"Accent"},"style":{"type":"string","title":"Style"},"mood":{"type":"string","title":"Mood"},"image_url":{"type":"string","title":"Image Url"},"sample_url":{"type":"string","title":"Sample Url"},"name":{"type":"string","title":"Name"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"language":{"type":"string","title":"Language"},"description":{"type":"string","title":"Description"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"type":"object","required":["display_name","voicemodel_uuid"],"title":"Voice"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}