{"openapi":"3.1.0","info":{"title":"ProsodyAI API","version":"1.0.0","description":"Text to speech with OpenAI TTS and Google Gemini TTS in 59 languages, directed in plain words, plus bulk generation, video Studio jobs and webhooks.\n\nAuthenticate with an API key from the Developer page (`Authorization: Bearer sk_...`): https://prosodyai.ai/auth.md. Plans and allowances: https://prosodyai.ai/pricing.md.\n\nGeneration is asynchronous: `POST /api/v1/tts/generate` returns a `task_id`; poll `GET /api/v1/tts/status/{task_id}` or register a webhook."},"servers":[{"url":"https://api.prosodyai.ai"}],"paths":{"/api/v1/auth/me":{"get":{"tags":["auth"],"summary":"Get Current User Info","description":"Get current user profile.","operationId":"get_current_user_info_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/tts/providers":{"get":{"tags":["tts"],"summary":"Get Tts Providers","description":"Return available TTS providers with remaining quota for the current user.","operationId":"get_tts_providers_api_v1_tts_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"object"},"type":"array","title":"Response Get Tts Providers Api V1 Tts Providers Get"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/tts/generate":{"post":{"tags":["tts"],"summary":"Generate Tts","description":"Generate TTS audio.\n\n**Request body:**\n- `text`: Text to synthesize (1-5000 chars)\n- `voice_id`: Voice model ID (optional)\n- `language`: Language code (en, tr, es, fr, etc)\n- `audio_format`: Output format (mp3, wav, ogg, flac)\n- `audio_quality`: high, medium, low\n- `speed`: 0.5 to 2.0\n- `pitch`: -20 to +20\n- `volume`: -10 to +10\n- `ssml`: Enable SSML support\n\n**Response:**\n- `task_id`: Celery task ID for polling status\n- `status`: \"pending\" (immediate response)\n- `polling_url`: URL to check status via GET /tts/status/{task_id}\n- `created_at`: Request timestamp\n- `request_id`: Unique request identifier\n\n**Note:** Audio generation is async. Poll the status endpoint to get the audio URL.","operationId":"generate_tts_api_v1_tts_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TTSGenerateRequest"},"example":{"text":"Hello, world!","language":"en","style_instructions":"warm, unhurried","audio_format":"mp3"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TTSGenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/tts/status/{task_id}":{"get":{"tags":["tts"],"summary":"Get Tts Status","description":"Get TTS generation status.\n\nPoll this endpoint to get:\n- Current `status`: pending, processing, completed, failed\n- `audio_url`: Download URL when completed\n- Error details if failed (`error_code`, `error_message`)\n\n**Poll interval:** Recommended 1-5 seconds\n\n**Status codes:**\n- `pending`: Task queued, waiting for worker\n- `processing`: Worker is synthesizing the audio\n- `completed`: Audio ready (check `audio_url`)\n- `failed`: Synthesis failed (check `error_message`)","operationId":"get_tts_status_api_v1_tts_status__task_id__get","security":[{"bearerAuth":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TTSStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tts/audio/{task_id}":{"get":{"tags":["tts"],"summary":"Stream Audio","description":"Stream audio file from MinIO through backend. Optional speed (0.5–2.0) via ffmpeg atempo.\nAuth via Authorization header or ?token= query param (needed for <audio> elements).","operationId":"stream_audio_api_v1_tts_audio__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"speed","in":"query","required":false,"schema":{"type":"number","default":1.0,"title":"Speed"}},{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Download"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/tts/requests":{"get":{"tags":["tts"],"summary":"List Tts Requests","description":"List all TTS requests for current user.\n\n**Query parameters:**\n- `status_filter`: Filter by status (pending, processing, completed, failed)\n- `limit`: Number of results (default: 100)\n- `offset`: Pagination offset (default: 0)\n\n**Returns:**\nPaginated list of TTS requests with synthesis results and errors.","operationId":"list_tts_requests_api_v1_tts_requests_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"status_filter","in":"query","required":false,"schema":{"type":"string","title":"Status Filter"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TTSRequestResponse"},"title":"Response List Tts Requests Api V1 Tts Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tts/{request_id}/video":{"post":{"tags":["tts"],"summary":"Render Video","description":"Render a finished generation into a shareable MP4.\n\nLandscape (16:9) targets YouTube; vertical (9:16) targets Shorts, TikTok and\nReels. Poll `GET /tts/status/{task_id}` for `video_status` and `video_url`.\n\nRendering reuses the audio already stored for this request — it never\nre-synthesises, so it costs no characters and consumes no quota.","operationId":"render_video_api_v1_tts__request_id__video_post","security":[{"bearerAuth":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TTSVideoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TTSVideoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tts/batch":{"post":{"tags":["tts-batch"],"summary":"Create Batch","description":"Queue up to 500 lines as one job.","operationId":"create_batch_api_v1_tts_batch_post","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TTSBatchCreate"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Batch Api V1 Tts Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["tts-batch"],"summary":"List Batches","description":"The caller's batches, newest first. No line manifest — that is per batch.","operationId":"list_batches_api_v1_tts_batch_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TTSBatchResponse"},"title":"Response List Batches Api V1 Tts Batch Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tts/batch/{batch_id}":{"get":{"tags":["tts-batch"],"summary":"Get Batch","description":"Poll a batch. `lines` fills in as the work lands.","operationId":"get_batch_api_v1_tts_batch__batch_id__get","security":[{"bearerAuth":[]}],"parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TTSBatchManifest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/voices/":{"get":{"tags":["voices"],"summary":"List Voices","description":"List available built-in voices.\n\n**Query parameters:**\n- `language`: Filter by language code (en, tr, es, fr, de, it, ja, zh, etc)\n- `gender`: Filter by gender (male, female, neutral)\n\n**Response:**\nList of voice models with:\n- `id`: Voice model ID (for use in /tts/generate)\n- `name`: Voice name (e.g., \"John\", \"Emma\")\n- `language`: Language code\n- `gender`: Gender\n- `description`: Voice characteristics\n- `rating`: User rating (1-5)\n- `sample_url`: Audio sample for preview\n- `is_premium`: Whether voice requires paid plan\n\n**Note:** Premium voices require active subscription on paid plan.","operationId":"list_voices_api_v1_voices__get","security":[{"bearerAuth":[]}],"parameters":[{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"gender","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"}},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VoiceModelResponse"},"title":"Response List Voices Api V1 Voices  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/voices/styles":{"get":{"tags":["voices"],"summary":"List Voice Styles","description":"List available voice style presets.\n\nPremium styles require a paid subscription plan.","operationId":"list_voice_styles_api_v1_voices_styles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/VoiceStyleResponse"},"type":"array","title":"Response List Voice Styles Api V1 Voices Styles Get"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/voices/{voice_code}/sample":{"get":{"tags":["voices"],"summary":"Get Voice Sample","description":"Serve the preview clip for a voice. Public endpoint, no auth required.","operationId":"get_voice_sample_api_v1_voices__voice_code__sample_get","parameters":[{"name":"voice_code","in":"path","required":true,"schema":{"type":"string","title":"Voice Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/voices/{voice_id}":{"get":{"tags":["voices"],"summary":"Get Voice","description":"Get details for a specific voice model.\n\n**Parameters:**\n- `voice_id`: Voice model ID\n\n**Response:**\nVoice model details including sample audio, ratings, and features.\n\n**Note:** Typed as a UUID path param (VoiceModel.id's real type) rather\nthan a bare str -- deliberately, so that a non-UUID single path segment\n(like the old `/clone`, `/custom`, `/consents` cloning routes) fails to\nmatch this route at all and falls through to a clean 404, instead of\nthis handler swallowing it as \"voice not found\" or the router answering\n405 because *some* route's path shape matched.","operationId":"get_voice_api_v1_voices__voice_id__get","security":[{"bearerAuth":[]}],"parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Voice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceModelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/voices/speakers":{"get":{"tags":["voices"],"summary":"Get Speakers","description":"List available built-in voices for a given language.","operationId":"get_speakers_api_v1_voices_speakers_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"language","in":"query","required":false,"schema":{"type":"string","default":"tr","title":"Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/upload":{"post":{"tags":["studio"],"summary":"Upload Media","description":"Store a source file and return the object name a job will reference.\n\nThe file is validated with ffprobe here rather than in the worker so a bad\nupload fails immediately, with a message about the file itself.","operationId":"upload_media_api_v1_studio_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_media_api_v1_studio_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Media Api V1 Studio Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/studio/engines":{"get":{"tags":["studio"],"summary":"List Engines","description":"Which video engines this account can actually reach, and with what.\n\nThe Veo picker has always shown all three tiers and let the server refuse\nwhat the plan cannot reach. That works when the engine is certainly there;\nSeedance may not be configured at all, and a picker offering an engine that\nanswers 503 is worse than no picker. So both are answered here, from the\nsame tables the gate enforces -- a client that renders this list cannot\noffer something the gate will refuse.\n\nLabels come from the client module rather than the page, so the model ids\nand the names shown for them cannot disagree.","operationId":"list_engines_api_v1_studio_engines_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Engines Api V1 Studio Engines Get"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/studio/templates":{"get":{"tags":["studio"],"summary":"List Templates","description":"The ready-made looks, without their prompts.\n\nListed for every account: a free one sees what it would get (the preview\nclips) with `can_generate` false, which is the paywall's best argument.\nA preview whose file is missing is listed with no URL rather than a\nsigned link to nothing.","operationId":"list_templates_api_v1_studio_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"object"},"type":"array","title":"Response List Templates Api V1 Studio Templates Get"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/studio/jobs":{"post":{"tags":["studio"],"summary":"Create Job","description":"Queue a Studio job. Poll `GET /studio/jobs/{id}` for the result.","operationId":"create_job_api_v1_studio_jobs_post","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioJobCreate"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["studio"],"summary":"List Jobs","description":"Recent Studio jobs, newest first.","operationId":"list_jobs_api_v1_studio_jobs_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StudioJobResponse"},"title":"Response List Jobs Api V1 Studio Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/jobs/{job_id}":{"get":{"tags":["studio"],"summary":"Get Job","description":"Poll a job. `status` is pending → processing → completed | failed.","operationId":"get_job_api_v1_studio_jobs__job_id__get","security":[{"bearerAuth":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters":{"get":{"tags":["characters"],"summary":"List Characters","operationId":"list_characters_api_v1_characters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CharacterOut"},"type":"array","title":"Response List Characters Api V1 Characters Get"}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["characters"],"summary":"Create Character","operationId":"create_character_api_v1_characters_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterCreate"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/characters/{character_id}":{"get":{"tags":["characters"],"summary":"Get Character","operationId":"get_character_api_v1_characters__character_id__get","security":[{"bearerAuth":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Character Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["characters"],"summary":"Rename Character","operationId":"rename_character_api_v1_characters__character_id__patch","security":[{"bearerAuth":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Character Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterRename"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["characters"],"summary":"Delete Character","operationId":"delete_character_api_v1_characters__character_id__delete","security":[{"bearerAuth":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Character Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/{character_id}/approve":{"post":{"tags":["characters"],"summary":"Approve Front","description":"The front is right; derive the other three views from it.","operationId":"approve_front_api_v1_characters__character_id__approve_post","security":[{"bearerAuth":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Character Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/{character_id}/images/{view}/regenerate":{"post":{"tags":["characters"],"summary":"Regenerate View","description":"Redraw one view. Costs one image; a failed view is retried through\nhere and charged again, because its first charge was refunded.","operationId":"regenerate_view_api_v1_characters__character_id__images__view__regenerate_post","security":[{"bearerAuth":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Character Id"}},{"name":"view","in":"path","required":true,"schema":{"type":"string","title":"View"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/frames":{"get":{"tags":["studio-frames"],"summary":"List Frames","operationId":"list_frames_api_v1_studio_frames_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/StudioFrameOut"},"type":"array","title":"Response List Frames Api V1 Studio Frames Get"}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["studio-frames"],"summary":"Create Frame","description":"Draw `count` stills of the same shot, one per camera angle, and hand\nthem back in angle order. Poll `GET /studio/frames/{id}` for each.\n\nEach frame is its own row -- its own status, its own refund, its own redraw\n-- because one angle failing is no reason to lose the others; what makes\nthem one draw is the `batch_id` they share and the single task that draws\nthem.","operationId":"create_frame_api_v1_studio_frames_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioFrameCreate"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/StudioFrameOut"},"type":"array","title":"Response Create Frame Api V1 Studio Frames Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/studio/frames/{frame_id}":{"get":{"tags":["studio-frames"],"summary":"Get Frame","operationId":"get_frame_api_v1_studio_frames__frame_id__get","security":[{"bearerAuth":[]}],"parameters":[{"name":"frame_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Frame Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioFrameOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["studio-frames"],"summary":"Delete Frame","operationId":"delete_frame_api_v1_studio_frames__frame_id__delete","security":[{"bearerAuth":[]}],"parameters":[{"name":"frame_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Frame Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/studio/frames/{frame_id}/regenerate":{"post":{"tags":["studio-frames"],"summary":"Regenerate Frame","description":"Draw the frame again, optionally with edited words. Costs one image.","operationId":"regenerate_frame_api_v1_studio_frames__frame_id__regenerate_post","security":[{"bearerAuth":[]}],"parameters":[{"name":"frame_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Frame Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioFrameRegenerate"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioFrameOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me":{"get":{"tags":["users"],"summary":"Get Current User Profile","description":"Get current user's profile information.\n\n**Response:**\n- `email`: User email\n- `full_name`: Full name\n- `created_at`: Account creation date\n- `api_key_count`: Number of active API keys\n- `subscription_status`: Active plan tier","operationId":"get_current_user_profile_api_v1_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/users/me/subscription":{"get":{"tags":["users"],"summary":"Get Subscription","description":"Get current user's subscription details.\n\n**Response:**\n- `plan_name`: Current plan name (Free, Pro, Studio, Enterprise)\n- `billing_cycle`: monthly or yearly\n- `features`: List of enabled features\n- `characters_per_month`: Monthly character quota\n- `requests_per_minute`: Rate limit\n- `period_started_at`: Current billing period start\n- `period_ends_at`: Current billing period end\n- `status`: active, trialing, cancelled, expired\n- `auto_renew`: Automatic renewal enabled\n- `cancellation_scheduled_at`: When cancellation takes effect (if scheduled)","operationId":"get_subscription_api_v1_users_me_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/users/me/quota":{"get":{"tags":["users"],"summary":"Get Quota Usage","description":"Get current quota usage.\n\n**Response:**\n- `characters_total`: Monthly character quota\n- `characters_used`: Characters used this period\n- `characters_remaining`: Characters remaining\n- `percentage_used`: Usage percentage (0-100)\n- `requests_total`: Total requests available this period\n- `requests_used`: Requests made this period\n- `period_started_at`: Billing period start\n- `period_ends_at`: Billing period end\n- `days_remaining`: Days until period reset","operationId":"get_quota_usage_api_v1_users_me_quota_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotaUsageResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/users/me/usage":{"get":{"tags":["users"],"summary":"Get Usage Metrics","description":"Get detailed usage metrics for a period.\n\n**Query parameters:**\n- `period`: last_7_days, last_30_days, or this_month\n\n**Response:**\n- `total_requests`: Total TTS requests in period\n- `total_characters`: Total characters synthesized\n- `total_audio_duration_seconds`: Total duration of generated audio\n- `total_cost`: Estimated cost (if metered billing)\n- `daily_breakdown`: Day-by-day usage stats\n- `average_characters_per_request`: Efficiency metric","operationId":"get_usage_metrics_api_v1_users_me_usage_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"last_30_days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/requests":{"get":{"tags":["users"],"summary":"List My Requests","description":"List current user's TTS requests.\n\n**Query parameters:**\n- `status_filter`: Filter by status (pending, processing, completed, failed)\n- `limit`: Items per page (default: 100)\n- `offset`: Pagination offset (default: 0)\n\n**Response:**\nPaginated list of TTS requests with synthesis results.","operationId":"list_my_requests_api_v1_users_me_requests_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TTSRequestResponse"},"title":"Response List My Requests Api V1 Users Me Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/settings":{"get":{"tags":["users"],"summary":"Get Settings","description":"Get user settings and preferences.\n\n**Response:**\n- `language`: Language preference code\n- `timezone`: Timezone for billing/notifications\n- `email_notifications`: Receive email notifications\n- `api_defaults`: Default TTS parameters (voice, format, quality)","operationId":"get_settings_api_v1_users_me_settings_get","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsResponse"}}}}}}},"/api/v1/webhooks/":{"get":{"tags":["webhooks"],"summary":"List Webhooks","description":"List all registered webhooks for the current user.\n\n**Requirements:** Starter plan or higher (api_access feature).","operationId":"list_webhooks_api_v1_webhooks__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WebhookResponse"},"type":"array","title":"Response List Webhooks Api V1 Webhooks  Get"}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["webhooks"],"summary":"Register Webhook","description":"Register a webhook endpoint to receive TTS event notifications.\n\n**Requirements:** Starter plan or higher (api_access feature).\n\n**Request body:**\n- `url`: HTTPS URL that will receive POST requests for events. Its host\n  must resolve to public addresses only; redirects are not followed.\n- `events`: List of events to subscribe to. Omitting it subscribes to\n  `tts.completed` and `tts.failed` only — a batch integration has to ask\n  for `batch.completed` explicitly.\n- `name`: Optional label for this webhook\n- `secret`: Optional HMAC secret — if set, every delivery includes an\n  `X-ProsodyAI-Signature` header (HMAC-SHA256 of the request body)\n\n**Supported events:**\n- `tts.completed`: Fired when audio generation finishes successfully\n- `tts.failed`: Fired when audio generation fails\n- `batch.completed`: A bulk submission finished; the payload carries\n  `batch_id`, the line counts and `archive_url` for the ZIP\n- `batch.failed`: A bulk submission ended failed as a whole\n- `quota.warning`: Usage crossed 80% / 90% / 100% of the month's quota\n- `monthly.report`: Usage summary at the billing period reset\n- `invoice.created`: A new invoice was generated\n\n**Delivery:** anything but a 2xx answer within 10 seconds is retried after\n1, 5, 15 and 45 minutes, then dropped. Every attempt carries the same body\n(same `timestamp`), so a receiver can ignore a repeat;\n`X-ProsodyAI-Delivery-Attempt` numbers them from 1.\n\n**Limits:** Maximum 10 webhooks per user.","operationId":"register_webhook_api_v1_webhooks__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/webhooks/{webhook_id}":{"delete":{"tags":["webhooks"],"summary":"Delete Webhook","description":"Delete (deactivate) a registered webhook.\n\n**Requirements:** Starter plan or higher (api_access feature).\n\n**Parameters:**\n- `webhook_id`: Webhook UUID to delete","operationId":"delete_webhook_api_v1_webhooks__webhook_id__delete","security":[{"bearerAuth":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Webhook Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["webhooks"],"summary":"Update Webhook","description":"Update a registered webhook.\n\n**Requirements:** Starter plan or higher (api_access feature).\n\n**Updatable fields:** `url`, `events`, `name`, `secret`, `is_active`","operationId":"update_webhook_api_v1_webhooks__webhook_id__put","security":[{"bearerAuth":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Webhook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/test":{"post":{"tags":["webhooks"],"summary":"Test Webhook","description":"Send a test payload to the webhook URL to verify it is reachable.\n\nDelivers: `{\"event\": \"test\", \"timestamp\": ..., \"data\": {\"message\": \"Test\"}}`\n\nIf a secret is configured, an `X-ProsodyAI-Signature` header (HMAC-SHA256)\nis included.","operationId":"test_webhook_api_v1_webhooks__webhook_id__test_post","security":[{"bearerAuth":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/my-costs":{"get":{"tags":["Cost Accounting"],"summary":"Get My Costs","description":"Get your cost breakdown over time.\n\nUseful for understanding your usage patterns and optimizing costs.","operationId":"get_my_costs_api_v1_costs_my_costs_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Number of days to look back","default":30,"title":"Days"},"description":"Number of days to look back"},{"name":"group_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(day|week|month)$","default":"day","title":"Group By"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserCostBreakdown"},"title":"Response Get My Costs Api V1 Costs My Costs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/my-summary":{"get":{"tags":["Cost Accounting"],"summary":"Get My Cost Summary","description":"Get your cost summary for a time period.\n\nReturns total costs, request counts, and averages.","operationId":"get_my_cost_summary_api_v1_costs_my_summary_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/quotas/my-status":{"get":{"tags":["Quota Management"],"summary":"Get My Quota Status","description":"Get your current quota status.\n\nShows limits, usage, and remaining quota for all quota types.","operationId":"get_my_quota_status_api_v1_quotas_my_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotaStatusResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/quotas/my-tier":{"get":{"tags":["Quota Management"],"summary":"Get My Tier Quotas","description":"Get quota limits for your subscription tier.\n\nShows what quotas are available at your current plan level.","operationId":"get_my_tier_quotas_api_v1_quotas_my_tier_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}]}}},"components":{"schemas":{"Body_upload_media_api_v1_studio_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"purpose":{"type":"string","title":"Purpose","description":"video | image | audio"}},"type":"object","required":["file","purpose"],"title":"Body_upload_media_api_v1_studio_upload_post"},"CharacterCreate":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":1500,"minLength":10,"title":"Description"},"reference_object":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Object"}},"type":"object","required":["name","description"],"title":"CharacterCreate"},"CharacterImageOut":{"properties":{"view":{"type":"string","title":"View"},"status":{"type":"string","title":"Status"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["view","status"],"title":"CharacterImageOut"},"CharacterOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"reference_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Url"},"stage":{"type":"string","title":"Stage"},"images":{"items":{"$ref":"#/components/schemas/CharacterImageOut"},"type":"array","title":"Images"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","description","stage","images","created_at"],"title":"CharacterOut"},"CharacterRename":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"CharacterRename"},"CostSummaryResponse":{"properties":{"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"total_cost":{"type":"number","title":"Total Cost"},"gpu_cost":{"type":"number","title":"Gpu Cost"},"character_cost":{"type":"number","title":"Character Cost"},"request_count":{"type":"integer","title":"Request Count"},"unique_users":{"type":"integer","title":"Unique Users","default":0},"total_gpu_hours":{"type":"number","title":"Total Gpu Hours"},"avg_cost_per_request":{"type":"number","title":"Avg Cost Per Request"}},"type":"object","required":["period_start","period_end","total_cost","gpu_cost","character_cost","request_count","total_gpu_hours","avg_cost_per_request"],"title":"CostSummaryResponse","description":"Cost summary for a time period."},"DailyUsageResponse":{"properties":{"date":{"type":"string","title":"Date"},"requests":{"type":"integer","title":"Requests"},"characters":{"type":"integer","title":"Characters"},"audio_duration_seconds":{"type":"number","title":"Audio Duration Seconds"}},"type":"object","required":["date","requests","characters","audio_duration_seconds"],"title":"DailyUsageResponse","description":"Daily usage stats"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"PlanResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"display_name":{"type":"string","title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price_monthly":{"type":"number","title":"Price Monthly"},"price_yearly":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Yearly"},"characters_per_month":{"type":"integer","title":"Characters Per Month"},"requests_per_minute":{"type":"integer","title":"Requests Per Minute"},"requests_per_day":{"type":"integer","title":"Requests Per Day"},"max_audio_length_seconds":{"type":"integer","title":"Max Audio Length Seconds"},"max_concurrent_requests":{"type":"integer","title":"Max Concurrent Requests"},"features":{"items":{"type":"string"},"type":"array","title":"Features","default":[]},"voice_models":{"items":{"type":"string"},"type":"array","title":"Voice Models","default":[]},"max_custom_voices":{"type":"integer","title":"Max Custom Voices"},"voice_cloning_enabled":{"type":"boolean","title":"Voice Cloning Enabled"},"support_level":{"type":"string","title":"Support Level"},"sla_uptime_percentage":{"type":"number","title":"Sla Uptime Percentage"},"is_active":{"type":"boolean","title":"Is Active"},"is_public":{"type":"boolean","title":"Is Public"},"sort_order":{"type":"integer","title":"Sort Order"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"video_clips":{"items":{"$ref":"#/components/schemas/PlanVideoClip"},"type":"array","title":"Video Clips","default":[]}},"type":"object","required":["id","name","display_name","description","price_monthly","price_yearly","characters_per_month","requests_per_minute","requests_per_day","max_audio_length_seconds","max_concurrent_requests","max_custom_voices","voice_cloning_enabled","support_level","sla_uptime_percentage","is_active","is_public","sort_order","created_at"],"title":"PlanResponse","description":"Subscription plan response"},"PlanVideoClip":{"properties":{"engine":{"type":"string","title":"Engine"},"model":{"type":"string","title":"Model"},"label":{"type":"string","title":"Label"},"clip_seconds":{"type":"integer","title":"Clip Seconds"},"included":{"type":"integer","title":"Included"},"max":{"type":"integer","title":"Max"}},"type":"object","required":["engine","model","label","clip_seconds","included","max"],"title":"PlanVideoClip","description":"Clips per month a plan buys with one video model (spec 2026-10-20)."},"QuotaStatusResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"quotas":{"type":"object","title":"Quotas"}},"type":"object","required":["user_id","quotas"],"title":"QuotaStatusResponse","description":"Complete quota status for a user."},"QuotaUsageResponse":{"properties":{"characters_total":{"type":"integer","title":"Characters Total"},"characters_used":{"type":"integer","title":"Characters Used"},"characters_remaining":{"type":"integer","title":"Characters Remaining"},"bonus_characters":{"type":"integer","title":"Bonus Characters","default":0},"percentage_used":{"type":"number","title":"Percentage Used"},"requests_total":{"type":"integer","title":"Requests Total"},"requests_used":{"type":"integer","title":"Requests Used"},"period_started_at":{"type":"string","format":"date-time","title":"Period Started At"},"period_ends_at":{"type":"string","format":"date-time","title":"Period Ends At"},"days_remaining":{"type":"integer","title":"Days Remaining"},"openai_tts_total":{"type":"integer","title":"Openai Tts Total","default":0},"openai_tts_used":{"type":"integer","title":"Openai Tts Used","default":0},"google_tts_total":{"type":"integer","title":"Google Tts Total","default":0},"google_tts_used":{"type":"integer","title":"Google Tts Used","default":0},"premium_welcome_gift":{"type":"boolean","title":"Premium Welcome Gift","default":false},"premium_pack_balance":{"type":"integer","title":"Premium Pack Balance","default":0},"video_seconds_total":{"type":"integer","title":"Video Seconds Total","default":0},"video_seconds_used":{"type":"integer","title":"Video Seconds Used","default":0},"video_seconds_reserved":{"type":"integer","title":"Video Seconds Reserved","default":0},"video_seconds_remaining":{"type":"integer","title":"Video Seconds Remaining","default":0},"images_total":{"type":"integer","title":"Images Total","default":0},"images_used":{"type":"integer","title":"Images Used","default":0},"images_remaining":{"type":"integer","title":"Images Remaining","default":0}},"type":"object","required":["characters_total","characters_used","characters_remaining","percentage_used","requests_total","requests_used","period_started_at","period_ends_at","days_remaining"],"title":"QuotaUsageResponse","description":"User quota usage response"},"ReferenceMediaItem":{"properties":{"object":{"type":"string","maxLength":300,"minLength":1,"title":"Object"},"token":{"type":"string","maxLength":100,"minLength":1,"title":"Token"}},"type":"object","required":["object","token"],"title":"ReferenceMediaItem","description":"A reference video or audio clip for a Seedance generation: the object\n`/studio/upload` returned, and the `media_token` it returned beside it,\nwhich carries the clip's length signed by the server."},"SettingsResponse":{"properties":{"language":{"type":"string","title":"Language","default":"en"},"timezone":{"type":"string","title":"Timezone","default":"UTC"},"email_notifications":{"type":"boolean","title":"Email Notifications","default":true},"api_defaults":{"type":"object","title":"Api Defaults","default":{}}},"type":"object","title":"SettingsResponse","description":"User settings response"},"StudioFrameCreate":{"properties":{"prompt":{"type":"string","maxLength":3500,"minLength":10,"title":"Prompt"},"aspect":{"type":"string","enum":["16:9","9:16","1:1"],"title":"Aspect"},"character_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Character Id"},"reference_objects":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Reference Objects"},"count":{"type":"integer","maximum":4.0,"minimum":1.0,"title":"Count","default":1}},"type":"object","required":["prompt","aspect"],"title":"StudioFrameCreate"},"StudioFrameOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"prompt":{"type":"string","title":"Prompt"},"aspect":{"type":"string","title":"Aspect"},"status":{"type":"string","title":"Status"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"character_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Character Id"},"batch_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Batch Id"},"angle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Angle"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","prompt","aspect","status","created_at"],"title":"StudioFrameOut"},"StudioFrameRegenerate":{"properties":{"prompt":{"anyOf":[{"type":"string","maxLength":3500,"minLength":10},{"type":"null"}],"title":"Prompt"}},"type":"object","title":"StudioFrameRegenerate","description":"An empty body redraws the same prompt; a prompt edits it first."},"StudioJobCreate":{"properties":{"reference_videos":{"anyOf":[{"items":{"$ref":"#/components/schemas/ReferenceMediaItem"},"type":"array","maxItems":10},{"type":"null"}],"title":"Reference Videos"},"reference_audios":{"anyOf":[{"items":{"$ref":"#/components/schemas/ReferenceMediaItem"},"type":"array","maxItems":10},{"type":"null"}],"title":"Reference Audios"},"kind":{"type":"string","enum":["voice_over_video","image_to_video","extract_audio","video_to_gif","merge_videos","trim_video","generate_video","grab_frame","trim_silence"],"title":"Kind"},"source_object":{"type":"string","title":"Source Object","description":"Object name returned by /studio/upload","default":""},"source_filename":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Source Filename"},"source_objects":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Source Objects","description":"image_to_video: ordered slides; omit for a single image"},"tts_request_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tts Request Id"},"audio_object":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Object"},"voice_clips":{"anyOf":[{"items":{"$ref":"#/components/schemas/StudioVoiceClip"},"type":"array"},{"type":"null"}],"title":"Voice Clips"},"aspect":{"type":"string","enum":["original","16:9","9:16","1:1"],"title":"Aspect","default":"original"},"quality":{"type":"string","enum":["720p","1080p","4k"],"title":"Quality","default":"1080p"},"subtitles":{"type":"boolean","title":"Subtitles","default":false},"zoom":{"type":"boolean","title":"Zoom","description":"Slow Ken Burns push on image_to_video","default":true},"original_volume":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Original Volume","description":"Keep the source video's own audio underneath: 0 replaces it outright","default":0.0},"voice_volume":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Voice Volume","default":1.0},"voice_start":{"type":"number","minimum":0.0,"title":"Voice Start","description":"Seconds into the video where the voice begins (voice_over_video)","default":0.0},"music_object":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Music Object"},"music_volume":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Music Volume","default":0.25},"frame_at":{"type":"number","minimum":0.0,"title":"Frame At","default":0.0},"silence_level":{"type":"string","enum":["light","medium","tight"],"title":"Silence Level","default":"medium"},"preset":{"anyOf":[{"type":"string","enum":["tiktok","youtube","podcast"]},{"type":"null"}],"title":"Preset"},"loudness_target":{"anyOf":[{"type":"number","maximum":-9.0,"minimum":-24.0},{"type":"null"}],"title":"Loudness Target","description":"LUFS for the finished mix; null leaves loudness alone"},"audio_bitrate":{"type":"string","enum":["192k","256k"],"title":"Audio Bitrate","default":"192k"},"subtitle_style":{"type":"string","enum":["classic","band","bold_center"],"title":"Subtitle Style","default":"classic"},"watermark_object":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Watermark Object"},"watermark_corner":{"type":"string","enum":["tl","tr","bl","br"],"title":"Watermark Corner","default":"br"},"watermark_opacity":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Watermark Opacity","default":0.7},"watermark_scale":{"type":"number","maximum":0.35,"minimum":0.05,"title":"Watermark Scale","description":"Logo width as a fraction of the video's","default":0.12},"gif_fps":{"type":"integer","maximum":24.0,"minimum":5.0,"title":"Gif Fps","default":12},"gif_width":{"type":"integer","maximum":800.0,"minimum":120.0,"title":"Gif Width","default":480},"clip_start":{"type":"number","minimum":0.0,"title":"Clip Start","description":"Seconds into the source","default":0.0},"clip_end":{"type":"number","minimum":0.0,"title":"Clip End","description":"Seconds into the source; 0 means run to the end","default":0.0},"prompt":{"type":"string","maxLength":3500,"title":"Prompt","description":"What the video should show","default":""},"negative_prompt":{"type":"string","maxLength":500,"title":"Negative Prompt","default":""},"engine":{"type":"string","enum":["veo","seedance","wan"],"title":"Engine","default":"veo"},"veo_tier":{"type":"string","enum":["lite","fast","standard"],"title":"Veo Tier","default":"lite"},"veo_seconds":{"type":"integer","maximum":8.0,"minimum":4.0,"title":"Veo Seconds","default":8},"seedance_model":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Seedance Model"},"seedance_seconds":{"type":"integer","maximum":30.0,"minimum":4.0,"title":"Seedance Seconds","default":10},"wan_resolution":{"type":"string","enum":["480p","720p","1080p"],"title":"Wan Resolution","default":"720p"},"wan_seconds":{"type":"integer","maximum":30.0,"minimum":2.0,"title":"Wan Seconds","default":5},"wan_image_role":{"type":"string","enum":["first_frame","reference"],"title":"Wan Image Role","default":"reference"},"extend_job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Extend Job Id","description":"Continue this earlier generation instead of starting fresh. Adds 7 seconds to it."},"allow_character_burn":{"type":"boolean","title":"Allow Character Burn","description":"Once the month's video seconds are gone, pay for more out of the character quota. Opt-in per request, never assumed.","default":false},"character_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Character Id"},"frame_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Frame Id"},"frame_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Frame Ids"},"template_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Template Id"},"template_fields":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Template Fields"},"transition_seconds":{"type":"number","maximum":3.0,"minimum":0.0,"title":"Transition Seconds","description":"Crossfade between clips; 0 cuts straight","default":0.0}},"type":"object","required":["kind"],"title":"StudioJobCreate","description":"Queue a Studio media job."},"StudioJobResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"kind":{"type":"string","title":"Kind"},"status":{"type":"string","title":"Status"},"source_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Filename"},"source_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Source Duration Seconds"},"output_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Url"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"output_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Size Bytes"},"subtitle_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"settings":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Settings"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["id","kind","status","created_at"],"title":"StudioJobResponse","description":"Studio job state. Poll until status is completed or failed."},"StudioVoiceClip":{"properties":{"tts_request_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tts Request Id"},"audio_object":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Audio Object"},"start":{"type":"number","minimum":0.0,"title":"Start","description":"Seconds into the video","default":0.0},"volume":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Volume","default":1.0}},"type":"object","title":"StudioVoiceClip","description":"One voice placed on a voice_over_video's timeline.\n\nExactly one of `tts_request_id` / `audio_object` names the sound; the\nrouter enforces that rather than a validator here, so the answer is a\nsentence about the clip and not a schema error about a union."},"SubscriptionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"plan_id":{"type":"string","format":"uuid","title":"Plan Id"},"plan":{"anyOf":[{"$ref":"#/components/schemas/PlanResponse"},{"type":"null"}]},"billing_cycle":{"type":"string","title":"Billing Cycle"},"status":{"type":"string","title":"Status"},"current_period_start":{"type":"string","format":"date-time","title":"Current Period Start"},"current_period_end":{"type":"string","format":"date-time","title":"Current Period End"},"trial_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial Start"},"trial_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial End"},"quota_characters_total":{"type":"integer","title":"Quota Characters Total"},"quota_characters_used":{"type":"integer","title":"Quota Characters Used"},"quota_characters_remaining":{"type":"integer","title":"Quota Characters Remaining"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End"},"canceled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Canceled At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"scheduled_plan_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Scheduled Plan Id"},"scheduled_change_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled Change At"},"scheduled_plan":{"anyOf":[{"$ref":"#/components/schemas/PlanResponse"},{"type":"null"}]},"trial_pending_payment":{"type":"boolean","title":"Trial Pending Payment","default":false},"trial_active":{"type":"boolean","title":"Trial Active","default":false},"payment_platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Platform"},"effective_max_custom_voices":{"type":"integer","title":"Effective Max Custom Voices","default":0}},"type":"object","required":["id","user_id","plan_id","plan","billing_cycle","status","current_period_start","current_period_end","trial_start","trial_end","quota_characters_total","quota_characters_used","quota_characters_remaining","cancel_at_period_end","canceled_at","created_at","updated_at"],"title":"SubscriptionResponse","description":"User subscription response"},"TTSBatchCreate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"provider":{"type":"string","enum":["openai_tts","google_tts"],"title":"Provider","default":"openai_tts"},"voice_id":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Voice Id"},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language"},"style_instructions":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Style Instructions"},"output_format":{"type":"string","enum":["mp3","wav","telephony_pcm","telephony_ulaw"],"title":"Output Format","default":"mp3"},"mastering_profile":{"type":"string","enum":["default","short_form","podcast","ivr"],"title":"Mastering Profile","default":"ivr"},"archive":{"type":"boolean","title":"Archive","default":false},"lines":{"items":{"$ref":"#/components/schemas/TTSBatchLine"},"type":"array","maxItems":500,"minItems":1,"title":"Lines"}},"type":"object","required":["lines"],"title":"TTSBatchCreate","description":"Queue a bulk generation.\n\nVoice, language and style belong to the batch rather than the\nline: an IVR menu read in three different voices is a defect."},"TTSBatchLine":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name","description":"Output filename stem"},"text":{"type":"string","maxLength":5000,"minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"TTSBatchLine","description":"One prompt in a bulk generation."},"TTSBatchLineStatus":{"properties":{"index":{"type":"integer","title":"Index"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["index","name","status"],"title":"TTSBatchLineStatus"},"TTSBatchManifest":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"status":{"type":"string","title":"Status"},"provider":{"type":"string","title":"Provider"},"output_format":{"type":"string","title":"Output Format"},"total_lines":{"type":"integer","title":"Total Lines"},"completed_lines":{"type":"integer","title":"Completed Lines"},"failed_lines":{"type":"integer","title":"Failed Lines"},"characters_reserved":{"type":"integer","title":"Characters Reserved"},"characters_refunded":{"type":"integer","title":"Characters Refunded"},"archive_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archive Url"},"archive_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Archive Size Bytes"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"lines":{"items":{"$ref":"#/components/schemas/TTSBatchLineStatus"},"type":"array","title":"Lines","default":[]}},"type":"object","required":["id","status","provider","output_format","total_lines","completed_lines","failed_lines","characters_reserved","characters_refunded","created_at"],"title":"TTSBatchManifest"},"TTSBatchResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"status":{"type":"string","title":"Status"},"provider":{"type":"string","title":"Provider"},"output_format":{"type":"string","title":"Output Format"},"total_lines":{"type":"integer","title":"Total Lines"},"completed_lines":{"type":"integer","title":"Completed Lines"},"failed_lines":{"type":"integer","title":"Failed Lines"},"characters_reserved":{"type":"integer","title":"Characters Reserved"},"characters_refunded":{"type":"integer","title":"Characters Refunded"},"archive_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archive Url"},"archive_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Archive Size Bytes"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","status","provider","output_format","total_lines","completed_lines","failed_lines","characters_reserved","characters_refunded","created_at"],"title":"TTSBatchResponse"},"TTSGenerateRequest":{"properties":{"text":{"type":"string","maxLength":5000,"minLength":1,"title":"Text"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","default":"en"},"audio_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Format","default":"mp3"},"audio_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Quality","default":"high"},"speed":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.5},{"type":"null"}],"title":"Speed","default":1.0},"pitch":{"anyOf":[{"type":"number","maximum":20.0,"minimum":-20.0},{"type":"null"}],"title":"Pitch","default":0.0},"volume":{"anyOf":[{"type":"number","maximum":10.0,"minimum":-10.0},{"type":"null"}],"title":"Volume","default":0.0},"ssml":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ssml","default":false},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"mastering_profile":{"anyOf":[{"type":"string","pattern":"^(default|short_form|podcast|ivr)$"},{"type":"null"}],"title":"Mastering Profile","default":"default"},"style_preset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style Preset Id"},"preview":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Preview","default":false},"provider":{"type":"string","title":"Provider","description":"TTS provider: openai_tts | google_tts","default":"openai_tts"},"style_instructions":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Style Instructions","description":"Free-text delivery style for premium providers, e.g. 'warm, slow, welcoming tone'"}},"type":"object","required":["text"],"title":"TTSGenerateRequest","description":"TTS generation request"},"TTSGenerateResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"type":"string","title":"Status"},"request_id":{"type":"string","title":"Request Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"polling_url":{"type":"string","title":"Polling Url"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"}},"type":"object","required":["task_id","status","request_id","created_at","polling_url"],"title":"TTSGenerateResponse","description":"TTS generation response"},"TTSRequestResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"text":{"type":"string","title":"Text"},"text_length":{"type":"integer","title":"Text Length"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"voice_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Code"},"audio_format":{"type":"string","title":"Audio Format"},"audio_quality":{"type":"string","title":"Audio Quality"},"status":{"type":"string","title":"Status"},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url"},"audio_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Audio Duration Seconds"},"processing_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Processing Time Ms"},"cost_credits":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Credits"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","text","text_length","voice_code","audio_format","audio_quality","status","audio_url","audio_duration_seconds","processing_time_ms","cost_credits","error_message","created_at"],"title":"TTSRequestResponse","description":"TTS request details"},"TTSStatusResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"processing_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processing Started At"},"processing_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processing Completed At"},"processing_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Processing Time Ms"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"audio_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Audio Duration Seconds"},"text_length":{"type":"integer","title":"Text Length"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"mastering_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mastering Profile"},"segment_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Segment Count"},"queue_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Queue Position"},"estimated_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Seconds"},"queue_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Queue Total"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"video_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Status"},"video_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Format"},"video_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Video Expires At"}},"type":"object","required":["task_id","status","created_at","processing_started_at","processing_completed_at","processing_time_ms","error_code","error_message","audio_url","audio_duration_seconds","text_length"],"title":"TTSStatusResponse","description":"TTS task status response"},"TTSVideoRequest":{"properties":{"format":{"type":"string","enum":["landscape","vertical"],"title":"Format","description":"landscape = 16:9 (YouTube), vertical = 9:16 (Shorts/TikTok)","default":"landscape"},"title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Title"},"subtitle":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Subtitle"},"subtitles":{"type":"boolean","title":"Subtitles","description":"Burn word-timed captions into the video","default":true},"quality":{"anyOf":[{"type":"string","enum":["720p","1080p","4k"]},{"type":"null"}],"title":"Quality","description":"Paid plans only; free always renders 720p"}},"type":"object","title":"TTSVideoRequest","description":"Render a finished generation into a shareable MP4."},"TTSVideoResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"video_status":{"type":"string","title":"Video Status"},"format":{"type":"string","title":"Format"},"message":{"type":"string","title":"Message"}},"type":"object","required":["task_id","video_status","format","message"],"title":"TTSVideoResponse","description":"Accepted response for a queued video render."},"UsageMetricsResponse":{"properties":{"period":{"type":"string","title":"Period"},"total_requests":{"type":"integer","title":"Total Requests"},"total_characters":{"type":"integer","title":"Total Characters"},"total_audio_duration_seconds":{"type":"number","title":"Total Audio Duration Seconds"},"total_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Cost"},"average_characters_per_request":{"type":"number","title":"Average Characters Per Request"},"daily_breakdown":{"items":{"$ref":"#/components/schemas/DailyUsageResponse"},"type":"array","title":"Daily Breakdown"}},"type":"object","required":["period","total_requests","total_characters","total_audio_duration_seconds","total_cost","average_characters_per_request","daily_breakdown"],"title":"UsageMetricsResponse","description":"Usage metrics over time"},"UserCostBreakdown":{"properties":{"period":{"type":"string","title":"Period"},"request_count":{"type":"integer","title":"Request Count"},"total_cost":{"type":"number","title":"Total Cost"},"gpu_cost":{"type":"number","title":"Gpu Cost"},"character_cost":{"type":"number","title":"Character Cost"},"total_gpu_seconds":{"type":"number","title":"Total Gpu Seconds"},"total_characters":{"type":"integer","title":"Total Characters"},"avg_cost_per_request":{"type":"number","title":"Avg Cost Per Request"}},"type":"object","required":["period","request_count","total_cost","gpu_cost","character_cost","total_gpu_seconds","total_characters","avg_cost_per_request"],"title":"UserCostBreakdown","description":"User cost breakdown by time period."},"UserProfileResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"status":{"type":"string","title":"Status"},"role":{"type":"string","title":"Role"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"api_key_count":{"type":"integer","title":"Api Key Count","default":0}},"type":"object","required":["id","email","full_name","status","role","created_at"],"title":"UserProfileResponse","description":"User profile response"},"UserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"status":{"type":"string","title":"Status"},"role":{"type":"string","title":"Role"},"language":{"type":"string","title":"Language"},"timezone":{"type":"string","title":"Timezone"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","email","full_name","company_name","phone","status","role","language","timezone","avatar_url","last_login_at","created_at","updated_at"],"title":"UserResponse","description":"User profile response"},"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"},"VoiceModelResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"language_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Name"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"age_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Range"},"voice_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Type"},"audio_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Quality"},"is_active":{"type":"boolean","title":"Is Active"},"is_premium":{"type":"boolean","title":"Is Premium"},"sample_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Text"},"sample_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Audio Url"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","default":[]},"use_cases":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Use Cases","default":[]},"accent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent"},"rating_average":{"type":"number","title":"Rating Average","default":0.0},"rating_count":{"type":"integer","title":"Rating Count","default":0},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","default":"openai_tts"}},"type":"object","required":["id","code","name","description","is_active","is_premium","sample_text","sample_audio_url","accent"],"title":"VoiceModelResponse","description":"Voice model response"},"VoiceStyleResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"speaking_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Speaking Style"},"is_premium":{"type":"boolean","title":"Is Premium","default":false},"required_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Required Plan"}},"type":"object","required":["id","name"],"title":"VoiceStyleResponse","description":"Voice style preset response"},"WebhookCreateRequest":{"properties":{"url":{"type":"string","title":"Url","description":"HTTPS URL to receive webhook POST requests"},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Events to subscribe to","default":["tts.completed","tts.failed"]},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"HMAC secret for signature verification"}},"type":"object","required":["url"],"title":"WebhookCreateRequest","description":"Register a webhook endpoint"},"WebhookResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","url","events","name","is_active","created_at"],"title":"WebhookResponse","description":"Registered webhook"},"WebhookTestResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"WebhookTestResponse","description":"Result of a test delivery to a webhook"},"WebhookUpdateRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Events"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"WebhookUpdateRequest","description":"Update a webhook endpoint"}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An `sk_` API key, created on https://prosodyai.ai/developer (Starter plan and above). See https://prosodyai.ai/auth.md."}}}}