Auto-dub follows as a dub job; localization runs dub, lip-sync and on-screen as one job instead, checked as in createLocalization except what needs a transcript.When to use: when the media is ready and estimateProject is eligible.Side effects: Creates the project and job.Cost: 1 project credit now (0 when unlimited; refunds: Job.error); later minutes never above expected_cost_minutes; a balance below the auto-dub estimate answers 402. Text stays closed until a dub is charged (dub_payment_required).Async: returns 202 and a project_processing Job (Location); wait with getJob wait_seconds=20 (poll hint 10 s); typically 5 min (p95 30 min).Idempotency:Idempotency-Key required; a same-key retry within 24 h returns the job.Plan:free_dubbing -> free_languages; glossary_id; translation_instructions; subtitles -> subtitle_import; auto_dub; onscreen; localization (conditional).Required scopes:projects:write, credits:spend; localization adds its stages’ (conditional)Errors:media_not_found (404), folder_not_found (404), glossary_not_found (404), media_not_ready (409), media_processing_failed (422), unsupported_media_type (415), media_too_large (413), media_too_long (413), feature_not_in_plan (403), prepare_mode_not_enabled (403), feature_temporarily_disabled (503), plan_configuration_error (500), source_language_not_supported (422), target_language_not_supported (422), glossary_language_mismatch (422), subtitles_invalid (422), auto_dub_required (422), voice_not_in_pool (422), instant_clone_not_available (422), onscreen_language_not_supported (422), localization_combination_not_supported (422), onscreen_video_too_long (422), cost_changed (409), insufficient_balance (402), too_many_concurrent_jobs (429)
API key from Settings -> API keys, sent as Authorization: Bearer <key> (SDK environment variable RASK_API_KEY). Bound to one workspace and one acting user. Operations list the scopes they need (OpenAPI 3.1 scopes on a bearer scheme).
Required. A unique key per logical request (SDKs send a bare UUIDv4; an RFC 9651 quoted string is accepted and unquoted); reuse it unchanged on retries. Kept 24 h per (workspace, acting user).
Requested dubbing model; omitted = v2. A named model is stored on the project (requested_dubbing_model); the effective model may differ (dubbing_model_override_reason).
Subtitles to import instead of transcribing (entitlement subtitle_import). Source and target must have equal cue counts and timings; source_language is required with source.
Dub automatically after translation (default); the project's text stays closed until a dub is charged (409 dub_payment_required). Needs an active subscription or a trial; a lapsed subscription answers 403 feature_not_in_plan. false answers 403 prepare_mode_not_enabled unless preparation is enabled; a trial payer must keep it true (422 auto_dub_required).
Voices to apply before the first dub. Availability and entitlement are checked up front (422 voice_not_in_pool, instant_clone_not_available; an instant clone needs the entitlement instant_voice_clone); a duplicate speaker_label answers 422 validation_failed. If a clone cannot be applied once speakers are known (too little speech, daily clone quota), the speaker keeps the suggested voice and the job result carries speaker_voice_not_applied with the label. Speakers without an entry get the suggested voice (Speaker.voice_origin).
Cap for the deferred spends (auto-dub after translation, on-screen auto-start after the first dub, the stages of a localization block). Required unless auto_dub: false is sent and nothing else defers a spend (422 validation_failed, errors[].code expected_cost_required). A deferred spend priced above the cap is skipped, uncharged. A cap below the current total fails 409 cost_changed at the request, and too few minutes for it fail 402 insufficient_balance; the skip applies only when the price or balance changes between the request and dispatch.
Client metadata: <= 20 string keys (<= 40 characters) and values (<= 500). Returned on reads, never sent in webhooks.
Show child attributes
Response
Accepted: Job.
Asynchronous work started through v3, and automatic follow-up work (auto-dub, on-screen auto-start, the stages of a localization run) on projects created through v3. Started by 202 responses (Location: /v3/jobs/{id}); wait with getJob wait_seconds. Finished jobs can be read for 90 days, then answer 404 job_not_found. Work started in the web app or API v2 has no job.
Estimated completion from the queue position and the type's typical duration (on-screen: the runner's ETA); null when terminal or unknown. An estimate, not a deadline.
The job that started this system job: the project_processing job of an auto-dub, the dub whose merge started an on-screen auto-start, the localization job of a stage, the project_processing job of a localization block, or the failed run a resumed localization job continues.
Quoted at creation; charged turns true once the charge is committed. A localization job has no charge of its own: minutes is the sum of its stages charged and not refunded so far, charged is true once any stage is charged, refunded is true only when every charged stage was refunded, refunded_at is the latest refund. stages[].cost holds each stage; the quote is params.expected_cost_minutes.
Set when failed; on a canceled job only for the cancellation reason project_deleted (the project was deleted while the job ran; its work is discarded, refunded only for on-screen); instance is /v3/jobs/{id}, detail is generic. Each code's status, retry, recommendation and hint are in components.x-rask-job-errors. Codes by type: media_import source_download_failed, unsupported_media_type, media_corrupt, media_processing_failed, media_too_large (a voice sample above its limit); project_processing media_processing_failed, source_unavailable, no_audio_track, transcription_failed, no_speech_detected, audio_separation_failed, speaker_detection_failed, translation_failed, subtitle_import_rolled_back, project_processing_timeout, internal_error; translation translation_failed, translation_dispatch_failed, translation_timeout; segment_generation (cause_code) segment_generation_failed, segment_generation_timeout; localization localization_stage_failed, localization_stage_skipped (failed_stage, cause_code); dub (cause_code) dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout; lipsync lipsync_failed, face_check_failed, no_face_detected, lipsync_rejected (cause_code), lipsync_timeout; onscreen onscreen_queue_timeout, onscreen_runner_lost, onscreen_runner_failed, onscreen_provider_unavailable, onscreen_finalize_timeout, onscreen_invalid_result, onscreen_publish_failed, onscreen_source_unavailable, onscreen_charge_failed; voice_clone voice_clone_failed, voice_clone_timeout; export export_failed; file_restore restore_failed. A failed job refunds its minutes (onscreen_charge_failed never charged). A failed localization job refunds only the failed stage, by its type's rule: succeeded stages stay charged, and skipped or unreached stages were never charged. A failed project_processing job refunds its project credit when a stage from transcription to translation failed, when it timed out and when a copy failed, but not for media_processing_failed, source_unavailable, no_audio_track or the internal_error of a new project.
{"docsConfig":{"$schema":"https://mintlify.com/docs.json","theme":"mint","name":"Rask AI API","colors":{"primary":"#0B0BCF","light":"#5D5DFF","dark":"#5D5DFF"},"favicon":"https://mintcdn.com/brask/hT_Hdq5wOpSqsld0/logo/favicon.png?fit=max\u0026auto=format\u0026n=hT_Hdq5wOpSqsld0\u0026q=85\u0026s=c711c46d0a11441ed308ce4e040a556e","logo":{"light":"https://mintcdn.com/brask/hT_Hdq5wOpSqsld0/logo/black.svg?fit=max\u0026auto=format\u0026n=hT_Hdq5wOpSqsld0\u0026q=85\u0026s=89737eaceb0bbdbadb10eeb2e0537eee","dark":"https://mintcdn.com/brask/hT_Hdq5wOpSqsld0/logo/white.svg?fit=max\u0026auto=format\u0026n=hT_Hdq5wOpSqsld0\u0026q=85\u0026s=534b5bab02df626978cebe76c20020bc"},"api":{"openapi":["openapi.yml","openapi.v3.json"]},"background":{"decoration":null,"color":{"light":null,"dark":"#090014"}},"navbar":{"links":[{"label":"api@rask.ai","href":"mailto:api@rask.ai"}],"primary":{"type":"button","label":"Sign Up","href":"https://app.rask.ai/"}},"footer":{"socials":{"twitter":"https://twitter.com/rask_ai","instagram":"https://www.instagram.com/rask.ai_official","linkedin":"https://www.linkedin.com/company/rask-ai"}},"integrations":{"gtm":{"tagId":"GTM-N9ZZHZV"}},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Blog","href":"https://www.rask.ai/blog","icon":"newspaper"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"brask","hasAudioNarration":false,"actualSubdomain":"brask","customDomains":["docs.api.rask.ai"],"gitSource":{"type":"github","owner":"braskai","repo":"rask-api-documentation","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af5cf7072ca9fe26a3617ef","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"default","tag":"Documentation","count":287},{"language":"default","tag":"Errors","count":144},{"language":"default","tag":"Inside a job","count":39},{"language":"default","tag":"409 Conflict","count":33},{"language":"default","tag":"413, 415 and 422 Input","count":27},{"language":"default","tag":"401 and 403 Access","count":15},{"language":"default","tag":"Projects","count":14},{"language":"default","tag":"404 and 410 Missing","count":13},{"language":"default","tag":"Concepts","count":10},{"language":"default","tag":"Recipes","count":9}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"operations/createProject","slug":"/operations/createProject","pageMetadata":{"title":"Create a localization project","sidebarTitle":"createProject","description":"Creates a project from a ready media item in one target language and starts its project_processing job (transcription to translation).","openapi":"openapi.v3.json POST /projects","href":"/operations/createProject"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Creates a project from a ready media item in one target language and starts its project_processing job (transcription to translation).\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,p:`p`,strong:`strong`,..._provideComponents(),...props.components};return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Auto-dub follows as a `,_jsx(_components.code,{children:`dub`}),` job; `,_jsx(_components.code,{children:`localization`}),` runs dub, lip-sync and on-screen as one job instead, checked as in createLocalization except what needs a transcript.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`When to use:`}),` when the media is ready and estimateProject is eligible.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Side effects:`}),` Creates the project and job.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Cost:`}),` 1 project credit now (0 when unlimited; refunds: `,_jsx(_components.code,{children:`Job.error`}),`); later minutes never above `,_jsx(_components.code,{children:`expected_cost_minutes`}),`; a balance below the auto-dub estimate answers 402. Text stays closed until a dub is charged (`,_jsx(_components.code,{children:`dub_payment_required`}),`).`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Async:`}),` returns `,_jsx(_components.code,{children:`202`}),` and a `,_jsx(_components.code,{children:`project_processing`}),` Job (`,_jsx(_components.code,{children:`Location`}),`); wait with getJob `,_jsx(_components.code,{children:`wait_seconds=20`}),` (poll hint 10 s); typically 5 min (p95 30 min).`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Idempotency:`}),` `,_jsx(_components.code,{children:`Idempotency-Key`}),` required; a same-key retry within 24 h returns the job.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Plan:`}),` `,_jsx(_components.code,{children:`free_dubbing`}),` -> free_languages; `,_jsx(_components.code,{children:`glossary_id`}),`; `,_jsx(_components.code,{children:`translation_instructions`}),`; `,_jsx(_components.code,{children:`subtitles`}),` -> subtitle_import; `,_jsx(_components.code,{children:`auto_dub`}),`; `,_jsx(_components.code,{children:`onscreen`}),`; `,_jsx(_components.code,{children:`localization`}),` (`,_jsx(_components.code,{children:`conditional`}),`).`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Required scopes:`}),` `,_jsx(_components.code,{children:`projects:write`}),`, `,_jsx(_components.code,{children:`credits:spend`}),`; `,_jsx(_components.code,{children:`localization`}),` adds its stages’ (`,_jsx(_components.code,{children:`conditional`}),`)`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Errors:`}),` `,_jsx(_components.code,{children:`media_not_found`}),` (404), `,_jsx(_components.code,{children:`folder_not_found`}),` (404), `,_jsx(_components.code,{children:`glossary_not_found`}),` (404), `,_jsx(_components.code,{children:`media_not_ready`}),` (409), `,_jsx(_components.code,{children:`media_processing_failed`}),` (422), `,_jsx(_components.code,{children:`unsupported_media_type`}),` (415), `,_jsx(_components.code,{children:`media_too_large`}),` (413), `,_jsx(_components.code,{children:`media_too_long`}),` (413), `,_jsx(_components.code,{children:`feature_not_in_plan`}),` (403), `,_jsx(_components.code,{children:`prepare_mode_not_enabled`}),` (403), `,_jsx(_components.code,{children:`feature_temporarily_disabled`}),` (503), `,_jsx(_components.code,{children:`plan_configuration_error`}),` (500), `,_jsx(_components.code,{children:`source_language_not_supported`}),` (422), `,_jsx(_components.code,{children:`target_language_not_supported`}),` (422), `,_jsx(_components.code,{children:`glossary_language_mismatch`}),` (422), `,_jsx(_components.code,{children:`subtitles_invalid`}),` (422), `,_jsx(_components.code,{children:`auto_dub_required`}),` (422), `,_jsx(_components.code,{children:`voice_not_in_pool`}),` (422), `,_jsx(_components.code,{children:`instant_clone_not_available`}),` (422), `,_jsx(_components.code,{children:`onscreen_language_not_supported`}),` (422), `,_jsx(_components.code,{children:`localization_combination_not_supported`}),` (422), `,_jsx(_components.code,{children:`onscreen_video_too_long`}),` (422), `,_jsx(_components.code,{children:`cost_changed`}),` (409), `,_jsx(_components.code,{children:`insufficient_balance`}),` (402), `,_jsx(_components.code,{children:`too_many_concurrent_jobs`}),` (429)`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create a localization project","sidebarTitle":"createProject","description":"Creates a project from a ready media item in one target language and starts its project_processing job (transcription to translation).","openapi":"openapi.v3.json POST /projects","href":"/operations/createProject"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"createProject","tags":["Projects"],"summary":"Create a localization project","description":"Creates a project from a ready media item in one target language and starts its project_processing job (transcription to translation).","security":["66a494e3-7331-42bc-a04b-729d07bdc35a"],"parameters":["d92b742f-7222-445b-96a0-c4f4685a5330"],"requestBody":"ecfb5d2b-8bc7-43de-a05c-a4b074ab3dba","responses":{"202":"e7457a84-d35b-4964-82ff-d1664517bba8","400":"2274a878-5681-44bf-a332-e7a5b2a33357","401":"2dd21967-171f-4442-8e13-2e3a6f0532cd","402":"60a92b98-871e-426d-9bf5-adddd47bfefb","403":"066f59eb-312e-41ff-941c-ff9b479dacc1","404":"eb1f162f-a8ab-422c-a7a0-cecb9dbc715f","409":"a03990ce-2948-4cad-b60e-66f554a00502","413":"520be4b1-f51f-43d0-be17-89c52a626ea3","415":"cbde2fa7-be07-42c8-bd90-4e6ed36458cf","422":"520df9d1-093b-488c-823d-64f3916dd28d","429":"d7317e78-4336-453d-b22c-211059cd736e","500":"6c9756f5-3494-425c-aa7a-c5c366b95a2e","503":"9e0d14e6-ef58-4b64-b78d-5d8e4a512196"},"x-rask-operation":{"effect":"spend","async":"job","job_type":"project_processing","typical_duration_seconds":{"p50":300,"p95":1800},"idempotency_key":"required","etag":"none","pagination":"none","estimate_operation":"estimateProject","plan_feature":null,"scopes":["projects:write","credits:spend"],"conditional":[{"when":"localization.lipsync","scopes":["lipsync:write"],"plan_features":["lipsync","lipsync_paid"]},{"when":"localization.lipsync.model=enhanced","plan_features":["lipsync_enhanced"]},{"when":"localization.onscreen","scopes":["onscreen:write"],"plan_features":["onscreen"]}],"errors":["media_not_found","folder_not_found","glossary_not_found","media_not_ready","media_processing_failed","unsupported_media_type","media_too_large","media_too_long","feature_not_in_plan","prepare_mode_not_enabled","feature_temporarily_disabled","plan_configuration_error","source_language_not_supported","target_language_not_supported","glossary_language_mismatch","subtitles_invalid","auto_dub_required","voice_not_in_pool","instant_clone_not_available","onscreen_language_not_supported","localization_combination_not_supported","onscreen_video_too_long","cost_changed","insufficient_balance","too_many_concurrent_jobs"],"stability":"alpha"},"x-rask-release":"ga","x-stability-level":"alpha","method":"post","type":"path","servers":["61053d33-b3c1-45e9-9029-d55a58076416"],"path":"/projects","baseUrlOptions":["https://api.rask.ai/v3"],"title":"Create a localization project","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"d92b742f-7222-445b-96a0-c4f4685a5330":{"name":"Idempotency-Key","in":"header","description":"Required. A unique key per logical request (SDKs send a bare UUIDv4; an RFC 9651 quoted string is accepted and unquoted); reuse it unchanged on retries. Kept 24 h per (workspace, acting user).","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x20-\\x7E]+$","isRequired":true,"description":"Required. A unique key per logical request (SDKs send a bare UUIDv4; an RFC 9651 quoted string is accepted and unquoted); reuse it unchanged on retries. Kept 24 h per (workspace, acting user).","uniqueKey":"","typeLabel":"string"},"example":"8e03978e-40d5-43e8-bc93-6894a57f9324"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Body of createProject (\u003c= 5 MiB).","required":["media_id","target_language"],"additionalProperties":false,"properties":{"media_id":{"type":"string","maxLength":64,"description":"A ready media item of this workspace (from completeUpload or importMedia).","x-rask-id-type":"media","isRequired":true,"uniqueKey":"media_id","typeLabel":"string"},"target_language":{"type":"string","maxLength":32,"description":"Target language code (GET /v3/languages?capability=translation).","isRequired":true,"uniqueKey":"target_language","typeLabel":"string"},"free_dubbing":{"type":"boolean","default":false,"description":"Use the free dubbing variant (entitlement free_languages).","uniqueKey":"free_dubbing","typeLabel":"boolean"},"source_language":{"type":"string","maxLength":32,"description":"Source language code; omit to auto-detect. Required with subtitles.source.","uniqueKey":"source_language","typeLabel":"string"},"name":{"type":"string","maxLength":255,"minLength":1,"description":"Project name; defaults to the media file name. Not de-duplicated.","x-rask-untrusted":true,"uniqueKey":"name","typeLabel":"string"},"num_speakers":{"type":"integer","minimum":1,"maximum":20,"description":"Number of speakers; omit to detect (or derive from subtitle labels).","format":"int32","uniqueKey":"num_speakers","typeLabel":"integer\u003cint32>"},"folder_id":{"type":"string","maxLength":64,"description":"Folder to create the project in; omit for the root.","x-rask-id-type":"folder","uniqueKey":"folder_id","typeLabel":"string"},"glossary_id":{"type":"string","maxLength":64,"description":"Glossary to apply (entitlement glossary); its language pair must match.","x-rask-id-type":"glossary","uniqueKey":"glossary_id","typeLabel":"string"},"translation_instructions":{"type":"string","maxLength":8192,"description":"Instructions for the translator (entitlement translation_instructions); forces LLM translation.","x-rask-untrusted":true,"uniqueKey":"translation_instructions","typeLabel":"string"},"dubbing_model":{"type":"string","description":"Requested dubbing model; omitted = v2. A named model is stored on the project (`requested_dubbing_model`); the effective model may differ (`dubbing_model_override_reason`).","enum":["v1","v2"],"x-rask-open-enum":true,"uniqueKey":"dubbing_model","typeLabel":"enum\u003cstring>"},"subtitles":{"type":"object","description":"Subtitles to import instead of transcribing (entitlement subtitle_import). Source and target must have equal cue counts and timings; source_language is required with source.","minProperties":1,"additionalProperties":false,"properties":{"source":{"type":"object","description":"An inline SRT file.","required":["format","content"],"additionalProperties":false,"properties":{"format":{"type":"string","enum":["srt"],"description":"Subtitle format.","isRequired":true,"uniqueKey":"subtitles.source.format","typeLabel":"enum\u003cstring>"},"content":{"type":"string","maxLength":2097152,"description":"SRT text (\u003c= 2 MiB). Cues may start with `[SPEAKER_NN]:` labels: all cues or none.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"subtitles.source.content","typeLabel":"string"}},"uniqueKey":"subtitles.source","typeLabel":"object"},"target":{"type":"object","description":"An inline SRT file.","required":["format","content"],"additionalProperties":false,"properties":{"format":{"type":"string","enum":["srt"],"description":"Subtitle format.","isRequired":true,"uniqueKey":"subtitles.target.format","typeLabel":"enum\u003cstring>"},"content":{"type":"string","maxLength":2097152,"description":"SRT text (\u003c= 2 MiB). Cues may start with `[SPEAKER_NN]:` labels: all cues or none.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"subtitles.target.content","typeLabel":"string"}},"uniqueKey":"subtitles.target","typeLabel":"object"}},"uniqueKey":"subtitles","typeLabel":"object"},"auto_dub":{"type":"boolean","default":true,"description":"Dub automatically after translation (default); the project's text stays closed until a dub is charged (409 `dub_payment_required`). Needs an active subscription or a trial; a lapsed subscription answers 403 feature_not_in_plan. `false` answers 403 prepare_mode_not_enabled unless preparation is enabled; a trial payer must keep it true (422 auto_dub_required).","uniqueKey":"auto_dub","typeLabel":"boolean"},"speaker_voices":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"object","description":"A voice chosen for a speaker before the first dub.","required":["speaker_label","voice_id"],"additionalProperties":false,"properties":{"speaker_label":{"type":"string","maxLength":11,"pattern":"^Speaker [1-9][0-9]{0,2}$","description":"Display name of the speaker: `Speaker 1` is the first speaker that speaker detection numbers (`SPEAKER_00`). Best effort: speakers are known only after detection; an entry for a speaker that does not occur is ignored with the notice `speaker_voice_unused`.","isRequired":true,"uniqueKey":"speaker_voices.items.[INDEX].speaker_label","typeLabel":"string"},"voice_id":{"type":"string","maxLength":64,"description":"A voice valid for the target language: from listVoices, or `languages[].voice_id` of getVoiceClone.","x-rask-id-type":"voice","isRequired":true,"uniqueKey":"speaker_voices.items.[INDEX].voice_id","typeLabel":"string"},"instant_clone_settings":{"type":"object","description":"Instant-clone settings.","required":["accent","expressiveness"],"additionalProperties":false,"properties":{"accent":{"type":"number","minimum":0,"maximum":1,"description":"Accent strength 0-1 (2 decimals).","format":"double","isRequired":true,"uniqueKey":"speaker_voices.items.[INDEX].instant_clone_settings.accent","typeLabel":"number\u003cdouble>"},"expressiveness":{"type":"number","minimum":0,"maximum":1,"description":"Expressiveness 0-1 (2 decimals).","format":"double","isRequired":true,"uniqueKey":"speaker_voices.items.[INDEX].instant_clone_settings.expressiveness","typeLabel":"number\u003cdouble>"}},"uniqueKey":"speaker_voices.items.[INDEX].instant_clone_settings","typeLabel":"object"}},"uniqueKey":"speaker_voices.items.[INDEX]","typeLabel":"object"},"description":"Voices to apply before the first dub. Availability and entitlement are checked up front (422 voice_not_in_pool, instant_clone_not_available; an instant clone needs the entitlement instant_voice_clone); a duplicate `speaker_label` answers 422 validation_failed. If a clone cannot be applied once speakers are known (too little speech, daily clone quota), the speaker keeps the suggested voice and the job result carries `speaker_voice_not_applied` with the label. Speakers without an entry get the suggested voice (`Speaker.voice_origin`).","uniqueKey":"speaker_voices","typeLabel":"object[]"},"onscreen":{"type":"object","description":"On-screen auto-start.","required":["auto_start"],"additionalProperties":false,"properties":{"auto_start":{"type":"boolean","description":"Start on-screen translation when the auto-dub of this request is merged (entitlement onscreen). Needs `auto_dub`. It runs as an `onscreen` job on the `system` channel, and its minutes count against the key that asked. If that dub is skipped or fails, it does not start: `onscreen_auto_start.state` reads `rejected` with `rejection_code: project_not_dubbed`, and a later dub or run does not start it, because each is priced without it. `createOnscreen` or `createLocalization` orders it anew.","isRequired":true,"uniqueKey":"onscreen.auto_start","typeLabel":"boolean"},"ui_language":{"type":"string","maxLength":16,"pattern":"^[A-Za-z]{2,3}([-_][A-Za-z0-9]{2,8})*$","description":"Language of the on-screen agent's activity messages (BCP 47).","uniqueKey":"onscreen.ui_language","typeLabel":"string"}},"uniqueKey":"onscreen","typeLabel":"object"},"localization":{"type":"object","description":"Run dub, lip-sync and on-screen as one `localization` job after translation.","additionalProperties":false,"properties":{"lipsync":{"type":"object","description":"Run lip-sync after the first dub.","required":["model"],"additionalProperties":false,"properties":{"model":{"type":"string","description":"legacy or enhanced (entitlement lipsync_enhanced).","enum":["legacy","enhanced"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"localization.lipsync.model","typeLabel":"enum\u003cstring>"}},"uniqueKey":"localization.lipsync","typeLabel":"object"},"onscreen":{"type":"object","description":"Translate on-screen text last.","additionalProperties":false,"properties":{"ui_language":{"type":"string","maxLength":16,"pattern":"^[A-Za-z]{2,3}([-_][A-Za-z0-9]{2,8})*$","description":"Language of the on-screen agent's activity messages (BCP 47).","uniqueKey":"localization.onscreen.ui_language","typeLabel":"string"}},"uniqueKey":"localization.onscreen","typeLabel":"object"}},"minProperties":1,"uniqueKey":"localization","typeLabel":"object"},"expected_cost_minutes":{"type":"integer","minimum":0,"maximum":100000,"description":"Cap for the deferred spends (auto-dub after translation, on-screen auto-start after the first dub, the stages of a `localization` block). Required unless `auto_dub: false` is sent and nothing else defers a spend (422 validation_failed, errors[].code expected_cost_required). A deferred spend priced above the cap is skipped, uncharged. A cap below the current total fails 409 cost_changed at the request, and too few minutes for it fail 402 insufficient_balance; the skip applies only when the price or balance changes between the request and dispatch.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"metadata":{"type":"object","maxProperties":20,"propertyNames":{"minLength":1,"maxLength":40},"additionalProperties":{"type":"string","maxLength":500,"uniqueKey":"metadata.additionalProperties","typeLabel":"string"},"description":"Client metadata: \u003c= 20 string keys (\u003c= 40 characters) and values (\u003c= 500). Returned on reads, never sent in webhooks.","x-rask-untrusted":true,"uniqueKey":"metadata","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"auto_dub":{"title":"auto_dub","value":{"media_id":"c7d2a9e4-3b1f-4a6c-8d5e-9f0b2e7c1a63","target_language":"es-es","name":"Q3 webinar teaser","folder_id":"41aa8f3e-6c2d-4b7a-9e1f-5d3c8b0a2e61","glossary_id":"e3b8d1f5-4a2c-4e9d-8b7f-2c6a0d1e9f38","expected_cost_minutes":1,"metadata":{"crm_id":"A-1042"}}},"speaker_voices":{"title":"speaker_voices","value":{"media_id":"c7d2a9e4-3b1f-4a6c-8d5e-9f0b2e7c1a63","target_language":"es-es","speaker_voices":[{"speaker_label":"Speaker 1","voice_id":"el_voice_21m00Tcm4"}],"expected_cost_minutes":1}},"localization":{"title":"localization","value":{"media_id":"c7d2a9e4-3b1f-4a6c-8d5e-9f0b2e7c1a63","target_language":"es-es","localization":{"lipsync":{"model":"legacy"},"onscreen":{"ui_language":"en"}},"expected_cost_minutes":7}},"subtitles":{"title":"subtitles","value":{"media_id":"c7d2a9e4-3b1f-4a6c-8d5e-9f0b2e7c1a63","target_language":"es-es","source_language":"en","subtitles":{"source":{"format":"srt","content":"1\n00:00:00,000 --> 00:00:03,200\n[SPEAKER_00]: Welcome to our Q3 webinar.\n"}},"expected_cost_minutes":1}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"e7457a84-d35b-4964-82ff-d1664517bba8":{"description":"Accepted: `Job`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"},"Idempotent-Replayed":{"description":"`true` when the response is a replay of a stored response for the same Idempotency-Key.","schema":{"type":"boolean"},"example":true},"Location":{"description":"Path-absolute link to the new resource: `/v3/jobs/{job_id}`.","schema":{"type":"string","format":"uri-reference"},"example":"/v3/jobs/91c3e7b2-4f8a-4d6e-9b1c-7a3e5f2d8c60"},"Retry-After":{"description":"On a non-terminal job: the type's poll hint in seconds (media_import 3, project_processing 10, translation 5, segment_generation 5, dub 10, lipsync 30, onscreen 15, localization 15, voice_clone 10, export 15, file_restore 300). Absent once terminal.","schema":{"type":"integer","format":"int32","minimum":0},"example":10}},"content":{"application/json":{"schema":{"type":"object","description":"Asynchronous work started through v3, and automatic follow-up work (auto-dub, on-screen auto-start, the stages of a localization run) on projects created through v3. Started by 202 responses (`Location: /v3/jobs/{id}`); wait with getJob `wait_seconds`. Finished jobs can be read for 90 days, then answer 404 `job_not_found`. Work started in the web app or API v2 has no job.","required":["object","id","workspace_id","type","status","progress","stage","queue_position","estimated_finish_at","overdue","project_id","media_id","parent_job_id","channel","params","details","stages","cost","result","error","created_at","started_at","finished_at","links"],"properties":{"object":{"type":"string","enum":["job"],"description":"Always `job`.","isRequired":true,"uniqueKey":"object","typeLabel":"enum\u003cstring>"},"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"workspace_id":{"type":"string","description":"Workspace that owns the job (and whose owner pays).","isRequired":true,"uniqueKey":"workspace_id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"progress":{"oneOf":[{"type":"integer","description":"0-100; null when the type has no honest progress.","format":"int32","minimum":0,"maximum":100,"isRequired":true,"uniqueKey":"progress.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"0-100; null when the type has no honest progress.","format":"int32","minimum":0,"maximum":100,"isRequired":true,"uniqueKey":"progress.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"progress","typeLabel":"integer\u003cint32> | null"},"stage":{"oneOf":[{"type":"string","description":"Per-type stage; for a `localization` job, the running stage's.","enum":["queued","uploading","transcribing","separating_audio","detecting_speakers","matching_voices","translating","voicing","merging","downloading","extracting_audio","face_check","waiting_for_worker","rendering","charging","waiting_for_runner","starting","preparing","checking","publishing","cloning","restoring"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"stage.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Per-type stage; for a `localization` job, the running stage's.","isRequired":true,"uniqueKey":"stage.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"stage","typeLabel":"enum\u003cstring> | null"},"queue_position":{"oneOf":[{"type":"integer","description":"Queue position (1 = next).","format":"int32","isRequired":true,"uniqueKey":"queue_position.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Queue position (1 = next).","format":"int32","isRequired":true,"uniqueKey":"queue_position.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"queue_position","typeLabel":"integer\u003cint32> | null"},"estimated_finish_at":{"oneOf":[{"type":"string","description":"Estimated completion from the queue position and the type's typical duration (on-screen: the runner's ETA); null when terminal or unknown. An estimate, not a deadline.","format":"date-time","isRequired":true,"uniqueKey":"estimated_finish_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Estimated completion from the queue position and the type's typical duration (on-screen: the runner's ETA); null when terminal or unknown. An estimate, not a deadline.","format":"date-time","isRequired":true,"uniqueKey":"estimated_finish_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"estimated_finish_at","typeLabel":"string\u003cdate-time> | null"},"overdue":{"type":"boolean","description":"True once the job runs past its type's overdue threshold: Rask is alerted. Keep waiting or check back later; do not start the same work again.","isRequired":true,"uniqueKey":"overdue","typeLabel":"boolean"},"project_id":{"oneOf":[{"type":"string","description":"Project.","isRequired":true,"uniqueKey":"project_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Project.","isRequired":true,"uniqueKey":"project_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"project_id","typeLabel":"string | null"},"media_id":{"oneOf":[{"type":"string","description":"Media.","isRequired":true,"uniqueKey":"media_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Media.","isRequired":true,"uniqueKey":"media_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"media_id","typeLabel":"string | null"},"parent_job_id":{"oneOf":[{"type":"string","description":"The job that started this system job: the project_processing job of an auto-dub, the dub whose merge started an on-screen auto-start, the `localization` job of a stage, the project_processing job of a `localization` block, or the failed run a resumed `localization` job continues.","isRequired":true,"uniqueKey":"parent_job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The job that started this system job: the project_processing job of an auto-dub, the dub whose merge started an on-screen auto-start, the `localization` job of a stage, the project_processing job of a `localization` block, or the failed run a resumed `localization` job continues.","isRequired":true,"uniqueKey":"parent_job_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parent_job_id","typeLabel":"string | null"},"channel":{"type":"string","description":"Who started a job.\n- `api`: REST API v3\n- `mcp`: the Rask MCP server\n- `system`: automatic (auto-dub, on-screen auto-start, the stages of a localization run)","enum":["api","mcp","system"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"channel","typeLabel":"enum\u003cstring>"},"params":{"oneOf":[{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type","origin","upload_id","url","filename","purpose"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["media_import"],"isRequired":true,"uniqueKey":"params.oneOf.0.type","typeLabel":"enum\u003cstring>"},"origin":{"type":"string","description":"Media origin.\n\n- `upload`: uploaded through createUpload\n- `url`: imported from a URL","enum":["upload","url"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.0.origin","typeLabel":"enum\u003cstring>"},"upload_id":{"oneOf":[{"type":"string","description":"Upload completed.","isRequired":true,"uniqueKey":"params.oneOf.0.upload_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Upload completed.","isRequired":true,"uniqueKey":"params.oneOf.0.upload_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.0.upload_id","typeLabel":"string | null"},"url":{"oneOf":[{"type":"string","description":"URL imported.","format":"uri","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"params.oneOf.0.url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","description":"URL imported.","format":"uri","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"params.oneOf.0.url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.0.url","typeLabel":"string\u003curi> | null"},"filename":{"oneOf":[{"type":"string","description":"File name.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"params.oneOf.0.filename.oneOf.0","typeLabel":"string"},{"type":"null","description":"File name.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"params.oneOf.0.filename.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.0.filename","typeLabel":"string | null"},"purpose":{"type":"string","description":"What a media item is for.\n\n- `project_source`: the source of a project (default)\n- `voice_sample`: a sample for createVoiceClone (audio, or video whose audio is extracted to MP3 on import)","enum":["project_source","voice_sample"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.0.purpose","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"params.oneOf.0","typeLabel":"object"},{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type","trigger","source_language","target_language","free_dubbing","dubbing_model","auto_dub","onscreen_auto_start","localization","expected_cost_minutes","copy_of_project_id"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["project_processing"],"isRequired":true,"uniqueKey":"params.oneOf.1.type","typeLabel":"enum\u003cstring>"},"trigger":{"type":"string","description":"What started a project_processing run.\n\n- `create`: createProject or a web upload\n- `copy`: createProjectCopies or a web copy\n- `subtitle_import`: importTranscript","enum":["create","copy","subtitle_import"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.1.trigger","typeLabel":"enum\u003cstring>"},"source_language":{"oneOf":[{"type":"string","description":"Requested source language; null = auto-detect.","isRequired":true,"uniqueKey":"params.oneOf.1.source_language.oneOf.0","typeLabel":"string"},{"type":"null","description":"Requested source language; null = auto-detect.","isRequired":true,"uniqueKey":"params.oneOf.1.source_language.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.1.source_language","typeLabel":"string | null"},"target_language":{"oneOf":[{"type":"string","description":"Target language.","isRequired":true,"uniqueKey":"params.oneOf.1.target_language.oneOf.0","typeLabel":"string"},{"type":"null","description":"Target language.","isRequired":true,"uniqueKey":"params.oneOf.1.target_language.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.1.target_language","typeLabel":"string | null"},"free_dubbing":{"type":"boolean","description":"Free variant.","isRequired":true,"uniqueKey":"params.oneOf.1.free_dubbing","typeLabel":"boolean"},"dubbing_model":{"oneOf":[{"type":"string","description":"Requested dubbing model; null when the request named none (for a copy: the source's).","enum":["v1","v2"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.1.dubbing_model.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Requested dubbing model; null when the request named none (for a copy: the source's).","isRequired":true,"uniqueKey":"params.oneOf.1.dubbing_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.1.dubbing_model","typeLabel":"enum\u003cstring> | null"},"auto_dub":{"type":"boolean","description":"Auto-dub requested.","isRequired":true,"uniqueKey":"params.oneOf.1.auto_dub","typeLabel":"boolean"},"onscreen_auto_start":{"type":"boolean","description":"On-screen auto-start requested.","isRequired":true,"uniqueKey":"params.oneOf.1.onscreen_auto_start","typeLabel":"boolean"},"localization":{"oneOf":[{"type":"object","description":"The `localization` block; null when not sent.","required":["lipsync","onscreen"],"properties":{"lipsync":{"oneOf":[{"type":"object","description":"Lip-sync stage; null when not ordered.","required":["model"],"properties":{"model":{"type":"string","description":"Lip-sync model.\n\n- `legacy`: the Legacy model\n- `enhanced`: the Enhanced model","enum":["legacy","enhanced"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0.lipsync.oneOf.0.model","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0.lipsync.oneOf.0","typeLabel":"object"},{"type":"null","description":"Lip-sync stage; null when not ordered.","isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0.lipsync.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0.lipsync","typeLabel":"object | null"},"onscreen":{"oneOf":[{"type":"object","description":"On-screen stage; null when not ordered.","required":["ui_language"],"properties":{"ui_language":{"oneOf":[{"type":"string","description":"Language of the on-screen agent's activity messages.","isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0.onscreen.oneOf.0.ui_language.oneOf.0","typeLabel":"string"},{"type":"null","description":"Language of the on-screen agent's activity messages.","isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0.onscreen.oneOf.0.ui_language.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0.onscreen.oneOf.0.ui_language","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0.onscreen.oneOf.0","typeLabel":"object"},{"type":"null","description":"On-screen stage; null when not ordered.","isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0.onscreen.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0.onscreen","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.0","typeLabel":"object"},{"type":"null","description":"The `localization` block; null when not sent.","isRequired":true,"uniqueKey":"params.oneOf.1.localization.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.1.localization","typeLabel":"object | null"},"expected_cost_minutes":{"oneOf":[{"type":"integer","description":"Stored cap for deferred spends.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.1.expected_cost_minutes.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Stored cap for deferred spends.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.1.expected_cost_minutes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.1.expected_cost_minutes","typeLabel":"integer\u003cint32> | null"},"copy_of_project_id":{"oneOf":[{"type":"string","description":"Source project of a copy.","isRequired":true,"uniqueKey":"params.oneOf.1.copy_of_project_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Source project of a copy.","isRequired":true,"uniqueKey":"params.oneOf.1.copy_of_project_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.1.copy_of_project_id","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"params.oneOf.1","typeLabel":"object"},{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type","cause","segment_ids"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["translation"],"isRequired":true,"uniqueKey":"params.oneOf.2.type","typeLabel":"enum\u003cstring>"},"cause":{"type":"string","description":"What started a translation job.\n\n- `retranslation`: retranslateSegments\n- `edit`: an edit that retranslates segments","enum":["retranslation","edit"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.2.cause","typeLabel":"enum\u003cstring>"},"segment_ids":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"params.oneOf.2.segment_ids.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Targeted segments; null = every segment with source text.","isRequired":true,"uniqueKey":"params.oneOf.2.segment_ids.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Targeted segments; null = every segment with source text.","isRequired":true,"uniqueKey":"params.oneOf.2.segment_ids.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.2.segment_ids","typeLabel":"string[] | null"}},"isRequired":true,"uniqueKey":"params.oneOf.2","typeLabel":"object"},{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type","segment_ids","expected_cost_minutes"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["segment_generation"],"isRequired":true,"uniqueKey":"params.oneOf.3.type","typeLabel":"enum\u003cstring>"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"params.oneOf.3.segment_ids.items.[INDEX]","typeLabel":"string"},"description":"The chosen segments.","isRequired":true,"uniqueKey":"params.oneOf.3.segment_ids","typeLabel":"string[]"},"expected_cost_minutes":{"oneOf":[{"type":"integer","description":"Cap sent with the request.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.3.expected_cost_minutes.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Cap sent with the request.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.3.expected_cost_minutes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.3.expected_cost_minutes","typeLabel":"integer\u003cint32> | null"}},"isRequired":true,"uniqueKey":"params.oneOf.3","typeLabel":"object"},{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type","mode_requested","mode_applied","expected_cost_minutes"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["dub"],"isRequired":true,"uniqueKey":"params.oneOf.4.type","typeLabel":"enum\u003cstring>"},"mode_requested":{"type":"string","description":"Requested dub mode.\n\n- `auto`: full when needed, otherwise changed_segments (default)\n- `full`: re-voice every segment\n- `changed_segments`: only outdated and not-dubbed segments: voiced, or merged from a current clip","enum":["auto","full","changed_segments"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.4.mode_requested","typeLabel":"enum\u003cstring>"},"mode_applied":{"type":"string","description":"Dub mode the server applies.\n\n- `full`: every segment\n- `changed_segments`: only changed segments","enum":["full","changed_segments"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.4.mode_applied","typeLabel":"enum\u003cstring>"},"expected_cost_minutes":{"oneOf":[{"type":"integer","description":"Cap sent with the request; null for auto-dub jobs.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.4.expected_cost_minutes.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Cap sent with the request; null for auto-dub jobs.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.4.expected_cost_minutes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.4.expected_cost_minutes","typeLabel":"integer\u003cint32> | null"}},"isRequired":true,"uniqueKey":"params.oneOf.4","typeLabel":"object"},{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type","model","free_trial_run","expected_cost_minutes"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["lipsync"],"isRequired":true,"uniqueKey":"params.oneOf.5.type","typeLabel":"enum\u003cstring>"},"model":{"type":"string","description":"Lip-sync model.\n\n- `legacy`: the Legacy model\n- `enhanced`: the Enhanced model","enum":["legacy","enhanced"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.5.model","typeLabel":"enum\u003cstring>"},"free_trial_run":{"type":"boolean","description":"Free run.","isRequired":true,"uniqueKey":"params.oneOf.5.free_trial_run","typeLabel":"boolean"},"expected_cost_minutes":{"oneOf":[{"type":"integer","description":"Cap sent with the request.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.5.expected_cost_minutes.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Cap sent with the request.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.5.expected_cost_minutes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.5.expected_cost_minutes","typeLabel":"integer\u003cint32> | null"}},"isRequired":true,"uniqueKey":"params.oneOf.5","typeLabel":"object"},{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type","source_kind","ui_language","expected_cost_minutes"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["onscreen"],"isRequired":true,"uniqueKey":"params.oneOf.6.type","typeLabel":"enum\u003cstring>"},"source_kind":{"type":"string","description":"Which video an on-screen job renders over.\n\n- `dubbed`: the dubbed video\n- `lipsync`: the current lip-synced video, when a localization run orders lip-sync and on-screen","enum":["dubbed","lipsync"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.6.source_kind","typeLabel":"enum\u003cstring>"},"ui_language":{"oneOf":[{"type":"string","description":"Language of on-screen activity messages.","isRequired":true,"uniqueKey":"params.oneOf.6.ui_language.oneOf.0","typeLabel":"string"},{"type":"null","description":"Language of on-screen activity messages.","isRequired":true,"uniqueKey":"params.oneOf.6.ui_language.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.6.ui_language","typeLabel":"string | null"},"expected_cost_minutes":{"oneOf":[{"type":"integer","description":"Cap sent with the request.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.6.expected_cost_minutes.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Cap sent with the request.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.6.expected_cost_minutes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.6.expected_cost_minutes","typeLabel":"integer\u003cint32> | null"}},"isRequired":true,"uniqueKey":"params.oneOf.6","typeLabel":"object"},{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type","dub","lipsync","onscreen","expected_cost_minutes"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["localization"],"isRequired":true,"uniqueKey":"params.oneOf.7.type","typeLabel":"enum\u003cstring>"},"dub":{"type":"object","description":"The dub stage of a run.","required":["mode"],"properties":{"mode":{"type":"string","description":"Requested dub mode.\n\n- `auto`: full when needed, otherwise changed_segments (default)\n- `full`: re-voice every segment\n- `changed_segments`: only outdated and not-dubbed segments: voiced, or merged from a current clip","enum":["auto","full","changed_segments"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.7.dub.mode","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"params.oneOf.7.dub","typeLabel":"object"},"lipsync":{"oneOf":[{"type":"object","description":"Lip-sync stage; null when not ordered.","required":["model"],"properties":{"model":{"type":"string","description":"Lip-sync model.\n\n- `legacy`: the Legacy model\n- `enhanced`: the Enhanced model","enum":["legacy","enhanced"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.7.lipsync.oneOf.0.model","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"params.oneOf.7.lipsync.oneOf.0","typeLabel":"object"},{"type":"null","description":"Lip-sync stage; null when not ordered.","isRequired":true,"uniqueKey":"params.oneOf.7.lipsync.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.7.lipsync","typeLabel":"object | null"},"onscreen":{"oneOf":[{"type":"object","description":"On-screen stage; null when not ordered.","required":["ui_language"],"properties":{"ui_language":{"oneOf":[{"type":"string","description":"Language of the on-screen agent's activity messages.","isRequired":true,"uniqueKey":"params.oneOf.7.onscreen.oneOf.0.ui_language.oneOf.0","typeLabel":"string"},{"type":"null","description":"Language of the on-screen agent's activity messages.","isRequired":true,"uniqueKey":"params.oneOf.7.onscreen.oneOf.0.ui_language.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.7.onscreen.oneOf.0.ui_language","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"params.oneOf.7.onscreen.oneOf.0","typeLabel":"object"},{"type":"null","description":"On-screen stage; null when not ordered.","isRequired":true,"uniqueKey":"params.oneOf.7.onscreen.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.7.onscreen","typeLabel":"object | null"},"expected_cost_minutes":{"oneOf":[{"type":"integer","description":"Cap for the whole run.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.7.expected_cost_minutes.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Cap for the whole run.","format":"int32","isRequired":true,"uniqueKey":"params.oneOf.7.expected_cost_minutes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"params.oneOf.7.expected_cost_minutes","typeLabel":"integer\u003cint32> | null"}},"isRequired":true,"uniqueKey":"params.oneOf.7","typeLabel":"object"},{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type","voice_clone_id","source_type"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["voice_clone"],"isRequired":true,"uniqueKey":"params.oneOf.8.type","typeLabel":"enum\u003cstring>"},"voice_clone_id":{"type":"string","description":"The clone being created.","isRequired":true,"uniqueKey":"params.oneOf.8.voice_clone_id","typeLabel":"string"},"source_type":{"type":"string","description":"Voice clone source type.\n\n- `media`: voice samples (media with purpose voice_sample)\n- `project_speaker`: a speaker of a project","enum":["media","project_speaker"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.8.source_type","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"params.oneOf.8","typeLabel":"object"},{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type","export_type","source_video"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["export"],"isRequired":true,"uniqueKey":"params.oneOf.9.type","typeLabel":"enum\u003cstring>"},"export_type":{"type":"string","description":"Export type.\n\n- `burned_subtitles`: a video with burned-in target subtitles","enum":["burned_subtitles"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.9.export_type","typeLabel":"enum\u003cstring>"},"source_video":{"type":"string","description":"Video to export from.\n\n- `dubbed`: the dubbed video\n- `lipsync`: the lip-synced video","enum":["dubbed","lipsync"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"params.oneOf.9.source_video","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"params.oneOf.9","typeLabel":"object"},{"type":"object","description":"Normalized request echo: a union on `type` (= Job.type).","required":["type"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["file_restore"],"isRequired":true,"uniqueKey":"params.oneOf.10.type","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"params.oneOf.10","typeLabel":"object"}],"isRequired":true,"uniqueKey":"params","typeLabel":"object"},"details":{"oneOf":[{"type":"object","description":"Live per-type state.","required":["type","target_language","ui_language","queue_position","eta_seconds","attempt","activity","draft"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["onscreen"],"isRequired":true,"uniqueKey":"details.oneOf.0.type","typeLabel":"enum\u003cstring>"},"target_language":{"type":"string","description":"Target language.","isRequired":true,"uniqueKey":"details.oneOf.0.target_language","typeLabel":"string"},"ui_language":{"oneOf":[{"type":"string","description":"Activity language.","isRequired":true,"uniqueKey":"details.oneOf.0.ui_language.oneOf.0","typeLabel":"string"},{"type":"null","description":"Activity language.","isRequired":true,"uniqueKey":"details.oneOf.0.ui_language.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"details.oneOf.0.ui_language","typeLabel":"string | null"},"queue_position":{"oneOf":[{"type":"integer","description":"Position while queued (1 = next).","format":"int32","isRequired":true,"uniqueKey":"details.oneOf.0.queue_position.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Position while queued (1 = next).","format":"int32","isRequired":true,"uniqueKey":"details.oneOf.0.queue_position.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"details.oneOf.0.queue_position","typeLabel":"integer\u003cint32> | null"},"eta_seconds":{"oneOf":[{"type":"integer","description":"Time left in the agent budget.","format":"int32","isRequired":true,"uniqueKey":"details.oneOf.0.eta_seconds.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Time left in the agent budget.","format":"int32","isRequired":true,"uniqueKey":"details.oneOf.0.eta_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"details.oneOf.0.eta_seconds","typeLabel":"integer\u003cint32> | null"},"attempt":{"type":"integer","description":"Runner attempt; increases when a runner is lost and the job requeues.","format":"int32","isRequired":true,"uniqueKey":"details.oneOf.0.attempt","typeLabel":"integer\u003cint32>"},"activity":{"type":"array","items":{"type":"object","description":"An on-screen agent activity message.","required":["text","at"],"properties":{"text":{"type":"string","description":"Agent message as the customer sees it (untrusted LLM text).","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"details.oneOf.0.activity.items.[INDEX].text","typeLabel":"string"},"at":{"type":"string","description":"Message time.","format":"date-time","isRequired":true,"uniqueKey":"details.oneOf.0.activity.items.[INDEX].at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"details.oneOf.0.activity.items.[INDEX]","typeLabel":"object"},"description":"Latest agent messages, oldest first.","isRequired":true,"uniqueKey":"details.oneOf.0.activity","typeLabel":"object[]"},"draft":{"oneOf":[{"type":"object","description":"Latest draft.","required":["number","created_at","url","download_url","expires_at"],"properties":{"number":{"type":"integer","description":"Draft number.","format":"int32","isRequired":true,"uniqueKey":"details.oneOf.0.draft.oneOf.0.number","typeLabel":"integer\u003cint32>"},"created_at":{"type":"string","description":"Draft time.","format":"date-time","isRequired":true,"uniqueKey":"details.oneOf.0.draft.oneOf.0.created_at","typeLabel":"string\u003cdate-time>"},"url":{"type":"string","description":"Player URL.","format":"uri","isRequired":true,"uniqueKey":"details.oneOf.0.draft.oneOf.0.url","typeLabel":"string\u003curi>"},"download_url":{"type":"string","description":"Download URL.","format":"uri","isRequired":true,"uniqueKey":"details.oneOf.0.draft.oneOf.0.download_url","typeLabel":"string\u003curi>"},"expires_at":{"type":"string","description":"Both URLs stop working then.","format":"date-time","isRequired":true,"uniqueKey":"details.oneOf.0.draft.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"details.oneOf.0.draft.oneOf.0","typeLabel":"object"},{"type":"null","description":"Latest draft.","isRequired":true,"uniqueKey":"details.oneOf.0.draft.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"details.oneOf.0.draft","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"details.oneOf.0","typeLabel":"object"},{"type":"null","description":"Live per-type state.","isRequired":true,"uniqueKey":"details.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"details","typeLabel":"object | null"},"stages":{"oneOf":[{"type":"array","items":{"type":"object","description":"One stage of a `localization` job.","required":["name","job_id","status","reused","stage","cost","error"],"properties":{"name":{"type":"string","description":"A stage of a `localization` job. They always run in this order, each on the previous result.\n\n- `dub`: dub or redub\n- `lipsync`: lip-sync of the dubbed video\n- `onscreen`: on-screen text translation of the latest video","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].name","typeLabel":"enum\u003cstring>"},"job_id":{"oneOf":[{"type":"string","description":"The child job (`dub`, `lipsync`, `onscreen`); null before it starts, and for a reused stage.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The child job (`dub`, `lipsync`, `onscreen`); null before it starts, and for a reused stage.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].job_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].job_id","typeLabel":"string | null"},"status":{"type":"string","description":"State of a stage.\n\n- `pending`: not started yet (or never reached, when an earlier stage ended the run)\n- `running`: its child job is running\n- `succeeded`: finished, in this run or earlier (`reused`); never re-run or re-charged\n- `failed`: its child job failed and was refunded by that type's rule, or something else kept it from starting, uncharged and with no child job (another run of the project, no face in the video); see `error`\n- `skipped`: not started, uncharged, because it could not be paid or exceeded a cap (the run's or the key's), or, for on-screen, a plan change during the run trimmed its lip-sync source; see `error`","enum":["pending","running","succeeded","failed","skipped"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"reused":{"type":"boolean","description":"True when the stage is `succeeded` by an existing, not outdated result, with no child job and no charge: a dub with nothing to voice, a paid lip-sync of the same model (a free run does not count), an on-screen run over the same source. Stages are judged in order, so a dub that runs again makes the lip-sync and on-screen after it run too. With every stage reused, the job succeeds at once at 0 minutes.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].reused","typeLabel":"boolean"},"stage":{"oneOf":[{"type":"string","description":"The child job's current stage.","enum":["queued","uploading","transcribing","separating_audio","detecting_speakers","matching_voices","translating","voicing","merging","downloading","extracting_audio","face_check","waiting_for_worker","rendering","charging","waiting_for_runner","starting","preparing","checking","publishing","cloning","restoring"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].stage.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The child job's current stage.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].stage.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].stage","typeLabel":"enum\u003cstring> | null"},"cost":{"oneOf":[{"type":"object","description":"The child job's cost in this run; null before it is charged, for a reused stage and for a stage carried over from the resumed run.","required":["credit_type","minutes","charged","refunded","refunded_at"],"x-rask-open-union":true,"properties":{"credit_type":{"type":"string","description":"A minute-denominated credit pool.\n\n- `minutes`: the main minute pool\n- `lipsync_free_minutes`: free lip-sync minutes","enum":["minutes","lipsync_free_minutes"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.0.credit_type","typeLabel":"enum\u003cstring>"},"minutes":{"type":"integer","description":"Quoted minutes; 0 when free. On a `localization` job: minutes charged and not refunded so far (see `Job.cost`).","format":"int32","minimum":0,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.0.minutes","typeLabel":"integer\u003cint32>"},"charged":{"type":"boolean","description":"True once the charge is committed.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.0.charged","typeLabel":"boolean"},"refunded":{"type":"boolean","description":"True once the charge is refunded; read at request time, so a refund on a finished job is visible.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.0.refunded","typeLabel":"boolean"},"refunded_at":{"oneOf":[{"type":"string","description":"When the refund was recorded; null without a refund.","format":"date-time","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.0.refunded_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the refund was recorded; null without a refund.","format":"date-time","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.0.refunded_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.0.refunded_at","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.0","typeLabel":"object"},{"type":"object","description":"The child job's cost in this run; null before it is charged, for a reused stage and for a stage carried over from the resumed run.","required":["credit_type","projects","charged","refunded","refunded_at"],"x-rask-open-union":true,"properties":{"credit_type":{"type":"string","enum":["projects"],"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.1.credit_type","typeLabel":"enum\u003cstring>"},"projects":{"type":"integer","description":"Project credits; 0 when the payer's credits are unlimited.","format":"int32","minimum":0,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.1.projects","typeLabel":"integer\u003cint32>"},"charged":{"type":"boolean","description":"True once the charge is committed.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.1.charged","typeLabel":"boolean"},"refunded":{"type":"boolean","description":"True once the charge is refunded; read at request time, so a refund on a finished job is visible.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.1.refunded","typeLabel":"boolean"},"refunded_at":{"oneOf":[{"type":"string","description":"When the refund was recorded; null without a refund.","format":"date-time","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.1.refunded_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the refund was recorded; null without a refund.","format":"date-time","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.1.refunded_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.1.refunded_at","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.1","typeLabel":"object"},{"type":"null","description":"The child job's cost in this run; null before it is charged, for a reused stage and for a stage carried over from the resumed run.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost.oneOf.2","typeLabel":"null"}],"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].cost","typeLabel":"object · object · null"},"error":{"oneOf":[{"type":"object","description":"Why it failed or was skipped: the child job's error, or, for a stage that did not start, the refusal it met; a skipped stage holds a code of `components.x-rask-job-errors.stage_codes`.","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0.failed_stage","typeLabel":"enum\u003cstring>"}},"additionalProperties":true,"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.0","typeLabel":"object"},{"type":"null","description":"Why it failed or was skipped: the child job's error, or, for a stage that did not start, the refusal it met; a skipped stage holds a code of `components.x-rask-job-errors.stage_codes`.","isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"stages.oneOf.0.items.[INDEX].error","typeLabel":"object | null"}},"uniqueKey":"stages.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"The stages of a `localization` job in run order; null for other types.","isRequired":true,"uniqueKey":"stages.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","description":"One stage of a `localization` job.","required":["name","job_id","status","reused","stage","cost","error"],"properties":{"name":{"type":"string","description":"A stage of a `localization` job. They always run in this order, each on the previous result.\n\n- `dub`: dub or redub\n- `lipsync`: lip-sync of the dubbed video\n- `onscreen`: on-screen text translation of the latest video","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true},"job_id":{"oneOf":[{"type":"string","description":"The child job (`dub`, `lipsync`, `onscreen`); null before it starts, and for a reused stage."},{"type":"null","description":"The child job (`dub`, `lipsync`, `onscreen`); null before it starts, and for a reused stage."}]},"status":{"type":"string","description":"State of a stage.\n\n- `pending`: not started yet (or never reached, when an earlier stage ended the run)\n- `running`: its child job is running\n- `succeeded`: finished, in this run or earlier (`reused`); never re-run or re-charged\n- `failed`: its child job failed and was refunded by that type's rule, or something else kept it from starting, uncharged and with no child job (another run of the project, no face in the video); see `error`\n- `skipped`: not started, uncharged, because it could not be paid or exceeded a cap (the run's or the key's), or, for on-screen, a plan change during the run trimmed its lip-sync source; see `error`","enum":["pending","running","succeeded","failed","skipped"],"x-rask-open-enum":true},"reused":{"type":"boolean","description":"True when the stage is `succeeded` by an existing, not outdated result, with no child job and no charge: a dub with nothing to voice, a paid lip-sync of the same model (a free run does not count), an on-screen run over the same source. Stages are judged in order, so a dub that runs again makes the lip-sync and on-screen after it run too. With every stage reused, the job succeeds at once at 0 minutes."},"stage":{"oneOf":[{"type":"string","description":"The child job's current stage.","enum":["queued","uploading","transcribing","separating_audio","detecting_speakers","matching_voices","translating","voicing","merging","downloading","extracting_audio","face_check","waiting_for_worker","rendering","charging","waiting_for_runner","starting","preparing","checking","publishing","cloning","restoring"],"x-rask-open-enum":true},{"type":"null","description":"The child job's current stage."}]},"cost":{"oneOf":[{"type":"object","description":"The child job's cost in this run; null before it is charged, for a reused stage and for a stage carried over from the resumed run.","required":["credit_type","minutes","charged","refunded","refunded_at"],"x-rask-open-union":true,"properties":{"credit_type":{"type":"string","description":"A minute-denominated credit pool.\n\n- `minutes`: the main minute pool\n- `lipsync_free_minutes`: free lip-sync minutes","enum":["minutes","lipsync_free_minutes"],"x-rask-open-enum":true},"minutes":{"type":"integer","description":"Quoted minutes; 0 when free. On a `localization` job: minutes charged and not refunded so far (see `Job.cost`).","format":"int32","minimum":0},"charged":{"type":"boolean","description":"True once the charge is committed."},"refunded":{"type":"boolean","description":"True once the charge is refunded; read at request time, so a refund on a finished job is visible."},"refunded_at":{"oneOf":[{"type":"string","description":"When the refund was recorded; null without a refund.","format":"date-time"},{"type":"null","description":"When the refund was recorded; null without a refund.","format":"date-time"}]}}},{"type":"object","description":"The child job's cost in this run; null before it is charged, for a reused stage and for a stage carried over from the resumed run.","required":["credit_type","projects","charged","refunded","refunded_at"],"x-rask-open-union":true,"properties":{"credit_type":{"type":"string","enum":["projects"]},"projects":{"type":"integer","description":"Project credits; 0 when the payer's credits are unlimited.","format":"int32","minimum":0},"charged":{"type":"boolean","description":"True once the charge is committed."},"refunded":{"type":"boolean","description":"True once the charge is refunded; read at request time, so a refund on a finished job is visible."},"refunded_at":{"oneOf":[{"type":"string","description":"When the refund was recorded; null without a refund.","format":"date-time"},{"type":"null","description":"When the refund was recorded; null without a refund.","format":"date-time"}]}}},{"type":"null","description":"The child job's cost in this run; null before it is charged, for a reused stage and for a stage carried over from the resumed run."}]},"error":{"oneOf":[{"type":"object","description":"Why it failed or was skipped: the child job's error, or, for a stage that did not start, the refusal it met; a skipped stage holds a code of `components.x-rask-job-errors.stage_codes`.","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri"},"title":{"type":"string","description":"Short summary of the problem type."},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text."},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how."},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160}]},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name."},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...)."},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text."}}},"description":"Failing fields; empty when the problem is not about fields."},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag."},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`."},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true},"description":"insufficient_scope: the key's scopes."},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`."},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency."},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id."},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true}}},"description":"project_busy: the project's active spending jobs."},"active_job_ids":{"type":"array","items":{"type":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting."},"segment_ids":{"type":"array","items":{"type":"string"},"description":"segment_busy: the busy segments."},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one."},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one."}]},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs)."},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for."},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked."},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`)."},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment."},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential."},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type."},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped."},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true}},"additionalProperties":true},{"type":"null","description":"Why it failed or was skipped: the child job's error, or, for a stage that did not start, the refusal it met; a skipped stage holds a code of `components.x-rask-job-errors.stage_codes`."}]}}},"description":"The stages of a `localization` job in run order; null for other types.","isRequired":true,"uniqueKey":"stages.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"stages","typeLabel":"object[] | null"},"cost":{"oneOf":[{"type":"object","description":"Quoted at creation; `charged` turns true once the charge is committed. A `localization` job has no charge of its own: `minutes` is the sum of its stages charged and not refunded so far, `charged` is true once any stage is charged, `refunded` is true only when every charged stage was refunded, `refunded_at` is the latest refund. `stages[].cost` holds each stage; the quote is `params.expected_cost_minutes`.","required":["credit_type","minutes","charged","refunded","refunded_at"],"x-rask-open-union":true,"properties":{"credit_type":{"type":"string","description":"A minute-denominated credit pool.\n\n- `minutes`: the main minute pool\n- `lipsync_free_minutes`: free lip-sync minutes","enum":["minutes","lipsync_free_minutes"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"cost.oneOf.0.credit_type","typeLabel":"enum\u003cstring>"},"minutes":{"type":"integer","description":"Quoted minutes; 0 when free. On a `localization` job: minutes charged and not refunded so far (see `Job.cost`).","format":"int32","minimum":0,"isRequired":true,"uniqueKey":"cost.oneOf.0.minutes","typeLabel":"integer\u003cint32>"},"charged":{"type":"boolean","description":"True once the charge is committed.","isRequired":true,"uniqueKey":"cost.oneOf.0.charged","typeLabel":"boolean"},"refunded":{"type":"boolean","description":"True once the charge is refunded; read at request time, so a refund on a finished job is visible.","isRequired":true,"uniqueKey":"cost.oneOf.0.refunded","typeLabel":"boolean"},"refunded_at":{"oneOf":[{"type":"string","description":"When the refund was recorded; null without a refund.","format":"date-time","isRequired":true,"uniqueKey":"cost.oneOf.0.refunded_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the refund was recorded; null without a refund.","format":"date-time","isRequired":true,"uniqueKey":"cost.oneOf.0.refunded_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"cost.oneOf.0.refunded_at","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"cost.oneOf.0","typeLabel":"object"},{"type":"object","description":"Quoted at creation; `charged` turns true once the charge is committed. A `localization` job has no charge of its own: `minutes` is the sum of its stages charged and not refunded so far, `charged` is true once any stage is charged, `refunded` is true only when every charged stage was refunded, `refunded_at` is the latest refund. `stages[].cost` holds each stage; the quote is `params.expected_cost_minutes`.","required":["credit_type","projects","charged","refunded","refunded_at"],"x-rask-open-union":true,"properties":{"credit_type":{"type":"string","enum":["projects"],"isRequired":true,"uniqueKey":"cost.oneOf.1.credit_type","typeLabel":"enum\u003cstring>"},"projects":{"type":"integer","description":"Project credits; 0 when the payer's credits are unlimited.","format":"int32","minimum":0,"isRequired":true,"uniqueKey":"cost.oneOf.1.projects","typeLabel":"integer\u003cint32>"},"charged":{"type":"boolean","description":"True once the charge is committed.","isRequired":true,"uniqueKey":"cost.oneOf.1.charged","typeLabel":"boolean"},"refunded":{"type":"boolean","description":"True once the charge is refunded; read at request time, so a refund on a finished job is visible.","isRequired":true,"uniqueKey":"cost.oneOf.1.refunded","typeLabel":"boolean"},"refunded_at":{"oneOf":[{"type":"string","description":"When the refund was recorded; null without a refund.","format":"date-time","isRequired":true,"uniqueKey":"cost.oneOf.1.refunded_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the refund was recorded; null without a refund.","format":"date-time","isRequired":true,"uniqueKey":"cost.oneOf.1.refunded_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"cost.oneOf.1.refunded_at","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"cost.oneOf.1","typeLabel":"object"},{"type":"null","description":"Quoted at creation; `charged` turns true once the charge is committed. A `localization` job has no charge of its own: `minutes` is the sum of its stages charged and not refunded so far, `charged` is true once any stage is charged, `refunded` is true only when every charged stage was refunded, `refunded_at` is the latest refund. `stages[].cost` holds each stage; the quote is `params.expected_cost_minutes`.","isRequired":true,"uniqueKey":"cost.oneOf.2","typeLabel":"null"}],"isRequired":true,"uniqueKey":"cost","typeLabel":"object · object · null"},"result":{"oneOf":[{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","media_id","kind","duration_seconds","size_bytes"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["media_import"],"isRequired":true,"uniqueKey":"result.oneOf.0.type","typeLabel":"enum\u003cstring>"},"media_id":{"type":"string","description":"Imported media.","isRequired":true,"uniqueKey":"result.oneOf.0.media_id","typeLabel":"string"},"kind":{"type":"string","description":"Media kind.\n\n- `video`: video with audio\n- `audio`: audio only","enum":["video","audio"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"duration_seconds":{"oneOf":[{"type":"number","description":"Duration.","format":"double","isRequired":true,"uniqueKey":"result.oneOf.0.duration_seconds.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Duration.","format":"double","isRequired":true,"uniqueKey":"result.oneOf.0.duration_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.0.duration_seconds","typeLabel":"number\u003cdouble> | null"},"size_bytes":{"oneOf":[{"type":"integer","description":"Size.","format":"int64","isRequired":true,"uniqueKey":"result.oneOf.0.size_bytes.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Size.","format":"int64","isRequired":true,"uniqueKey":"result.oneOf.0.size_bytes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.0.size_bytes","typeLabel":"integer\u003cint64> | null"}},"isRequired":true,"uniqueKey":"result.oneOf.0","typeLabel":"object"},{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","project_id","source_language","speakers_detected","subtitles_imported","copy_of_project_id","reused_dub","auto_dub","onscreen_auto_start","localization_job_id","notices"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["project_processing"],"isRequired":true,"uniqueKey":"result.oneOf.1.type","typeLabel":"enum\u003cstring>"},"project_id":{"type":"string","description":"Project.","isRequired":true,"uniqueKey":"result.oneOf.1.project_id","typeLabel":"string"},"source_language":{"oneOf":[{"type":"string","description":"Detected source language.","isRequired":true,"uniqueKey":"result.oneOf.1.source_language.oneOf.0","typeLabel":"string"},{"type":"null","description":"Detected source language.","isRequired":true,"uniqueKey":"result.oneOf.1.source_language.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.1.source_language","typeLabel":"string | null"},"speakers_detected":{"oneOf":[{"type":"integer","description":"Speakers detected.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.1.speakers_detected.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Speakers detected.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.1.speakers_detected.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.1.speakers_detected","typeLabel":"integer\u003cint32> | null"},"subtitles_imported":{"type":"object","description":"Imported subtitles.","required":["source","target"],"properties":{"source":{"type":"boolean","description":"Source subtitles were imported.","isRequired":true,"uniqueKey":"result.oneOf.1.subtitles_imported.source","typeLabel":"boolean"},"target":{"type":"boolean","description":"Target subtitles were imported.","isRequired":true,"uniqueKey":"result.oneOf.1.subtitles_imported.target","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"result.oneOf.1.subtitles_imported","typeLabel":"object"},"copy_of_project_id":{"oneOf":[{"type":"string","description":"Source of a copy.","isRequired":true,"uniqueKey":"result.oneOf.1.copy_of_project_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Source of a copy.","isRequired":true,"uniqueKey":"result.oneOf.1.copy_of_project_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.1.copy_of_project_id","typeLabel":"string | null"},"reused_dub":{"type":"boolean","description":"A copy reused the source dub.","isRequired":true,"uniqueKey":"result.oneOf.1.reused_dub","typeLabel":"boolean"},"auto_dub":{"type":"object","description":"Auto-dub outcome. With a `localization` block, `state` is `dispatched` once the run starts, `dub_job_id` and `skipped_reason` stay null, and `localization_job_id` is authoritative.","required":["state","skipped_reason","dub_job_id"],"properties":{"state":{"type":"string","description":"Auto-dub outcome of a processing run.\n\n- `not_requested`: not requested\n- `dispatched`: a dub job was started\n- `skipped`: skipped; see skipped_reason","enum":["not_requested","dispatched","skipped"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.1.auto_dub.state","typeLabel":"enum\u003cstring>"},"skipped_reason":{"oneOf":[{"type":"string","description":"Why it was skipped.","enum":["insufficient_balance","cost_changed"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.1.auto_dub.skipped_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Why it was skipped.","isRequired":true,"uniqueKey":"result.oneOf.1.auto_dub.skipped_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.1.auto_dub.skipped_reason","typeLabel":"enum\u003cstring> | null"},"dub_job_id":{"oneOf":[{"type":"string","description":"The auto-dub `dub` job.","isRequired":true,"uniqueKey":"result.oneOf.1.auto_dub.dub_job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The auto-dub `dub` job.","isRequired":true,"uniqueKey":"result.oneOf.1.auto_dub.dub_job_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.1.auto_dub.dub_job_id","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"result.oneOf.1.auto_dub","typeLabel":"object"},"onscreen_auto_start":{"type":"object","description":"On-screen auto-start outcome.","required":["state","rejection_code"],"properties":{"state":{"type":"string","description":"On-screen auto-start state.\n\n- `not_requested`: not requested\n- `pending`: waits for the first dub\n- `started`: the onscreen job was created\n- `rejected`: refused; see rejection_code","enum":["not_requested","pending","started","rejected"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.1.onscreen_auto_start.state","typeLabel":"enum\u003cstring>"},"rejection_code":{"oneOf":[{"type":"string","description":"Rejection code.","isRequired":true,"uniqueKey":"result.oneOf.1.onscreen_auto_start.rejection_code.oneOf.0","typeLabel":"string"},{"type":"null","description":"Rejection code.","isRequired":true,"uniqueKey":"result.oneOf.1.onscreen_auto_start.rejection_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.1.onscreen_auto_start.rejection_code","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"result.oneOf.1.onscreen_auto_start","typeLabel":"object"},"localization_job_id":{"oneOf":[{"type":"string","description":"The `localization` job started after translation; null without a `localization` block.","isRequired":true,"uniqueKey":"result.oneOf.1.localization_job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The `localization` job started after translation; null without a `localization` block.","isRequired":true,"uniqueKey":"result.oneOf.1.localization_job_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.1.localization_job_id","typeLabel":"string | null"},"notices":{"type":"array","items":{"type":"object","description":"A non-blocking notice in a job result.","required":["code","detail","speaker_labels"],"properties":{"code":{"type":"string","description":"A non-blocking fact about how a job ran.\n\n- `dubbing_model_overridden`: the effective dubbing model differs from the requested one, or from the default `v2` when the request named none (see `dubbing_model_override_reason`)\n- `meaning_first_disabled`: meaning-first translation or dubbing is switched off, so the legacy path ran\n- `voice_fallback`: the project uses dubbing model v2, but a voice that is not `meaning_first_compatible` sent this voiceover to the legacy engine\n- `speaker_voice_unused`: a `speaker_voices` entry names a speaker the transcript does not have; the entry was ignored\n- `speaker_voice_not_applied`: a `speaker_voices` clone could not be applied once speakers were known (too little speech, daily clone quota); the speaker keeps the suggested voice","enum":["dubbing_model_overridden","meaning_first_disabled","voice_fallback","speaker_voice_unused","speaker_voice_not_applied"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.1.notices.items.[INDEX].code","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","description":"Explanation; never user text.","isRequired":true,"uniqueKey":"result.oneOf.1.notices.items.[INDEX].detail","typeLabel":"string"},"speaker_labels":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"result.oneOf.1.notices.items.[INDEX].speaker_labels.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"speaker_voice_unused, speaker_voice_not_applied: the speaker labels concerned; otherwise null.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.1.notices.items.[INDEX].speaker_labels.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"speaker_voice_unused, speaker_voice_not_applied: the speaker labels concerned; otherwise null.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.1.notices.items.[INDEX].speaker_labels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.1.notices.items.[INDEX].speaker_labels","typeLabel":"string[] | null"}},"uniqueKey":"result.oneOf.1.notices.items.[INDEX]","typeLabel":"object"},"description":"Notices of the run (`dubbing_model_overridden`, `meaning_first_disabled`, `speaker_voice_unused`, `speaker_voice_not_applied`).","isRequired":true,"uniqueKey":"result.oneOf.1.notices","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"result.oneOf.1","typeLabel":"object"},{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","segment_ids","failed_segment_ids","skipped_segment_ids","version_number"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["translation"],"isRequired":true,"uniqueKey":"result.oneOf.2.type","typeLabel":"enum\u003cstring>"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"result.oneOf.2.segment_ids.items.[INDEX]","typeLabel":"string"},"description":"Translated segments.","isRequired":true,"uniqueKey":"result.oneOf.2.segment_ids","typeLabel":"string[]"},"failed_segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"result.oneOf.2.failed_segment_ids.items.[INDEX]","typeLabel":"string"},"description":"Segments whose translation failed.","isRequired":true,"uniqueKey":"result.oneOf.2.failed_segment_ids","typeLabel":"string[]"},"skipped_segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"result.oneOf.2.skipped_segment_ids.items.[INDEX]","typeLabel":"string"},"description":"Segments skipped because they turned busy.","isRequired":true,"uniqueKey":"result.oneOf.2.skipped_segment_ids","typeLabel":"string[]"},"version_number":{"oneOf":[{"type":"integer","description":"The translation_completed version.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.2.version_number.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"The translation_completed version.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.2.version_number.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.2.version_number","typeLabel":"integer\u003cint32> | null"}},"isRequired":true,"uniqueKey":"result.oneOf.2","typeLabel":"object"},{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","clips","engine","text_adaptation","notices"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["segment_generation"],"isRequired":true,"uniqueKey":"result.oneOf.3.type","typeLabel":"enum\u003cstring>"},"clips":{"type":"array","items":{"type":"object","description":"One voiced take of a segment, produced by a `segment_generation` job and stored under that job: a later take of the same segment does not overwrite it, so an old job keeps serving its old take. The clip keeps its natural duration; it is neither stretched nor cut to the interval.","required":["segment_id","generation_id","segment_etag","speaker_id","speaker_label","start_seconds","end_seconds","audio_duration_seconds","overrun_seconds","fit","format","url","expires_at"],"properties":{"segment_id":{"type":"string","description":"Segment.","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].segment_id","typeLabel":"string"},"generation_id":{"type":"string","description":"The `segment_generation` job that produced this take.","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].generation_id","typeLabel":"string"},"segment_etag":{"type":"string","description":"The segment ETag right after synthesis. When the current ETag differs, the segment has changed and the take may no longer match it.","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].segment_etag","typeLabel":"string"},"speaker_id":{"oneOf":[{"type":"string","description":"Speaker (`SPEAKER_NN`) at synthesis.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].speaker_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Speaker (`SPEAKER_NN`) at synthesis.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].speaker_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].speaker_id","typeLabel":"string | null"},"speaker_label":{"oneOf":[{"type":"string","description":"Display name of the speaker (\"Speaker N\") at synthesis.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].speaker_label.oneOf.0","typeLabel":"string"},{"type":"null","description":"Display name of the speaker (\"Speaker N\") at synthesis.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].speaker_label.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].speaker_label","typeLabel":"string | null"},"start_seconds":{"type":"number","description":"Segment start, frozen at synthesis.","format":"double","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].start_seconds","typeLabel":"number\u003cdouble>"},"end_seconds":{"type":"number","description":"Segment end, frozen at synthesis.","format":"double","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].end_seconds","typeLabel":"number\u003cdouble>"},"audio_duration_seconds":{"type":"number","description":"Natural duration of the take.","format":"double","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].audio_duration_seconds","typeLabel":"number\u003cdouble>"},"overrun_seconds":{"type":"number","description":"`audio_duration_seconds` minus the interval, never below 0. In a later dub an overrun pushes the same speaker's next line later.","format":"double","minimum":0,"isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].overrun_seconds","typeLabel":"number\u003cdouble>"},"fit":{"type":"string","description":"How a clip fits its segment interval.\n\n- `fits`: the clip is no longer than the interval\n- `overruns`: the clip is longer than the interval by `overrun_seconds`","enum":["fits","overruns"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].fit","typeLabel":"enum\u003cstring>"},"format":{"type":"string","description":"Audio format (mp3, flac, wav).","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].format","typeLabel":"string"},"url":{"oneOf":[{"type":"string","description":"Absolute presigned download URL, minted at read time; null in webhook payloads and when the plan no longer includes `audio_download`.","format":"uri","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","description":"Absolute presigned download URL, minted at read time; null in webhook payloads and when the plan no longer includes `audio_download`.","format":"uri","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].url","typeLabel":"string\u003curi> | null"},"expires_at":{"oneOf":[{"type":"string","description":"URL expiry (1 hour after the read).","format":"date-time","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].expires_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"URL expiry (1 hour after the read).","format":"date-time","isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].expires_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.3.clips.items.[INDEX].expires_at","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"result.oneOf.3.clips.items.[INDEX]","typeLabel":"object"},"description":"The voiced takes.","isRequired":true,"uniqueKey":"result.oneOf.3.clips","typeLabel":"object[]"},"engine":{"type":"string","description":"Voice-over engine.\n\n- `meaning_first`: meaning-first engine\n- `legacy`: legacy engine","enum":["meaning_first","legacy"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.3.engine","typeLabel":"enum\u003cstring>"},"text_adaptation":{"type":"string","description":"How the dub treats the translated text.\n\n- `context`: voiced with the translation context, so the speech may be adapted to the interval (auto-dub after a meaning-first translation)\n- `as_written`: voiced exactly as the segment text is written (every manual dub, segment generation and auto-dub without a translation context)","enum":["context","as_written"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.3.text_adaptation","typeLabel":"enum\u003cstring>"},"notices":{"type":"array","items":{"type":"object","description":"A non-blocking notice in a job result.","required":["code","detail","speaker_labels"],"properties":{"code":{"type":"string","description":"A non-blocking fact about how a job ran.\n\n- `dubbing_model_overridden`: the effective dubbing model differs from the requested one, or from the default `v2` when the request named none (see `dubbing_model_override_reason`)\n- `meaning_first_disabled`: meaning-first translation or dubbing is switched off, so the legacy path ran\n- `voice_fallback`: the project uses dubbing model v2, but a voice that is not `meaning_first_compatible` sent this voiceover to the legacy engine\n- `speaker_voice_unused`: a `speaker_voices` entry names a speaker the transcript does not have; the entry was ignored\n- `speaker_voice_not_applied`: a `speaker_voices` clone could not be applied once speakers were known (too little speech, daily clone quota); the speaker keeps the suggested voice","enum":["dubbing_model_overridden","meaning_first_disabled","voice_fallback","speaker_voice_unused","speaker_voice_not_applied"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.3.notices.items.[INDEX].code","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","description":"Explanation; never user text.","isRequired":true,"uniqueKey":"result.oneOf.3.notices.items.[INDEX].detail","typeLabel":"string"},"speaker_labels":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"result.oneOf.3.notices.items.[INDEX].speaker_labels.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"speaker_voice_unused, speaker_voice_not_applied: the speaker labels concerned; otherwise null.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.3.notices.items.[INDEX].speaker_labels.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"speaker_voice_unused, speaker_voice_not_applied: the speaker labels concerned; otherwise null.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.3.notices.items.[INDEX].speaker_labels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.3.notices.items.[INDEX].speaker_labels","typeLabel":"string[] | null"}},"uniqueKey":"result.oneOf.3.notices.items.[INDEX]","typeLabel":"object"},"description":"Notices of the run.","isRequired":true,"uniqueKey":"result.oneOf.3.notices","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"result.oneOf.3","typeLabel":"object"},{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","mode_applied","voiced_segment_count","engine","version_number","reused_clip_count","text_adaptation","notices"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["dub"],"isRequired":true,"uniqueKey":"result.oneOf.4.type","typeLabel":"enum\u003cstring>"},"mode_applied":{"type":"string","description":"Dub mode the server applies.\n\n- `full`: every segment\n- `changed_segments`: only changed segments","enum":["full","changed_segments"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.4.mode_applied","typeLabel":"enum\u003cstring>"},"voiced_segment_count":{"type":"integer","description":"Segments voiced and charged.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.4.voiced_segment_count","typeLabel":"integer\u003cint32>"},"engine":{"type":"string","description":"Voice-over engine.\n\n- `meaning_first`: meaning-first engine\n- `legacy`: legacy engine","enum":["meaning_first","legacy"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.4.engine","typeLabel":"enum\u003cstring>"},"version_number":{"oneOf":[{"type":"integer","description":"The dub_completed version.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.4.version_number.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"The dub_completed version.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.4.version_number.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.4.version_number","typeLabel":"integer\u003cint32> | null"},"reused_clip_count":{"type":"integer","description":"Segments merged from their current clip without voicing them again.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.4.reused_clip_count","typeLabel":"integer\u003cint32>"},"text_adaptation":{"type":"string","description":"How the dub treats the translated text.\n\n- `context`: voiced with the translation context, so the speech may be adapted to the interval (auto-dub after a meaning-first translation)\n- `as_written`: voiced exactly as the segment text is written (every manual dub, segment generation and auto-dub without a translation context)","enum":["context","as_written"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.4.text_adaptation","typeLabel":"enum\u003cstring>"},"notices":{"type":"array","items":{"type":"object","description":"A non-blocking notice in a job result.","required":["code","detail","speaker_labels"],"properties":{"code":{"type":"string","description":"A non-blocking fact about how a job ran.\n\n- `dubbing_model_overridden`: the effective dubbing model differs from the requested one, or from the default `v2` when the request named none (see `dubbing_model_override_reason`)\n- `meaning_first_disabled`: meaning-first translation or dubbing is switched off, so the legacy path ran\n- `voice_fallback`: the project uses dubbing model v2, but a voice that is not `meaning_first_compatible` sent this voiceover to the legacy engine\n- `speaker_voice_unused`: a `speaker_voices` entry names a speaker the transcript does not have; the entry was ignored\n- `speaker_voice_not_applied`: a `speaker_voices` clone could not be applied once speakers were known (too little speech, daily clone quota); the speaker keeps the suggested voice","enum":["dubbing_model_overridden","meaning_first_disabled","voice_fallback","speaker_voice_unused","speaker_voice_not_applied"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.4.notices.items.[INDEX].code","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","description":"Explanation; never user text.","isRequired":true,"uniqueKey":"result.oneOf.4.notices.items.[INDEX].detail","typeLabel":"string"},"speaker_labels":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"result.oneOf.4.notices.items.[INDEX].speaker_labels.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"speaker_voice_unused, speaker_voice_not_applied: the speaker labels concerned; otherwise null.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.4.notices.items.[INDEX].speaker_labels.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"speaker_voice_unused, speaker_voice_not_applied: the speaker labels concerned; otherwise null.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.4.notices.items.[INDEX].speaker_labels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.4.notices.items.[INDEX].speaker_labels","typeLabel":"string[] | null"}},"uniqueKey":"result.oneOf.4.notices.items.[INDEX]","typeLabel":"object"},"description":"Notices of the run (`dubbing_model_overridden`, `meaning_first_disabled`, `voice_fallback`).","isRequired":true,"uniqueKey":"result.oneOf.4.notices","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"result.oneOf.4","typeLabel":"object"},{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","model","video","download_restricted","is_trimmed","processed_seconds","is_outdated"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["lipsync"],"isRequired":true,"uniqueKey":"result.oneOf.5.type","typeLabel":"enum\u003cstring>"},"model":{"type":"string","description":"Lip-sync model.\n\n- `legacy`: the Legacy model\n- `enhanced`: the Enhanced model","enum":["legacy","enhanced"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.5.model","typeLabel":"enum\u003cstring>"},"video":{"oneOf":[{"type":"object","description":"The lip-synced video, from the media id the job stored when it finished: it stays readable after a later dub clears the project's record.","required":["media_id","url","expires_at"],"properties":{"media_id":{"type":"string","description":"Media id of the file.","isRequired":true,"uniqueKey":"result.oneOf.5.video.oneOf.0.media_id","typeLabel":"string"},"url":{"type":"string","description":"Absolute presigned `https://` URL.","format":"uri","isRequired":true,"uniqueKey":"result.oneOf.5.video.oneOf.0.url","typeLabel":"string\u003curi>"},"expires_at":{"type":"string","description":"When the URL stops working (1 hour after the read).","format":"date-time","isRequired":true,"uniqueKey":"result.oneOf.5.video.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"result.oneOf.5.video.oneOf.0","typeLabel":"object"},{"type":"null","description":"The lip-synced video, from the media id the job stored when it finished: it stays readable after a later dub clears the project's record.","isRequired":true,"uniqueKey":"result.oneOf.5.video.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.5.video","typeLabel":"object | null"},"download_restricted":{"type":"boolean","description":"The plan withholds the download URL.","isRequired":true,"uniqueKey":"result.oneOf.5.download_restricted","typeLabel":"boolean"},"is_trimmed":{"type":"boolean","description":"Only part was processed.","isRequired":true,"uniqueKey":"result.oneOf.5.is_trimmed","typeLabel":"boolean"},"processed_seconds":{"type":"number","description":"Seconds processed.","format":"double","isRequired":true,"uniqueKey":"result.oneOf.5.processed_seconds","typeLabel":"number\u003cdouble>"},"is_outdated":{"type":"boolean","description":"A later dub or a newer lip-sync replaced it on the project.","isRequired":true,"uniqueKey":"result.oneOf.5.is_outdated","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"result.oneOf.5","typeLabel":"object"},{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","target_language","video","is_outdated"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["onscreen"],"isRequired":true,"uniqueKey":"result.oneOf.6.type","typeLabel":"enum\u003cstring>"},"target_language":{"type":"string","description":"Target language.","isRequired":true,"uniqueKey":"result.oneOf.6.target_language","typeLabel":"string"},"video":{"oneOf":[{"type":"object","description":"The translated video.","required":["media_id","url","expires_at"],"properties":{"media_id":{"type":"string","description":"Media id of the file.","isRequired":true,"uniqueKey":"result.oneOf.6.video.oneOf.0.media_id","typeLabel":"string"},"url":{"type":"string","description":"Absolute presigned `https://` URL.","format":"uri","isRequired":true,"uniqueKey":"result.oneOf.6.video.oneOf.0.url","typeLabel":"string\u003curi>"},"expires_at":{"type":"string","description":"When the URL stops working (1 hour after the read).","format":"date-time","isRequired":true,"uniqueKey":"result.oneOf.6.video.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"result.oneOf.6.video.oneOf.0","typeLabel":"object"},{"type":"null","description":"The translated video.","isRequired":true,"uniqueKey":"result.oneOf.6.video.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.6.video","typeLabel":"object | null"},"is_outdated":{"type":"boolean","description":"A later dub made it stale, or a later lip-sync when it was rendered over a lip-synced video.","isRequired":true,"uniqueKey":"result.oneOf.6.is_outdated","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"result.oneOf.6","typeLabel":"object"},{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","final_output","notices"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["localization"],"isRequired":true,"uniqueKey":"result.oneOf.7.type","typeLabel":"enum\u003cstring>"},"final_output":{"type":"object","description":"The output that holds every ordered change (kind `localized_video`), as of this read: `outdated` follows `Output.outdated`, so an older run's output turns outdated.","required":["object","kind","format","language","available","unavailable_reason","outdated","version","url","expires_at","subtitles_request","filename"],"properties":{"object":{"type":"string","enum":["output"],"description":"Always `output`.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.object","typeLabel":"enum\u003cstring>"},"kind":{"type":"string","description":"Kind of a downloadable output.\n\n- `source`: the original media\n- `cover_image`: the cover frame\n- `dubbed_video`: the dubbed video\n- `dubbed_audio`: dubbed audio with background\n- `voice_track`: the voice-only track\n- `dubbed_subtitles`: subtitles snapshot at the last dub (srt, vtt)\n- `source_subtitles`: source subtitles rendered from the current transcript, one cue per segment\n- `source_subtitles_speakers`: the same with `[SPEAKER_NN]:` labels\n- `target_subtitles`: target subtitles rendered from the current transcript, one cue per segment\n- `target_subtitles_speakers`: the same with `[SPEAKER_NN]:` labels\n- `burned_subtitles_video`: the dubbed video with burned-in subtitles\n- `lipsync_video`: the lip-synced video\n- `lipsync_burned_subtitles_video`: the lip-synced video with burned-in subtitles\n- `onscreen_video`: the video with translated on-screen text\n- `localized_video`: the final video of a localization run, holding every ordered change","enum":["source","cover_image","dubbed_video","dubbed_audio","voice_track","dubbed_subtitles","source_subtitles","source_subtitles_speakers","target_subtitles","target_subtitles_speakers","burned_subtitles_video","lipsync_video","lipsync_burned_subtitles_video","onscreen_video","localized_video"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.kind","typeLabel":"enum\u003cstring>"},"format":{"type":"string","description":"File format (mp4, mp3, srt, vtt, jpg...).","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.format","typeLabel":"string"},"language":{"oneOf":[{"type":"string","description":"Language of the output.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.language.oneOf.0","typeLabel":"string"},{"type":"null","description":"Language of the output.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.language.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.language","typeLabel":"string | null"},"available":{"type":"boolean","description":"True when it can be obtained: `url` is set, or `subtitles_request` says how to render it.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.available","typeLabel":"boolean"},"unavailable_reason":{"oneOf":[{"type":"string","description":"Why there is no URL.","enum":["not_produced","in_progress","not_in_plan","dub_payment_required","not_generated","restoring","temporarily_unavailable"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.unavailable_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Why there is no URL.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.unavailable_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.unavailable_reason","typeLabel":"enum\u003cstring> | null"},"outdated":{"type":"boolean","description":"True when it no longer matches the project. `dubbed_video`, `dubbed_audio`, `voice_track`, `dubbed_subtitles`: a segment with target text is `outdated` or `not_dubbed`, or the transcript or a voice changed since the last dub. `localized_video`: the same rule, or its final stage's job result `is_outdated`, or a newer succeeded `localization` job. Burned and on-screen videos: a later dub made them stale (on-screen: or a new source video). `lipsync_video`: always false, because a later dub removes it (`available: false`, `unavailable_reason: not_produced`; the job result keeps its video). Rendered subtitle variants are always current.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.outdated","typeLabel":"boolean"},"version":{"oneOf":[{"type":"object","description":"Which work produced it; null when nothing was produced, and for the source, the cover and rendered subtitle variants.","required":["number","job_id","produced_at"],"properties":{"number":{"oneOf":[{"type":"integer","description":"Transcript version recorded by the dub that produced it; null for outputs that do not follow a transcript version.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.0.number.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Transcript version recorded by the dub that produced it; null for outputs that do not follow a transcript version.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.0.number.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.0.number","typeLabel":"integer\u003cint32> | null"},"job_id":{"oneOf":[{"type":"string","description":"The v3 job that produced it; null for work started in the web app or API v2.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.0.job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The v3 job that produced it; null for work started in the web app or API v2.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.0.job_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.0.job_id","typeLabel":"string | null"},"produced_at":{"oneOf":[{"type":"string","description":"When it was produced; null when unknown (a web lip-sync).","format":"date-time","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.0.produced_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When it was produced; null when unknown (a web lip-sync).","format":"date-time","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.0.produced_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.0.produced_at","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.0","typeLabel":"object"},{"type":"null","description":"Which work produced it; null when nothing was produced, and for the source, the cover and rendered subtitle variants.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.version","typeLabel":"object | null"},"url":{"oneOf":[{"type":"string","description":"Absolute presigned download URL (Content-Disposition: attachment); null when unavailable and for rendered subtitle variants.","format":"uri","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","description":"Absolute presigned download URL (Content-Disposition: attachment); null when unavailable and for rendered subtitle variants.","format":"uri","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.url","typeLabel":"string\u003curi> | null"},"expires_at":{"oneOf":[{"type":"string","description":"URL expiry (1 hour after the read).","format":"date-time","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.expires_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"URL expiry (1 hour after the read).","format":"date-time","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.expires_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.expires_at","typeLabel":"string\u003cdate-time> | null"},"subtitles_request":{"oneOf":[{"type":"object","description":"For a rendered subtitle variant (no stored file): the getProjectSubtitles parameters that produce it; otherwise null, also while `unavailable_reason` is set.","required":["language","format","speaker_labels","cue"],"properties":{"language":{"type":"string","description":"Subtitle side.\n\n- `source`: the source language\n- `target`: the target language","enum":["source","target"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.subtitles_request.oneOf.0.language","typeLabel":"enum\u003cstring>"},"format":{"type":"string","description":"Subtitle format.\n\n- `srt`: SubRip\n- `vtt`: WebVTT","enum":["srt","vtt"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.subtitles_request.oneOf.0.format","typeLabel":"enum\u003cstring>"},"speaker_labels":{"type":"boolean","description":"Value of `speaker_labels`.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.subtitles_request.oneOf.0.speaker_labels","typeLabel":"boolean"},"cue":{"type":"string","description":"How cues are cut.\n\n- `segment`: one cue per segment, text as stored\n- `line`: long segments split into timed lines, as in the `dubbed_subtitles` snapshot","enum":["segment","line"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.subtitles_request.oneOf.0.cue","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.subtitles_request.oneOf.0","typeLabel":"object"},{"type":"null","description":"For a rendered subtitle variant (no stored file): the getProjectSubtitles parameters that produce it; otherwise null, also while `unavailable_reason` is set.","isRequired":true,"uniqueKey":"result.oneOf.7.final_output.subtitles_request.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.subtitles_request","typeLabel":"object | null"},"filename":{"type":"string","description":"Suggested file name `\u003cname>_\u003ctarget_language>_\u003ckind>.\u003cext>`.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.7.final_output.filename","typeLabel":"string"}},"isRequired":true,"uniqueKey":"result.oneOf.7.final_output","typeLabel":"object"},"notices":{"type":"array","items":{"type":"object","description":"A non-blocking notice in a job result.","required":["code","detail","speaker_labels"],"properties":{"code":{"type":"string","description":"A non-blocking fact about how a job ran.\n\n- `dubbing_model_overridden`: the effective dubbing model differs from the requested one, or from the default `v2` when the request named none (see `dubbing_model_override_reason`)\n- `meaning_first_disabled`: meaning-first translation or dubbing is switched off, so the legacy path ran\n- `voice_fallback`: the project uses dubbing model v2, but a voice that is not `meaning_first_compatible` sent this voiceover to the legacy engine\n- `speaker_voice_unused`: a `speaker_voices` entry names a speaker the transcript does not have; the entry was ignored\n- `speaker_voice_not_applied`: a `speaker_voices` clone could not be applied once speakers were known (too little speech, daily clone quota); the speaker keeps the suggested voice","enum":["dubbing_model_overridden","meaning_first_disabled","voice_fallback","speaker_voice_unused","speaker_voice_not_applied"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.7.notices.items.[INDEX].code","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","description":"Explanation; never user text.","isRequired":true,"uniqueKey":"result.oneOf.7.notices.items.[INDEX].detail","typeLabel":"string"},"speaker_labels":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"result.oneOf.7.notices.items.[INDEX].speaker_labels.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"speaker_voice_unused, speaker_voice_not_applied: the speaker labels concerned; otherwise null.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.7.notices.items.[INDEX].speaker_labels.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"speaker_voice_unused, speaker_voice_not_applied: the speaker labels concerned; otherwise null.","x-rask-untrusted":true,"isRequired":true,"uniqueKey":"result.oneOf.7.notices.items.[INDEX].speaker_labels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result.oneOf.7.notices.items.[INDEX].speaker_labels","typeLabel":"string[] | null"}},"uniqueKey":"result.oneOf.7.notices.items.[INDEX]","typeLabel":"object"},"description":"Notices of the run's stages.","isRequired":true,"uniqueKey":"result.oneOf.7.notices","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"result.oneOf.7","typeLabel":"object"},{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","voice_clone_id","language_count"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["voice_clone"],"isRequired":true,"uniqueKey":"result.oneOf.8.type","typeLabel":"enum\u003cstring>"},"voice_clone_id":{"type":"string","description":"The clone.","isRequired":true,"uniqueKey":"result.oneOf.8.voice_clone_id","typeLabel":"string"},"language_count":{"type":"integer","description":"Languages with samples.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.8.language_count","typeLabel":"integer\u003cint32>"}},"isRequired":true,"uniqueKey":"result.oneOf.8","typeLabel":"object"},{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","export_type","source_video","output_kind"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["export"],"isRequired":true,"uniqueKey":"result.oneOf.9.type","typeLabel":"enum\u003cstring>"},"export_type":{"type":"string","description":"Export type.\n\n- `burned_subtitles`: a video with burned-in target subtitles","enum":["burned_subtitles"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.9.export_type","typeLabel":"enum\u003cstring>"},"source_video":{"type":"string","description":"Video to export from.\n\n- `dubbed`: the dubbed video\n- `lipsync`: the lip-synced video","enum":["dubbed","lipsync"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.9.source_video","typeLabel":"enum\u003cstring>"},"output_kind":{"type":"string","description":"Kind of a downloadable output.\n\n- `source`: the original media\n- `cover_image`: the cover frame\n- `dubbed_video`: the dubbed video\n- `dubbed_audio`: dubbed audio with background\n- `voice_track`: the voice-only track\n- `dubbed_subtitles`: subtitles snapshot at the last dub (srt, vtt)\n- `source_subtitles`: source subtitles rendered from the current transcript, one cue per segment\n- `source_subtitles_speakers`: the same with `[SPEAKER_NN]:` labels\n- `target_subtitles`: target subtitles rendered from the current transcript, one cue per segment\n- `target_subtitles_speakers`: the same with `[SPEAKER_NN]:` labels\n- `burned_subtitles_video`: the dubbed video with burned-in subtitles\n- `lipsync_video`: the lip-synced video\n- `lipsync_burned_subtitles_video`: the lip-synced video with burned-in subtitles\n- `onscreen_video`: the video with translated on-screen text\n- `localized_video`: the final video of a localization run, holding every ordered change","enum":["source","cover_image","dubbed_video","dubbed_audio","voice_track","dubbed_subtitles","source_subtitles","source_subtitles_speakers","target_subtitles","target_subtitles_speakers","burned_subtitles_video","lipsync_video","lipsync_burned_subtitles_video","onscreen_video","localized_video"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"result.oneOf.9.output_kind","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"result.oneOf.9","typeLabel":"object"},{"type":"object","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","required":["type","files_checked","files_restored"],"x-rask-open-union":true,"properties":{"type":{"type":"string","enum":["file_restore"],"isRequired":true,"uniqueKey":"result.oneOf.10.type","typeLabel":"enum\u003cstring>"},"files_checked":{"type":"integer","description":"Files checked.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.10.files_checked","typeLabel":"integer\u003cint32>"},"files_restored":{"type":"integer","description":"Files restored.","format":"int32","isRequired":true,"uniqueKey":"result.oneOf.10.files_restored","typeLabel":"integer\u003cint32>"}},"isRequired":true,"uniqueKey":"result.oneOf.10","typeLabel":"object"},{"type":"null","description":"Set when succeeded; a failed `segment_generation` job may also list clips already voiced.","isRequired":true,"uniqueKey":"result.oneOf.11","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result","typeLabel":"object · object · object · object · object · object · object · object · object · object · object · null"},"error":{"oneOf":[{"type":"object","description":"Set when failed; on a canceled job only for the cancellation reason `project_deleted` (the project was deleted while the job ran; its work is discarded, refunded only for on-screen); `instance` is `/v3/jobs/{id}`, `detail` is generic. Each code's `status`, `retry`, `recommendation` and `hint` are in `components.x-rask-job-errors`. Codes by type: media_import `source_download_failed`, `unsupported_media_type`, `media_corrupt`, `media_processing_failed`, `media_too_large` (a voice sample above its limit); project_processing `media_processing_failed`, `source_unavailable`, `no_audio_track`, `transcription_failed`, `no_speech_detected`, `audio_separation_failed`, `speaker_detection_failed`, `translation_failed`, `subtitle_import_rolled_back`, `project_processing_timeout`, `internal_error`; translation `translation_failed`, `translation_dispatch_failed`, `translation_timeout`; segment_generation (`cause_code`) `segment_generation_failed`, `segment_generation_timeout`; localization `localization_stage_failed`, `localization_stage_skipped` (`failed_stage`, `cause_code`); dub (`cause_code`) `dub_voiceover_failed`, `dub_merge_failed`, `dub_failed`, `dub_timeout`; lipsync `lipsync_failed`, `face_check_failed`, `no_face_detected`, `lipsync_rejected` (`cause_code`), `lipsync_timeout`; onscreen `onscreen_queue_timeout`, `onscreen_runner_lost`, `onscreen_runner_failed`, `onscreen_provider_unavailable`, `onscreen_finalize_timeout`, `onscreen_invalid_result`, `onscreen_publish_failed`, `onscreen_source_unavailable`, `onscreen_charge_failed`; voice_clone `voice_clone_failed`, `voice_clone_timeout`; export `export_failed`; file_restore `restore_failed`. A failed job refunds its minutes (`onscreen_charge_failed` never charged). A failed `localization` job refunds only the failed stage, by its type's rule: succeeded stages stay charged, and skipped or unreached stages were never charged. A failed `project_processing` job refunds its project credit when a stage from transcription to translation failed, when it timed out and when a copy failed, but not for `media_processing_failed`, `source_unavailable`, `no_audio_track` or the `internal_error` of a new project.","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"error.oneOf.0.type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"error.oneOf.0.title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"error.oneOf.0.status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"error.oneOf.0.detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"error.oneOf.0.instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"error.oneOf.0.code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"error.oneOf.0.retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"error.oneOf.0.retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"error.oneOf.0.recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"error.oneOf.0.hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"error.oneOf.0.hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.oneOf.0.hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"error.oneOf.0.errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"error.oneOf.0.errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"error.oneOf.0.errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"error.oneOf.0.errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"error.oneOf.0.errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"error.oneOf.0.credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"error.oneOf.0.required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"error.oneOf.0.balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"error.oneOf.0.required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"error.oneOf.0.balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"error.oneOf.0.expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"error.oneOf.0.current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"error.oneOf.0.current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"error.oneOf.0.required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"error.oneOf.0.required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"error.oneOf.0.granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"error.oneOf.0.granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"error.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"error.oneOf.0.reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"error.oneOf.0.limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"error.oneOf.0.used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"error.oneOf.0.limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"error.oneOf.0.spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"error.oneOf.0.limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"error.oneOf.0.spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"error.oneOf.0.resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"error.oneOf.0.policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"error.oneOf.0.window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"error.oneOf.0.active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"error.oneOf.0.active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"error.oneOf.0.active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"error.oneOf.0.active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"error.oneOf.0.active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"error.oneOf.0.active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"error.oneOf.0.active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"error.oneOf.0.active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"error.oneOf.0.segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"error.oneOf.0.segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"error.oneOf.0.job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"error.oneOf.0.job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.oneOf.0.job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"error.oneOf.0.job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"error.oneOf.0.import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"error.oneOf.0.max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"error.oneOf.0.expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"error.oneOf.0.revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"error.oneOf.0.token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"error.oneOf.0.server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"error.oneOf.0.parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"error.oneOf.0.max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"error.oneOf.0.size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"error.oneOf.0.max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"error.oneOf.0.duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"error.oneOf.0.declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"error.oneOf.0.actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"error.oneOf.0.project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"error.oneOf.0.content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"error.oneOf.0.cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"error.oneOf.0.failed_stage","typeLabel":"enum\u003cstring>"}},"additionalProperties":true,"isRequired":true,"uniqueKey":"error.oneOf.0","typeLabel":"object"},{"type":"null","description":"Set when failed; on a canceled job only for the cancellation reason `project_deleted` (the project was deleted while the job ran; its work is discarded, refunded only for on-screen); `instance` is `/v3/jobs/{id}`, `detail` is generic. Each code's `status`, `retry`, `recommendation` and `hint` are in `components.x-rask-job-errors`. Codes by type: media_import `source_download_failed`, `unsupported_media_type`, `media_corrupt`, `media_processing_failed`, `media_too_large` (a voice sample above its limit); project_processing `media_processing_failed`, `source_unavailable`, `no_audio_track`, `transcription_failed`, `no_speech_detected`, `audio_separation_failed`, `speaker_detection_failed`, `translation_failed`, `subtitle_import_rolled_back`, `project_processing_timeout`, `internal_error`; translation `translation_failed`, `translation_dispatch_failed`, `translation_timeout`; segment_generation (`cause_code`) `segment_generation_failed`, `segment_generation_timeout`; localization `localization_stage_failed`, `localization_stage_skipped` (`failed_stage`, `cause_code`); dub (`cause_code`) `dub_voiceover_failed`, `dub_merge_failed`, `dub_failed`, `dub_timeout`; lipsync `lipsync_failed`, `face_check_failed`, `no_face_detected`, `lipsync_rejected` (`cause_code`), `lipsync_timeout`; onscreen `onscreen_queue_timeout`, `onscreen_runner_lost`, `onscreen_runner_failed`, `onscreen_provider_unavailable`, `onscreen_finalize_timeout`, `onscreen_invalid_result`, `onscreen_publish_failed`, `onscreen_source_unavailable`, `onscreen_charge_failed`; voice_clone `voice_clone_failed`, `voice_clone_timeout`; export `export_failed`; file_restore `restore_failed`. A failed job refunds its minutes (`onscreen_charge_failed` never charged). A failed `localization` job refunds only the failed stage, by its type's rule: succeeded stages stay charged, and skipped or unreached stages were never charged. A failed `project_processing` job refunds its project credit when a stage from transcription to translation failed, when it timed out and when a copy failed, but not for `media_processing_failed`, `source_unavailable`, `no_audio_track` or the `internal_error` of a new project.","isRequired":true,"uniqueKey":"error.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error","typeLabel":"object | null"},"created_at":{"type":"string","description":"Creation time.","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"started_at":{"oneOf":[{"type":"string","description":"Start time.","format":"date-time","isRequired":true,"uniqueKey":"started_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Start time.","format":"date-time","isRequired":true,"uniqueKey":"started_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"started_at","typeLabel":"string\u003cdate-time> | null"},"finished_at":{"oneOf":[{"type":"string","description":"End time.","format":"date-time","isRequired":true,"uniqueKey":"finished_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"End time.","format":"date-time","isRequired":true,"uniqueKey":"finished_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"finished_at","typeLabel":"string\u003cdate-time> | null"},"links":{"type":"object","description":"Path-absolute API links.","required":["self","project","outputs","media"],"properties":{"self":{"type":"string","description":"This job.","format":"uri-reference","isRequired":true,"uniqueKey":"links.self","typeLabel":"string\u003curi-reference>"},"project":{"oneOf":[{"type":"string","description":"The project.","format":"uri-reference","isRequired":true,"uniqueKey":"links.project.oneOf.0","typeLabel":"string\u003curi-reference>"},{"type":"null","description":"The project.","format":"uri-reference","isRequired":true,"uniqueKey":"links.project.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"links.project","typeLabel":"string\u003curi-reference> | null"},"outputs":{"oneOf":[{"type":"string","description":"The project's outputs.","format":"uri-reference","isRequired":true,"uniqueKey":"links.outputs.oneOf.0","typeLabel":"string\u003curi-reference>"},{"type":"null","description":"The project's outputs.","format":"uri-reference","isRequired":true,"uniqueKey":"links.outputs.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"links.outputs","typeLabel":"string\u003curi-reference> | null"},"media":{"oneOf":[{"type":"string","description":"The media.","format":"uri-reference","isRequired":true,"uniqueKey":"links.media.oneOf.0","typeLabel":"string\u003curi-reference>"},{"type":"null","description":"The media.","format":"uri-reference","isRequired":true,"uniqueKey":"links.media.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"links.media","typeLabel":"string\u003curi-reference> | null"}},"isRequired":true,"uniqueKey":"links","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"queued":{"title":"queued","value":{"object":"job","id":"e4a1c9f3-2d7b-4f5e-8a6c-0b3d9e1f7a52","workspace_id":"b2e0c6d4-5b1a-4f7e-9a3c-2d8f1e6a7b90","type":"project_processing","status":"queued","progress":1,"stage":"queued","queue_position":null,"estimated_finish_at":"2026-11-03T09:17:44Z","overdue":false,"project_id":"6f1c2b7e-8a4d-4e3f-9b5c-1d0a7e2f3c58","media_id":"c7d2a9e4-3b1f-4a6c-8d5e-9f0b2e7c1a63","parent_job_id":null,"channel":"api","params":{"type":"project_processing","trigger":"create","source_language":null,"target_language":"es-es","free_dubbing":false,"dubbing_model":"v2","auto_dub":true,"onscreen_auto_start":false,"localization":null,"expected_cost_minutes":1,"copy_of_project_id":null},"details":null,"stages":null,"cost":{"credit_type":"projects","projects":0,"charged":true,"refunded":false,"refunded_at":null},"result":null,"error":null,"created_at":"2026-11-03T09:12:44Z","started_at":null,"finished_at":null,"links":{"self":"/v3/jobs/e4a1c9f3-2d7b-4f5e-8a6c-0b3d9e1f7a52","project":"/v3/projects/6f1c2b7e-8a4d-4e3f-9b5c-1d0a7e2f3c58","outputs":null,"media":"/v3/media/c7d2a9e4-3b1f-4a6c-8d5e-9f0b2e7c1a63"}}}},"exampleType":"examples"}},"exampleType":"examples"},"2274a878-5681-44bf-a332-e7a5b2a33357":{"description":"Bad request. Codes: `token_in_query`, `idempotency_key_required`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"token_in_query":{"title":"token_in_query","value":{"type":"https://docs.api.rask.ai/errors/token_in_query","title":"Token in query","status":400,"detail":"A credential was sent in the query string parameter 'api_key'.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"token_in_query","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Send the key in the Authorization header as 'Bearer \u003ckey>' and revoke the exposed key in the web app.","errors":[],"parameter":"api_key"}},"idempotency_key_required":{"title":"idempotency_key_required","value":{"type":"https://docs.api.rask.ai/errors/idempotency_key_required","title":"Idempotency key required","status":400,"detail":"This operation starts work or spends credits and needs an Idempotency-Key header.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"idempotency_key_required","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Send an Idempotency-Key header (a UUIDv4) and reuse the same value when you retry this request.","errors":[]}}},"exampleType":"examples"}},"exampleType":"examples"},"2dd21967-171f-4442-8e13-2e3a6f0532cd":{"description":"Unauthorized. Codes: `authentication_required`, `invalid_token`, `token_expired`, `token_revoked`, `token_wrong_environment`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"WWW-Authenticate":{"description":"Bearer challenge, e.g. `Bearer realm=\"api.rask.ai\", error=\"invalid_token\"`; for insufficient_scope it names the required scopes.","schema":{"type":"string"},"example":"Bearer realm=\"api.rask.ai\", error=\"insufficient_scope\", scope=\"dubbing:write credits:spend\""}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"authentication_required":{"title":"authentication_required","value":{"type":"https://docs.api.rask.ai/errors/authentication_required","title":"Authentication required","status":401,"detail":"No bearer credential was sent.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"authentication_required","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Send 'Authorization: Bearer \u003cAPI key>'; SDKs read RASK_API_KEY.","errors":[]}},"invalid_token":{"title":"invalid_token","value":{"type":"https://docs.api.rask.ai/errors/invalid_token","title":"Invalid token","status":401,"detail":"The credential is malformed or unknown.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"invalid_token","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Check that RASK_API_KEY holds a complete key created in Settings -> API keys.","errors":[]}},"token_expired":{"title":"token_expired","value":{"type":"https://docs.api.rask.ai/errors/token_expired","title":"Token expired","status":401,"detail":"The API key expired.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"token_expired","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Create a new key in Settings -> API keys and update RASK_API_KEY.","errors":[],"expired_at":"2026-10-31T00:00:00Z"}},"token_revoked":{"title":"token_revoked","value":{"type":"https://docs.api.rask.ai/errors/token_revoked","title":"Token revoked","status":401,"detail":"The API key was revoked.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"token_revoked","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Create a new key in Settings -> API keys; the old key cannot be restored.","errors":[],"revoked_reason":"revoked_by_user"}},"token_wrong_environment":{"title":"token_wrong_environment","value":{"type":"https://docs.api.rask.ai/errors/token_wrong_environment","title":"Token wrong environment","status":401,"detail":"A test key was sent to the production API.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"token_wrong_environment","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Use a raskai_live_ key with api.rask.ai and a raskai_test_ key with a test environment.","errors":[],"token_env":"test","server_env":"live"}}},"exampleType":"examples"}},"exampleType":"examples"},"60a92b98-871e-426d-9bf5-adddd47bfefb":{"description":"Insufficient balance. Codes: `insufficient_balance`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"insufficient_balance":{"title":"insufficient_balance","value":{"type":"https://docs.api.rask.ai/errors/insufficient_balance","title":"Insufficient balance","status":402,"detail":"Dubbing project 6f1c2b7e needs 1 minute; the workspace owner has 0.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"insufficient_balance","retryable":false,"retry":"none","recommendation":"top_up","hint":"Stop and tell the user: the workspace owner adds minutes in the web app. Check GET /v3/balance.","errors":[],"credit_type":"minutes","required_minutes":1,"balance_minutes":0}}},"exampleType":"examples"}},"exampleType":"examples"},"066f59eb-312e-41ff-941c-ff9b479dacc1":{"description":"Forbidden. Codes: `insufficient_scope`, `account_disabled`, `feature_not_in_plan`, `prepare_mode_not_enabled`, `workspace_access_suspended`, `token_spend_limit_exceeded`, `forbidden`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"},"WWW-Authenticate":{"description":"Bearer challenge, e.g. `Bearer realm=\"api.rask.ai\", error=\"invalid_token\"`; for insufficient_scope it names the required scopes.","schema":{"type":"string"},"example":"Bearer realm=\"api.rask.ai\", error=\"insufficient_scope\", scope=\"dubbing:write credits:spend\""}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"insufficient_scope":{"title":"insufficient_scope","value":{"type":"https://docs.api.rask.ai/errors/insufficient_scope","title":"Insufficient scope","status":403,"detail":"This operation needs scopes the key does not have.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"insufficient_scope","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Use a key that has the scopes in required_scopes; scopes cannot be added to an existing key.","errors":[],"required_scopes":["dubbing:write","credits:spend"],"granted_scopes":["dubbing:write","projects:read","jobs:read"]}},"account_disabled":{"title":"account_disabled","value":{"type":"https://docs.api.rask.ai/errors/account_disabled","title":"Account disabled","status":403,"detail":"The user this key acts as is deactivated.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"account_disabled","retryable":false,"retry":"none","recommendation":"contact_support","hint":"Stop and contact Rask support; the acting user is deactivated.","errors":[]}},"feature_not_in_plan":{"title":"feature_not_in_plan","value":{"type":"https://docs.api.rask.ai/errors/feature_not_in_plan","title":"Feature not in plan","status":403,"detail":"The payer's plan does not include lipsync_enhanced.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"feature_not_in_plan","retryable":false,"retry":"none","recommendation":"top_up","hint":"Stop and tell the user the plan does not include this feature; GET /v3/plan lists entitlements.","errors":[],"feature":"lipsync_enhanced"}},"prepare_mode_not_enabled":{"title":"prepare_mode_not_enabled","value":{"type":"https://docs.api.rask.ai/errors/prepare_mode_not_enabled","title":"Prepare mode not enabled","status":403,"detail":"A project without auto-dub is not available: free preparation is not enabled.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"prepare_mode_not_enabled","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Remove auto_dub=false and send expected_cost_minutes from the estimate; voices can be chosen with speaker_voices.","errors":[]}},"workspace_access_suspended":{"title":"workspace_access_suspended","value":{"type":"https://docs.api.rask.ai/errors/workspace_access_suspended","title":"Workspace access suspended","status":403,"detail":"The workspace is not accessible: the owner's subscription is inactive.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"workspace_access_suspended","retryable":false,"retry":"none","recommendation":"top_up","hint":"Stop and tell the user to restore access to the workspace in the web app.","errors":[],"reason":"subscription_inactive"}},"token_spend_limit_exceeded":{"title":"token_spend_limit_exceeded","value":{"type":"https://docs.api.rask.ai/errors/token_spend_limit_exceeded","title":"Token spend limit exceeded","status":403,"detail":"This request would exceed the key's monthly limit on the minutes pool.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"token_spend_limit_exceeded","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Stop until resets_at, or ask the user to raise this key's monthly limit in Settings -> API keys.","errors":[],"credit_type":"minutes","limit_minutes":500,"spent_minutes":495,"required_minutes":12,"resets_at":"2026-12-01T00:00:00Z"}},"forbidden":{"title":"forbidden","value":{"type":"https://docs.api.rask.ai/errors/forbidden","title":"Forbidden","status":403,"detail":"Requests from the documentation playground may call only GET and estimate operations.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"forbidden","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Call this operation from your own code, not from the docs playground.","errors":[]}}},"exampleType":"examples"}},"exampleType":"examples"},"eb1f162f-a8ab-422c-a7a0-cecb9dbc715f":{"description":"Not found. Codes: `media_not_found`, `folder_not_found`, `glossary_not_found`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"media_not_found":{"title":"media_not_found","value":{"type":"https://docs.api.rask.ai/errors/media_not_found","title":"Media not found","status":404,"detail":"No media item with this id exists in the key's workspace.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"media_not_found","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Use an id returned by listMedia for this workspace.","errors":[]}},"folder_not_found":{"title":"folder_not_found","value":{"type":"https://docs.api.rask.ai/errors/folder_not_found","title":"Folder not found","status":404,"detail":"No folder with this id exists in the key's workspace.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"folder_not_found","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Use an id returned by listFolders for this workspace.","errors":[]}},"glossary_not_found":{"title":"glossary_not_found","value":{"type":"https://docs.api.rask.ai/errors/glossary_not_found","title":"Glossary not found","status":404,"detail":"No glossary with this id exists in the key's workspace.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"glossary_not_found","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Use an id returned by listGlossaries for this workspace.","errors":[]}}},"exampleType":"examples"}},"exampleType":"examples"},"a03990ce-2948-4cad-b60e-66f554a00502":{"description":"Conflict. Codes: `idempotency_key_in_use`, `media_not_ready`, `cost_changed`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","format":"int32","minimum":0},"example":30}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"idempotency_key_in_use":{"title":"idempotency_key_in_use","value":{"type":"https://docs.api.rask.ai/errors/idempotency_key_in_use","title":"Idempotency key in use","status":409,"detail":"A request with this Idempotency-Key is still in flight.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"idempotency_key_in_use","retryable":true,"retry":"same_key","recommendation":"wait","hint":"Wait Retry-After seconds and retry with the same Idempotency-Key.","errors":[]}},"media_not_ready":{"title":"media_not_ready","value":{"type":"https://docs.api.rask.ai/errors/media_not_ready","title":"Media not ready","status":409,"detail":"Media c7d2a9e4 is still processing.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"media_not_ready","retryable":true,"retry":"same_key","recommendation":"wait","hint":"Wait for the media_import job: GET /v3/jobs/{job_id}?wait_seconds=20.","errors":[],"import_job_id":"0b7d4e2a-6c1f-4a8e-b3d9-5e2c7a1f9b46"}},"cost_changed":{"title":"cost_changed","value":{"type":"https://docs.api.rask.ai/errors/cost_changed","title":"Cost changed","status":409,"detail":"The current price is higher than expected_cost_minutes; nothing was charged.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"cost_changed","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Call the estimate operation again and resend with its total_minutes as expected_cost_minutes.","errors":[],"expected_cost_minutes":1,"current_cost_minutes":2}}},"exampleType":"examples"}},"exampleType":"examples"},"520be4b1-f51f-43d0-be17-89c52a626ea3":{"description":"Content too large. Codes: `request_too_large`, `media_too_large`, `media_too_long`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"request_too_large":{"title":"request_too_large","value":{"type":"https://docs.api.rask.ai/errors/request_too_large","title":"Request too large","status":413,"detail":"The request body exceeds the limit of this operation.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"request_too_large","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Send a smaller body; see the body limits in the operation description.","errors":[]}},"media_too_large":{"title":"media_too_large","value":{"type":"https://docs.api.rask.ai/errors/media_too_large","title":"Media too large","status":413,"detail":"The file exceeds the plan's upload limit.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"media_too_large","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Keep files under getPlan.limits.max_upload_bytes.","errors":[],"max_upload_bytes":2000000000,"size_bytes":2500000000}},"media_too_long":{"title":"media_too_long","value":{"type":"https://docs.api.rask.ai/errors/media_too_long","title":"Media too long","status":413,"detail":"The media is longer than the plan allows.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"media_too_long","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Trim the source below getPlan.limits.max_source_duration_seconds.","errors":[],"max_source_duration_seconds":3600,"duration_seconds":5400}}},"exampleType":"examples"}},"exampleType":"examples"},"cbde2fa7-be07-42c8-bd90-4e6ed36458cf":{"description":"Unsupported media type. Codes: `unsupported_media_type`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"unsupported_media_type":{"title":"unsupported_media_type","value":{"type":"https://docs.api.rask.ai/errors/unsupported_media_type","title":"Unsupported media type","status":415,"detail":"This content type is not accepted.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"unsupported_media_type","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Send one of the listed video or audio content types.","errors":[],"content_type":"image/gif"}}},"exampleType":"examples"}},"exampleType":"examples"},"520df9d1-093b-488c-823d-64f3916dd28d":{"description":"Unprocessable request. Codes: `idempotency_key_reused`, `validation_failed`, `media_processing_failed`, `source_language_not_supported`, `target_language_not_supported`, `glossary_language_mismatch`, `subtitles_invalid`, `auto_dub_required`, `voice_not_in_pool`, `instant_clone_not_available`, `onscreen_language_not_supported`, `localization_combination_not_supported`, `onscreen_video_too_long`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"idempotency_key_reused":{"title":"idempotency_key_reused","value":{"type":"https://docs.api.rask.ai/errors/idempotency_key_reused","title":"Idempotency key reused","status":422,"detail":"This Idempotency-Key was used with a different request in the last 24 hours.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"idempotency_key_reused","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Use a new Idempotency-Key for a different request.","errors":[]}},"validation_failed":{"title":"validation_failed","value":{"type":"https://docs.api.rask.ai/errors/validation_failed","title":"Validation failed","status":422,"detail":"The request has 1 invalid field.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"validation_failed","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Fix the fields listed in errors[] and retry.","errors":[{"pointer":"/expected_cost_minutes","code":"expected_cost_required","detail":"expected_cost_minutes is required when auto_dub is true."}]}},"media_processing_failed":{"title":"media_processing_failed","value":{"type":"https://docs.api.rask.ai/errors/media_processing_failed","title":"Media processing failed","status":422,"detail":"Media c7d2a9e4 failed to process.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"media_processing_failed","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Upload or import the file again.","errors":[]}},"source_language_not_supported":{"title":"source_language_not_supported","value":{"type":"https://docs.api.rask.ai/errors/source_language_not_supported","title":"Source language not supported","status":422,"detail":"The source language is not supported.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"source_language_not_supported","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Pick a code from GET /v3/languages?capability=transcription.","errors":[{"pointer":"/source_language","code":"unsupported","detail":"Unknown source language."}]}},"target_language_not_supported":{"title":"target_language_not_supported","value":{"type":"https://docs.api.rask.ai/errors/target_language_not_supported","title":"Target language not supported","status":422,"detail":"The target language is not supported for this variant.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"target_language_not_supported","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Pick a code from GET /v3/languages?capability=translation.","errors":[{"pointer":"/target_language","code":"unsupported","detail":"Unknown target language."}]}},"glossary_language_mismatch":{"title":"glossary_language_mismatch","value":{"type":"https://docs.api.rask.ai/errors/glossary_language_mismatch","title":"Glossary language mismatch","status":422,"detail":"The glossary pair does not match the project's languages.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"glossary_language_mismatch","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Use a glossary whose language pair matches the project's languages.","errors":[]}},"subtitles_invalid":{"title":"subtitles_invalid","value":{"type":"https://docs.api.rask.ai/errors/subtitles_invalid","title":"Subtitles invalid","status":422,"detail":"The subtitles could not be parsed.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"subtitles_invalid","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Fix the SRT cues listed in errors[]; source and target need equal cues and timings.","errors":[{"pointer":"/subtitles/source","code":"speaker_labels_inconsistent","detail":"Cue 4 has no speaker label."}]}},"auto_dub_required":{"title":"auto_dub_required","value":{"type":"https://docs.api.rask.ai/errors/auto_dub_required","title":"Auto dub required","status":422,"detail":"The payer is on a trial, which always dubs automatically.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"auto_dub_required","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Trial plans always auto-dub: send auto_dub=true with expected_cost_minutes.","errors":[]}},"voice_not_in_pool":{"title":"voice_not_in_pool","value":{"type":"https://docs.api.rask.ai/errors/voice_not_in_pool","title":"Voice not in pool","status":422,"detail":"The voice is not available for this project.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"voice_not_in_pool","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Pick a voice from listProjectVoices for this project.","errors":[]}},"instant_clone_not_available":{"title":"instant_clone_not_available","value":{"type":"https://docs.api.rask.ai/errors/instant_clone_not_available","title":"Instant clone not available","status":422,"detail":"The speaker's own voice cannot be cloned.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"instant_clone_not_available","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Pick a stock or library voice from listProjectVoices.","errors":[],"reason":"insufficient_speech"}},"onscreen_language_not_supported":{"title":"onscreen_language_not_supported","value":{"type":"https://docs.api.rask.ai/errors/onscreen_language_not_supported","title":"Onscreen language not supported","status":422,"detail":"The target language cannot be rendered on screen.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"onscreen_language_not_supported","retryable":false,"retry":"none","recommendation":"fix_request","hint":"On-screen translation supports Latin, Cyrillic and Greek target scripts.","errors":[]}},"localization_combination_not_supported":{"title":"localization_combination_not_supported","value":{"type":"https://docs.api.rask.ai/errors/localization_combination_not_supported","title":"Localization combination not supported","status":422,"detail":"A localization run needs lipsync or onscreen on a video project, and on-screen cannot run on a lip-sync the plan trims.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"localization_combination_not_supported","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Order lipsync or onscreen on a video project; when the plan trims lip-sync, order one of them or change the plan.","errors":[],"reason":"nothing_ordered"}},"onscreen_video_too_long":{"title":"onscreen_video_too_long","value":{"type":"https://docs.api.rask.ai/errors/onscreen_video_too_long","title":"Onscreen video too long","status":422,"detail":"The video is longer than on-screen translation supports.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"onscreen_video_too_long","retryable":false,"retry":"none","recommendation":"fix_request","hint":"Trim the video below max_seconds before on-screen translation.","errors":[],"max_seconds":600}}},"exampleType":"examples"}},"exampleType":"examples"},"d7317e78-4336-453d-b22c-211059cd736e":{"description":"Too many requests. Codes: `rate_limited`, `too_many_concurrent_jobs`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","format":"int32","minimum":0},"example":30}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"rate_limited":{"title":"rate_limited","value":{"type":"https://docs.api.rask.ai/errors/rate_limited","title":"Rate limited","status":429,"detail":"The credential-minute limit was exceeded.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"rate_limited","retryable":true,"retry":"same_key","recommendation":"retry_later","hint":"Wait Retry-After seconds, then retry; policy and limit name the limit that was reached.","errors":[],"policy":"credential-minute","limit":600,"window_seconds":60}},"too_many_concurrent_jobs":{"title":"too_many_concurrent_jobs","value":{"type":"https://docs.api.rask.ai/errors/too_many_concurrent_jobs","title":"Too many concurrent jobs","status":429,"detail":"The payer already has 10 active dub jobs started through the API.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"too_many_concurrent_jobs","retryable":true,"retry":"same_key","recommendation":"wait","hint":"Wait Retry-After seconds for running jobs of this type to finish.","errors":[],"policy":"payer-concurrency","job_type":"dub","active_job_count":10,"limit":10}}},"exampleType":"examples"}},"exampleType":"examples"},"6c9756f5-3494-425c-aa7a-c5c366b95a2e":{"description":"Internal error. Codes: `internal_error`, `plan_configuration_error`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"internal_error":{"title":"internal_error","value":{"type":"https://docs.api.rask.ai/errors/internal_error","title":"Internal error","status":500,"detail":"An internal error occurred.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"internal_error","retryable":true,"retry":"same_key","recommendation":"retry_later","hint":"Retry with the same Idempotency-Key; contact support with the instance id if it persists.","errors":[]}},"plan_configuration_error":{"title":"plan_configuration_error","value":{"type":"https://docs.api.rask.ai/errors/plan_configuration_error","title":"Plan configuration error","status":500,"detail":"The plan's lip-sync configuration is invalid.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"plan_configuration_error","retryable":false,"retry":"none","recommendation":"contact_support","hint":"Stop and contact Rask support with the instance id.","errors":[]}}},"exampleType":"examples"}},"exampleType":"examples"},"9e0d14e6-ef58-4b64-b78d-5d8e4a512196":{"description":"Service unavailable. Codes: `temporarily_unavailable`, `api_unavailable`, `auth_unavailable`, `spending_paused`, `feature_temporarily_disabled`.","headers":{"X-Request-Id":{"description":"Request id (UUID); also the problem `instance` (`urn:uuid:\u003cid>`). Quote it to support.","schema":{"type":"string"},"example":"7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93"},"RateLimit":{"description":"Remaining quota of the most constrained policy (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";r=597;t=42"},"RateLimit-Policy":{"description":"Rate-limit policies that apply to the key (IETF draft-11; provisional).","schema":{"type":"string"},"example":"\"credential-minute\";q=600;w=60, \"account-minute\";q=1800;w=60"},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","format":"int32","minimum":0},"example":30}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","retryable","retry","recommendation","hint","errors"],"properties":{"type":{"type":"string","description":"`https://docs.api.rask.ai/errors/{code}`: one documentation page per code.","format":"uri","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"HTTP status (for a job's error: the status the same failure would have synchronously).","format":"int32","minimum":400,"maximum":599,"isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"detail":{"type":"string","description":"Explanation of this occurrence. May name ids, never user text.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"`urn:uuid:\u003crequest_id>` (also in `X-Request-Id`); for a job's error, `/v3/jobs/{job_id}`.","format":"uri-reference","isRequired":true,"uniqueKey":"instance","typeLabel":"string\u003curi-reference>"},"code":{"type":"string","description":"Stable snake_case code from the problem registry. Branch on this value, never on text.","pattern":"^[a-z][a-z0-9_]*$","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"retryable":{"type":"boolean","description":"True when a retry can succeed; `retry` says how.","isRequired":true,"uniqueKey":"retryable","typeLabel":"boolean"},"retry":{"type":"string","description":"How to retry: `same_key` for request problems that may succeed later, `new_key` for job errors worth a new attempt, `none` otherwise. `retryable` is true exactly when this is not `none`.","enum":["same_key","new_key","none"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"retry","typeLabel":"enum\u003cstring>"},"recommendation":{"type":"string","description":"What has to happen before a retry can succeed; set per code, and per `cause_code` for dub and generation failures (`components.x-rask-job-errors`). `cause_code: unknown`: `retry_later`, or `contact_support` when the same project's previous job of that type also failed with `unknown`.","enum":["fix_request","wait","top_up","retry_later","contact_support"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"recommendation","typeLabel":"enum\u003cstring>"},"hint":{"oneOf":[{"type":"string","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.0","typeLabel":"string"},{"type":"null","description":"One imperative sentence naming the next call or field (\u003c= 160 characters).","maxLength":160,"isRequired":true,"uniqueKey":"hint.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hint","typeLabel":"string | null"},"errors":{"type":"array","items":{"type":"object","description":"One failing field of a request.","required":["pointer","code","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer into the request body (`/operations/3/start_seconds`), or a `query:`, `header:` or `path:` prefixed parameter name.","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"code":{"type":"string","description":"Stable snake_case code of this field error. Segment writes: `invalid_time`, `start_not_before_end`, `beyond_media_duration`, `segment_too_short`, `segment_too_long`, `invalid_speaker_id`, `too_many_speakers`, `text_too_long`, `invalid_text`, `transcript_too_large`, `split_point_outside_segment`, `segments_not_adjacent`, `too_many_segments`, `segment_targeted_twice`, `unknown_segment`, `variant_not_found`; spending requests: `expected_cost_required`; uploads: `part_missing`; generic schema failures use JSON Schema keyword names (`required`, `maxLength`, ...).","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"string","description":"Human-readable explanation. Never contains user text.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"Failing fields; empty when the problem is not about fields.","isRequired":true,"uniqueKey":"errors","typeLabel":"object[]"},"credit_type":{"type":"string","description":"insufficient_balance, token_spend_limit_exceeded: the pool concerned.","enum":["minutes","lipsync_free_minutes","projects"],"x-rask-open-enum":true,"uniqueKey":"credit_type","typeLabel":"enum\u003cstring>"},"required_minutes":{"type":"integer","description":"insufficient_balance, token_spend_limit_exceeded: minutes the request needs.","format":"int32","uniqueKey":"required_minutes","typeLabel":"integer\u003cint32>"},"balance_minutes":{"type":"integer","description":"insufficient_balance: minutes available in the pool.","format":"int32","uniqueKey":"balance_minutes","typeLabel":"integer\u003cint32>"},"required_projects":{"type":"integer","description":"insufficient_balance (projects pool), token_spend_limit_exceeded (projects cap): project credits needed.","format":"int32","uniqueKey":"required_projects","typeLabel":"integer\u003cint32>"},"balance_projects":{"type":"integer","description":"insufficient_balance (projects pool): project credits available.","format":"int32","uniqueKey":"balance_projects","typeLabel":"integer\u003cint32>"},"expected_cost_minutes":{"type":"integer","description":"cost_changed: the cap the request sent.","format":"int32","uniqueKey":"expected_cost_minutes","typeLabel":"integer\u003cint32>"},"current_cost_minutes":{"type":"integer","description":"cost_changed: the current price.","format":"int32","uniqueKey":"current_cost_minutes","typeLabel":"integer\u003cint32>"},"current_etag":{"type":"string","description":"precondition_failed: the resource's current ETag.","uniqueKey":"current_etag","typeLabel":"string"},"required_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"required_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: every scope the request needs, including those of `x-rask-operation.conditional`.","uniqueKey":"required_scopes","typeLabel":"enum\u003cstring>[]"},"granted_scopes":{"type":"array","items":{"type":"string","description":"An API key scope (`resource:action`). `X:write` implies `X:read`; every `*:write` implies `jobs:read`.\nA key reads every job it started. Another credential's job also needs the scope that reads what it works on, as its params and result hold that: `media:read` for `media_import`, `voices:read` for `voice_clone`, `transcripts:read` for `translation` and `segment_generation`, `projects:read` for the rest. Otherwise it answers 404 `job_not_found` and is not listed.\n\n- `account:read`: read me, plan, entitlements, balance and usage\n- `media:read`: read uploads and media\n- `media:write`: create and complete uploads, import from a URL, delete media (implies media:read)\n- `projects:read`: read projects, outputs, subtitles, lip-sync and on-screen state\n- `projects:write`: create, copy, update and delete projects; folders; share links; exports; file restores\n- `transcripts:read`: read transcripts, segments, versions and translation settings\n- `transcripts:write`: edit, split, merge and retranslate segments, import subtitles, save and restore versions, change translation settings\n- `voices:read`: read speakers, the voice catalog and voice clones\n- `voices:write`: change a speaker's voice; create, update and delete voice clones\n- `glossaries:read`: read glossaries\n- `glossaries:write`: create, update and delete glossaries\n- `dubbing:write`: dub and redub, segment generation, localization runs and their estimates\n- `lipsync:write`: lip-sync (face check included) and its estimate\n- `onscreen:write`: on-screen text translation and its estimate\n- `jobs:read`: get, list and wait for jobs\n- `jobs:write`: cancel and resume jobs\n- `webhooks:read`: read webhook endpoints and deliveries\n- `webhooks:write`: create, update, delete, rotate and test webhook endpoints\n- `credits:spend`: additionally required by every operation that can spend credits","enum":["account:read","media:read","media:write","projects:read","projects:write","transcripts:read","transcripts:write","voices:read","voices:write","glossaries:read","glossaries:write","dubbing:write","lipsync:write","onscreen:write","jobs:read","jobs:write","webhooks:read","webhooks:write","credits:spend"],"x-rask-open-enum":true,"uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"insufficient_scope: the key's scopes.","uniqueKey":"granted_scopes","typeLabel":"enum\u003cstring>[]"},"feature":{"type":"string","description":"A plan feature checked server-side on the payer's plan (403 `feature_not_in_plan`).\n\n- `api_access`: use the API at all (checked on every request)\n- `auto_dub`: dub automatically after processing (needs an active subscription)\n- `dubbing_model_choice`: choose the dubbing model; otherwise it is overridden (estimate notice)\n- `free_languages`: free_dubbing language variants\n- `glossary`: attach and manage glossaries\n- `translation_instructions`: custom translation instructions\n- `subtitle_import`: import SRT subtitles when creating a project\n- `subtitle_reimport`: replace a project's transcript from SRT (importTranscript)\n- `subtitle_download`: download subtitles (getProjectSubtitles, subtitle outputs)\n- `burned_subtitles`: export and download videos with burned-in subtitles\n- `audio_download`: download dubbed audio and the voice track\n- `multilanguage`: several target languages per media (copies)\n- `lipsync`: lip-sync\n- `lipsync_paid`: paid lip-sync runs (otherwise only the free run)\n- `lipsync_enhanced`: the Enhanced lip-sync model\n- `lipsync_download`: download lip-synced video\n- `onscreen`: on-screen text translation and download of its video\n- `voice_clones`: workspace voice clones\n- `instant_voice_clone`: a speaker's own cloned voice\n- `share_links`: revocable project share links","enum":["api_access","auto_dub","dubbing_model_choice","free_languages","glossary","translation_instructions","subtitle_import","subtitle_reimport","subtitle_download","burned_subtitles","audio_download","multilanguage","lipsync","lipsync_paid","lipsync_enhanced","lipsync_download","onscreen","voice_clones","instant_voice_clone","share_links"],"x-rask-open-enum":true,"uniqueKey":"feature","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","description":"workspace_access_suspended, source_url_not_allowed, webhook_url_not_allowed, instant_clone_not_available, job_not_resumable, localization_combination_not_supported: machine-readable reason. workspace_access_suspended: `subscription_inactive` (the owner's subscription is not active), `space_limit_exceeded` (the owner has more workspaces than the plan allows), `seat_limit_exceeded` (the key's user is beyond the plan's seats). job_not_resumable: `not_failed_localization`, `already_resumed`, `project_deleted`, `stage_result_gone`. localization_combination_not_supported: `nothing_ordered`, `audio_project`, `plan_trims_lipsync`.","uniqueKey":"reason","typeLabel":"string"},"limit":{"type":"integer","description":"limit_reached, voice_clone_limit_reached, rate_limited, too_many_waiters, too_many_concurrent_jobs, translation_batch_too_large: the limit.","format":"int32","uniqueKey":"limit","typeLabel":"integer\u003cint32>"},"used":{"type":"integer","description":"voice_clone_limit_reached: clones counted against the quota.","format":"int32","uniqueKey":"used","typeLabel":"integer\u003cint32>"},"limit_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): the key's monthly cap on the minutes pool.","format":"int32","uniqueKey":"limit_minutes","typeLabel":"integer\u003cint32>"},"spent_minutes":{"type":"integer","description":"token_spend_limit_exceeded (minutes cap): minutes spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_minutes","typeLabel":"integer\u003cint32>"},"limit_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): the key's monthly cap on project credits.","format":"int32","uniqueKey":"limit_projects","typeLabel":"integer\u003cint32>"},"spent_projects":{"type":"integer","description":"token_spend_limit_exceeded (projects cap): project credits spent this month by the key, with pending deferred spends.","format":"int32","uniqueKey":"spent_projects","typeLabel":"integer\u003cint32>"},"resets_at":{"type":"string","description":"token_spend_limit_exceeded: start of the next UTC month.","format":"date-time","uniqueKey":"resets_at","typeLabel":"string\u003cdate-time>"},"policy":{"type":"string","description":"rate_limited, too_many_waiters, too_many_concurrent_jobs: the exceeded policy or quota. rate_limited: credential-minute, account-minute, spend-minute, upload-hour, auth-fail-ip, translation-hour, clone-create-day, voice-settings-hour, upload-open, upload-bytes-day; too_many_waiters: long-poll (per key and per payer); too_many_concurrent_jobs: payer-concurrency, global-concurrency.","uniqueKey":"policy","typeLabel":"string"},"window_seconds":{"type":"integer","description":"rate_limited: the policy window.","format":"int32","uniqueKey":"window_seconds","typeLabel":"integer\u003cint32>"},"active_job_count":{"type":"integer","description":"too_many_concurrent_jobs: active API and MCP jobs of this type (the payer's, or all of Rask's for global-concurrency).","format":"int32","uniqueKey":"active_job_count","typeLabel":"integer\u003cint32>"},"active_jobs":{"type":"array","items":{"type":"object","description":"A non-terminal job of a project.","required":["id","type","status"],"properties":{"id":{"type":"string","description":"Job id.","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].id","typeLabel":"string"},"type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Job type. Open enum: new types are added over time.\n\n- `media_import`: registering uploaded or imported media (poll hint 3 s; cancelable)\n- `project_processing`: the project pipeline up to translation (poll hint 10 s)\n- `translation`: retranslating segments (poll hint 5 s)\n- `segment_generation`: paid voicing of chosen segments into downloadable clips (poll hint 5 s)\n- `dub`: dubbing or redubbing (poll hint 10 s)\n- `lipsync`: lip-sync (poll hint 30 s)\n- `onscreen`: on-screen text translation (poll hint 15 s; cancelable while queued)\n- `localization`: dub, lip-sync and on-screen as one run with child jobs (poll hint 15 s)\n- `voice_clone`: creating a voice clone (poll hint 10 s)\n- `export`: rendering an export (poll hint 15 s)\n- `file_restore`: restoring archived files (poll hint 300 s)","isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status. Monotonic: never goes backwards and never leaves a terminal state.\n\n- `queued`: accepted, not started\n- `running`: in progress\n- `succeeded`: finished; see result\n- `failed`: finished; see error\n- `canceled`: canceled, or its project was deleted (`error.code = project_deleted`)","enum":["queued","running","succeeded","failed","canceled"],"x-rask-open-enum":true,"isRequired":true,"uniqueKey":"active_jobs.items.[INDEX].status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"active_jobs.items.[INDEX]","typeLabel":"object"},"description":"project_busy: the project's active spending jobs.","uniqueKey":"active_jobs","typeLabel":"object[]"},"active_job_ids":{"type":"array","items":{"type":"string","uniqueKey":"active_job_ids.items.[INDEX]","typeLabel":"string"},"description":"transcript_busy: the active jobs that block a whole-transcript request; absent when concurrent writes kept conflicting.","uniqueKey":"active_job_ids","typeLabel":"string[]"},"segment_ids":{"type":"array","items":{"type":"string","uniqueKey":"segment_ids.items.[INDEX]","typeLabel":"string"},"description":"segment_busy: the busy segments.","uniqueKey":"segment_ids","typeLabel":"string[]"},"job_id":{"oneOf":[{"type":"string","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The blocking job: dub_in_progress, lipsync_in_progress, onscreen_in_progress, project_not_ready and transcript_busy (null when the blocking work has no v3 job, e.g. it was started in the web app; `job_type` still names it), export_in_progress, restore_in_progress, media_in_use, subtitle_import_in_progress. job_not_resumable: the job that already continues this run, when there is one.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_type":{"type":"string","x-rask-open-enum":true,"enum":["media_import","project_processing","translation","segment_generation","dub","lipsync","onscreen","localization","voice_clone","export","file_restore"],"description":"Type of `job_id` (single-flight conflicts), of the job that cannot be canceled or resumed (job_not_cancelable, job_not_resumable), or whose concurrency limit was reached (too_many_concurrent_jobs).","uniqueKey":"job_type","typeLabel":"enum\u003cstring>"},"import_job_id":{"type":"string","description":"media_not_ready: the media_import job to wait for.","uniqueKey":"import_job_id","typeLabel":"string"},"max_seconds":{"type":"integer","description":"onscreen_video_too_long: the plan's limit (`onscreen_max_video_seconds`).","format":"int32","uniqueKey":"max_seconds","typeLabel":"integer\u003cint32>"},"expired_at":{"type":"string","description":"token_expired, upload_expired: when it expired.","format":"date-time","uniqueKey":"expired_at","typeLabel":"string\u003cdate-time>"},"revoked_reason":{"type":"string","description":"token_revoked: why the key was revoked.","uniqueKey":"revoked_reason","typeLabel":"string"},"token_env":{"type":"string","description":"token_wrong_environment: the key's environment (`live` or `test`).","uniqueKey":"token_env","typeLabel":"string"},"server_env":{"type":"string","description":"token_wrong_environment: this server's environment.","uniqueKey":"server_env","typeLabel":"string"},"parameter":{"type":"string","description":"token_in_query: the query parameter that carried a credential.","uniqueKey":"parameter","typeLabel":"string"},"max_upload_bytes":{"type":"integer","description":"media_too_large: the limit in bytes (the plan's upload limit, or a voice-sample limit: 11000000 for audio and stored samples, 500000000 for video).","format":"int64","uniqueKey":"max_upload_bytes","typeLabel":"integer\u003cint64>"},"size_bytes":{"type":"integer","description":"media_too_large: the file size in bytes.","format":"int64","uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"max_source_duration_seconds":{"type":"number","description":"media_too_long: the plan's limit.","format":"double","uniqueKey":"max_source_duration_seconds","typeLabel":"number\u003cdouble>"},"duration_seconds":{"type":"number","description":"media_too_long: the media duration.","format":"double","uniqueKey":"duration_seconds","typeLabel":"number\u003cdouble>"},"declared_size_bytes":{"type":"integer","description":"upload_size_mismatch: size_bytes of the upload.","format":"int64","uniqueKey":"declared_size_bytes","typeLabel":"integer\u003cint64>"},"actual_size_bytes":{"type":"integer","description":"upload_size_mismatch: size of the stored object.","format":"int64","uniqueKey":"actual_size_bytes","typeLabel":"integer\u003cint64>"},"project_count":{"type":"integer","description":"folder_not_empty: live projects in the folder.","format":"int32","uniqueKey":"project_count","typeLabel":"integer\u003cint32>"},"content_type":{"type":"string","description":"unsupported_media_type: the rejected content type.","uniqueKey":"content_type","typeLabel":"string"},"cause_code":{"type":"string","description":"Job errors. lipsync_rejected: the code that rejected the automatic start. dub_voiceover_failed, dub_merge_failed, dub_failed, dub_timeout, segment_generation_failed, segment_generation_timeout (always `unknown` on a timeout): the failure class, one of `segment_changed`, `insufficient_speech`, `voice_configuration`, `missing_translation`, `tts_provider_failed`, `merge_failed`, `unknown` (the default when the class cannot be told). localization_stage_failed, localization_stage_skipped: the code of the stage's own error; `localization_combination_not_supported` when a plan change during the run trimmed the lip-sync, so on-screen was skipped.","uniqueKey":"cause_code","typeLabel":"string"},"failed_stage":{"type":"string","description":"localization_stage_failed, localization_stage_skipped (job error): the stage that ended the run.","enum":["dub","lipsync","onscreen"],"x-rask-open-enum":true,"uniqueKey":"failed_stage","typeLabel":"enum\u003cstring>"}},"description":"RFC 9457 problem details (`application/problem+json`), used for every 4xx/5xx response and for `Job.error`. Branch on `code`; follow `hint`; act as `recommendation` says; retry as `retry` says. An extension member has one type across all codes and never reuses an RFC 9457 or Problem member name (hence `job_type`, and `active_job_count` for a count beside `active_jobs` for a list). Extension members appear only with the codes that define them (see each property). The problem registry and one documentation page per code live at https://docs.api.rask.ai/errors.","additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"temporarily_unavailable":{"title":"temporarily_unavailable","value":{"type":"https://docs.api.rask.ai/errors/temporarily_unavailable","title":"Temporarily unavailable","status":503,"detail":"A dependency is temporarily unavailable.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"temporarily_unavailable","retryable":true,"retry":"same_key","recommendation":"retry_later","hint":"Wait Retry-After seconds and retry.","errors":[]}},"api_unavailable":{"title":"api_unavailable","value":{"type":"https://docs.api.rask.ai/errors/api_unavailable","title":"Api unavailable","status":503,"detail":"The API is temporarily disabled.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"api_unavailable","retryable":true,"retry":"same_key","recommendation":"retry_later","hint":"Wait Retry-After seconds and retry.","errors":[]}},"auth_unavailable":{"title":"auth_unavailable","value":{"type":"https://docs.api.rask.ai/errors/auth_unavailable","title":"Auth unavailable","status":503,"detail":"Credential verification is temporarily unavailable.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"auth_unavailable","retryable":true,"retry":"same_key","recommendation":"retry_later","hint":"Wait Retry-After seconds and retry.","errors":[]}},"spending_paused":{"title":"spending_paused","value":{"type":"https://docs.api.rask.ai/errors/spending_paused","title":"Spending paused","status":503,"detail":"Spending operations are temporarily paused.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"spending_paused","retryable":true,"retry":"same_key","recommendation":"retry_later","hint":"Wait Retry-After seconds; spending operations are paused, reads still work.","errors":[]}},"feature_temporarily_disabled":{"title":"feature_temporarily_disabled","value":{"type":"https://docs.api.rask.ai/errors/feature_temporarily_disabled","title":"Feature temporarily disabled","status":503,"detail":"On-screen translation is temporarily disabled.","instance":"urn:uuid:7d5c0e9a-3f1b-4c2e-9a8d-6b4f2e1c0d93","code":"feature_temporarily_disabled","retryable":true,"retry":"same_key","recommendation":"retry_later","hint":"Wait Retry-After seconds, or continue without this feature.","errors":[],"feature":"onscreen"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"66a494e3-7331-42bc-a04b-729d07bdc35a":{"apiToken":{"type":"http","scheme":"bearer","bearerFormat":"raskai_\u003clive|test>_key_\u003c49 base62 characters>","description":"API key from Settings -> API keys, sent as `Authorization: Bearer \u003ckey>` (SDK environment variable `RASK_API_KEY`). Bound to one workspace and one acting user. Operations list the scopes they need (OpenAPI 3.1 scopes on a bearer scheme).","scopes":["projects:write","credits:spend"],"schemeName":"apiToken"}}},"servers":{"61053d33-b3c1-45e9-9029-d55a58076416":{"url":"https://api.rask.ai/v3","description":"Production."}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"raskai_\u003clive|test>_key_\u003c49 base62 characters>","description":"API key from Settings -> API keys, sent as `Authorization: Bearer \u003ckey>` (SDK environment variable `RASK_API_KEY`). Bound to one workspace and one acting user. Operations list the scopes they need (OpenAPI 3.1 scopes on a bearer scheme).","scopes":["projects:write","credits:spend"],"schemeName":"apiToken"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"API key from Settings -> API keys, sent as `Authorization: Bearer \u003ckey>` (SDK environment variable `RASK_API_KEY`). Bound to one workspace and one acting user. Operations list the scopes they need (OpenAPI 3.1 scopes on a bearer scheme).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiToken","name":"Authorization"}],"title":"apiToken"}]},"originalFileLocation":"openapi.v3.json"},"subdomain":"brask","siteName":"Rask AI API","title":"Create a localization project - Rask AI API","navMaps":{"firstHrefInVersion":{"v3":{"href":"/operations/createProject","matchLevel":0},"v2":{"href":"/introduction","matchLevel":4}},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T14:38:52.685Z","originalFileLocation":"operations/createProject.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Creates a project from a ready media item in one target language and starts its project_processing job (transcription to translation).\">\u003cmeta data-mint-head name=\"application-name\" content=\"Rask AI API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/brask/64TpFZATa3dVq0DX/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/brask/64TpFZATa3dVq0DX/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/brask/64TpFZATa3dVq0DX/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/brask/64TpFZATa3dVq0DX/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/brask/64TpFZATa3dVq0DX/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/brask/64TpFZATa3dVq0DX/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/brask/64TpFZATa3dVq0DX/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/brask/64TpFZATa3dVq0DX/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/brask/64TpFZATa3dVq0DX/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a localization project - Rask AI API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates a project from a ready media item in one target language and starts its project_processing job (transcription to translation).\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Rask AI API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.api.rask.ai/operations/createProject\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://brask.mintlify.site/_mintlify/api/og/v2?division=Projects\u0026amp;title=Create+a+localization+project\u0026amp;description=Creates+a+project+from+a+ready+media+item+in+one+target+language+and+starts+its+project_processing+job+%28transcription+to+translation%29.\u0026amp;theme=0d666554d2a0d7f967d5e07b\u0026amp;signature=2b1470667de982c1c5ce0639cca523a45c4dfaa4dd6be9b3dcae4a837484407e\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create a localization project - Rask AI API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates a project from a ready media item in one target language and starts its project_processing job (transcription to translation).\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://brask.mintlify.site/_mintlify/api/og/v2?division=Projects\u0026amp;title=Create+a+localization+project\u0026amp;description=Creates+a+project+from+a+ready+media+item+in+one+target+language+and+starts+its+project_processing+job+%28transcription+to+translation%29.\u0026amp;theme=0d666554d2a0d7f967d5e07b\u0026amp;signature=2b1470667de982c1c5ce0639cca523a45c4dfaa4dd6be9b3dcae4a837484407e\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/brask/64TpFZATa3dVq0DX/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Rask AI API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0B0BCF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.api.rask.ai/operations/createProject\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/operations/createProject.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.api.rask.ai/#organization\",\"name\":\"Rask AI API\",\"url\":\"https://docs.api.rask.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/brask/hT_Hdq5wOpSqsld0/logo/black.svg?fit=max\u0026auto=format\u0026n=hT_Hdq5wOpSqsld0\u0026q=85\u0026s=89737eaceb0bbdbadb10eeb2e0537eee\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.api.rask.ai#website\",\"name\":\"Rask AI API\",\"url\":\"https://docs.api.rask.ai\",\"publisher\":{\"@id\":\"https://docs.api.rask.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.api.rask.ai/operations/createProject#webpage\",\"url\":\"https://docs.api.rask.ai/operations/createProject\",\"name\":\"Create a localization project\",\"description\":\"Creates a project from a ready media item in one target language and starts its project_processing job (transcription to translation).\",\"dateModified\":\"2026-11-12T14:38:52.685Z\",\"isPartOf\":{\"@id\":\"https://docs.api.rask.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.api.rask.ai/operations/createProject#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.api.rask.ai/operations/createProject#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Projects\",\"item\":\"https://docs.api.rask.ai/operations/listFolders\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a localization project\",\"item\":\"https://docs.api.rask.ai/operations/createProject\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.api.rask.ai/operations/createProject#apireference\",\"headline\":\"Create a localization project\",\"name\":\"Create a localization project\",\"description\":\"Creates a project from a ready media item in one target language and starts its project_processing job (transcription to translation).\",\"url\":\"https://docs.api.rask.ai/operations/createProject\",\"mainEntityOfPage\":{\"@id\":\"https://docs.api.rask.ai/operations/createProject#webpage\"},\"dateModified\":\"2026-11-12T14:38:52.685Z\",\"publisher\":{\"@id\":\"https://docs.api.rask.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.api.rask.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Rask AI API\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Rask AI API\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/operations/createProject.md","siteName":"Rask AI API","nav":{"global":{"anchors":[{"anchor":"Blog","href":"https://www.rask.ai/blog","icon":"newspaper"}]},"versions":[{"version":"v3","anchors":[{"anchor":"Documentation","icon":"book-open","groups":[{"group":"Get started","pages":[{"title":"Rask API v3","sidebarTitle":"Introduction","href":"/v3/introduction"},{"title":"Quickstart: dub a video from upload to download","sidebarTitle":"Quickstart","href":"/v3/quickstart"},{"title":"API v3 authentication: keys, scopes and caps","sidebarTitle":"Authentication","href":"/authentication"},{"title":"SDKs for Rask API v3","sidebarTitle":"SDKs","href":"/v3/sdks"},{"title":"Move from API v2 to v3","sidebarTitle":"Move from v2","href":"/v3/migrate-from-v2"}]},{"group":"AI agents","pages":[{"title":"Use Rask from an AI agent: prompt, key and spending","sidebarTitle":"Use from an agent","href":"/v3/agents"},{"title":"Rask MCP server: connect, tools and confirmation","sidebarTitle":"MCP server","href":"/v3/mcp"}]},{"group":"Recipes","pages":[{"title":"Choose the dubbing model and read it back","sidebarTitle":"Dubbing model","href":"/v3/recipes/dubbing-model"},{"title":"Create a project from your own transcript","sidebarTitle":"Your own transcript","href":"/v3/recipes/own-transcript"},{"title":"Clone a voice and set its settings","sidebarTitle":"Voice clones","href":"/v3/recipes/voice-clone"},{"title":"Voice chosen segments, then assemble with a dub","sidebarTitle":"Segment generation","href":"/v3/recipes/segment-generation"},{"title":"Lip-sync a dubbed video with a model","sidebarTitle":"Lip-sync","href":"/v3/recipes/lipsync"},{"title":"Translate on-screen text","sidebarTitle":"On-screen text","href":"/v3/recipes/onscreen"},{"title":"One request for dub, lip-sync and on-screen","sidebarTitle":"One request for everything","href":"/v3/recipes/localization-run"},{"title":"Download every output","sidebarTitle":"Downloads","href":"/v3/recipes/downloads"},{"title":"Spend, balance and errors","sidebarTitle":"Spend, balance, errors","href":"/v3/recipes/spend-balance-errors"}]},{"group":"Concepts","pages":[{"title":"Glossary: the words this API uses","sidebarTitle":"Glossary","href":"/v3/concepts/glossary"},{"title":"Conventions: requests, responses and lists","sidebarTitle":"Conventions","href":"/v3/concepts/conventions"},{"title":"Jobs and long-polling","sidebarTitle":"Jobs and long-polling","href":"/v3/concepts/jobs"},{"title":"Idempotency and retries","sidebarTitle":"Idempotency and retries","href":"/v3/concepts/idempotency"},{"title":"ETags and If-Match","sidebarTitle":"ETags and If-Match","href":"/v3/concepts/etags"},{"title":"Paid text: closed until the first dub is charged","sidebarTitle":"Paid text","href":"/v3/concepts/paid-text"},{"title":"Capabilities, models and plan limits","sidebarTitle":"Capabilities and limits","href":"/v3/concepts/capabilities"},{"title":"Prices and refunds","sidebarTitle":"Prices and refunds","href":"/v3/concepts/pricing"},{"title":"Operation table","sidebarTitle":"Operation table","href":"/v3/concepts/operation-table"},{"title":"API v3 changelog","sidebarTitle":"Changelog","href":"/changelog"}]},{"group":"Errors","pages":[{"title":"Errors","sidebarTitle":"All error codes","href":"/errors"},{"group":"400 Bad request","pages":[{"title":"idempotency_key_required","sidebarTitle":"idempotency_key_required","href":"/errors/idempotency_key_required"},{"title":"invalid_cursor","sidebarTitle":"invalid_cursor","href":"/errors/invalid_cursor"},{"title":"token_in_query","sidebarTitle":"token_in_query","href":"/errors/token_in_query"}]},{"group":"401 and 403 Access","pages":[{"title":"account_disabled","sidebarTitle":"account_disabled","href":"/errors/account_disabled"},{"title":"authentication_required","sidebarTitle":"authentication_required","href":"/errors/authentication_required"},{"title":"demo_project_read_only","sidebarTitle":"demo_project_read_only","href":"/errors/demo_project_read_only"},{"title":"feature_not_in_plan","sidebarTitle":"feature_not_in_plan","href":"/errors/feature_not_in_plan"},{"title":"forbidden","sidebarTitle":"forbidden","href":"/errors/forbidden"},{"title":"insufficient_scope","sidebarTitle":"insufficient_scope","href":"/errors/insufficient_scope"},{"title":"invalid_token","sidebarTitle":"invalid_token","href":"/errors/invalid_token"},{"title":"prepare_mode_not_enabled","sidebarTitle":"prepare_mode_not_enabled","href":"/errors/prepare_mode_not_enabled"},{"title":"token_expired","sidebarTitle":"token_expired","href":"/errors/token_expired"},{"title":"token_revoked","sidebarTitle":"token_revoked","href":"/errors/token_revoked"},{"title":"token_spend_limit_exceeded","sidebarTitle":"token_spend_limit_exceeded","href":"/errors/token_spend_limit_exceeded"},{"title":"token_wrong_environment","sidebarTitle":"token_wrong_environment","href":"/errors/token_wrong_environment"},{"title":"trial_project_dub_not_allowed","sidebarTitle":"trial_project_dub_not_allowed","href":"/errors/trial_project_dub_not_allowed"},{"title":"voice_clone_limit_reached","sidebarTitle":"voice_clone_limit_reached","href":"/errors/voice_clone_limit_reached"},{"title":"workspace_access_suspended","sidebarTitle":"workspace_access_suspended","href":"/errors/workspace_access_suspended"}]},{"group":"402 Balance","pages":[{"title":"insufficient_balance","sidebarTitle":"insufficient_balance","href":"/errors/insufficient_balance"}]},{"group":"404 and 410 Missing","pages":[{"title":"folder_not_found","sidebarTitle":"folder_not_found","href":"/errors/folder_not_found"},{"title":"glossary_not_found","sidebarTitle":"glossary_not_found","href":"/errors/glossary_not_found"},{"title":"job_not_found","sidebarTitle":"job_not_found","href":"/errors/job_not_found"},{"title":"media_not_found","sidebarTitle":"media_not_found","href":"/errors/media_not_found"},{"title":"method_not_allowed","sidebarTitle":"method_not_allowed","href":"/errors/method_not_allowed"},{"title":"not_found","sidebarTitle":"not_found","href":"/errors/not_found"},{"title":"project_not_found","sidebarTitle":"project_not_found","href":"/errors/project_not_found"},{"title":"segment_not_found","sidebarTitle":"segment_not_found","href":"/errors/segment_not_found"},{"title":"speaker_not_found","sidebarTitle":"speaker_not_found","href":"/errors/speaker_not_found"},{"title":"transcript_version_not_found","sidebarTitle":"transcript_version_not_found","href":"/errors/transcript_version_not_found"},{"title":"upload_expired","sidebarTitle":"upload_expired","href":"/errors/upload_expired"},{"title":"upload_not_found","sidebarTitle":"upload_not_found","href":"/errors/upload_not_found"},{"title":"voice_clone_not_found","sidebarTitle":"voice_clone_not_found","href":"/errors/voice_clone_not_found"}]},{"group":"409 Conflict","pages":[{"title":"cost_changed","sidebarTitle":"cost_changed","href":"/errors/cost_changed"},{"title":"dub_in_progress","sidebarTitle":"dub_in_progress","href":"/errors/dub_in_progress"},{"title":"dub_payment_required","sidebarTitle":"dub_payment_required","href":"/errors/dub_payment_required"},{"title":"dub_up_to_date","sidebarTitle":"dub_up_to_date","href":"/errors/dub_up_to_date"},{"title":"export_in_progress","sidebarTitle":"export_in_progress","href":"/errors/export_in_progress"},{"title":"folder_not_empty","sidebarTitle":"folder_not_empty","href":"/errors/folder_not_empty"},{"title":"free_lipsync_already_used","sidebarTitle":"free_lipsync_already_used","href":"/errors/free_lipsync_already_used"},{"title":"idempotency_key_in_use","sidebarTitle":"idempotency_key_in_use","href":"/errors/idempotency_key_in_use"},{"title":"job_already_finished","sidebarTitle":"job_already_finished","href":"/errors/job_already_finished"},{"title":"job_not_cancelable","sidebarTitle":"job_not_cancelable","href":"/errors/job_not_cancelable"},{"title":"job_not_resumable","sidebarTitle":"job_not_resumable","href":"/errors/job_not_resumable"},{"title":"lipsync_already_done","sidebarTitle":"lipsync_already_done","href":"/errors/lipsync_already_done"},{"title":"lipsync_in_progress","sidebarTitle":"lipsync_in_progress","href":"/errors/lipsync_in_progress"},{"title":"media_in_use","sidebarTitle":"media_in_use","href":"/errors/media_in_use"},{"title":"media_not_ready","sidebarTitle":"media_not_ready","href":"/errors/media_not_ready"},{"title":"no_face_detected","sidebarTitle":"no_face_detected","href":"/errors/no_face_detected"},{"title":"no_previous_dub","sidebarTitle":"no_previous_dub","href":"/errors/no_previous_dub"},{"title":"onscreen_in_progress","sidebarTitle":"onscreen_in_progress","href":"/errors/onscreen_in_progress"},{"title":"project_busy","sidebarTitle":"project_busy","href":"/errors/project_busy"},{"title":"project_media_restoring","sidebarTitle":"project_media_restoring","href":"/errors/project_media_restoring"},{"title":"project_not_dubbed","sidebarTitle":"project_not_dubbed","href":"/errors/project_not_dubbed"},{"title":"project_not_ready","sidebarTitle":"project_not_ready","href":"/errors/project_not_ready"},{"title":"restore_in_progress","sidebarTitle":"restore_in_progress","href":"/errors/restore_in_progress"},{"title":"segment_busy","sidebarTitle":"segment_busy","href":"/errors/segment_busy"},{"title":"subtitle_import_in_progress","sidebarTitle":"subtitle_import_in_progress","href":"/errors/subtitle_import_in_progress"},{"title":"transcript_busy","sidebarTitle":"transcript_busy","href":"/errors/transcript_busy"},{"title":"transcript_not_ready","sidebarTitle":"transcript_not_ready","href":"/errors/transcript_not_ready"},{"title":"transcript_replaced","sidebarTitle":"transcript_replaced","href":"/errors/transcript_replaced"},{"title":"upload_incomplete","sidebarTitle":"upload_incomplete","href":"/errors/upload_incomplete"},{"title":"upload_not_pending","sidebarTitle":"upload_not_pending","href":"/errors/upload_not_pending"},{"title":"voice_clone_in_use","sidebarTitle":"voice_clone_in_use","href":"/errors/voice_clone_in_use"},{"title":"voice_clone_not_ready","sidebarTitle":"voice_clone_not_ready","href":"/errors/voice_clone_not_ready"},{"title":"voices_not_assigned","sidebarTitle":"voices_not_assigned","href":"/errors/voices_not_assigned"}]},{"group":"412 and 428 Preconditions","pages":[{"title":"precondition_failed","sidebarTitle":"precondition_failed","href":"/errors/precondition_failed"},{"title":"precondition_required","sidebarTitle":"precondition_required","href":"/errors/precondition_required"}]},{"group":"413, 415 and 422 Input","pages":[{"title":"auto_dub_required","sidebarTitle":"auto_dub_required","href":"/errors/auto_dub_required"},{"title":"field_not_updatable","sidebarTitle":"field_not_updatable","href":"/errors/field_not_updatable"},{"title":"glossary_entries_invalid","sidebarTitle":"glossary_entries_invalid","href":"/errors/glossary_entries_invalid"},{"title":"glossary_language_mismatch","sidebarTitle":"glossary_language_mismatch","href":"/errors/glossary_language_mismatch"},{"title":"glossary_language_pair_not_supported","sidebarTitle":"glossary_language_pair_not_supported","href":"/errors/glossary_language_pair_not_supported"},{"title":"idempotency_key_reused","sidebarTitle":"idempotency_key_reused","href":"/errors/idempotency_key_reused"},{"title":"instant_clone_not_available","sidebarTitle":"instant_clone_not_available","href":"/errors/instant_clone_not_available"},{"title":"invalid_date_range","sidebarTitle":"invalid_date_range","href":"/errors/invalid_date_range"},{"title":"localization_combination_not_supported","sidebarTitle":"localization_combination_not_supported","href":"/errors/localization_combination_not_supported"},{"title":"media_processing_failed","sidebarTitle":"media_processing_failed","href":"/errors/media_processing_failed"},{"title":"media_purpose_mismatch","sidebarTitle":"media_purpose_mismatch","href":"/errors/media_purpose_mismatch"},{"title":"media_too_large","sidebarTitle":"media_too_large","href":"/errors/media_too_large"},{"title":"media_too_long","sidebarTitle":"media_too_long","href":"/errors/media_too_long"},{"title":"onscreen_language_not_supported","sidebarTitle":"onscreen_language_not_supported","href":"/errors/onscreen_language_not_supported"},{"title":"onscreen_video_too_long","sidebarTitle":"onscreen_video_too_long","href":"/errors/onscreen_video_too_long"},{"title":"request_too_large","sidebarTitle":"request_too_large","href":"/errors/request_too_large"},{"title":"segments_missing_translation","sidebarTitle":"segments_missing_translation","href":"/errors/segments_missing_translation"},{"title":"source_language_not_supported","sidebarTitle":"source_language_not_supported","href":"/errors/source_language_not_supported"},{"title":"source_url_not_allowed","sidebarTitle":"source_url_not_allowed","href":"/errors/source_url_not_allowed"},{"title":"speaker_has_no_speech","sidebarTitle":"speaker_has_no_speech","href":"/errors/speaker_has_no_speech"},{"title":"subtitles_invalid","sidebarTitle":"subtitles_invalid","href":"/errors/subtitles_invalid"},{"title":"target_language_not_supported","sidebarTitle":"target_language_not_supported","href":"/errors/target_language_not_supported"},{"title":"translation_batch_too_large","sidebarTitle":"translation_batch_too_large","href":"/errors/translation_batch_too_large"},{"title":"unsupported_media_type","sidebarTitle":"unsupported_media_type","href":"/errors/unsupported_media_type"},{"title":"upload_size_mismatch","sidebarTitle":"upload_size_mismatch","href":"/errors/upload_size_mismatch"},{"title":"validation_failed","sidebarTitle":"validation_failed","href":"/errors/validation_failed"},{"title":"voice_not_in_pool","sidebarTitle":"voice_not_in_pool","href":"/errors/voice_not_in_pool"}]},{"group":"429 Limits","pages":[{"title":"rate_limited","sidebarTitle":"rate_limited","href":"/errors/rate_limited"},{"title":"too_many_concurrent_jobs","sidebarTitle":"too_many_concurrent_jobs","href":"/errors/too_many_concurrent_jobs"},{"title":"too_many_waiters","sidebarTitle":"too_many_waiters","href":"/errors/too_many_waiters"}]},{"group":"5xx Server","pages":[{"title":"api_unavailable","sidebarTitle":"api_unavailable","href":"/errors/api_unavailable"},{"title":"auth_unavailable","sidebarTitle":"auth_unavailable","href":"/errors/auth_unavailable"},{"title":"feature_temporarily_disabled","sidebarTitle":"feature_temporarily_disabled","href":"/errors/feature_temporarily_disabled"},{"title":"internal_error","sidebarTitle":"internal_error","href":"/errors/internal_error"},{"title":"plan_configuration_error","sidebarTitle":"plan_configuration_error","href":"/errors/plan_configuration_error"},{"title":"spending_paused","sidebarTitle":"spending_paused","href":"/errors/spending_paused"},{"title":"temporarily_unavailable","sidebarTitle":"temporarily_unavailable","href":"/errors/temporarily_unavailable"}]},{"group":"Inside a job","pages":[{"title":"audio_separation_failed","sidebarTitle":"audio_separation_failed","href":"/errors/audio_separation_failed"},{"title":"dub_failed","sidebarTitle":"dub_failed","href":"/errors/dub_failed"},{"title":"dub_merge_failed","sidebarTitle":"dub_merge_failed","href":"/errors/dub_merge_failed"},{"title":"dub_timeout","sidebarTitle":"dub_timeout","href":"/errors/dub_timeout"},{"title":"dub_voiceover_failed","sidebarTitle":"dub_voiceover_failed","href":"/errors/dub_voiceover_failed"},{"title":"export_failed","sidebarTitle":"export_failed","href":"/errors/export_failed"},{"title":"face_check_failed","sidebarTitle":"face_check_failed","href":"/errors/face_check_failed"},{"title":"lipsync_failed","sidebarTitle":"lipsync_failed","href":"/errors/lipsync_failed"},{"title":"lipsync_rejected","sidebarTitle":"lipsync_rejected","href":"/errors/lipsync_rejected"},{"title":"lipsync_timeout","sidebarTitle":"lipsync_timeout","href":"/errors/lipsync_timeout"},{"title":"localization_stage_failed","sidebarTitle":"localization_stage_failed","href":"/errors/localization_stage_failed"},{"title":"localization_stage_skipped","sidebarTitle":"localization_stage_skipped","href":"/errors/localization_stage_skipped"},{"title":"media_corrupt","sidebarTitle":"media_corrupt","href":"/errors/media_corrupt"},{"title":"no_audio_track","sidebarTitle":"no_audio_track","href":"/errors/no_audio_track"},{"title":"no_speech_detected","sidebarTitle":"no_speech_detected","href":"/errors/no_speech_detected"},{"title":"onscreen_charge_failed","sidebarTitle":"onscreen_charge_failed","href":"/errors/onscreen_charge_failed"},{"title":"onscreen_finalize_timeout","sidebarTitle":"onscreen_finalize_timeout","href":"/errors/onscreen_finalize_timeout"},{"title":"onscreen_invalid_result","sidebarTitle":"onscreen_invalid_result","href":"/errors/onscreen_invalid_result"},{"title":"onscreen_provider_unavailable","sidebarTitle":"onscreen_provider_unavailable","href":"/errors/onscreen_provider_unavailable"},{"title":"onscreen_publish_failed","sidebarTitle":"onscreen_publish_failed","href":"/errors/onscreen_publish_failed"},{"title":"onscreen_queue_timeout","sidebarTitle":"onscreen_queue_timeout","href":"/errors/onscreen_queue_timeout"},{"title":"onscreen_runner_failed","sidebarTitle":"onscreen_runner_failed","href":"/errors/onscreen_runner_failed"},{"title":"onscreen_runner_lost","sidebarTitle":"onscreen_runner_lost","href":"/errors/onscreen_runner_lost"},{"title":"onscreen_source_unavailable","sidebarTitle":"onscreen_source_unavailable","href":"/errors/onscreen_source_unavailable"},{"title":"project_deleted","sidebarTitle":"project_deleted","href":"/errors/project_deleted"},{"title":"project_processing_timeout","sidebarTitle":"project_processing_timeout","href":"/errors/project_processing_timeout"},{"title":"restore_failed","sidebarTitle":"restore_failed","href":"/errors/restore_failed"},{"title":"segment_generation_failed","sidebarTitle":"segment_generation_failed","href":"/errors/segment_generation_failed"},{"title":"segment_generation_timeout","sidebarTitle":"segment_generation_timeout","href":"/errors/segment_generation_timeout"},{"title":"source_download_failed","sidebarTitle":"source_download_failed","href":"/errors/source_download_failed"},{"title":"source_unavailable","sidebarTitle":"source_unavailable","href":"/errors/source_unavailable"},{"title":"speaker_detection_failed","sidebarTitle":"speaker_detection_failed","href":"/errors/speaker_detection_failed"},{"title":"subtitle_import_rolled_back","sidebarTitle":"subtitle_import_rolled_back","href":"/errors/subtitle_import_rolled_back"},{"title":"transcription_failed","sidebarTitle":"transcription_failed","href":"/errors/transcription_failed"},{"title":"translation_dispatch_failed","sidebarTitle":"translation_dispatch_failed","href":"/errors/translation_dispatch_failed"},{"title":"translation_failed","sidebarTitle":"translation_failed","href":"/errors/translation_failed"},{"title":"translation_timeout","sidebarTitle":"translation_timeout","href":"/errors/translation_timeout"},{"title":"voice_clone_failed","sidebarTitle":"voice_clone_failed","href":"/errors/voice_clone_failed"},{"title":"voice_clone_timeout","sidebarTitle":"voice_clone_timeout","href":"/errors/voice_clone_timeout"}]}]},{"group":"Account","pages":[{"title":"Get the payer's credit balance","sidebarTitle":"getBalance","openapi":"openapi.v3.json GET /balance","href":"/operations/getBalance"},{"title":"Get the calling key, user and workspace","sidebarTitle":"getMe","openapi":"openapi.v3.json GET /me","href":"/operations/getMe"},{"title":"Get the payer's plan, entitlements and limits","sidebarTitle":"getPlan","openapi":"openapi.v3.json GET /plan","href":"/operations/getPlan"}]},{"group":"Usage","pages":[{"title":"Get aggregated credit usage","sidebarTitle":"getUsage","openapi":"openapi.v3.json GET /usage","href":"/operations/getUsage"},{"title":"List credit usage events","sidebarTitle":"listUsageEvents","openapi":"openapi.v3.json GET /usage/events","href":"/operations/listUsageEvents"}]},{"group":"Catalogs","pages":[{"title":"List supported languages and capabilities","sidebarTitle":"listLanguages","openapi":"openapi.v3.json GET /languages","href":"/operations/listLanguages"}]},{"group":"Uploads","pages":[{"title":"Create a presigned upload","sidebarTitle":"createUpload","openapi":"openapi.v3.json POST /uploads","href":"/operations/createUpload"},{"title":"Get an upload and refresh its upload URLs","sidebarTitle":"getUpload","openapi":"openapi.v3.json GET /uploads/{upload_id}","href":"/operations/getUpload"},{"title":"Abort a pending upload","sidebarTitle":"deleteUpload","openapi":"openapi.v3.json DELETE /uploads/{upload_id}","href":"/operations/deleteUpload"},{"title":"Complete an upload and import the media","sidebarTitle":"completeUpload","openapi":"openapi.v3.json POST /uploads/{upload_id}/complete","href":"/operations/completeUpload"}]},{"group":"Media","pages":[{"title":"List media in the workspace","sidebarTitle":"listMedia","openapi":"openapi.v3.json GET /media","href":"/operations/listMedia"},{"title":"Import media from a public URL","sidebarTitle":"importMedia","openapi":"openapi.v3.json POST /media/import","href":"/operations/importMedia"},{"title":"Get a media item","sidebarTitle":"getMedia","openapi":"openapi.v3.json GET /media/{media_id}","href":"/operations/getMedia"},{"title":"Delete a media item","sidebarTitle":"deleteMedia","openapi":"openapi.v3.json DELETE /media/{media_id}","href":"/operations/deleteMedia"}]},{"group":"Projects","pages":[{"title":"List folders","sidebarTitle":"listFolders","openapi":"openapi.v3.json GET /folders","href":"/operations/listFolders"},{"title":"Create a folder","sidebarTitle":"createFolder","openapi":"openapi.v3.json POST /folders","href":"/operations/createFolder"},{"title":"Get a folder","sidebarTitle":"getFolder","openapi":"openapi.v3.json GET /folders/{folder_id}","href":"/operations/getFolder"},{"title":"Rename or pin a folder","sidebarTitle":"updateFolder","openapi":"openapi.v3.json PATCH /folders/{folder_id}","href":"/operations/updateFolder"},{"title":"Delete an empty folder","sidebarTitle":"deleteFolder","openapi":"openapi.v3.json DELETE /folders/{folder_id}","href":"/operations/deleteFolder"},{"title":"List projects","sidebarTitle":"listProjects","description":"Lists the workspace's projects newest first (items have outputs: null; use getProject or listProjectOutputs for links).","openapi":"openapi.v3.json GET /projects","href":"/operations/listProjects"},{"title":"Create a localization project","sidebarTitle":"createProject","openapi":"openapi.v3.json POST /projects","href":"/operations/createProject"},{"title":"Delete several projects","sidebarTitle":"deleteProjectBatch","description":"Soft-deletes 1-50 projects in one transaction.","openapi":"openapi.v3.json DELETE /projects","href":"/operations/deleteProjectBatch"},{"title":"Estimate the cost of creating a project","sidebarTitle":"estimateProject","openapi":"openapi.v3.json POST /projects/estimate","href":"/operations/estimateProject"},{"title":"Get a project","sidebarTitle":"getProject","openapi":"openapi.v3.json GET /projects/{project_id}","href":"/operations/getProject"},{"title":"Update a project's name, folder or metadata","sidebarTitle":"updateProject","openapi":"openapi.v3.json PATCH /projects/{project_id}","href":"/operations/updateProject"},{"title":"Delete a project","sidebarTitle":"deleteProject","openapi":"openapi.v3.json DELETE /projects/{project_id}","href":"/operations/deleteProject"},{"title":"Copy a project into other target languages","sidebarTitle":"createProjectCopies","openapi":"openapi.v3.json POST /projects/{project_id}/copies","href":"/operations/createProjectCopies"},{"title":"Estimate copies of a project","sidebarTitle":"estimateProjectCopies","openapi":"openapi.v3.json POST /projects/{project_id}/copies/estimate","href":"/operations/estimateProjectCopies"}]},{"group":"Exports","pages":[{"title":"Export a video with burned-in subtitles","sidebarTitle":"createExport","openapi":"openapi.v3.json POST /projects/{project_id}/exports","href":"/operations/createExport"},{"title":"Restore a project's archived files","sidebarTitle":"createFileRestore","openapi":"openapi.v3.json POST /projects/{project_id}/file-restores","href":"/operations/createFileRestore"},{"title":"List a project's downloadable outputs","sidebarTitle":"listProjectOutputs","openapi":"openapi.v3.json GET /projects/{project_id}/outputs","href":"/operations/listProjectOutputs"},{"title":"Render a project's subtitles","sidebarTitle":"getProjectSubtitles","openapi":"openapi.v3.json GET /projects/{project_id}/subtitles","href":"/operations/getProjectSubtitles"}]},{"group":"Glossaries","pages":[{"title":"List glossaries","sidebarTitle":"listGlossaries","openapi":"openapi.v3.json GET /glossaries","href":"/operations/listGlossaries"},{"title":"Create a glossary","sidebarTitle":"createGlossary","openapi":"openapi.v3.json POST /glossaries","href":"/operations/createGlossary"},{"title":"Get a glossary with its entries","sidebarTitle":"getGlossary","openapi":"openapi.v3.json GET /glossaries/{glossary_id}","href":"/operations/getGlossary"},{"title":"Update a glossary","sidebarTitle":"updateGlossary","openapi":"openapi.v3.json PATCH /glossaries/{glossary_id}","href":"/operations/updateGlossary"},{"title":"Delete a glossary","sidebarTitle":"deleteGlossary","openapi":"openapi.v3.json DELETE /glossaries/{glossary_id}","href":"/operations/deleteGlossary"}]},{"group":"Jobs","pages":[{"title":"List jobs","sidebarTitle":"listJobs","openapi":"openapi.v3.json GET /jobs","href":"/operations/listJobs"},{"title":"Get a job, optionally waiting for a change","sidebarTitle":"getJob","openapi":"openapi.v3.json GET /jobs/{job_id}","href":"/operations/getJob"},{"title":"Cancel a job","sidebarTitle":"cancelJob","openapi":"openapi.v3.json POST /jobs/{job_id}/cancel","href":"/operations/cancelJob"},{"title":"Resume a failed localization job","sidebarTitle":"resumeJob","openapi":"openapi.v3.json POST /jobs/{job_id}/resume","href":"/operations/resumeJob"}]},{"group":"Transcript","pages":[{"title":"Retranslate segments","sidebarTitle":"retranslateSegments","openapi":"openapi.v3.json POST /projects/{project_id}/retranslation","href":"/operations/retranslateSegments"},{"title":"Get a project's transcript summary","sidebarTitle":"getTranscript","openapi":"openapi.v3.json GET /projects/{project_id}/transcript","href":"/operations/getTranscript"},{"title":"Replace the transcript from SRT subtitles","sidebarTitle":"importTranscript","openapi":"openapi.v3.json POST /projects/{project_id}/transcript/import","href":"/operations/importTranscript"},{"title":"Get a project's translation settings","sidebarTitle":"getTranslationSettings","openapi":"openapi.v3.json GET /projects/{project_id}/translation-settings","href":"/operations/getTranslationSettings"},{"title":"Update translation instructions or glossary","sidebarTitle":"updateTranslationSettings","openapi":"openapi.v3.json PATCH /projects/{project_id}/translation-settings","href":"/operations/updateTranslationSettings"}]},{"group":"Segments","pages":[{"title":"List transcript segments","sidebarTitle":"listSegments","openapi":"openapi.v3.json GET /projects/{project_id}/segments","href":"/operations/listSegments"},{"title":"Insert a segment","sidebarTitle":"createSegment","openapi":"openapi.v3.json POST /projects/{project_id}/segments","href":"/operations/createSegment"},{"title":"Merge adjacent segments","sidebarTitle":"mergeSegments","openapi":"openapi.v3.json POST /projects/{project_id}/segments/merge","href":"/operations/mergeSegments"},{"title":"Get a segment","sidebarTitle":"getSegment","openapi":"openapi.v3.json GET /projects/{project_id}/segments/{segment_id}","href":"/operations/getSegment"},{"title":"Update a segment","sidebarTitle":"updateSegment","openapi":"openapi.v3.json PATCH /projects/{project_id}/segments/{segment_id}","href":"/operations/updateSegment"},{"title":"Delete a segment","sidebarTitle":"deleteSegment","openapi":"openapi.v3.json DELETE /projects/{project_id}/segments/{segment_id}","href":"/operations/deleteSegment"},{"title":"Select a translation variant for a segment","sidebarTitle":"selectTranslationVariant","openapi":"openapi.v3.json POST /projects/{project_id}/segments/{segment_id}/select-variant","href":"/operations/selectTranslationVariant"},{"title":"Split a segment in two","sidebarTitle":"splitSegment","openapi":"openapi.v3.json POST /projects/{project_id}/segments/{segment_id}/split","href":"/operations/splitSegment"}]},{"group":"Versions","pages":[{"title":"List transcript versions","sidebarTitle":"listTranscriptVersions","openapi":"openapi.v3.json GET /projects/{project_id}/transcript/versions","href":"/operations/listTranscriptVersions"},{"title":"Save a transcript version","sidebarTitle":"createTranscriptVersion","openapi":"openapi.v3.json POST /projects/{project_id}/transcript/versions","href":"/operations/createTranscriptVersion"},{"title":"Get a transcript version","sidebarTitle":"getTranscriptVersion","openapi":"openapi.v3.json GET /projects/{project_id}/transcript/versions/{version_number}","href":"/operations/getTranscriptVersion"},{"title":"Restore a transcript version","sidebarTitle":"restoreTranscriptVersion","openapi":"openapi.v3.json POST /projects/{project_id}/transcript/versions/{version_number}/restore","href":"/operations/restoreTranscriptVersion"},{"title":"List the segments of a transcript version","sidebarTitle":"listTranscriptVersionSegments","openapi":"openapi.v3.json GET /projects/{project_id}/transcript/versions/{version_number}/segments","href":"/operations/listTranscriptVersionSegments"}]},{"group":"Speakers","pages":[{"title":"List a project's speakers","sidebarTitle":"listSpeakers","openapi":"openapi.v3.json GET /projects/{project_id}/speakers","href":"/operations/listSpeakers"},{"title":"Get a speaker","sidebarTitle":"getSpeaker","openapi":"openapi.v3.json GET /projects/{project_id}/speakers/{speaker_id}","href":"/operations/getSpeaker"},{"title":"Set a speaker's voice","sidebarTitle":"updateSpeakerVoice","openapi":"openapi.v3.json PUT /projects/{project_id}/speakers/{speaker_id}/voice","href":"/operations/updateSpeakerVoice"}]},{"group":"Voices","pages":[{"title":"List voices available to a project","sidebarTitle":"listProjectVoices","openapi":"openapi.v3.json GET /projects/{project_id}/voices","href":"/operations/listProjectVoices"},{"title":"List voices for a target language","sidebarTitle":"listVoices","openapi":"openapi.v3.json GET /voices","href":"/operations/listVoices"}]},{"group":"Voice clones","pages":[{"title":"List voice clones","sidebarTitle":"listVoiceClones","openapi":"openapi.v3.json GET /voice-clones","href":"/operations/listVoiceClones"},{"title":"Create a voice clone","sidebarTitle":"createVoiceClone","openapi":"openapi.v3.json POST /voice-clones","href":"/operations/createVoiceClone"},{"title":"Get the voice clone quota","sidebarTitle":"getVoiceCloneQuota","openapi":"openapi.v3.json GET /voice-clones/quota","href":"/operations/getVoiceCloneQuota"},{"title":"Get a voice clone","sidebarTitle":"getVoiceClone","openapi":"openapi.v3.json GET /voice-clones/{voice_clone_id}","href":"/operations/getVoiceClone"},{"title":"Rename a voice clone or change its settings","sidebarTitle":"updateVoiceClone","openapi":"openapi.v3.json PATCH /voice-clones/{voice_clone_id}","href":"/operations/updateVoiceClone"},{"title":"Delete a voice clone","sidebarTitle":"deleteVoiceClone","openapi":"openapi.v3.json DELETE /voice-clones/{voice_clone_id}","href":"/operations/deleteVoiceClone"}]},{"group":"Dubbing","pages":[{"title":"Dub or redub a project","sidebarTitle":"createDub","openapi":"openapi.v3.json POST /projects/{project_id}/dub","href":"/operations/createDub"},{"title":"Estimate a dub or redub","sidebarTitle":"estimateDub","openapi":"openapi.v3.json POST /projects/{project_id}/dub/estimate","href":"/operations/estimateDub"},{"title":"Run dub, lip-sync and on-screen as one job","sidebarTitle":"createLocalization","openapi":"openapi.v3.json POST /projects/{project_id}/localizations","href":"/operations/createLocalization"},{"title":"Estimate a dub, lip-sync and on-screen run","sidebarTitle":"estimateLocalization","openapi":"openapi.v3.json POST /projects/{project_id}/localizations/estimate","href":"/operations/estimateLocalization"},{"title":"Voice chosen segments into downloadable clips","sidebarTitle":"generateSegments","openapi":"openapi.v3.json POST /projects/{project_id}/segments/generate","href":"/operations/generateSegments"},{"title":"Estimate voicing chosen segments","sidebarTitle":"estimateSegmentGeneration","openapi":"openapi.v3.json POST /projects/{project_id}/segments/generate/estimate","href":"/operations/estimateSegmentGeneration"}]},{"group":"Lipsync","pages":[{"title":"Get a project's lip-sync state","sidebarTitle":"getLipsyncState","openapi":"openapi.v3.json GET /projects/{project_id}/lipsync","href":"/operations/getLipsyncState"},{"title":"Lip-sync a dubbed video","sidebarTitle":"createLipsync","openapi":"openapi.v3.json POST /projects/{project_id}/lipsync","href":"/operations/createLipsync"},{"title":"Estimate a lip-sync run","sidebarTitle":"estimateLipsync","openapi":"openapi.v3.json POST /projects/{project_id}/lipsync/estimate","href":"/operations/estimateLipsync"}]},{"group":"Onscreen","pages":[{"title":"Get a project's on-screen translation state","sidebarTitle":"getOnscreenState","openapi":"openapi.v3.json GET /projects/{project_id}/onscreen","href":"/operations/getOnscreenState"},{"title":"Translate on-screen text","sidebarTitle":"createOnscreen","openapi":"openapi.v3.json POST /projects/{project_id}/onscreen","href":"/operations/createOnscreen"},{"title":"Estimate on-screen text translation","sidebarTitle":"estimateOnscreen","openapi":"openapi.v3.json POST /projects/{project_id}/onscreen/estimate","href":"/operations/estimateOnscreen"}]}]}]},{"version":"v2","pages":[{"title":"v2","href":"/introduction"}]}]},"basePath":"","title":"Create a localization project - Rask AI API","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CybtLBIt.js","utils-BMLj2fvV.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-B6In562Y.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Dr8Mfhp9.js","snippetPresets-2rmQvMVl.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-WMqJYdZj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CJ-MlPHu.js","shallow-dY3TMRCk.js","getApiPlaygroundDisplay-v-1B2bKm.js","CodeSnippet-BDhiTB7U.js","CodeSnippets-D9hnzQcS.js","Page-C4GwDT3_.js","getPastedJson-Th2V45jI.js","icon-BQXch1W9.js","MethodPill-BCqUneP3.js","DuplicateIcon-Q_-bhurZ.js","createIcon-DUjLHRqp.js","DynamicMarkdown-B-f2cqXQ.js","SectionHeading-Da5NsV4v.js","axios-vUo_bRtp.js","Markdown-D13FWkIM.js","clsx-D3Isdib3.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-C-XZBk9h.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink--qIqmmVG.js"]}