Videos
Upload, manage, and retrieve videos with the Moviie REST API.
Videos
Videos are the core resource in Moviie. Each video belongs to exactly one collection within your organization.
Video statuses
| Status | Description |
|---|---|
pending_upload | Video slot reserved; file upload not yet started. |
processing | File uploaded; encoding in progress. |
ready | Video is fully processed and playable. |
error | Processing failed. |
External reference IDs
Every video accepts an optional reference_id: a client-side identifier you can use to link the Moviie video to a row in your own database (a course, lesson, product SKU, etc.). It is:
- Free-form, 1–128 characters.
- Unique within an organization. Two videos in the same org cannot share a
reference_id. Different organizations can. - Filterable via
GET /v1/videos?referenceId=…. - Editable via
PUT /v1/videos/{id}: passnullto clear.
Setting a value already used by another video in the same org returns HTTP 409.
Available operations
| Method | Endpoint | Description |
|---|---|---|
GET | /v1/videos | List videos |
GET | /v1/videos/{id} | Get a video |
PUT | /v1/videos/{id} | Update a video |
DELETE | /v1/videos/{id} | Delete a video |
POST | /v1/videos/uploads/reserve | Reserve an upload slot |
POST | /v1/videos/bulk-delete | Bulk delete |
POST | /v1/videos/move-to-collection | Move to collection |
GET | /v1/videos/{id}/captions | List captions |
GET | /v1/videos/{id}/chapters | List chapters |
GET | /v1/videos/{id}/subtitle-tracks | List subtitle tracks |
GET | /v1/videos/{id}/subtitle | Get subtitle |
GET | /v1/videos/{id}/translations | List translations |
GET | /v1/videos/{id}/embed | Get embed code |
GET | /v1/videos/{id}/download-urls | Get download URLs |
Subtitles and translations
Every video can have one source subtitle in its spoken language, plus any number of translations into other languages. Both are made of timed cues (start, end, text) and can be fetched, edited, downloaded, and shown in the player.
Lifecycle
- Source subtitle: fetch it with
GET /v1/videos/{id}/subtitle.availableisfalseuntil one exists. Edit its cues withPUT /v1/videos/{id}/subtitle, control whether the player shows it by default withPUT /v1/videos/{id}/subtitle/display, and regenerate or revert it. When the transcript changes,transcriptDriftturnstrue: regenerate to refresh. - Translations: start one or more with
POST /v1/videos/{id}/translations, passing the target languages fromsupportedLanguages. Translation requires a source subtitle (sourceAvailable: true) and consumes credits proportional to the video duration, per language. Each language is produced asynchronously: pollGET /v1/videos/{id}/translationsorGET /v1/videos/{id}/translations/{lang}untilstatusisready. - Editing a translation:
PUT /v1/videos/{id}/translations/{lang}edits cue text only; timings stay locked to the source subtitle, so changing a cue's timing or count returns422. Regenerate re-runs the translation; revert discards manual edits.
Listing and downloading
GET /v1/videos/{id}/subtitle-tracks returns the source subtitle and every translation in a single list: each with its status and cueCount: which is handy for building a track picker. Download any ready track as a WebVTT (.vtt) file with GET /v1/videos/{id}/subtitle-tracks/{lang}/download.
Credits and limits
- Starting or regenerating a translation returns
402when the credit balance is insufficient. - Translation endpoints are rate limited and return
429with aRetry-Afterheader when a limit is hit. - A translation can be started only after a source subtitle exists; otherwise the request returns
409.
Already have subtitle files? You can also upload
.vttor.srttracks directly withPOST /v1/videos/{id}/captions.