{"openapi":"3.1.0","info":{"title":"Subyar API — AI Subtitle & Game Translator","description":"Production REST API for **Subyar (سابیار)** — the enterprise platform for AI-powered subtitle translation, Persian/Arabic RTL fixing, ASS font embedding, and Game Localization Studio.\n\n### Authentication & Access Control\n1. **Developer API Keys**: Pass via `X-API-Key: sub_live_...` or `Authorization: Bearer sub_live_...`.\n   - Programmatic automation across Jobs, Tools, Game Localization, Studio, and Templates.\n   - Governed strictly by assigned permission scopes (`jobs:read`, `jobs:write`, `game:read`, `game:write`, `studio:read`, `studio:write`, `templates:read`, `templates:write`, `account:read`, or `*`).\n2. **Interactive User Session (JWT)**: Pass via `Authorization: Bearer <jwt_token>`.\n   - Required for sensitive user-facing actions such as phone OTP verification, plan switching/cancellation, and payment initiation.\n\nManage your API keys at `/api/api-keys` or from your Subyar account dashboard.","version":"2.1.0"},"paths":{"/api/auth/signup":{"post":{"tags":["Auth"],"summary":"Signup","description":"Register a new user and return a JWT.","operationId":"signup_api_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["Auth"],"summary":"Login","description":"Authenticate and return a JWT.","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["Auth"],"summary":"Current User","description":"Return the currently authenticated user.","operationId":"current_user_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/auth/phone/send-otp":{"post":{"tags":["Auth"],"summary":"Send Phone Otp","operationId":"send_phone_otp_api_auth_phone_send_otp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendPhoneOtpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/auth/phone/verify":{"post":{"tags":["Auth"],"summary":"Verify Phone Otp","operationId":"verify_phone_otp_api_auth_phone_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyPhoneOtpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/auth/password/forgot":{"post":{"tags":["Auth"],"summary":"Forgot Password","description":"Request a password-reset email. Always responds the same way, whether or not the email exists.","operationId":"forgot_password_api_auth_password_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/password/reset":{"post":{"tags":["Auth"],"summary":"Reset Password","description":"Consume a password-reset token and set a new password.","operationId":"reset_password_api_auth_password_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/api-key":{"get":{"tags":["Auth"],"summary":"Get User Api Key","description":"Legacy algorithmic API key retrieval.\nRetired: Developer API keys are now securely hashed and managed under /api/api-keys.","operationId":"get_user_api_key_api_auth_api_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"deprecated":true,"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/auth/api-key/regenerate":{"post":{"tags":["Auth"],"summary":"Regenerate User Api Key","description":"Regenerate a new API key for the current user (Legacy rotation).\nCreates a real database-backed API key and revokes previous regenerated keys.\nUses database row-level locking to prevent race conditions during concurrent rotations.\nPreserves original scopes and expiration dates when replacing existing keys.\nRejects rotation of keys with empty or invalid scopes to prevent privilege escalation.","operationId":"regenerate_user_api_key_api_auth_api_key_regenerate_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RegenerateApiKeyRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"deprecated":true,"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/users/profile":{"get":{"tags":["Users"],"summary":"Get Profile","description":"Get current user profile.","operationId":"get_profile_api_users_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/api-keys/":{"get":{"tags":["API Keys"],"summary":"List all Developer API Keys","description":"Retrieve all API keys created by the current authenticated user.","operationId":"list_api_keys_api_api_keys__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyListResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"post":{"tags":["API Keys"],"summary":"Create a new Developer API Key","description":"Generate a new secure API key for programmatic automation. Note that the secret key is only displayed once in this response.","operationId":"create_api_key_api_api_keys__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/api-keys/{key_id}":{"delete":{"tags":["API Keys"],"summary":"Revoke an API Key","description":"Permanently delete and invalidate an API key.","operationId":"revoke_api_key_api_api_keys__key_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-keys/{key_id}/toggle":{"patch":{"tags":["API Keys"],"summary":"Enable or Disable an API Key","description":"Temporarily activate or deactivate an API key without deleting it.","operationId":"toggle_api_key_api_api_keys__key_id__toggle_patch","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleApiKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/":{"post":{"tags":["Jobs"],"summary":"Create Job","description":"Create a new translation job with file upload.","operationId":"create_job_api_jobs__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"content":{"multipart/form-data":{"schema":{"allOf":[{"$ref":"#/components/schemas/Body_create_job_api_jobs__post"}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/JobResponse"},{"$ref":"#/components/schemas/JobBatchCreateResponse"}],"title":"Response Create Job Api Jobs  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Jobs"],"summary":"List Jobs","description":"List jobs for the current user with optional status and search filters.","operationId":"list_jobs_api_jobs__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Per Page"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/estimate":{"post":{"tags":["Jobs"],"summary":"Estimate Job","operationId":"estimate_job_api_jobs_estimate_post","requestBody":{"content":{"multipart/form-data":{"schema":{"allOf":[{"$ref":"#/components/schemas/Body_estimate_job_api_jobs_estimate_post"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobEstimateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/jobs/{job_id}/preview":{"get":{"tags":["Jobs"],"summary":"Preview Job","description":"Return a line-by-line preview of original vs translated subtitles with timestamps.","operationId":"preview_job_api_jobs__job_id__preview_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/batch/download":{"get":{"tags":["Jobs"],"summary":"Download Batch Results","description":"Download multiple completed translated files in a ZIP archive.","operationId":"download_batch_results_api_jobs_batch_download_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"job_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Job Ids"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(srt|ass)$"},{"type":"null"}],"title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}":{"get":{"tags":["Jobs"],"summary":"Get Job","description":"Get job details.","operationId":"get_job_api_jobs__job_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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/JobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/cancel":{"post":{"tags":["Jobs"],"summary":"Cancel Job","description":"Cancel a pending/processing/awaiting-model/paused job and refund any reserved credits.","operationId":"cancel_job_api_jobs__job_id__cancel_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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/JobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/pause":{"post":{"tags":["Jobs"],"summary":"Pause Job","description":"Pause an in-progress or pending translation job.","operationId":"pause_job_api_jobs__job_id__pause_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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/JobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/resume":{"post":{"tags":["Jobs"],"summary":"Resume Job","description":"Resume a paused translation job.","operationId":"resume_job_api_jobs__job_id__resume_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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/JobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/retry-with-model":{"post":{"tags":["Jobs"],"summary":"Retry Job With Model","operationId":"retry_job_with_model_api_jobs__job_id__retry_with_model_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryJobWithModelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/download":{"get":{"tags":["Jobs"],"summary":"Download Result","description":"Download the translated file.","operationId":"download_result_api_jobs__job_id__download_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(srt|ass)$"},{"type":"null"}],"title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/studio-data":{"get":{"tags":["Jobs"],"summary":"Get Studio Data","description":"Retrieve structured bilingual subtitle data for In-Browser Subtitle Studio.","operationId":"get_studio_data_api_jobs__job_id__studio_data_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wizard/schema":{"get":{"tags":["Wizard"],"summary":"Get Wizard Schema","description":"Return the full wizard step schema for the frontend to render.","operationId":"get_wizard_schema_api_wizard_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WizardResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/wizard/presets":{"get":{"tags":["Wizard"],"summary":"Get Presets","description":"Return all available translation presets/packs.","operationId":"get_presets_api_wizard_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PresetSchema"},"type":"array","title":"Response Get Presets Api Wizard Presets Get"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/wizard/suggest-preset":{"get":{"tags":["Wizard"],"summary":"Suggest Preset","description":"Suggest a preset based on content type and language pair.","operationId":"suggest_preset_api_wizard_suggest_preset_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"content_type","in":"query","required":false,"schema":{"type":"string","default":"anime","title":"Content Type"}},{"name":"source_lang","in":"query","required":false,"schema":{"type":"string","default":"ja","title":"Source Lang"}},{"name":"target_lang","in":"query","required":false,"schema":{"type":"string","default":"fa","title":"Target Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresetSuggestionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/templates/":{"get":{"tags":["Templates"],"summary":"List Templates","description":"List all user's templates.","operationId":"list_templates_api_templates__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateListResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"post":{"tags":["Templates"],"summary":"Create Template","description":"Create a new template.","operationId":"create_template_api_templates__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/templates/discover/config":{"get":{"tags":["Templates"],"summary":"Get Template Discovery Config","operationId":"get_template_discovery_config_api_templates_discover_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/templates/discover":{"post":{"tags":["Templates"],"summary":"Discover Template","operationId":"discover_template_api_templates_discover_post","requestBody":{"content":{"multipart/form-data":{"schema":{"allOf":[{"$ref":"#/components/schemas/Body_discover_template_api_templates_discover_post"}],"title":"Body"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/templates/discover/jobs/{job_id}":{"get":{"tags":["Templates"],"summary":"Get Discovery Job","operationId":"get_discovery_job_api_templates_discover_jobs__job_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/templates/{template_id}":{"get":{"tags":["Templates"],"summary":"Get Template","description":"Get a specific template by ID.","operationId":"get_template_api_templates__template_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Templates"],"summary":"Update Template","description":"Update an existing template.","operationId":"update_template_api_templates__template_id__patch","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Templates"],"summary":"Delete Template","description":"Delete a template.","operationId":"delete_template_api_templates__template_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Template Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/providers/":{"get":{"tags":["AI Providers"],"summary":"List Available Providers","description":"Return the list of AI providers that have API keys configured.","operationId":"list_available_providers_api_providers__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Bypass in-memory cache and force discovery (Admin only)","default":false,"title":"Refresh"},"description":"Bypass in-memory cache and force discovery (Admin only)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/providers/openrouter/models":{"get":{"tags":["AI Providers"],"summary":"List Openrouter Models","description":"Return popular models available through OpenRouter.","operationId":"list_openrouter_models_api_providers_openrouter_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/providers/default-selection":{"get":{"tags":["AI Providers"],"summary":"Get Default Provider Model Selection","description":"Return admin-defined default provider/model selection (if any).","operationId":"get_default_provider_model_selection_api_providers_default_selection_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/providers/health":{"get":{"tags":["AI Providers"],"summary":"Provider Health Check","description":"Probe each configured AI provider and report their live status.\nCached for 60 seconds per target to prevent active probe flooding and API budget exhaustion.\nCustom model probe strictly requires administrative interactive JWT credentials.\nIn-flight request coalescing prevents concurrent cache stampedes.","operationId":"provider_health_check_api_providers_health_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"model","in":"query","required":false,"schema":{"type":"string","description":"Optional specific model ID to probe (for gemini, Admin JWT only)","default":"","title":"Model"},"description":"Optional specific model ID to probe (for gemini, Admin JWT only)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/active-models":{"get":{"tags":["Public"],"summary":"List Active Models","description":"Public snapshot of the admin-selected default models, for the landing page engine strip.","operationId":"list_active_models_api_public_active_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/free/providers":{"get":{"tags":["Public"],"summary":"List Free Providers","operationId":"list_free_providers_api_public_free_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/translate":{"post":{"tags":["Public"],"summary":"Translate Demo","operationId":"translate_demo_api_public_translate_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_translate_demo_api_public_translate_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/demo/{token}/download":{"get":{"tags":["Demo Claim"],"summary":"Download Claimed Demo","operationId":"download_claimed_demo_api_demo__token__download_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/":{"get":{"tags":["Conversations"],"summary":"List Conversations","operationId":"list_conversations_api_conversations__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]},"post":{"tags":["Conversations"],"summary":"Create Conversation","operationId":"create_conversation_api_conversations__post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/conversations/{conversation_id}":{"get":{"tags":["Conversations"],"summary":"Get Conversation","operationId":"get_conversation_api_conversations__conversation_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Conversations"],"summary":"Update Conversation","operationId":"update_conversation_api_conversations__conversation_id__patch","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Conversations"],"summary":"Delete Conversation","operationId":"delete_conversation_api_conversations__conversation_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conversation_id}/messages":{"get":{"tags":["Conversations"],"summary":"List Messages","operationId":"list_messages_api_conversations__conversation_id__messages_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Conversations"],"summary":"Send Message","operationId":"send_message_api_conversations__conversation_id__messages_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"allOf":[{"$ref":"#/components/schemas/Body_send_message_api_conversations__conversation_id__messages_post"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plans/catalog":{"get":{"tags":["Plans"],"summary":"Catalog","operationId":"catalog_api_plans_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/plans/entitlements":{"get":{"tags":["Plans"],"summary":"Entitlements","operationId":"entitlements_api_plans_entitlements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserEntitlementsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/plans/switch-active/{instance_id}":{"post":{"tags":["Plans"],"summary":"Switch Active","operationId":"switch_active_api_plans_switch_active__instance_id__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plans/instances/{instance_id}":{"delete":{"tags":["Plans"],"summary":"Cancel Instance","operationId":"cancel_instance_api_plans_instances__instance_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/zibal/request":{"post":{"tags":["Payments"],"summary":"Zibal Request","operationId":"zibal_request_api_payments_zibal_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/payments/zibal/callback":{"get":{"tags":["Payments"],"summary":"Zibal Callback","operationId":"zibal_callback_api_payments_zibal_callback_get","parameters":[{"name":"trackId","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Trackid"}},{"name":"track_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Track Id"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Success"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status"}},{"name":"zibal_success","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zibal Success"}},{"name":"zibal_status","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zibal Status"}},{"name":"zibal_trackId","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zibal Trackid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/orders/{order_id}":{"get":{"tags":["Payments"],"summary":"Get Order","operationId":"get_order_api_payments_orders__order_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentOrderStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tools/rtl-fix":{"post":{"tags":["Tools"],"summary":"Fix Rtl","description":"Accept an ASS/SRT/VTT subtitle file, normalize all RTL embedding marks,\nand return the fixed file as a download.","operationId":"fix_rtl_api_tools_rtl_fix_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_fix_rtl_api_tools_rtl_fix_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/tools/config":{"get":{"tags":["Tools"],"summary":"Get Tools Config","description":"Returns tool settings and the current user's permitted tools.","operationId":"get_tools_config_api_tools_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/tools/ass-style/tones":{"get":{"tags":["Tools"],"summary":"Get Ass Style Tones","operationId":"get_ass_style_tones_api_tools_ass_style_tones_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/tools/ass-style/suggestion":{"get":{"tags":["Tools"],"summary":"Get Ass Style Suggestion","operationId":"get_ass_style_suggestion_api_tools_ass_style_suggestion_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"filename","in":"query","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tools/ass-style/recommend":{"post":{"tags":["Tools"],"summary":"Recommend Ass Style","description":"Recommend an ASS styling tone from one or more same-anime ASS files.\n\nRuns as a background job (poll GET .../jobs/{job_id}) since the AI call can\ntake longer than an intermediate proxy's request timeout allows.","operationId":"recommend_ass_style_api_tools_ass_style_recommend_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_recommend_ass_style_api_tools_ass_style_recommend_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/tools/ass-style/recommend/jobs/{job_id}":{"get":{"tags":["Tools"],"summary":"Get Ass Style Recommend Job","operationId":"get_ass_style_recommend_job_api_tools_ass_style_recommend_jobs__job_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tools/ass-style/font-map":{"post":{"tags":["Tools"],"summary":"Recommend Ass Font Map","description":"Suggest replacements for inline ASS font override tags using AI.\n\nRuns as a background job (poll GET .../jobs/{job_id}) since the AI call can\ntake longer than an intermediate proxy's request timeout allows.","operationId":"recommend_ass_font_map_api_tools_ass_style_font_map_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_recommend_ass_font_map_api_tools_ass_style_font_map_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/tools/ass-style/font-map/jobs/{job_id}":{"get":{"tags":["Tools"],"summary":"Get Ass Font Map Job","operationId":"get_ass_font_map_job_api_tools_ass_style_font_map_jobs__job_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tools/ass-style/debug-font-candidates":{"post":{"tags":["Tools"],"summary":"Debug Ass Style Font Candidates","description":"Return role-filtered ASS font candidates and rejection reasons for debugging.","operationId":"debug_ass_style_font_candidates_api_tools_ass_style_debug_font_candidates_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"allOf":[{"$ref":"#/components/schemas/Body_debug_ass_style_font_candidates_api_tools_ass_style_debug_font_candidates_post"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/tools/ass-style":{"post":{"tags":["Tools"],"summary":"Style Ass","description":"Apply a Persian ASS style tone, remember the series tone, and return ASS.","operationId":"style_ass_api_tools_ass_style_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_style_ass_api_tools_ass_style_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/tools/srt-to-ass":{"post":{"tags":["Tools"],"summary":"Srt To Ass","description":"Merge translations into an ASS file.\n\nRuns as a background job (poll GET .../jobs/{job_id}) since AI verification\ncan take longer than an intermediate proxy's request timeout allows. On\ncompletion the job result is JSON: {file_b64, filename, report, verify_enabled}\n— or, on an alignment mismatch, {detail: \"episodes_mismatch\", ...}.","operationId":"srt_to_ass_api_tools_srt_to_ass_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_srt_to_ass_api_tools_srt_to_ass_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/tools/srt-to-ass/jobs/{job_id}":{"get":{"tags":["Tools"],"summary":"Get Srt To Ass Job","operationId":"get_srt_to_ass_job_api_tools_srt_to_ass_jobs__job_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tools/studio/analyze-characters":{"post":{"tags":["Tools"],"summary":"Analyze Characters Ai","description":"Analyzes subtitle characters via Admin-configured AI model.\nSTRICT CANON CRITERION: Derives subtitle border/outline colors directly\nfrom each character's canonical anime hair color and aesthetic theme.","operationId":"analyze_characters_ai_api_tools_studio_analyze_characters_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/studio/config":{"get":{"tags":["Studio","studio"],"summary":"Get Studio Config","description":"Return runtime Studio configuration including autosave interval.","operationId":"get_studio_config_api_studio_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioConfigResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/studio/save":{"post":{"tags":["Studio","studio"],"summary":"Save Studio Revision","description":"Save or auto-save a project draft/revision snapshot to Postgres.","operationId":"save_studio_revision_api_studio_save_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioSaveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/studio/projects":{"get":{"tags":["Studio","studio"],"summary":"List Studio Projects","description":"List distinct Studio projects / drafts for the current user.","operationId":"list_studio_projects_api_studio_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/studio/projects/{project_key}/history":{"get":{"tags":["Studio","studio"],"summary":"Get Project History","description":"List revision timeline snapshots for a specific studio project.","operationId":"get_project_history_api_studio_projects__project_key__history_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_key","in":"path","required":true,"schema":{"type":"string","title":"Project Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/studio/projects/{project_key}/revisions/{revision_id}":{"get":{"tags":["Studio","studio"],"summary":"Get Project Revision","description":"Retrieve full content of a specific revision to rollback/restore.","operationId":"get_project_revision_api_studio_projects__project_key__revisions__revision_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_key","in":"path","required":true,"schema":{"type":"string","title":"Project Key"}},{"name":"revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/studio/projects/{project_key}":{"delete":{"tags":["Studio","studio"],"summary":"Delete Studio Project","description":"Delete all revisions and drafts for a project.","operationId":"delete_studio_project_api_studio_projects__project_key__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_key","in":"path","required":true,"schema":{"type":"string","title":"Project Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/projects":{"post":{"tags":["Game Localization"],"summary":"Create Project","operationId":"create_project_api_game_projects_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Game Localization"],"summary":"List Projects","operationId":"list_projects_api_game_projects_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"trashed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Trashed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/projects/{project_id}":{"delete":{"tags":["Game Localization"],"summary":"Trash Project","description":"Move an owned project to trash without deleting its files or versions.","operationId":"trash_project_api_game_projects__project_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Game Localization"],"summary":"Get Project","operationId":"get_project_api_game_projects__project_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/projects/{project_id}/restore":{"post":{"tags":["Game Localization"],"summary":"Restore Project","operationId":"restore_project_api_game_projects__project_id__restore_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/projects/{project_id}/versions":{"post":{"tags":["Game Localization"],"summary":"Create Version","operationId":"create_version_api_game_projects__project_id__versions_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/versions/{version_id}/upload":{"post":{"tags":["Game Localization"],"summary":"Upload Files","operationId":"upload_files_api_game_versions__version_id__upload_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_files_api_game_versions__version_id__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/versions/{version_id}/analyze":{"post":{"tags":["Game Localization"],"summary":"Start Analysis","operationId":"start_analysis_api_game_versions__version_id__analyze_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/versions/{version_id}/analysis":{"get":{"tags":["Game Localization"],"summary":"Get Analysis","operationId":"get_analysis_api_game_versions__version_id__analysis_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/versions/{version_id}/files":{"get":{"tags":["Game Localization"],"summary":"List Files","operationId":"list_files_api_game_versions__version_id__files_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/versions/{version_id}/entries":{"get":{"tags":["Game Localization"],"summary":"Query Entries","operationId":"query_entries_api_game_versions__version_id__entries_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}},{"name":"file_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"File Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/entries/{entry_id}":{"patch":{"tags":["Game Localization"],"summary":"Update Entry","operationId":"update_entry_api_game_entries__entry_id__patch","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/models":{"get":{"tags":["Game Localization"],"summary":"List Game Translation Models","description":"List available AI models strictly filtered by user's active plan entitlements.","operationId":"list_game_translation_models_api_game_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}]}},"/api/game/versions/{version_id}/translation-scope-summary":{"get":{"tags":["Game Localization"],"summary":"Get Translation Scope Summary","description":"Provides exact breakdown of translatable, translated, untranslated, and token-error rows.","operationId":"get_translation_scope_summary_api_game_versions__version_id__translation_scope_summary_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/versions/{version_id}/translate":{"post":{"tags":["Game Localization"],"summary":"Start Translation","operationId":"start_translation_api_game_versions__version_id__translate_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TranslateRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/jobs/{job_id}":{"get":{"tags":["Game Localization"],"summary":"Get Job Status","operationId":"get_job_status_api_game_jobs__job_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/versions/{version_id}/jobs/latest":{"get":{"tags":["Game Localization"],"summary":"Get Latest Translation Job","operationId":"get_latest_translation_job_api_game_versions__version_id__jobs_latest_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/jobs/{job_id}/pause":{"post":{"tags":["Game Localization"],"summary":"Pause Translation Job","operationId":"pause_translation_job_api_game_jobs__job_id__pause_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/jobs/{job_id}/resume":{"post":{"tags":["Game Localization"],"summary":"Resume Translation Job","operationId":"resume_translation_job_api_game_jobs__job_id__resume_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/versions/{version_id}/build":{"post":{"tags":["Game Localization"],"summary":"Build Export","operationId":"build_export_api_game_versions__version_id__build_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/artifacts/{artifact_id}/download-token":{"post":{"tags":["Game Localization"],"summary":"Create Artifact Download Token","description":"Exchange an authenticated request for a short-lived direct download link.\n\nThe browser then downloads natively (progress, pause, resume) instead of\nbuffering the whole package in memory.","operationId":"create_artifact_download_token_api_game_artifacts__artifact_id__download_token_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"artifact_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Artifact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/artifacts/direct/{token}":{"head":{"tags":["Game Localization"],"summary":"Download Artifact Direct","operationId":"download_artifact_direct_api_game_artifacts_direct__token__head","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Game Localization"],"summary":"Download Artifact Direct","operationId":"download_artifact_direct_api_game_artifacts_direct__token__head","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/artifacts/{artifact_id}/download":{"head":{"tags":["Game Localization"],"summary":"Download Artifact","operationId":"download_artifact_api_game_artifacts__artifact_id__download_head","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"artifact_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Artifact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Game Localization"],"summary":"Download Artifact","operationId":"download_artifact_api_game_artifacts__artifact_id__download_head","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"artifact_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Artifact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/entries/{entry_id}/translate-ai":{"post":{"tags":["Game Localization"],"summary":"Translate Single Entry Ai","description":"Translate a single localization entry with AI on-demand.","operationId":"translate_single_entry_ai_api_game_entries__entry_id__translate_ai_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TranslateRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/projects/{project_id}/glossaries":{"get":{"tags":["Game Localization"],"summary":"List Glossaries","operationId":"list_glossaries_api_game_projects__project_id__glossaries_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Game Localization"],"summary":"Create Glossary","operationId":"create_glossary_api_game_projects__project_id__glossaries_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/glossaries/{glossary_id}":{"get":{"tags":["Game Localization"],"summary":"Get Glossary Detail","operationId":"get_glossary_detail_api_game_glossaries__glossary_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"glossary_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Glossary Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Game Localization"],"summary":"Update Glossary","operationId":"update_glossary_api_game_glossaries__glossary_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"glossary_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Glossary Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Game Localization"],"summary":"Delete Glossary","operationId":"delete_glossary_api_game_glossaries__glossary_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"glossary_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Glossary Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/glossaries/{glossary_id}/terms":{"post":{"tags":["Game Localization"],"summary":"Create Glossary Term","operationId":"create_glossary_term_api_game_glossaries__glossary_id__terms_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"glossary_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Glossary Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryTermCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/glossaries/terms/{term_id}":{"put":{"tags":["Game Localization"],"summary":"Update Glossary Term","operationId":"update_glossary_term_api_game_glossaries_terms__term_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"term_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Term Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryTermUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Game Localization"],"summary":"Delete Glossary Term","operationId":"delete_glossary_term_api_game_glossaries_terms__term_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"term_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Term Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/projects/{project_id}/characters":{"get":{"tags":["Game Localization"],"summary":"List Character Memories","operationId":"list_character_memories_api_game_projects__project_id__characters_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Game Localization"],"summary":"Create Character Memory","operationId":"create_character_memory_api_game_projects__project_id__characters_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterMemoryCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/game/characters/{character_id}":{"put":{"tags":["Game Localization"],"summary":"Update Character Memory","operationId":"update_character_memory_api_game_characters__character_id__put","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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/CharacterMemoryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Game Localization"],"summary":"Delete Character Memory","operationId":"delete_character_memory_api_game_characters__character_id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyHeader":[]}],"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"summary":"Health Check","description":"Health check endpoint — checks DB connectivity and surfaces config warnings.\n\nKept free of outbound calls to AI providers so it stays fast and reliable enough\nto be polled by Docker's healthcheck and the external cron-based monitor.","operationId":"health_check_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Friendly name for identifying this API key","default":"My API Key","examples":["Subtitle CLI Integration","Automated Translator Script"]},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"Allowed permission scopes. Use ['*'] for full user account access.","default":["*"],"examples":[["*"],["jobs:read","jobs:write","tools:read","tools:write"]]},"expires_in_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days","description":"Optional expiration in days. If null, the key will not expire.","examples":[30,90,null]}},"type":"object","title":"ApiKeyCreateRequest","description":"Payload to create a new API Key."},"ApiKeyCreatedResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Unique UUID of the API key"},"name":{"type":"string","title":"Name","description":"Name/label given to this key"},"key_prefix":{"type":"string","title":"Key Prefix","description":"Key prefix for recognition (e.g. sub_live_a1b2...)"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"List of scopes"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether this key is currently active"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At","description":"ISO timestamp of last request made with this key"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"ISO timestamp when this key expires"},"created_at":{"type":"string","title":"Created At","description":"ISO timestamp when this key was generated"},"secret_key":{"type":"string","title":"Secret Key","description":"The unmasked secret key. Store this securely as it will never be displayed again!","examples":["sub_live_9f8d1c6e2b4a7053e1d2c3b4a5f60718"]}},"type":"object","required":["id","name","key_prefix","scopes","is_active","created_at","secret_key"],"title":"ApiKeyCreatedResponse","description":"Response returned upon API key creation containing the one-time raw secret key."},"ApiKeyListResponse":{"properties":{"keys":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Keys"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["keys","total"],"title":"ApiKeyListResponse","description":"Response containing list of API keys for the current user."},"ApiKeyResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Unique UUID of the API key"},"name":{"type":"string","title":"Name","description":"Name/label given to this key"},"key_prefix":{"type":"string","title":"Key Prefix","description":"Key prefix for recognition (e.g. sub_live_a1b2...)"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"List of scopes"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether this key is currently active"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At","description":"ISO timestamp of last request made with this key"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"ISO timestamp when this key expires"},"created_at":{"type":"string","title":"Created At","description":"ISO timestamp when this key was generated"}},"type":"object","required":["id","name","key_prefix","scopes","is_active","created_at"],"title":"ApiKeyResponse","description":"Public representation of an API Key."},"Body_create_job_api_jobs__post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"},"ai_provider":{"type":"string","title":"Ai Provider","default":"gemini"},"content_spec":{"type":"string","title":"Content Spec","default":"{}"},"profile_snapshot":{"type":"string","title":"Profile Snapshot","default":"{}"},"job_options":{"type":"string","title":"Job Options","default":"{}"},"user_note":{"type":"string","title":"User Note","default":""}},"type":"object","title":"Body_create_job_api_jobs__post"},"Body_debug_ass_style_font_candidates_api_tools_ass_style_debug_font_candidates_post":{"properties":{"detected_tone_json":{"type":"string","title":"Detected Tone Json","default":"{}"}},"type":"object","title":"Body_debug_ass_style_font_candidates_api_tools_ass_style_debug_font_candidates_post"},"Body_discover_template_api_templates_discover_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","title":"Body_discover_template_api_templates_discover_post"},"Body_estimate_job_api_jobs_estimate_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"},"content_spec":{"type":"string","title":"Content Spec","default":"{}"},"job_options":{"type":"string","title":"Job Options","default":"{}"}},"type":"object","title":"Body_estimate_job_api_jobs_estimate_post"},"Body_fix_rtl_api_tools_rtl_fix_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_fix_rtl_api_tools_rtl_fix_post"},"Body_recommend_ass_font_map_api_tools_ass_style_font_map_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"},"tone_key":{"type":"string","title":"Tone Key","default":"clean_readable"},"detected_tone_json":{"type":"string","title":"Detected Tone Json","default":"{}"}},"type":"object","required":["files"],"title":"Body_recommend_ass_font_map_api_tools_ass_style_font_map_post"},"Body_recommend_ass_style_api_tools_ass_style_recommend_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_recommend_ass_style_api_tools_ass_style_recommend_post"},"Body_send_message_api_conversations__conversation_id__messages_post":{"properties":{"content":{"type":"string","title":"Content","default":""},"provider_id":{"type":"string","title":"Provider Id","default":""},"model_id":{"type":"string","title":"Model Id","default":""},"template_id":{"type":"string","title":"Template Id","default":""},"template_values":{"type":"string","title":"Template Values","default":""},"quality_level_key":{"type":"string","title":"Quality Level Key","default":""},"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","title":"Body_send_message_api_conversations__conversation_id__messages_post"},"Body_srt_to_ass_api_tools_srt_to_ass_post":{"properties":{"ass_file":{"type":"string","format":"binary","title":"Ass File"},"translation_file":{"type":"string","format":"binary","title":"Translation File"},"verify":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verify"}},"type":"object","required":["ass_file","translation_file"],"title":"Body_srt_to_ass_api_tools_srt_to_ass_post"},"Body_style_ass_api_tools_ass_style_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"tone_key":{"type":"string","title":"Tone Key","default":"clean_readable"},"font_mapping_json":{"type":"string","title":"Font Mapping Json","default":"{}"},"style_plan_json":{"type":"string","title":"Style Plan Json","default":"{}"},"detected_tone_json":{"type":"string","title":"Detected Tone Json","default":"{}"},"remember":{"type":"boolean","title":"Remember","default":true}},"type":"object","required":["file"],"title":"Body_style_ass_api_tools_ass_style_post"},"Body_translate_demo_api_public_translate_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"provider_id":{"type":"string","title":"Provider Id","default":""},"model_id":{"type":"string","title":"Model Id","default":""},"template_id":{"type":"string","title":"Template Id","default":""},"template_values":{"type":"string","title":"Template Values","default":""}},"type":"object","required":["file"],"title":"Body_translate_demo_api_public_translate_post"},"Body_upload_files_api_game_versions__version_id__upload_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_upload_files_api_game_versions__version_id__upload_post"},"BuildRequest":{"properties":{"persian_output_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Persian Output Mode","default":"logical"},"export_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Export Mode","default":"full"}},"type":"object","title":"BuildRequest"},"CharacterMemoryCreate":{"properties":{"character_name":{"type":"string","title":"Character Name"},"aliases":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Aliases"},"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["character_name"],"title":"CharacterMemoryCreate"},"CharacterMemoryUpdate":{"properties":{"character_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Character Name"},"aliases":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Aliases"},"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"CharacterMemoryUpdate"},"EntryUpdate":{"properties":{"target":{"type":"string","title":"Target"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"translated"},"expected_revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Revision"}},"type":"object","required":["target"],"title":"EntryUpdate"},"FieldConditionSchema":{"properties":{"field":{"type":"string","title":"Field"},"operator":{"type":"string","title":"Operator"},"value":{"title":"Value"}},"type":"object","required":["field","operator","value"],"title":"FieldConditionSchema","description":"Condition for showing/hiding a field."},"FieldOptionSchema":{"properties":{"value":{"type":"string","title":"Value"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description","default":""},"icon":{"type":"string","title":"Icon","default":""}},"type":"object","required":["value","label"],"title":"FieldOptionSchema","description":"Single option for select/radio fields."},"FieldSchema":{"properties":{"name":{"type":"string","title":"Name"},"field_type":{"type":"string","title":"Field Type"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description","default":""},"placeholder":{"type":"string","title":"Placeholder","default":""},"required":{"type":"boolean","title":"Required","default":false},"default":{"title":"Default"},"options":{"items":{"$ref":"#/components/schemas/FieldOptionSchema"},"type":"array","title":"Options","default":[]},"conditions":{"items":{"$ref":"#/components/schemas/FieldConditionSchema"},"type":"array","title":"Conditions","default":[]},"validation":{"type":"object","title":"Validation","default":{}},"css_class":{"type":"string","title":"Css Class","default":""},"icon":{"type":"string","title":"Icon","default":""},"help_text":{"type":"string","title":"Help Text","default":""}},"type":"object","required":["name","field_type","label"],"title":"FieldSchema","description":"Schema for a single form field."},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"GlossaryCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_shared":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Shared","default":false}},"type":"object","required":["name"],"title":"GlossaryCreate"},"GlossaryTermCreate":{"properties":{"source_term":{"type":"string","title":"Source Term"},"target_term":{"type":"string","title":"Target Term"},"case_sensitive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Case Sensitive","default":false},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["source_term","target_term"],"title":"GlossaryTermCreate"},"GlossaryTermUpdate":{"properties":{"source_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Term"},"target_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Term"},"case_sensitive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Case Sensitive"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"GlossaryTermUpdate"},"GlossaryUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_shared":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Shared"}},"type":"object","title":"GlossaryUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"JobBatchCreateResponse":{"properties":{"primary_job_id":{"type":"string","title":"Primary Job Id"},"jobs":{"items":{"$ref":"#/components/schemas/JobResponse"},"type":"array","title":"Jobs"}},"type":"object","required":["primary_job_id","jobs"],"title":"JobBatchCreateResponse","description":"Response returned when multiple jobs are created in one request."},"JobEstimateResponse":{"properties":{"filename":{"type":"string","title":"Filename"},"format":{"type":"string","title":"Format"},"cue_count":{"type":"integer","title":"Cue Count"},"max_chars_per_cue_in_file":{"type":"integer","title":"Max Chars Per Cue In File"},"total_chars_in_file":{"type":"integer","title":"Total Chars In File"},"plan_max_cues_per_file":{"type":"integer","title":"Plan Max Cues Per File"},"plan_max_chars_per_cue":{"type":"integer","title":"Plan Max Chars Per Cue"},"plan_max_total_chars_per_file":{"type":"integer","title":"Plan Max Total Chars Per File"},"quality_level_key":{"type":"string","title":"Quality Level Key"},"quality_multiplier":{"type":"number","title":"Quality Multiplier"},"model_multiplier":{"type":"number","title":"Model Multiplier","default":1.0},"effective_multiplier":{"type":"number","title":"Effective Multiplier","default":1.0},"credits_required":{"type":"integer","title":"Credits Required"},"credits_available":{"type":"integer","title":"Credits Available"},"credits_reserved":{"type":"integer","title":"Credits Reserved"},"max_user_note_chars":{"type":"integer","title":"Max User Note Chars","default":0},"batch_translation_enabled":{"type":"boolean","title":"Batch Translation Enabled","default":false},"max_files_per_batch":{"type":"integer","title":"Max Files Per Batch","default":1},"total_files":{"type":"integer","title":"Total Files","default":1},"violations":{"items":{"type":"string"},"type":"array","title":"Violations"},"can_submit":{"type":"boolean","title":"Can Submit"}},"type":"object","required":["filename","format","cue_count","max_chars_per_cue_in_file","total_chars_in_file","plan_max_cues_per_file","plan_max_chars_per_cue","plan_max_total_chars_per_file","quality_level_key","quality_multiplier","credits_required","credits_available","credits_reserved","violations","can_submit"],"title":"JobEstimateResponse"},"JobListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/JobResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"}},"type":"object","required":["items","total","page","per_page"],"title":"JobListResponse","description":"Paginated job list."},"JobRecoveryOptions":{"properties":{"reason":{"type":"string","title":"Reason"},"provider_id":{"type":"string","title":"Provider Id"},"failed_model":{"type":"string","title":"Failed Model"},"status_code":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Status Code"},"available_models":{"items":{"$ref":"#/components/schemas/RecoveryModelOption"},"type":"array","title":"Available Models"}},"type":"object","required":["reason","provider_id","failed_model"],"title":"JobRecoveryOptions"},"JobResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"number","title":"Progress"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"source_filename":{"type":"string","title":"Source Filename"},"ai_provider":{"type":"string","title":"Ai Provider"},"content_spec":{"type":"object","title":"Content Spec"},"job_options":{"type":"object","title":"Job Options"},"concept_seed":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Concept Seed"},"episode_summary":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Episode Summary"},"recovery_options":{"anyOf":[{"$ref":"#/components/schemas/JobRecoveryOptions"},{"type":"null"}]},"created_at":{"type":"string","title":"Created At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"cue_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cue Count"},"credits_required":{"type":"integer","title":"Credits Required","default":0},"credits_reserved":{"type":"integer","title":"Credits Reserved","default":0},"credits_charged":{"type":"integer","title":"Credits Charged","default":0}},"type":"object","required":["id","status","progress","source_filename","ai_provider","content_spec","created_at"],"title":"JobResponse","description":"Job status response."},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest","description":"User login payload."},"PaymentOrderStatusResponse":{"properties":{"id":{"type":"string","title":"Id"},"provider":{"type":"string","title":"Provider"},"status":{"type":"string","title":"Status"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency"},"plan_key":{"type":"string","title":"Plan Key"}},"type":"object","required":["id","provider","status","amount","currency","plan_key"],"title":"PaymentOrderStatusResponse"},"PaymentRequestBody":{"properties":{"plan_key":{"type":"string","maxLength":100,"minLength":1,"title":"Plan Key"},"status":{"type":"string","title":"Status","default":"active"}},"type":"object","required":["plan_key"],"title":"PaymentRequestBody"},"PaymentRequestResponse":{"properties":{"order_id":{"type":"string","title":"Order Id"},"track_id":{"type":"integer","title":"Track Id"},"payment_url":{"type":"string","title":"Payment Url"}},"type":"object","required":["order_id","track_id","payment_url"],"title":"PaymentRequestResponse"},"PresetSchema":{"properties":{"preset_id":{"type":"string","title":"Preset Id"},"name":{"type":"string","title":"Name"},"name_fa":{"type":"string","title":"Name Fa"},"description":{"type":"string","title":"Description"},"icon":{"type":"string","title":"Icon"},"settings":{"type":"object","title":"Settings"}},"type":"object","required":["preset_id","name","name_fa","description","icon","settings"],"title":"PresetSchema","description":"Translation preset/pack definition."},"PresetSuggestionResponse":{"properties":{"suggested_preset":{"type":"string","title":"Suggested Preset"},"preset_name":{"type":"string","title":"Preset Name"}},"type":"object","required":["suggested_preset","preset_name"],"title":"PresetSuggestionResponse","description":"Auto-suggested preset based on content."},"ProjectCreate":{"properties":{"title":{"type":"string","title":"Title"},"game_identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Game Identifier","default":""},"engine_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine Profile","default":"auto"},"source_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language","default":"en"},"target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Language","default":"fa"},"persian_output_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Persian Output Mode","default":"logical"},"translation_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Style","default":"standard"}},"type":"object","required":["title"],"title":"ProjectCreate"},"QualityLevelSchema":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label","default":""},"multiplier":{"type":"number","title":"Multiplier","default":1.0},"enabled":{"type":"boolean","title":"Enabled","default":true},"sort":{"type":"integer","title":"Sort","default":0}},"type":"object","required":["key"],"title":"QualityLevelSchema"},"RecoveryModelOption":{"properties":{"provider_id":{"type":"string","title":"Provider Id"},"provider_name":{"type":"string","title":"Provider Name"},"model_id":{"type":"string","title":"Model Id"},"model_name":{"type":"string","title":"Model Name"},"credit_multiplier":{"type":"number","title":"Credit Multiplier","default":1.0}},"type":"object","required":["provider_id","provider_name","model_id","model_name"],"title":"RecoveryModelOption"},"RegenerateApiKeyRequest":{"properties":{"key_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Key Id","description":"Optional ID of specific key to rotate. If omitted, rotates previous regenerated/legacy keys."},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Optional explicit scopes for new key. If omitted, inherits rotated key scopes."},"expires_in_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days","description":"Optional explicit expiry in days. If omitted, preserves rotated key expiry."}},"type":"object","title":"RegenerateApiKeyRequest","description":"Payload to regenerate/rotate an API key."},"ResetPasswordRequest":{"properties":{"token":{"type":"string","minLength":1,"title":"Token"},"new_password":{"type":"string","maxLength":128,"minLength":8,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"RetryJobWithModelRequest":{"properties":{"provider_id":{"type":"string","title":"Provider Id"},"model_id":{"type":"string","title":"Model Id"}},"type":"object","required":["provider_id","model_id"],"title":"RetryJobWithModelRequest"},"SendPhoneOtpRequest":{"properties":{"phone_number":{"type":"string","maxLength":32,"minLength":8,"title":"Phone Number"}},"type":"object","required":["phone_number"],"title":"SendPhoneOtpRequest"},"SignupRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"username":{"type":"string","maxLength":100,"minLength":3,"title":"Username"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"type":"object","required":["email","username","password"],"title":"SignupRequest","description":"User registration payload."},"StepSchema":{"properties":{"step_id":{"type":"string","title":"Step Id"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description","default":""},"icon":{"type":"string","title":"Icon","default":""},"fields":{"items":{"$ref":"#/components/schemas/FieldSchema"},"type":"array","title":"Fields","default":[]},"conditions":{"items":{"$ref":"#/components/schemas/FieldConditionSchema"},"type":"array","title":"Conditions","default":[]}},"type":"object","required":["step_id","title"],"title":"StepSchema","description":"Schema for a wizard step."},"StudioConfigResponse":{"properties":{"autosave_interval_seconds":{"type":"integer","title":"Autosave Interval Seconds"}},"type":"object","required":["autosave_interval_seconds"],"title":"StudioConfigResponse"},"StudioSaveRequest":{"properties":{"project_key":{"type":"string","title":"Project Key","description":"Unique key for the project (job UUID or custom local key)"},"project_name":{"type":"string","title":"Project Name","description":"User-friendly project title","default":"پروژه استودیو"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id","description":"Optional associated translation job UUID"},"raw_ass":{"type":"string","title":"Raw Ass","description":"Full raw ASS content","default":""},"cues":{"items":{"type":"object"},"type":"array","title":"Cues","description":"Array of structured subtitle cues"},"label":{"type":"string","title":"Label","description":"Label for this revision snapshot","default":"ذخیره خودکار"},"is_checkpoint":{"type":"boolean","title":"Is Checkpoint","description":"Whether to explicitly create a permanent checkpoint","default":false}},"type":"object","required":["project_key"],"title":"StudioSaveRequest"},"TemplateCreateRequest":{"properties":{"name_en":{"type":"string","maxLength":200,"minLength":1,"title":"Name En"},"name_fa":{"type":"string","maxLength":200,"minLength":1,"title":"Name Fa"},"description_en":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description En"},"description_fa":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description Fa"},"values":{"type":"object","title":"Values"}},"type":"object","required":["name_en","name_fa"],"title":"TemplateCreateRequest","description":"Request to create a new template."},"TemplateListResponse":{"properties":{"templates":{"items":{"$ref":"#/components/schemas/TemplateResponse"},"type":"array","title":"Templates"}},"type":"object","required":["templates"],"title":"TemplateListResponse","description":"List of templates."},"TemplateResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"is_builtin":{"type":"boolean","title":"Is Builtin"},"name_en":{"type":"string","title":"Name En"},"name_fa":{"type":"string","title":"Name Fa"},"description_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description En"},"description_fa":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description Fa"},"values":{"type":"object","title":"Values"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","is_builtin","name_en","name_fa","description_en","description_fa","values","created_at","updated_at"],"title":"TemplateResponse","description":"Template response."},"TemplateUpdateRequest":{"properties":{"name_en":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name En"},"name_fa":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name Fa"},"description_en":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description En"},"description_fa":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description Fa"},"values":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Values"}},"type":"object","title":"TemplateUpdateRequest","description":"Request to update an existing template."},"ToggleApiKeyRequest":{"properties":{"is_active":{"type":"boolean","title":"Is Active","description":"Desired active state for the API key"}},"type":"object","required":["is_active"],"title":"ToggleApiKeyRequest"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token"],"title":"TokenResponse","description":"JWT token response."},"TranslateRequest":{"properties":{"provider_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Id"},"model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Id"},"enable_world_seed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enable World Seed","default":true},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope","default":"untranslated"},"overwrite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Overwrite","default":false},"entry_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entry Ids"}},"type":"object","title":"TranslateRequest"},"UserEntitlementsResponse":{"properties":{"active":{"anyOf":[{"$ref":"#/components/schemas/UserPlanInstanceResponse"},{"type":"null"}]},"reserve":{"anyOf":[{"$ref":"#/components/schemas/UserPlanInstanceResponse"},{"type":"null"}]}},"type":"object","required":["active","reserve"],"title":"UserEntitlementsResponse"},"UserPlanInstanceResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"remaining_credits":{"type":"integer","title":"Remaining Credits"},"reserved_credits":{"type":"integer","title":"Reserved Credits"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"plan_key":{"type":"string","title":"Plan Key"},"plan_name":{"type":"string","title":"Plan Name"},"plan_version":{"type":"integer","title":"Plan Version"},"max_cues_per_file":{"type":"integer","title":"Max Cues Per File"},"max_chars_per_cue":{"type":"integer","title":"Max Chars Per Cue"},"max_total_chars_per_file":{"type":"integer","title":"Max Total Chars Per File"},"quality_levels":{"items":{"$ref":"#/components/schemas/QualityLevelSchema"},"type":"array","title":"Quality Levels"},"model_policy":{"items":{"type":"object"},"type":"array","title":"Model Policy"},"batch_translation_enabled":{"type":"boolean","title":"Batch Translation Enabled","default":false},"max_files_per_batch":{"type":"integer","title":"Max Files Per Batch","default":1},"tool_permissions":{"items":{"type":"string"},"type":"array","title":"Tool Permissions"}},"type":"object","required":["id","status","remaining_credits","reserved_credits","expires_at","plan_key","plan_name","plan_version","max_cues_per_file","max_chars_per_cue","max_total_chars_per_file"],"title":"UserPlanInstanceResponse"},"UserResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"username":{"type":"string","title":"Username"},"is_active":{"type":"boolean","title":"Is Active"},"is_admin":{"type":"boolean","title":"Is Admin"},"is_premium":{"type":"boolean","title":"Is Premium"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"phone_verified":{"type":"boolean","title":"Phone Verified","default":false},"phone_verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Verified At"},"phone_verification_required":{"type":"boolean","title":"Phone Verification Required","default":true},"created_at":{"type":"string","title":"Created At"},"tool_permissions":{"items":{"type":"string"},"type":"array","title":"Tool Permissions","default":[]}},"type":"object","required":["id","email","username","is_active","is_admin","is_premium","created_at"],"title":"UserResponse","description":"Public user representation."},"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"},"VerifyPhoneOtpRequest":{"properties":{"phone_number":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone Number"},"code":{"type":"string","maxLength":12,"minLength":4,"title":"Code"}},"type":"object","required":["code"],"title":"VerifyPhoneOtpRequest"},"VersionCreate":{"properties":{"label":{"type":"string","title":"Label"},"build_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Number"},"parent_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Version Id"}},"type":"object","required":["label"],"title":"VersionCreate"},"WizardResponse":{"properties":{"wizard_id":{"type":"string","title":"Wizard Id"},"title":{"type":"string","title":"Title"},"steps":{"items":{"$ref":"#/components/schemas/StepSchema"},"type":"array","title":"Steps"}},"type":"object","required":["wizard_id","title","steps"],"title":"WizardResponse","description":"Full wizard schema response."}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/auth/login"}},"description":"Provide an interactive user session JWT (`Bearer <jwt_token>`).\n\nRequired for sensitive mutations (phone OTP, plan management, payment requests) and administrative actions."},"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Provide your Subyar developer API key via header `X-API-Key: sub_live_...`.\n\nAPI keys are validated against cryptographic hashes in PostgreSQL and scoped to specific modules."}}},"tags":[{"name":"API Keys","description":"Create, list, and revoke developer API keys for programmatic automation and CLI integrations."},{"name":"Jobs","description":"Subtitle translation pipeline: create jobs, batch upload, estimate tokens, monitor status, and download results in SRT/ASS/VTT/DOCX/TXT."},{"name":"Tools","description":"Subtitle processing utilities: RTL fixer, SRT-to-ASS converter, ASS style recommendation, and font embedding."},{"name":"Game Localization","description":"Game Studio pipeline: unpack, analyze, translate, and rebuild games (Ren'Py, Unity, Unreal, Android, PO, XNB, etc.)."},{"name":"Templates","description":"Translation templates, style profiles, and AI-powered template discovery."},{"name":"AI Providers","description":"Available AI models, OpenRouter catalog, and model capability configurations."},{"name":"Users","description":"User profile, balance, and tool permissions."},{"name":"Plans","description":"Subscription plans, word quotas, credit ledger, and active entitlements."},{"name":"Payments","description":"Zibal payment gateway requests and transactions."},{"name":"Studio","description":"Subtitle Studio real-time editor and revision history."},{"name":"Auth","description":"Authentication: registration, login, phone OTP verification, and password management."}]}