Skip to main content
POST
Transcribes the speech in the project’s current cut and adds timed caption text clips in the default caption style, then returns the updated project. Captions follow the cut: each one is placed on the timeline where its words are spoken, so cut first and caption last. Adding captions is free (no credits). It can take a while for long videos, and it is rate limited per account owner because every request transcribes the cut. The captions appear in the project’s text_clips with role: "caption", and live in the Genviral web editor at the project’s editor_url, where the user can restyle or edit them.
  • A cut that already has captions is left as it is, and the project is returned unchanged. Your request never adds a second set of captions.
  • A cut with no speech is returned unchanged, with no captions added.
  • To read the words with their timings instead, use Get Editor Transcript.

Concurrency

Pass expected_updated_at with the updated_at you last read. If the project changed since, the request is refused with 409 editor_conflict: read the project again and retry with a new Idempotency-Key. The caption write also checks the revision that was transcribed, even if you omit expected_updated_at. An edit made during transcription returns 409 editor_conflict without inserting captions timed to the old cut. While Vira (the Genviral assistant) is editing the same project, the request is refused with 409 editor_locked. Wait a few seconds and retry.

Idempotency

Idempotency-Key is required and is scoped to the API key (or MCP grant) that sends it.
  • Retrying with the same key and the same body returns the project and never transcribes or adds captions twice.
  • Reusing a key with a different body returns 409 idempotency_key_reused.
  • A refused request (for example 502 transcription_failed) does not consume its key.

Path Parameters

string (UUID)
required
The project id.

Body Parameters

The body is optional. Send {} or no body to caption the cut as it is.
string
The updated_at you last read (ISO 8601). The request is refused with editor_conflict if the project changed since.
string
One short plain-text line (at most 140 characters, no line breaks) describing this step in the user’s terms, for example Added captions. The open Genviral web editor shows it live in its activity feed, labelled with who made the edit (Claude, ChatGPT, another MCP client, or the API).

Response

Returns 200 with the updated project, in the same shape as Get Editor Project. Any earlier render is no longer current once captions are added.

Error Responses

  • 400 invalid_json - request body is not valid JSON
  • 400 invalid_request - Idempotency-Key header is missing or longer than 255 characters
  • 401 - authentication failed (missing/invalid/revoked token)
  • 404 project_not_found - the project does not exist in the key scope
  • 409 editor_locked - Vira is editing this project right now; retry shortly
  • 409 editor_conflict - the project changed since your read or during transcription; read it again
  • 409 idempotency_key_reused - this Idempotency-Key was already used with a different body
  • 409 request_in_progress - an identical request with this key is still being processed; retry shortly
  • 422 invalid_payload - body failed validation (see issues)
  • 422 no_audio_source - nothing on the timeline has audible sound to caption
  • 422 invalid_document - the project could not be read or the result would not be a valid project
  • 429 rate_limited - the hourly caption budget is spent; retry after retry_after_seconds
  • 502 transcription_failed - the cut could not be transcribed; retry later