{"openapi":"3.1.0","info":{"title":"Voxy API","description":"Text to speech, voice cloning and design, transcription, dubbing, Studio projects and voice agents, with Mongolian first.\n\nAccess is by approval: apply in [Settings → API](https://voxy.mn/app/settings/api), then create a key.\nSend it as `Authorization: Bearer <key>`. Keys belong on your server, never in a browser.\n\n**Rate limit:** 60 requests per minute per key. Daily fair-use quotas are shared with your account's app usage.\n\n**Scopes**\n\n- `voices`: List, clone, design, verify and publish voices\n- `tts`: Text to speech\n- `stt`: Transcription, live speech to text, dictation\n- `studio`: Studio projects, chapters, takes, renders\n- `dubbing`: Dubbing\n- `media`: Batch TTS, voice changer, audio tools\n- `agents`: Voice agents and conversations\n- `dictionaries`: Pronunciation dictionaries\n- `history`: Generation history and downloads\n\nThe [guides](https://voxy.mn/docs) cover streaming, WebSockets, jobs and errors.","version":"1.0.0"},"servers":[{"url":"https://voxy.mn/v1","description":"Voxy API"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Account","description":"The key you're calling with, your daily usage, and WebSocket tickets. No scope needed."},{"name":"Voices","description":"List, clone, design, verify and publish voices. Scope: `voices`."},{"name":"Text to speech","description":"Check text and stream speech sentence by sentence. Scope: `tts`."},{"name":"Speech to text","description":"Transcribe files, stream live speech, clean up dictation. Scope: `stt`."},{"name":"Transcripts","description":"Read, edit, export and summarise saved transcripts. Scope: `stt`."},{"name":"Studio","description":"Long-form projects: chapters, paragraphs (blocks), takes, renders and exports. Scope: `studio`."},{"name":"Dubbing","description":"Translate and re-voice audio or video, with a review step before rendering. Scope: `dubbing`."},{"name":"Media","description":"Batch text to speech, voice changer (speech to speech) and audio tools. Scope: `media`."},{"name":"Agents","description":"Voice agents, their conversations, and the real-time talk socket. Scope: `agents`."},{"name":"Dictionaries","description":"Pronunciation dictionaries applied to text before synthesis. Scope: `dictionaries`."},{"name":"History","description":"Your text-to-speech generations and their audio. Scope: `history`."},{"name":"Jobs","description":"Background work started by other endpoints (`jobId`): status, live progress, cancel and retry. No scope needed."}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"vs_live_…"}},"schemas":{"Account":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"],"additionalProperties":false},"key":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["voices","tts","stt","studio","dubbing","media","agents","dictionaries","history"]}},"createdAt":{"type":["string","null"]},"expiresAt":{"type":["string","null"]}},"required":["id","name","prefix","scopes","createdAt","expiresAt"],"additionalProperties":false},"rateLimit":{"type":"object","properties":{"requestsPerMinute":{"type":"number"}},"required":["requestsPerMinute"],"additionalProperties":false}},"required":["user","key","rateLimit"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["unauthorized","forbidden","not_found","validation","limit_reached","rate_limited","voice_not_ready","model_unavailable","upstream_error","conflict"]},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"Usage":{"type":"object","properties":{"resetAt":{"type":"string","description":"Next reset, midnight UTC"},"features":{"type":"array","items":{"type":"object","properties":{"feature":{"type":"string"},"used":{"type":"number"},"limit":{"type":"number"}},"required":["feature","used","limit"],"additionalProperties":false}}},"required":["resetAt","features"],"additionalProperties":false},"RealtimeTicket":{"type":"object","properties":{"ticket":{"type":"string"},"expiresIn":{"type":"number","description":"Seconds until the ticket expires"}},"required":["ticket","expiresIn"],"additionalProperties":false},"VoiceList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Voice"}}},"required":["items"],"additionalProperties":false},"Voice":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"source":{"type":"string","enum":["cloned","designed","preset","auto"]},"status":{"type":"string","enum":["processing","ready","failed"]},"visibility":{"type":"string","enum":["private","workspace","public"]},"language":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"color":{"type":"string"},"instruct":{"type":["string","null"]},"refText":{"type":["string","null"]},"refSeconds":{"type":["number","null"]},"previewUrl":{"type":["string","null"]},"verified":{"type":"boolean"},"ownerId":{"type":["string","null"]},"ownerName":{"type":["string","null"]},"workspaceId":{"type":["string","null"]},"usageCount":{"type":"number"},"createdAt":{"type":"string"},"isMine":{"type":"boolean"},"inLibrary":{"type":"boolean"}},"required":["id","name","description","source","status","visibility","language","tags","color","instruct","refText","refSeconds","previewUrl","verified","ownerId","ownerName","workspaceId","usageCount","createdAt","isMine","inLibrary"],"additionalProperties":false},"ReferenceTranscript":{"type":"object","properties":{"text":{"type":"string"},"duration":{"type":"number","description":"Seconds"}},"required":["text","duration"],"additionalProperties":false},"VoiceCloneStarted":{"type":"object","properties":{"voice":{"$ref":"#/components/schemas/Voice"},"jobId":{"type":"string"}},"required":["voice","jobId"],"additionalProperties":false},"VoiceDesignResult":{"type":"object","properties":{"instruct":{"description":"The voice description the candidates were generated from; null for `auto`","type":["string","null"]},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/VoiceCandidate"}}},"required":["instruct","candidates"],"additionalProperties":false},"VoiceCandidate":{"type":"object","properties":{"candidateId":{"type":"string"},"audioUrl":{"type":"string"},"seed":{"type":"number"},"durationMs":{"type":"number"}},"required":["candidateId","audioUrl","seed","durationMs"],"additionalProperties":false},"VoiceDesignRequest":{"type":"object","properties":{"attributes":{"default":{},"type":"object","properties":{"gender":{"type":"string","enum":["male","female"]},"age":{"type":"string","enum":["child","teenager","young adult","middle-aged","elderly"]},"pitch":{"type":"string","enum":["very low pitch","low pitch","moderate pitch","high pitch","very high pitch"]},"style":{"type":"string","enum":["whisper"]},"accent":{"type":"string","enum":["american accent","british accent","australian accent","canadian accent","indian accent","russian accent","chinese accent","korean accent","japanese accent"]}}},"description":{"type":"string","maxLength":300},"text":{"type":"string","minLength":1,"maxLength":400},"language":{"default":"mn","type":"string"},"auto":{"default":false,"type":"boolean"},"count":{"default":3,"type":"integer","minimum":1,"maximum":4}},"required":["text"]},"VoiceDesignSaveRequest":{"type":"object","properties":{"candidateId":{"type":"string"},"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","maxLength":500},"tags":{"default":[],"maxItems":12,"type":"array","items":{"type":"string"}}},"required":["candidateId","name"]},"VoiceUpdate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"tags":{"maxItems":12,"type":"array","items":{"type":"string","maxLength":32}},"color":{"type":"string","maxLength":32},"visibility":{"type":"string","enum":["private","workspace","public"]}}},"Ok":{"type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"],"additionalProperties":false},"VoicePreview":{"type":"object","properties":{"audioUrl":{"type":"string"}},"required":["audioUrl"],"additionalProperties":false},"VoicePreviewRequest":{"type":"object","properties":{"text":{"type":"string"}}},"VoicePublishRequest":{"type":"object","properties":{"allowCommercial":{"type":"boolean"}}},"VerificationChallenge":{"type":"object","properties":{"token":{"type":"string"},"sentence":{"type":"string","description":"Read this aloud and upload the recording"}},"required":["token","sentence"],"additionalProperties":false},"VerificationResult":{"type":"object","properties":{"passed":{"type":"boolean"},"heard":{"type":"string","description":"What we transcribed from the recording"},"wordMatch":{"type":"number","description":"Share of the sentence's words heard, 0-1"},"speakerMatch":{"type":"number","description":"Speaker similarity to the voice's reference, 0-1"}},"required":["passed","heard","wordMatch","speakerMatch"],"additionalProperties":false},"VoiceReport":{"type":"object","properties":{"reason":{"type":"string","minLength":3,"maxLength":1000}},"required":["reason"]},"TextCheck":{"type":"object","properties":{"sentences":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"issues":{"type":"array","items":{"type":"string","enum":["digits","latin","symbols","too_long"]}}},"required":["text","issues"],"additionalProperties":false}},"chars":{"type":"number"},"issueCount":{"type":"number"},"spoken":{"description":"The text as it will be spoken after number normalization and dictionaries; null when nothing would change it","type":["string","null"]}},"required":["sentences","chars","issueCount","spoken"],"additionalProperties":false},"TextCheckRequest":{"type":"object","properties":{"text":{"type":"string","maxLength":20000},"language":{"default":"mn","type":"string"},"normalize":{"default":true,"type":"boolean"},"dictionaryIds":{"default":[],"type":"array","items":{"type":"string"}}},"required":["text"]},"TtsStreamEvent":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"start"},"generationId":{"type":"string"},"sentences":{"type":"number"},"sampleRate":{"type":"number"},"variant":{"type":"number"}},"required":["type","generationId","sentences","sampleRate","variant"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"chunk"},"index":{"type":"number"},"variant":{"type":"number"},"text":{"type":"string"},"audio":{"type":"string","description":"Base64 PCM16 mono little-endian at the `start` event's sampleRate"},"durationMs":{"type":"number"},"processingMs":{"type":"number"}},"required":["type","index","variant","text","audio","durationMs","processingMs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"skipped"},"index":{"type":"number"},"variant":{"type":"number"},"text":{"type":"string"},"reason":{"type":"string"}},"required":["type","index","variant","text","reason"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"done"},"generationId":{"type":"string"},"variant":{"type":"number"},"audioUrl":{"type":"string"},"durationMs":{"type":"number"},"processingMs":{"type":"number"}},"required":["type","generationId","variant","audioUrl","durationMs","processingMs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"error"},"code":{"type":"string"},"message":{"type":"string"}},"required":["type","code","message"],"additionalProperties":false}]},"TtsRequest":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":5000},"voiceId":{"type":"string","minLength":1},"language":{"default":"mn","type":"string"},"settings":{"default":{"speed":1,"numStep":32,"guidanceScale":2,"denoise":true},"type":"object","properties":{"speed":{"default":1,"type":"number","minimum":0.5,"maximum":2},"numStep":{"default":32,"type":"integer","minimum":8,"maximum":64},"guidanceScale":{"default":2,"type":"number","minimum":1,"maximum":4},"denoise":{"default":true,"type":"boolean"},"duration":{"anyOf":[{"type":"number","exclusiveMinimum":0,"maximum":600},{"type":"null"}]},"seed":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]}}},"normalizeText":{"default":true,"type":"boolean"},"dictionaryIds":{"default":[],"type":"array","items":{"type":"string"}},"variants":{"default":1,"type":"integer","minimum":1,"maximum":3}},"required":["text","voiceId"]},"GenerationList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Generation"}},"nextCursor":{"description":"Pass as `cursor` for the next page; null on the last page","type":["string","null"]}},"required":["items","nextCursor"],"additionalProperties":false},"Generation":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["tts","sts","design","clone_preview","batch","dictation","agent"]},"voiceId":{"type":["string","null"]},"voiceName":{"type":["string","null"]},"text":{"type":"string"},"language":{"type":"string"},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"audioUrl":{"type":["string","null"]},"downloadUrl":{"type":["string","null"]},"durationMs":{"type":["number","null"]},"processingMs":{"type":["number","null"]},"chars":{"type":"number"},"variant":{"type":"number"},"groupId":{"description":"Shared by the variants of one request","type":["string","null"]},"starred":{"type":"boolean"},"rating":{"description":"-1, 0 or 1","type":["number","null"]},"createdAt":{"type":"string","description":"ISO 8601 timestamp"}},"required":["id","kind","voiceId","voiceName","text","language","settings","audioUrl","downloadUrl","durationMs","processingMs","chars","variant","groupId","starred","rating","createdAt"],"additionalProperties":false},"GenerationUpdate":{"type":"object","properties":{"starred":{"type":"boolean"},"rating":{"anyOf":[{"type":"integer","minimum":-1,"maximum":1},{"type":"null"}]}}},"TranscriptionStarted":{"type":"object","properties":{"transcriptId":{"type":"string"},"jobId":{"type":"string"}},"required":["transcriptId","jobId"],"additionalProperties":false},"TextResult":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"],"additionalProperties":false},"DictationCleanupRequest":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":30000},"style":{"default":"plain","type":"string","enum":["plain","email","notes","message"]}},"required":["text"]},"TranscriptList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptSummary"}},"nextCursor":{"description":"Pass as `cursor` for the next page; null on the last page","type":["string","null"]}},"required":["items","nextCursor"],"additionalProperties":false},"TranscriptSummary":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"source":{"type":"string","enum":["file","live","dictation"]},"language":{"type":"string"},"status":{"type":"string","enum":["processing","ready","failed"]},"durationSec":{"type":["number","null"]},"audioUrl":{"type":["string","null"]},"text":{"type":"string","description":"The first 240 characters"},"speakerNames":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Display names by speaker label, e.g. `{ \"S1\": \"Bat\" }`"},"diarized":{"type":"boolean"},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"}},"required":["id","title","source","language","status","durationSec","audioUrl","text","speakerNames","diarized","createdAt","updatedAt"],"additionalProperties":false},"Transcript":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"source":{"type":"string","enum":["file","live","dictation"]},"language":{"type":"string"},"status":{"type":"string","enum":["processing","ready","failed"]},"durationSec":{"type":["number","null"]},"audioUrl":{"type":["string","null"]},"text":{"type":"string"},"speakerNames":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Display names by speaker label, e.g. `{ \"S1\": \"Bat\" }`"},"diarized":{"type":"boolean"},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"},"segments":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptSegmentOutput"}}},"required":["id","title","source","language","status","durationSec","audioUrl","text","speakerNames","diarized","createdAt","updatedAt","segments"],"additionalProperties":false},"TranscriptSegmentOutput":{"type":"object","properties":{"id":{"type":"number"},"start":{"type":"number"},"end":{"type":"number"},"text":{"type":"string"},"speaker":{"type":["string","null"]},"words":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"start":{"type":"number"},"end":{"type":"number"}},"required":["text","start","end"],"additionalProperties":false}}},"required":["id","start","end","text"],"additionalProperties":false},"TranscriptUpdate":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"segments":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptSegment"}},"speakerNames":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","maxLength":60}}}},"TranscriptSegment":{"type":"object","properties":{"id":{"type":"number"},"start":{"type":"number"},"end":{"type":"number"},"text":{"type":"string"},"speaker":{"type":["string","null"]},"words":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"start":{"type":"number"},"end":{"type":"number"}},"required":["text","start","end"]}}},"required":["id","start","end","text"]},"TranscriptLlmRequest":{"type":"object","properties":{"action":{"type":"string","enum":["summarize","cleanup","action_items","translate"]},"targetLanguage":{"default":"English","type":"string"}},"required":["action"]},"JobList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}},"required":["items"],"additionalProperties":false},"Job":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["voice_clone","stt_file","studio_render","batch_tts","sts","dubbing","isolate","export"]},"status":{"type":"string","enum":["queued","running","succeeded","failed","canceled"]},"progress":{"type":"number"},"stage":{"type":["string","null"]},"title":{"type":"string"},"error":{"type":["string","null"]},"output":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","type","status","progress","stage","title","error","output","createdAt","updatedAt"],"additionalProperties":false},"ProjectList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProjectSummary"}}},"required":["items"],"additionalProperties":false},"ProjectSummary":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"kind":{"type":"string","enum":["audiobook","podcast","story","other"]},"language":{"type":"string"},"defaultVoiceId":{"type":["string","null"]},"cast":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Voice id by speaker name"},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"musicUrl":{"type":["string","null"]},"musicVolume":{"type":"number"},"coverColor":{"type":"string"},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"},"chapterCount":{"type":"number"},"durationMs":{"type":"number"}},"required":["id","title","description","kind","language","defaultVoiceId","cast","settings","musicUrl","musicVolume","coverColor","createdAt","updatedAt","chapterCount","durationMs"],"additionalProperties":false},"Project":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"kind":{"type":"string","enum":["audiobook","podcast","story","other"]},"language":{"type":"string"},"defaultVoiceId":{"type":["string","null"]},"cast":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Voice id by speaker name"},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"musicUrl":{"type":["string","null"]},"musicVolume":{"type":"number"},"coverColor":{"type":"string"},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"}},"required":["id","title","description","kind","language","defaultVoiceId","cast","settings","musicUrl","musicVolume","coverColor","createdAt","updatedAt"],"additionalProperties":false},"ProjectCreate":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"kind":{"default":"other","type":"string","enum":["audiobook","podcast","story","other"]},"language":{"default":"mn","type":"string"},"defaultVoiceId":{"default":null,"type":["string","null"]},"text":{"type":"string","maxLength":2000000}},"required":["title"]},"ImportedProject":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"kind":{"type":"string","enum":["audiobook","podcast","story","other"]},"language":{"type":"string"},"defaultVoiceId":{"type":["string","null"]},"cast":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Voice id by speaker name"},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"musicUrl":{"type":["string","null"]},"musicVolume":{"type":"number"},"coverColor":{"type":"string"},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"},"chapterCount":{"type":"number"}},"required":["id","title","description","kind","language","defaultVoiceId","cast","settings","musicUrl","musicVolume","coverColor","createdAt","updatedAt","chapterCount"],"additionalProperties":false},"ProjectDetail":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"kind":{"type":"string","enum":["audiobook","podcast","story","other"]},"language":{"type":"string"},"defaultVoiceId":{"type":["string","null"]},"cast":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Voice id by speaker name"},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"musicUrl":{"type":["string","null"]},"musicVolume":{"type":"number"},"coverColor":{"type":"string"},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"},"chapters":{"type":"array","items":{"$ref":"#/components/schemas/ChapterSummary"}}},"required":["id","title","description","kind","language","defaultVoiceId","cast","settings","musicUrl","musicVolume","coverColor","createdAt","updatedAt","chapters"],"additionalProperties":false},"ChapterSummary":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"position":{"type":"number"},"audioUrl":{"type":["string","null"]},"durationMs":{"type":["number","null"]},"blockCount":{"type":"number"},"chars":{"type":"number"}},"required":["id","title","position","audioUrl","durationMs","blockCount","chars"],"additionalProperties":false},"ProjectUpdate":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"kind":{"type":"string","enum":["audiobook","podcast","story","other"]},"language":{"type":"string"},"defaultVoiceId":{"type":["string","null"]},"cast":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"settings":{"type":"object","properties":{"speed":{"default":1,"type":"number","minimum":0.5,"maximum":2},"numStep":{"default":32,"type":"integer","minimum":8,"maximum":64},"guidanceScale":{"default":2,"type":"number","minimum":1,"maximum":4},"denoise":{"default":true,"type":"boolean"},"duration":{"anyOf":[{"type":"number","exclusiveMinimum":0,"maximum":600},{"type":"null"}]},"seed":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"normalizeText":{"type":"boolean"},"dictionaryIds":{"type":"array","items":{"type":"string"}}}},"musicVolume":{"type":"number","minimum":0,"maximum":1},"coverColor":{"type":"string","maxLength":32}}},"ProjectMusic":{"type":"object","properties":{"musicUrl":{"type":["string","null"]}},"required":["musicUrl"],"additionalProperties":false},"Chapter":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"position":{"type":"number"},"audioUrl":{"type":["string","null"]},"durationMs":{"type":["number","null"]},"blocks":{"type":"array","items":{"$ref":"#/components/schemas/Block"}}},"required":["id","title","position","audioUrl","durationMs","blocks"],"additionalProperties":false},"Block":{"type":"object","properties":{"id":{"type":"string"},"position":{"type":"number"},"text":{"type":"string"},"voiceId":{"type":["string","null"]},"speaker":{"type":["string","null"]},"pauseMs":{"type":"number"},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"locked":{"type":"boolean"},"selectedTakeId":{"type":["string","null"]},"stale":{"type":"boolean","description":"True when the text or voice changed since the selected take was generated"},"takes":{"type":"array","items":{"$ref":"#/components/schemas/Take"},"description":"The newest 5 takes"}},"required":["id","position","text","voiceId","speaker","pauseMs","settings","locked","selectedTakeId","stale","takes"],"additionalProperties":false},"Take":{"type":"object","properties":{"id":{"type":"string"},"blockId":{"type":"string"},"contentHash":{"type":"string"},"audioUrl":{"type":"string"},"durationMs":{"type":"number"},"seed":{"type":["number","null"]},"createdAt":{"type":"string","description":"ISO 8601 timestamp"}},"required":["id","blockId","contentHash","audioUrl","durationMs","seed","createdAt"],"additionalProperties":false},"ChapterCreate":{"type":"object","properties":{"title":{"default":"New chapter","type":"string","minLength":1,"maxLength":200},"text":{"type":"string","maxLength":500000}}},"ChapterReorder":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}}},"required":["ids"]},"JobAccepted":{"type":"object","properties":{"jobId":{"type":"string","description":"Follow it with `GET /jobs/{id}` or `GET /jobs/{id}/events`"}},"required":["jobId"],"additionalProperties":false},"ProjectRenderRequest":{"type":"object","properties":{"chapterIds":{"type":"array","items":{"type":"string"}}}},"ProjectExportRequest":{"type":"object","properties":{"format":{"default":"mp3","type":"string","enum":["mp3","wav","m4b","zip"]},"chapterIds":{"type":"array","items":{"type":"string"}}}},"ChapterUpdate":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200}},"required":["title"]},"ChapterBlocksUpdate":{"type":"object","properties":{"blocks":{"maxItems":5000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string","maxLength":5000},"voiceId":{"default":null,"type":["string","null"]},"speaker":{"default":null,"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"pauseMs":{"default":400,"type":"integer","minimum":0,"maximum":10000},"settings":{"default":{},"type":"object","properties":{"speed":{"default":1,"type":"number","minimum":0.5,"maximum":2},"numStep":{"default":32,"type":"integer","minimum":8,"maximum":64},"guidanceScale":{"default":2,"type":"number","minimum":1,"maximum":4},"denoise":{"default":true,"type":"boolean"},"duration":{"anyOf":[{"type":"number","exclusiveMinimum":0,"maximum":600},{"type":"null"}]},"seed":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]}}},"locked":{"default":false,"type":"boolean"}},"required":["text"]}}},"required":["blocks"]},"GeneratedTake":{"type":"object","properties":{"take":{"$ref":"#/components/schemas/Take"},"selectedTakeId":{"type":"string"}},"required":["take","selectedTakeId"],"additionalProperties":false},"TakeGenerateRequest":{"type":"object","properties":{"seed":{"type":"number"}}},"TakeSelect":{"type":"object","properties":{"takeId":{"type":"string"}},"required":["takeId"]},"TakeList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Take"}}},"required":["items"],"additionalProperties":false},"DubbingList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DubbingSummary"}}},"required":["items"],"additionalProperties":false},"DubbingSummary":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"sourceKind":{"type":"string","enum":["audio","video"]},"sourceLanguage":{"type":"string"},"targetLanguage":{"type":"string"},"status":{"type":"string","enum":["processing","review","rendering","ready","failed"]},"stage":{"type":["string","null"]},"voiceMap":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Voice id by speaker label"},"glossary":{"type":["string","null"]},"durationSec":{"type":["number","null"]},"error":{"type":["string","null"]},"sourceUrl":{"type":["string","null"]},"outputAudioUrl":{"type":["string","null"]},"outputVideoUrl":{"type":["string","null"]},"downloadAudioUrl":{"type":["string","null"]},"downloadVideoUrl":{"type":["string","null"]},"segmentCount":{"type":"number"},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"}},"required":["id","title","sourceKind","sourceLanguage","targetLanguage","status","stage","voiceMap","glossary","durationSec","error","sourceUrl","outputAudioUrl","outputVideoUrl","downloadAudioUrl","downloadVideoUrl","segmentCount","createdAt","updatedAt"],"additionalProperties":false},"DubbingStarted":{"type":"object","properties":{"dubbingId":{"type":"string"},"jobId":{"type":"string"}},"required":["dubbingId","jobId"],"additionalProperties":false},"Dubbing":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"sourceKind":{"type":"string","enum":["audio","video"]},"sourceLanguage":{"type":"string"},"targetLanguage":{"type":"string"},"status":{"type":"string","enum":["processing","review","rendering","ready","failed"]},"stage":{"type":["string","null"]},"voiceMap":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Voice id by speaker label"},"glossary":{"type":["string","null"]},"durationSec":{"type":["number","null"]},"error":{"type":["string","null"]},"sourceUrl":{"type":["string","null"]},"outputAudioUrl":{"type":["string","null"]},"outputVideoUrl":{"type":["string","null"]},"downloadAudioUrl":{"type":["string","null"]},"downloadVideoUrl":{"type":["string","null"]},"segmentCount":{"type":"number"},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"},"segments":{"type":"array","items":{"$ref":"#/components/schemas/DubbingSegment"}}},"required":["id","title","sourceKind","sourceLanguage","targetLanguage","status","stage","voiceMap","glossary","durationSec","error","sourceUrl","outputAudioUrl","outputVideoUrl","downloadAudioUrl","downloadVideoUrl","segmentCount","createdAt","updatedAt","segments"],"additionalProperties":false},"DubbingSegment":{"type":"object","properties":{"id":{"type":"number"},"start":{"type":"number"},"end":{"type":"number"},"speaker":{"type":["string","null"]},"source":{"type":"string","description":"Original text"},"translation":{"type":"string"},"durationMs":{"type":["number","null"]},"audioUrl":{"description":"Null until the segment is synthesized","type":["string","null"]}},"required":["id","start","end","speaker","source","translation","audioUrl"],"additionalProperties":false},"DubbingUpdate":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"voiceMap":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"glossary":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"segments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"translation":{"type":"string","maxLength":2000},"speaker":{"type":["string","null"]}},"required":["id","translation"]}}}},"DubbingSegmentAudio":{"type":"object","properties":{"id":{"type":"number"},"audioUrl":{"type":"string"},"durationMs":{"type":"number"}},"required":["id","audioUrl","durationMs"],"additionalProperties":false},"BatchRequest":{"type":"object","properties":{"title":{"default":"Batch","type":"string","maxLength":120},"voiceId":{"type":"string"},"language":{"default":"mn","type":"string"},"settings":{"default":{},"type":"object","properties":{"speed":{"default":1,"type":"number","minimum":0.5,"maximum":2},"numStep":{"default":32,"type":"integer","minimum":8,"maximum":64},"guidanceScale":{"default":2,"type":"number","minimum":1,"maximum":4},"denoise":{"default":true,"type":"boolean"},"duration":{"anyOf":[{"type":"number","exclusiveMinimum":0,"maximum":600},{"type":"null"}]},"seed":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]}}},"format":{"default":"mp3","type":"string","enum":["wav","mp3","ogg"]},"normalizeText":{"default":true,"type":"boolean"},"dictionaryIds":{"default":[],"type":"array","items":{"type":"string"}},"items":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":5000},"filename":{"type":"string","maxLength":120},"voiceId":{"type":"string"}},"required":["text"]}}},"required":["voiceId","items"]},"WatermarkDetection":{"type":"object","properties":{"detected":{"type":"boolean"},"probability":{"type":"number","description":"0-1"}},"required":["detected","probability"],"additionalProperties":false},"AgentTemplateList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AgentTemplate"}}},"required":["items"],"additionalProperties":false},"AgentTemplate":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"systemPrompt":{"type":"string"},"greeting":{"type":"string"}},"required":["key","name","description","systemPrompt","greeting"],"additionalProperties":false},"AgentList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AgentSummary"}}},"required":["items"],"additionalProperties":false},"AgentSummary":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"systemPrompt":{"type":"string"},"greeting":{"type":["string","null"]},"voiceId":{"type":["string","null"]},"language":{"type":"string"},"temperature":{"type":"number"},"think":{"type":"boolean"},"knowledge":{"type":["string","null"]},"isPublic":{"type":"boolean"},"publicSlug":{"type":["string","null"]},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"},"conversationCount":{"type":"number"},"voice":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"}},"required":["id","name","color"],"additionalProperties":false},{"type":"null"}]}},"required":["id","name","description","systemPrompt","greeting","voiceId","language","temperature","think","knowledge","isPublic","publicSlug","createdAt","updatedAt","conversationCount","voice"],"additionalProperties":false},"Agent":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"systemPrompt":{"type":"string"},"greeting":{"type":["string","null"]},"voiceId":{"type":["string","null"]},"language":{"type":"string"},"temperature":{"type":"number"},"think":{"type":"boolean"},"knowledge":{"type":["string","null"]},"isPublic":{"type":"boolean"},"publicSlug":{"type":["string","null"]},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"}},"required":["id","name","description","systemPrompt","greeting","voiceId","language","temperature","think","knowledge","isPublic","publicSlug","createdAt","updatedAt"],"additionalProperties":false},"AgentInput":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"default":null,"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"systemPrompt":{"description":"Defaults to short friendly-assistant instructions in the agent's `language` (Mongolian unless `en`).","type":"string","maxLength":8000},"greeting":{"default":null,"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"voiceId":{"default":null,"type":["string","null"]},"language":{"default":"mn","type":"string"},"temperature":{"default":0.6,"type":"number","minimum":0,"maximum":1.5},"think":{"default":false,"type":"boolean"},"knowledge":{"default":null,"anyOf":[{"type":"string","maxLength":50000},{"type":"null"}]},"isPublic":{"default":false,"type":"boolean"}},"required":["name"]},"Conversation":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"agentId":{"type":"string"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ConversationMessage"}}},"required":["id","title","agentId","messages"],"additionalProperties":false},"ConversationMessage":{"type":"object","properties":{"id":{"type":"string"},"role":{"type":"string","enum":["system","user","assistant"]},"content":{"type":"string"},"timings":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}},{"type":"null"}],"description":"Latency breakdown in ms (sttMs, llmFirstTokenMs, ttsFirstAudioMs)"},"createdAt":{"type":"string","description":"ISO 8601 timestamp"}},"required":["id","role","content","timings","createdAt"],"additionalProperties":false},"AgentUpdate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"default":null,"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"systemPrompt":{"description":"Defaults to short friendly-assistant instructions in the agent's `language` (Mongolian unless `en`).","type":"string","maxLength":8000},"greeting":{"default":null,"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"voiceId":{"default":null,"type":["string","null"]},"language":{"default":"mn","type":"string"},"temperature":{"default":0.6,"type":"number","minimum":0,"maximum":1.5},"think":{"default":false,"type":"boolean"},"knowledge":{"default":null,"anyOf":[{"type":"string","maxLength":50000},{"type":"null"}]},"isPublic":{"default":false,"type":"boolean"}}},"ConversationList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ConversationSummary"}}},"required":["items"],"additionalProperties":false},"ConversationSummary":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"createdAt":{"type":"string","description":"ISO 8601 timestamp"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"},"mine":{"type":"boolean","description":"False for conversations other people had with a public agent"}},"required":["id","title","createdAt","updatedAt","mine"],"additionalProperties":false},"DictionaryList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DictionarySummary"}}},"required":["items"],"additionalProperties":false},"DictionarySummary":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"entryCount":{"type":"number"},"updatedAt":{"type":"string","description":"ISO 8601 timestamp"}},"required":["id","name","description","entryCount","updatedAt"],"additionalProperties":false},"DictionaryCreate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"default":null,"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]}},"required":["name"]},"Dictionary":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"entries":{"type":"array","items":{"$ref":"#/components/schemas/DictionaryEntry"}}},"required":["id","name","description","entries"],"additionalProperties":false},"DictionaryEntry":{"type":"object","properties":{"id":{"type":"string"},"term":{"type":"string"},"replacement":{"type":"string"},"caseSensitive":{"type":"boolean"}},"required":["id","term","replacement","caseSensitive"],"additionalProperties":false},"DictionaryUpdate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]}}},"DictionaryEntryInput":{"type":"object","properties":{"term":{"type":"string","minLength":1,"maxLength":200},"replacement":{"type":"string","minLength":1,"maxLength":500},"caseSensitive":{"default":false,"type":"boolean"}},"required":["term","replacement"]},"DictionaryEntryUpdate":{"type":"object","properties":{"term":{"type":"string","minLength":1,"maxLength":200},"replacement":{"type":"string","minLength":1,"maxLength":500},"caseSensitive":{"default":false,"type":"boolean"}}},"DictionaryImportResult":{"type":"object","properties":{"imported":{"type":"number"}},"required":["imported"],"additionalProperties":false}}},"paths":{"/me":{"get":{"operationId":"getAccount","summary":"Current key and account","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Account"],"deprecated":false,"security":[{"bearerAuth":[]}]}},"/usage":{"get":{"operationId":"getUsage","summary":"Today's usage","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Account"],"deprecated":false,"security":[{"bearerAuth":[]}]}},"/realtime/tickets":{"post":{"operationId":"createRealtimeTicket","summary":"WebSocket ticket","description":"For browser clients, which can't set headers on a WebSocket. Pass it as `?ticket=` within 60 seconds. Server clients can send the `Authorization` header instead.","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RealtimeTicket"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Account"],"deprecated":false,"security":[{"bearerAuth":[]}]}},"/voices":{"get":{"operationId":"listVoices","summary":"List voices","description":"Not paginated: returns up to `limit` voices (max 200). `scope=all` is your own voices, the preset studio voices, your workspace's shared voices and community voices you added to your library.","parameters":[{"name":"scope","in":"query","required":false,"description":"`mine`: yours; `workspace`: shared in your workspace; `library`: community voices you added; `community`: all published voices; `studio`: presets","schema":{"default":"all","type":"string","enum":["all","mine","workspace","library","community","studio"]}},{"name":"q","in":"query","required":false,"description":"Search name and description","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","enum":["cloned","designed","preset","auto"]}},{"name":"language","in":"query","required":false,"schema":{"type":"string"}},{"name":"tag","in":"query","required":false,"description":"Exact tag","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"schema":{"default":"recent","type":"string","enum":["recent","popular","name"]}},{"name":"limit","in":"query","required":false,"schema":{"default":100,"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices"}},"/voices/transcribe-ref":{"post":{"operationId":"transcribeReferenceClip","summary":"Transcribe a reference clip","description":"Quick transcript of a voice sample, to send as `refText` when cloning. Runs synchronously.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Audio sample"},"trimStart":{"type":"number","description":"Seconds to start from"},"trimEnd":{"type":"number","description":"Seconds to stop at (used only when greater than `trimStart`)"}},"required":["file"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferenceTranscript"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No file attached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model returned an error (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The model is unavailable right now (`model_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The model timed out (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices"}},"/voices/clone":{"post":{"operationId":"createVoiceClone","summary":"Clone a voice","description":"Creates a voice in `processing` status and starts a `voice_clone` job (cleanup, transcript, safety checks). The voice is usable once the job succeeds. The sample must be 3-30 seconds after trimming. Uses 1 unit of the `clone` quota.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Voice sample (audio or video)"},"name":{"type":"string","description":"Voice name"},"consent":{"type":"string","description":"Must be `true`: you confirm you have the right to clone this voice","enum":["true"]},"description":{"type":"string","description":"Description"},"language":{"type":"string","description":"Language code","default":"mn"},"tags":{"type":"string","description":"Comma-separated tags (up to 12)"},"refText":{"type":"string","description":"Transcript of the sample; transcribed for you when omitted"},"trimStart":{"type":"number","description":"Seconds to start from"},"trimEnd":{"type":"number","description":"Seconds to stop at; defaults to the end of the file"},"denoise":{"type":"string","enum":["true","false"],"default":"false","description":"Remove background noise first"}},"required":["file","name","consent"]}}}},"responses":{"201":{"description":"Created; follow the job for progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceCloneStarted"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No file, no consent, no name, or the sample is too short or too long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices"}},"/voices/design":{"post":{"operationId":"designVoices","summary":"Design candidate voices","description":"Synchronous GPU work: generates `count` (1-4) candidates speaking `text`. Save one with `POST /voices/design/save` within 6 hours. Uses 1 unit of the `design` quota per call.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceDesignRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceDesignResult"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model returned an error (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The model is unavailable right now (`model_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The model timed out (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices"}},"/voices/design/save":{"post":{"operationId":"saveDesignedVoice","summary":"Save a designed voice","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceDesignSaveRequest"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voice"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"The candidate expired; generate new ones (`not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices"}},"/voices/{id}":{"get":{"operationId":"getVoice","summary":"Get a voice","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voice"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"patch":{"operationId":"updateVoice","summary":"Update a voice","description":"Owner only. Setting `visibility` to `public` requires a verified voice.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voice"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The voice isn't verified","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"delete":{"operationId":"deleteVoice","summary":"Delete a voice","description":"Owner only.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/voices/{id}/preview":{"post":{"operationId":"previewVoice","summary":"Preview a voice","description":"Without `text`, returns the voice's cached preview clip (generated once if missing). With `text`, synthesizes up to its first 400 characters synchronously. The body is optional.","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoicePreviewRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoicePreview"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The voice is still processing (`voice_not_ready`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model returned an error (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The model is unavailable right now (`model_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The model timed out (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/voices/{id}/library":{"post":{"operationId":"addVoiceToLibrary","summary":"Add a community voice","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Public voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"delete":{"operationId":"removeVoiceFromLibrary","summary":"Remove from library","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/voices/{id}/publish":{"post":{"operationId":"publishVoice","summary":"Publish a voice","description":"Owner only; the voice must be verified and ready. The body is optional; `allowCommercial` defaults to true.","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoicePublishRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The voice isn't verified (`conflict`) or is still processing (`voice_not_ready`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/voices/{id}/unpublish":{"post":{"operationId":"unpublishVoice","summary":"Unpublish a voice","description":"Owner only. The voice goes back to workspace visibility.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/voices/{id}/verify/start":{"post":{"operationId":"startVoiceVerification","summary":"Start voice verification","description":"Owner only. Returns a sentence to read aloud and a token valid for 10 minutes.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationChallenge"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/voices/{id}/verify":{"post":{"operationId":"verifyVoice","summary":"Submit verification audio","description":"Owner only. Checks the words and the speaker against the voice; on success the voice becomes `verified`. Runs synchronously.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"Token from `POST /voices/{id}/verify/start`"},"file":{"type":"string","format":"binary","description":"Recording of the sentence"}},"required":["token","file"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationResult"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"The verification expired; start again (`not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No recording attached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model returned an error (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The model is unavailable right now (`model_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The model timed out (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/voices/{id}/report":{"post":{"operationId":"reportVoice","summary":"Report a voice","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceReport"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Voices"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"voices","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/tts/check":{"post":{"operationId":"checkText","summary":"Check text before synthesis","description":"Splits the text into sentences, flags issues (digits without normalization, Latin script in Mongolian, odd symbols) and shows how it will be spoken.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextCheckRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextCheck"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Text to speech"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"tts"}},"/tts/stream":{"post":{"operationId":"streamSpeech","summary":"Stream speech","description":"Streams newline-delimited JSON, one event per line: `start`, then one `chunk` per sentence (base64 PCM16 audio you can play as it arrives), then `done` with the saved WAV's URL. With `variants` > 1 the sequence repeats per variant.\n\nChecks run before the stream starts and fail with a normal JSON error (404, 409, 422, 429). Failures after that arrive as an `error` event and end the stream.\n\nUses the `tts` quota: characters × variants. Each variant is saved to history.\n\nGuide: https://voxy.mn/docs/streaming","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TtsRequest"}}}},"responses":{"200":{"description":"NDJSON stream of `TtsStreamEvent`","content":{"application/x-ndjson":{"schema":{"$ref":"#/components/schemas/TtsStreamEvent"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The voice is still processing (`voice_not_ready`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input, or the text is blocked by the acceptable-use policy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Text to speech"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"tts"}},"/history":{"get":{"operationId":"listGenerations","summary":"List generations","description":"Newest first, paginated with `cursor`.","parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string","enum":["tts","sts","design","clone_preview","batch","dictation","agent"]}},{"name":"voiceId","in":"query","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Search the text","schema":{"type":"string"}},{"name":"starred","in":"query","required":false,"description":"Only starred generations","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"`nextCursor` from the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":30,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["History"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"history"}},"/history/{id}":{"get":{"operationId":"getGeneration","summary":"Get a generation","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Generation"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Generation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["History"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"history","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"patch":{"operationId":"updateGeneration","summary":"Star or rate a generation","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Generation"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Generation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["History"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"history","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"delete":{"operationId":"deleteGeneration","summary":"Delete a generation","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Generation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["History"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"history","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/history/{id}/download":{"get":{"operationId":"downloadGeneration","summary":"Download audio","description":"Converted on the fly when `format` isn't `wav`.","parameters":[{"name":"format","in":"query","required":false,"description":"Audio format","schema":{"type":"string","enum":["wav","mp3","ogg"],"default":"wav"}},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The audio file","headers":{"Content-Disposition":{"description":"`attachment` with the file name","schema":{"type":"string"}}},"content":{"audio/wav":{"schema":{"type":"string","format":"binary"}},"audio/mpeg":{"schema":{"type":"string","format":"binary"}},"audio/ogg":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Generation or its audio not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["History"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"history"}},"/stt/file":{"post":{"operationId":"transcribeFile","summary":"Transcribe a file","description":"Creates a transcript in `processing` status and starts an `stt_file` job; the transcript fills in as the job runs. Uses the `stt` quota by the file's duration in seconds.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Audio or video (MP3, WAV, M4A, MP4, …)"},"title":{"type":"string","description":"Title; defaults to the file name"},"language":{"type":"string","description":"Language code","default":"mn"},"diarize":{"type":"string","enum":["true","false"],"default":"false","description":"Label speakers"}},"required":["file"]}}}},"responses":{"201":{"description":"Created; follow the job for progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionStarted"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No file, or the file can't be read","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Speech to text"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"stt"}},"/stt/live":{"get":{"operationId":"streamTranscription","summary":"Live STT (WebSocket)","description":"Upgrade to a WebSocket and stream microphone audio; transcripts come back as you speak.\n\n1. Send a JSON config first: `{ \"type\": \"config\", \"language\": \"mn\", \"partials\": true, \"lookahead\": \"la0\", \"save\": true }` (everything but `type` is optional).\n\n2. Send audio as binary frames: 16 kHz, mono, PCM16 little-endian. Send `{ \"type\": \"flush\" }` to finalise the current utterance, `{ \"type\": \"close\" }` to end the session.\n\n3. Server messages (JSON): `ready`, `partial`, `utterance` (with word timings), `eot`, `error` (`fatal: true` closes the socket), `saved` (`transcriptId`, when `save` is true), `end`.\n\nAdd `?source=dictation` to save and bill the session as dictation. Uses the `stt` (or `dictation`) quota by audio seconds.\n\nServer clients send the `Authorization` header. Browsers can't, so they get a ticket from `POST /realtime/tickets` and connect with `?ticket=`.\n\nGuide: https://voxy.mn/docs/streaming","parameters":[{"name":"ticket","in":"query","required":false,"description":"Single-use ticket from `POST /realtime/tickets` (browsers)","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"Save the transcript as `live` or `dictation`","schema":{"type":"string","enum":["live","dictation"],"default":"live"}}],"responses":{"101":{"description":"Switching Protocols. The connection is now a WebSocket."},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Speech to text"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"stt"}},"/dictation/cleanup":{"post":{"operationId":"cleanupDictation","summary":"Clean up dictated text","description":"Punctuates and tidies dictated text, or rewrites it as an email, notes or a chat message. Runs synchronously on an LLM.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DictationCleanupRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextResult"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model returned an error (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The model is unavailable right now (`model_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The model timed out (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Speech to text"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"stt"}},"/transcripts":{"get":{"operationId":"listTranscripts","summary":"List transcripts","description":"Newest first, paginated with `cursor`. Items carry a 240-character preview and no segments; fetch one for the full text.","parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string","enum":["file","live","dictation"]}},{"name":"q","in":"query","required":false,"description":"Search the text","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"`nextCursor` from the previous page","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":30,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Transcripts"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"stt"}},"/transcripts/{id}":{"get":{"operationId":"getTranscript","summary":"Get a transcript","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transcript"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Transcripts"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"stt","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"patch":{"operationId":"updateTranscript","summary":"Edit a transcript","description":"Sending `segments` replaces them all and rebuilds `text` from them.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transcript"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Transcripts"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"stt","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"delete":{"operationId":"deleteTranscript","summary":"Delete a transcript","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Transcripts"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"stt","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/transcripts/{id}/export":{"get":{"operationId":"exportTranscript","summary":"Export a transcript","description":"`json` is `{ title, language, duration, speakers, segments }`. Unknown formats fall back to `txt`.","parameters":[{"name":"format","in":"query","required":false,"description":"Export format","schema":{"type":"string","enum":["txt","srt","vtt","json"],"default":"txt"}},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The exported file","headers":{"Content-Disposition":{"description":"`attachment` with the file name","schema":{"type":"string"}}},"content":{"text/plain":{"schema":{"type":"string"}},"application/x-subrip":{"schema":{"type":"string"}},"text/vtt":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"string"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Transcripts"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"stt"}},"/transcripts/{id}/llm":{"post":{"operationId":"transformTranscript","summary":"Summarise or translate","description":"Runs synchronously on an LLM over the first 60,000 characters. `targetLanguage` is used by `translate` only.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptLlmRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextResult"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model returned an error (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The model is unavailable right now (`model_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The model timed out (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Transcripts"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"stt","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/jobs":{"get":{"operationId":"listJobs","summary":"List jobs","description":"Newest first, up to `limit`. Not paginated.","parameters":[{"name":"active","in":"query","required":false,"description":"Only queued or running jobs","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Comma-separated job types, e.g. `stt_file,dubbing`","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":30,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Jobs"],"deprecated":false,"security":[{"bearerAuth":[]}]}},"/jobs/{id}":{"get":{"operationId":"getJob","summary":"Get a job","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Jobs"],"deprecated":false,"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/jobs/{id}/events":{"get":{"operationId":"streamJobEvents","summary":"Job events (SSE)","description":"A `text/event-stream` with three event types:\n- `snapshot`: sent first; `data` is the `Job`. If the job has already finished the stream ends here.\n- `job`: each update; `data` is `{ \"type\": \"progress\", \"progress\": 0.4, \"stage\": \"…\" }` or `{ \"type\": \"status\", \"status\": \"succeeded\", \"error\": null, \"output\": { … } }`. The stream ends after a `succeeded`, `failed` or `canceled` status.\n- `ping`: every 15 seconds, empty `data`, to keep proxies from closing the connection.\nGuide: https://voxy.mn/docs/streaming","responses":{"200":{"description":"Event stream","content":{"text/event-stream":{"schema":{"type":"string"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Jobs"],"deprecated":false,"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/jobs/{id}/cancel":{"post":{"operationId":"cancelJob","summary":"Cancel a job","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The job has already finished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Jobs"],"deprecated":false,"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/jobs/{id}/retry":{"post":{"operationId":"retryJob","summary":"Retry a job","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only failed or canceled jobs can be retried","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Jobs"],"deprecated":false,"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/projects":{"get":{"operationId":"listProjects","summary":"List projects","description":"Most recently updated first. Not paginated.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio"},"post":{"operationId":"createProject","summary":"Create a project","description":"With `text`, chapters are split on headings and paragraphs on blank lines; without it the project starts with one empty chapter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio"}},"/projects/import":{"post":{"operationId":"importProject","summary":"Create from a document","description":"Imports .txt, .md, .docx or .epub (up to 50 MB) into chapters and paragraphs.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"The document"},"title":{"type":"string","description":"Title; defaults to the file name"},"kind":{"type":"string","description":"Project kind","enum":["audiobook","podcast","story","other"],"default":"audiobook"},"language":{"type":"string","description":"Language code","default":"mn"},"defaultVoiceId":{"type":"string","description":"Voice for paragraphs without one"}},"required":["file"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportedProject"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No file, too large, or unreadable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio"}},"/projects/{id}":{"get":{"operationId":"getProject","summary":"Get a project","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDetail"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"patch":{"operationId":"updateProject","summary":"Update a project","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"delete":{"operationId":"deleteProject","summary":"Delete a project","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/projects/{id}/music":{"post":{"operationId":"setProjectMusic","summary":"Background music","description":"Send `file` to set the track, or `remove=true` to clear it.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Music track"},"remove":{"type":"string","enum":["true","false"],"default":"false","description":"Remove the current track instead"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMusic"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No file attached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/projects/{id}/chapters":{"post":{"operationId":"createChapter","summary":"Add a chapter","description":"Appended at the end. `text` is split into paragraphs on blank lines.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterCreate"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chapter"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/projects/{id}/chapters/reorder":{"post":{"operationId":"reorderChapters","summary":"Reorder chapters","description":"`ids` in the new order. Ids from other projects are ignored.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterReorder"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/projects/{id}/render":{"post":{"operationId":"renderProject","summary":"Render chapter audio","description":"Starts a `studio_render` job that generates missing or stale paragraphs and assembles each chapter's audio. The body is optional; without `chapterIds` every chapter is rendered.","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectRenderRequest"}}}},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobAccepted"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/projects/{id}/export":{"post":{"operationId":"exportProject","summary":"Export a project","description":"Starts an `export` job; the file's URL is in the job's `output` when it succeeds.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectExportRequest"}}}},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobAccepted"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/projects/{id}/text":{"get":{"operationId":"getProjectText","summary":"Download as Markdown","responses":{"200":{"description":"One `#` heading per chapter, paragraphs separated by blank lines","headers":{"Content-Disposition":{"description":"`attachment` with the file name","schema":{"type":"string"}}},"content":{"text/markdown":{"schema":{"type":"string"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/chapters/{id}":{"get":{"operationId":"getChapter","summary":"Get a chapter","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chapter"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Chapter not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"patch":{"operationId":"updateChapter","summary":"Rename a chapter","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Chapter not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"delete":{"operationId":"deleteChapter","summary":"Delete a chapter","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Chapter not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/chapters/{id}/blocks":{"put":{"operationId":"replaceChapterBlocks","summary":"Replace paragraphs","description":"Send the full list in order (up to 5,000). Paragraphs with a known `id` keep their takes; others are created; missing ones are deleted.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterBlocksUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chapter"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Chapter not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/blocks/{id}/generate":{"post":{"operationId":"generateTake","summary":"Generate a take","description":"Synchronous GPU work. The new take becomes the selected one. Uses the `tts` quota by the paragraph's length. The body is optional.","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TakeGenerateRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratedTake"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Paragraph not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input, or the paragraph is empty","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model returned an error (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The model is unavailable right now (`model_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The model timed out (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/blocks/{id}/select-take":{"post":{"operationId":"selectTake","summary":"Select a take","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TakeSelect"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Paragraph or take not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/blocks/{id}/takes":{"get":{"operationId":"listTakes","summary":"List a paragraph's takes","description":"The newest 20.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TakeList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Paragraph not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Studio"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"studio","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/dubbing":{"get":{"operationId":"listDubbings","summary":"List dubbing projects","description":"Newest first. Not paginated. Items have no segments; fetch one for them.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DubbingList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dubbing"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dubbing"},"post":{"operationId":"createDubbing","summary":"Dub an audio or video file","description":"Starts a `dubbing` job that transcribes, translates and voices the file (up to 2 hours, 500 MB). With `review` (the default) it stops at `review` status so you can edit segments, then call `POST /dubbing/{id}/render`. Uses the `dubbing` quota by duration in seconds.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Audio or video (MP3, WAV, M4A, MP4, MOV)"},"targetLanguage":{"type":"string","description":"Language code to dub into"},"sourceLanguage":{"type":"string","description":"Language code of the source","default":"mn"},"title":{"type":"string","description":"Title; defaults to the file name"},"voiceMap":{"type":"string","description":"JSON object of voice id by speaker label, e.g. `{\"S1\":\"voice_…\"}`; unassigned speakers get a voice automatically"},"glossary":{"type":"string","description":"Terms to keep or translate a certain way"},"review":{"type":"string","enum":["true","false"],"default":"true","description":"Stop for review before rendering"}},"required":["file","targetLanguage"]}}}},"responses":{"201":{"description":"Created; follow the job for progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DubbingStarted"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No file, unreadable, too long, or no target language","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dubbing"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dubbing"}},"/dubbing/{id}":{"get":{"operationId":"getDubbing","summary":"Get a dubbing project","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dubbing"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dubbing project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dubbing"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dubbing","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"patch":{"operationId":"updateDubbing","summary":"Edit a dubbing project","description":"Changing a segment's translation or speaker, or a speaker's voice, clears that segment's audio so the next render regenerates it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DubbingUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dubbing"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dubbing project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dubbing"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dubbing","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"delete":{"operationId":"deleteDubbing","summary":"Delete a dubbing project","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dubbing project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dubbing"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dubbing","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/dubbing/{id}/segments/{segId}/regenerate":{"post":{"operationId":"regenerateDubbingSegment","summary":"Re-voice one segment now","description":"Synchronous GPU work, for previewing an edit. Uses the `tts` quota by the translation's length.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DubbingSegmentAudio"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dubbing project, segment or voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No voice assigned to the segment's speaker","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model returned an error (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The model is unavailable right now (`model_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The model timed out (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dubbing"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dubbing","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"segId","required":true}]}},"/dubbing/{id}/render":{"post":{"operationId":"renderDubbing","summary":"Render the dub","description":"Starts a `dubbing` job; the output URLs appear on the dubbing project when it succeeds.","responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobAccepted"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dubbing project not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Already processing, or nothing to render yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dubbing"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dubbing","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/batch":{"post":{"operationId":"createBatch","summary":"Synthesize many texts","description":"Starts a `batch_tts` job for up to 1,000 items; the job's `output` links a ZIP of the files. Uses the `tts` quota by total characters, checked up front.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}}},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobAccepted"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Media"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"media"}},"/sts":{"post":{"operationId":"convertSpeech","summary":"Change a voice","description":"Starts an `sts` job (speech to speech) for up to 20 minutes of audio or video. Uses the `sts` quota by duration in seconds.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Audio or video (up to 500 MB)"},"voiceId":{"type":"string","description":"Target voice"},"language":{"type":"string","description":"Language code","default":"mn"},"keepBackground":{"type":"string","enum":["true","false"],"default":"false","description":"Keep music and background sound"},"keepTiming":{"type":"string","enum":["true","false"],"default":"true","description":"Keep the original timing"}},"required":["file","voiceId"]}}}},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobAccepted"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Voice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No file, unreadable, or too long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Media"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"media"}},"/tools/isolate":{"post":{"operationId":"isolateVoice","summary":"Isolate a voice","description":"Starts an `isolate` job for up to 1 hour of audio. `isolate` returns vocal and background stems; `denoise` returns cleaned audio. Uses the `tools` quota by duration in seconds.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Audio or video (up to 500 MB)"},"mode":{"type":"string","description":"What to do","enum":["isolate","denoise"],"default":"isolate"}},"required":["file"]}}}},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobAccepted"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No file, unreadable, or too long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Media"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"media"}},"/tools/convert":{"post":{"operationId":"convertAudio","summary":"Convert audio","description":"Synchronous, for files up to 30 minutes. Returns the converted file.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Audio or video (up to 500 MB)"},"format":{"type":"string","description":"Output format","enum":["mp3","wav","ogg","m4a"],"default":"mp3"},"sampleRate":{"type":"number","description":"Output sample rate in Hz (default 44100)"},"trimStart":{"type":"number","description":"Seconds to start from"},"trimEnd":{"type":"number","description":"Seconds to stop at"},"normalize":{"type":"string","enum":["true","false"],"default":"false","description":"Loudness-normalise"}},"required":["file"]}}}},"responses":{"200":{"description":"The converted file","headers":{"Content-Disposition":{"description":"`attachment` with the file name","schema":{"type":"string"}}},"content":{"audio/mpeg":{"schema":{"type":"string","format":"binary"}},"audio/wav":{"schema":{"type":"string","format":"binary"}},"audio/ogg":{"schema":{"type":"string","format":"binary"}},"audio/mp4":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No file, unreadable, or too long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Media"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"media"}},"/tools/detect":{"post":{"operationId":"detectWatermark","summary":"Detect Voxy audio","description":"Checks a file for the watermark embedded in audio generated here. Runs synchronously.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Audio or video (up to 500 MB)"}},"required":["file"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkDetection"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No file, or unreadable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model returned an error (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The model is unavailable right now (`model_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The model timed out (`upstream_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Media"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"media"}},"/agents/templates":{"get":{"operationId":"listAgentTemplates","summary":"List agent templates","description":"Starting points for `POST /agents`, with names, prompts and greetings in the requested language.","parameters":[{"name":"locale","in":"query","required":false,"description":"Language of the template copy.","schema":{"type":"string","enum":["mn","en"],"default":"mn"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentTemplateList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Agents"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"agents"}},"/agents":{"get":{"operationId":"listAgents","summary":"List agents","description":"Most recently updated first. Not paginated.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Agents"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"agents"},"post":{"operationId":"createAgent","summary":"Create an agent","description":"`isPublic` gives the agent a shareable `publicSlug`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentInput"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agent"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Agents"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"agents"}},"/agents/conversations/{cid}":{"get":{"operationId":"getConversation","summary":"Get a conversation","description":"Conversations you had, or that anyone had with your agents.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Conversation"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Conversation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Agents"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"agents","parameters":[{"schema":{"type":"string"},"in":"path","name":"cid","required":true}]},"delete":{"operationId":"deleteConversation","summary":"Delete a conversation","description":"Only conversations you had yourself.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Conversation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Agents"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"agents","parameters":[{"schema":{"type":"string"},"in":"path","name":"cid","required":true}]}},"/agents/{id}":{"get":{"operationId":"getAgent","summary":"Get an agent","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agent"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Agent not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Agents"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"agents","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"patch":{"operationId":"updateAgent","summary":"Update an agent","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agent"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Agent not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Agents"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"agents","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"delete":{"operationId":"deleteAgent","summary":"Delete an agent","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Agent not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Agents"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"agents","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/agents/{id}/conversations":{"get":{"operationId":"listConversations","summary":"List conversations","description":"The 100 most recent.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Agent not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Agents"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"agents","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/agents/{id}/talk":{"get":{"operationId":"talkToAgent","summary":"Talk (WebSocket)","description":"Upgrade to a WebSocket for a real-time voice (or typed) conversation. Pass `?conversationId=` to continue one of yours; otherwise a new conversation starts.\n\nClient → server (JSON): `{ \"type\": \"start\", \"sampleRate\": 16000 }` first (`0` for text only), then microphone audio as binary frames (16 kHz mono PCM16 little-endian); `{ \"type\": \"text\", \"text\": \"…\" }` to type a turn; `{ \"type\": \"flush\" }` to end your spoken turn now; `{ \"type\": \"interrupt\" }` to cut the agent off; `{ \"type\": \"stop\" }` to end.\n\nServer → client (JSON): `ready` (`conversationId`, `sampleRate`), `partial` (your speech so far), `user`, `agent_delta` (reply text as it streams), `agent_done` (with latency `timings`), `audio_start` (followed by binary PCM16 frames of that sentence at its `sampleRate`), `interrupted`, `error`.\n\nUses the `agent` quota by conversation seconds.\n\nServer clients send the `Authorization` header. Browsers can't, so they get a ticket from `POST /realtime/tickets` and connect with `?ticket=`.\n\nGuide: https://voxy.mn/docs/streaming","parameters":[{"name":"ticket","in":"query","required":false,"description":"Single-use ticket from `POST /realtime/tickets` (browsers)","schema":{"type":"string"}},{"name":"conversationId","in":"query","required":false,"description":"Continue this conversation","schema":{"type":"string"}},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"101":{"description":"Switching Protocols. The connection is now a WebSocket."},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Agents"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"agents"}},"/dictionaries":{"get":{"operationId":"listDictionaries","summary":"List dictionaries","description":"Use their ids as `dictionaryIds` in text-to-speech requests.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DictionaryList"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dictionaries"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dictionaries"},"post":{"operationId":"createDictionary","summary":"Create a dictionary","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DictionaryCreate"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DictionarySummary"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dictionaries"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dictionaries"}},"/dictionaries/{id}":{"get":{"operationId":"getDictionary","summary":"Get a dictionary","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dictionary"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dictionary not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dictionaries"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dictionaries","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"patch":{"operationId":"updateDictionary","summary":"Update a dictionary","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DictionaryUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dictionary not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dictionaries"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dictionaries","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"delete":{"operationId":"deleteDictionary","summary":"Delete a dictionary","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dictionary not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dictionaries"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dictionaries","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/dictionaries/{id}/entries":{"post":{"operationId":"createDictionaryEntry","summary":"Add an entry","description":"`term` is replaced by `replacement` as a whole word before synthesis.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DictionaryEntryInput"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DictionaryEntry"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dictionary not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dictionaries"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dictionaries","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/dictionaries/{id}/entries/{entryId}":{"patch":{"operationId":"updateDictionaryEntry","summary":"Update an entry","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DictionaryEntryUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dictionary not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid input (`validation`); `details` lists the issues","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dictionaries"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dictionaries","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"entryId","required":true}]},"delete":{"operationId":"deleteDictionaryEntry","summary":"Delete an entry","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dictionary not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dictionaries"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dictionaries","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"entryId","required":true}]}},"/dictionaries/{id}/import":{"post":{"operationId":"importDictionaryEntries","summary":"Import entries","description":"One `term,replacement` per line (comma, tab, `=>` or `→`), or a PLS lexicon. Send a `file` or `text`. Up to 5,000 entries; existing entries are kept.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"CSV, TSV or PLS file"},"text":{"type":"string","description":"The same content as text, instead of a file"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DictionaryImportResult"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dictionary not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No entries found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dictionaries"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dictionaries","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/dictionaries/{id}/export":{"get":{"operationId":"exportDictionary","summary":"Export a dictionary as CSV","responses":{"200":{"description":"`term,replacement` with a header row","headers":{"Content-Disposition":{"description":"`attachment` with the file name","schema":{"type":"string"}}},"content":{"text/csv":{"schema":{"type":"string"}}}},"401":{"description":"Missing, invalid, revoked or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Account suspended, API access not active, or the key lacks the scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dictionary not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit (`rate_limited`, with `Retry-After`) or daily quota (`limit_reached`) reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Dictionaries"],"deprecated":false,"security":[{"bearerAuth":[]}],"x-scope":"dictionaries","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}}}}