> ## Documentation Index
> Fetch the complete documentation index at: https://docs.api.rask.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Capabilities, models and plan limits

> What the Rask API v3 can do, under which plan features and limits, which models exist, and what stays in the web app or with support.

What a workspace can do depends on the payer's plan, read live from the API. These pages never list plans, prices or languages, because those change. Ask the API:

| To learn | Call |
| - | - |
| Which features the plan has | [`GET /v3/plan`](https://docs.api.rask.ai/operations/getPlan): `entitlements[]` with `feature`, `enabled`, `reason` |
| The plan's limits and multipliers | [`GET /v3/plan`](https://docs.api.rask.ai/operations/getPlan): `limits` |
| What a language supports | [`GET /v3/languages`](https://docs.api.rask.ai/operations/listLanguages): `capabilities` of each language |
| Whether one request would work, and its price | Its estimate: `eligible`, `reasons`, `total_minutes` |

There is no public list of the v3 languages: [`GET /v3/languages`](https://docs.api.rask.ai/operations/listLanguages) needs a key, though any valid key will do. The language pages of API v2 are a separate list, not this catalog.

An entitlement's `reason` is `not_in_plan`, `subscription_inactive` or `temporarily_disabled`. A feature that is `not_in_plan` or `subscription_inactive` answers 403 [`feature_not_in_plan`](https://docs.api.rask.ai/errors/feature_not_in_plan) with `feature`. A `temporarily_disabled` one answers 503 [`feature_temporarily_disabled`](https://docs.api.rask.ai/errors/feature_temporarily_disabled): retry after `Retry-After`, or go on without the feature.

## What the API does

| Capability | Operations | Plan feature | Language capability | Limits |
| - | - | - | - | - |
| Upload a file | [createUpload](https://docs.api.rask.ai/operations/createUpload.md), [completeUpload](https://docs.api.rask.ai/operations/completeUpload.md) | | | `max_upload_bytes`, 5 GB at most |
| Import from a URL | [importMedia](https://docs.api.rask.ai/operations/importMedia.md) | | | YouTube, Google Drive, Vimeo and allow-listed hosts |
| Create a project with auto-dub | [createProject](https://docs.api.rask.ai/operations/createProject.md) | `auto_dub` | `translation`, `transcription` | `max_source_duration_seconds` |
| Copy into more languages | [createProjectCopies](https://docs.api.rask.ai/operations/createProjectCopies.md) | `multilanguage` | `translation` | 1 to 10 targets, `max_batch_targets` |
| Import subtitles | `subtitles` on createProject, [importTranscript](https://docs.api.rask.ai/operations/importTranscript.md): see [Your own transcript](https://docs.api.rask.ai/v3/recipes/own-transcript.md) | `subtitle_import`, `subtitle_reimport` | | SRT, 2 MiB per file |
| Glossaries | [createGlossary](https://docs.api.rask.ai/operations/createGlossary.md) and others | `glossary` | `glossary` | |
| Translation instructions | `translation_instructions` | `translation_instructions` | | 8192 characters |
| Edit segments, keep versions | [updateSegment](https://docs.api.rask.ai/operations/updateSegment.md), [createTranscriptVersion](https://docs.api.rask.ai/operations/createTranscriptVersion.md) and others | | | After a dub is [charged](https://docs.api.rask.ai/v3/concepts/paid-text.md) |
| Retranslate | [retranslateSegments](https://docs.api.rask.ai/operations/retranslateSegments.md) | | | `translation-hour` budget |
| Stock and cloned voices | [listVoices](https://docs.api.rask.ai/operations/listVoices.md), [updateSpeakerVoice](https://docs.api.rask.ai/operations/updateSpeakerVoice.md) | | | |
| Voice clones | [createVoiceClone](https://docs.api.rask.ai/operations/createVoiceClone.md) | `voice_clones` | `voice_cloning` | `voice_clone_limit`, 1 to 10 samples |
| A speaker's own clone | `instant_clone` voice on updateSpeakerVoice | `instant_voice_clone` | `voice_cloning` | `instant_clone.eligible` on the speaker |
| Dub and redub | [createDub](https://docs.api.rask.ai/operations/createDub.md) | | `dubbing` | Not on a trial project |
| Free dubbing variant | `free_dubbing` | `free_languages` | | |
| Paid segment clips | [generateSegments](https://docs.api.rask.ai/operations/generateSegments.md) | `audio_download` | | 1 to 100 segments per job |
| Lip-sync | [createLipsync](https://docs.api.rask.ai/operations/createLipsync.md) | `lipsync`, `lipsync_paid` | `lipsync` | `lipsync_max_seconds` |
| On-screen translation | [createOnscreen](https://docs.api.rask.ai/operations/createOnscreen.md) | `onscreen` | `onscreen` | `onscreen_max_video_seconds` |
| One run of all three | [createLocalization](https://docs.api.rask.ai/operations/createLocalization.md) | Those of its stages | Those of its stages | No on-screen on a trimmed lip-sync |
| Burned-in subtitles | [createExport](https://docs.api.rask.ai/operations/createExport.md) | `burned_subtitles` | | |
| Downloads | [listProjectOutputs](https://docs.api.rask.ai/operations/listProjectOutputs.md) | `audio_download`, `subtitle_download`, `lipsync_download` | | See [Downloads](https://docs.api.rask.ai/v3/recipes/downloads.md) |
| Balance, plan, usage | [getBalance](https://docs.api.rask.ai/operations/getBalance.md), [getPlan](https://docs.api.rask.ai/operations/getPlan.md), [getUsage](https://docs.api.rask.ai/operations/getUsage.md) | | | One workspace per key |

The [operation table](https://docs.api.rask.ai/v3/concepts/operation-table.md) has every operation with its scopes.

## Plan features

Every feature `GET /v3/plan` can report. The [operation table](https://docs.api.rask.ai/v3/concepts/operation-table.md#plan-features) says which operations declare each.

| Feature | What it allows |
| - | - |
| `api_access` | Use the API at all, checked on every request |
| `auto_dub` | Dub automatically after processing; needs an active subscription or a trial |
| `dubbing_model_choice` | Choose the dubbing model; otherwise it is overridden, with an estimate notice |
| `free_languages` | Free dubbing language variants |
| `glossary` | Attach and manage glossaries |
| `translation_instructions` | Custom translation instructions |
| `subtitle_import` | Import SRT subtitles when creating a project |
| `subtitle_reimport` | Replace a project's transcript from SRT |
| `subtitle_download` | Download subtitles |
| `burned_subtitles` | Export videos with burned-in subtitles |
| `audio_download` | Download dubbed audio and the voice track |
| `multilanguage` | Several target languages per media |
| `lipsync` | Lip-sync |
| `lipsync_paid` | Paid lip-sync runs; otherwise only the free run |
| `lipsync_enhanced` | The Enhanced lip-sync model |
| `lipsync_download` | Download lip-synced video |
| `onscreen` | On-screen text translation |
| `voice_clones` | Workspace voice clones |
| `instant_voice_clone` | A speaker's own cloned voice |
| `share_links` | Always off: no operation serves share links |

## Models

| Choice | Value | Conditions | Falls back or refuses |
| - | - | - | - |
| Dubbing | `v2`, meaning-first, the default | The language has `capabilities.meaning_first`; the voices have `meaning_first_compatible`; not a free variant | Runs as `v1`, and `dubbing_model_override_reason` says why. [Dubbing model](https://docs.api.rask.ai/v3/recipes/dubbing-model.md) |
| Dubbing | `v1`, legacy | Languages with `capabilities.meaning_first_only` run only on `v2` | Runs as `v2`, and `dubbing_model_override_reason` is `language_requires_v2` |
| Lip-sync | `legacy` | `lipsync`, and `lipsync_paid` for a paid run | 403 `feature_not_in_plan` |
| Lip-sync | `enhanced` | Also `lipsync_enhanced`. Costs `limits.lipsync_enhanced_cost_multiplier` times the base | 403 `feature_not_in_plan` |

## Plan limits

Read these from `limits` in [`GET /v3/plan`](https://docs.api.rask.ai/operations/getPlan):

| Limit | Meaning | Answer when exceeded |
| - | - | - |
| `max_upload_bytes` | Largest accepted upload; null when the plan sets no limit | 413 [`media_too_large`](https://docs.api.rask.ai/errors/media_too_large) |
| `max_source_duration_seconds` | Longest accepted source media; null when the plan sets no limit | 413 [`media_too_long`](https://docs.api.rask.ai/errors/media_too_long) |
| `processing_window_seconds` | Trial processing window; null when the whole media is processed | Estimate notice `trial_processing_window` |
| `max_batch_targets` | Most targets per copy request | 422 [`validation_failed`](https://docs.api.rask.ai/errors/validation_failed) |
| `onscreen_max_video_seconds` | Longest video for on-screen translation | 422 [`onscreen_video_too_long`](https://docs.api.rask.ai/errors/onscreen_video_too_long) |
| `voice_clone_limit` | Voice clones in the workspace; null when unlimited | 403 [`voice_clone_limit_reached`](https://docs.api.rask.ai/errors/voice_clone_limit_reached) |
| `lipsync_max_seconds` | Seconds a lip-sync run processes; null when unlimited | The result is trimmed: `is_trimmed` |
| `lipsync_enhanced_cost_multiplier` | Price multiplier of Enhanced lip-sync | |
| `onscreen_cost_multiplier` | Price multiplier of on-screen translation | |

`outputs_watermarked` says whether outputs carry a watermark. Limits for voice samples and body sizes do not depend on the plan: see [Voice clones](https://docs.api.rask.ai/v3/recipes/voice-clone.md) and [Conventions](https://docs.api.rask.ai/v3/concepts/conventions.md#request-limits).

## Rate limits

These are the starting defaults for a paid plan. A trial has lower ones, and a plan can set others. So read the `RateLimit-Policy` and `RateLimit` headers, and `limit` on a 429, rather than hard-code them. Over a limit, the answer is 429 with `Retry-After` and `policy`.

The request limits (`credential-minute`, `account-minute`, `spend-minute`, `upload-hour` and `auth-fail-ip`) and `long-poll` are approximate: a key can get somewhat more or fewer requests through than a limit says, and `RateLimit` is an estimate. Treat a 429 as the signal to wait for `Retry-After`, and do not count on being refused at an exact number. The other limits in the table are exact.

| Policy | Per | Default |
| - | - | - |
| `credential-minute` | Key | 600 requests per minute |
| `account-minute` | Payer | 1,800 requests per minute across all keys |
| `spend-minute` | Key | 30 spending requests per minute |
| `upload-hour` | Key | 120 uploads and imports per hour |
| `auth-fail-ip` | IP address | Failed authentications per minute. Over it, requests from that address can answer 429 until `Retry-After`, even with a valid key |
| `long-poll` | Key, payer | About 10 and 50 concurrent job waits ([`too_many_waiters`](https://docs.api.rask.ai/errors/too_many_waiters), which can also come below these when many clients wait at once) |
| `translation-hour` | Payer | 5,000 translated segments per hour: retranslation, edits that retranslate, subtitle import. One request over the whole budget answers 422 [`translation_batch_too_large`](https://docs.api.rask.ai/errors/translation_batch_too_large) |
| `clone-create-day` | Payer | 20 voice-clone creations per day across the payer's workspaces; deleted and instant clones count |
| `voice-settings-hour` | Clone | 10 settings changes per hour |
| `upload-open` | Payer | 20 open uploads |
| `upload-bytes-day` | Payer | Declared upload bytes per day: 50 times `max_upload_bytes`, or 50 times 5 GB when it is null |

Job concurrency per payer, counting jobs started through the API (429 [`too_many_concurrent_jobs`](https://docs.api.rask.ai/errors/too_many_concurrent_jobs) with `policy: payer-concurrency`):

| Job type | Active at once |
| - | - |
| `project_processing` | 20 |
| `dub` | 10 |
| `translation` | 5 |
| `localization` | 5 |
| `export` | 5 |
| `media_import` | 5 |
| `segment_generation` | 3 |
| `lipsync` | 3 |
| `onscreen` | 2 |
| `voice_clone` | 2 |

The same 429 with `policy: global-concurrency` means Rask as a whole runs its limit of that job type. Wait for `Retry-After` the same way.

## What stays in the web app or with support

* **Creating and revoking keys, and changing their caps:** Settings in the web app.
* **Buying minutes and changing the plan:** the web app, at `manage_url` from [`GET /v3/plan`](https://docs.api.rask.ai/operations/getPlan). No API does it, so on 402 a client tells a person.
* **A stuck dub or lip-sync:** a client cannot cancel these. `overdue` on the job means Rask is alerted. If it stays stuck, write to [api@rask.ai](mailto:api@rask.ai) with the job id.
* **Testing without paying:** there is no sandbox. Use a key without `credits:spend` with the estimates, a mock of the contract ([Introduction](https://docs.api.rask.ai/v3/introduction.md#read-the-contract-from-code)), and short clips.

## What API v3 does not do

* **Webhooks.** Wait for jobs with [getJob](https://docs.api.rask.ai/operations/getJob.md).
* **A free preview of a segment.** [generateSegments](https://docs.api.rask.ai/operations/generateSegments.md) is the paid way to hear one.
* **Multipart uploads.** One PUT carries the whole file.
* **Other workspaces.** A key sees only its own, and it cannot list the workspace's members.
* **Glossary file import.** Send the entries in the request body.
* **Replacing a clone's samples.** Create a new clone.
* **Waveform data and audio-track editing.** Neither is exposed.
* **Screen recording.** It is not part of this API.
* **Web and API v2 runs as jobs.** They do not appear in [listJobs](https://docs.api.rask.ai/operations/listJobs.md) and cannot be canceled here. Read their state on the project.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.