v2.0.5 — Timed-word transcripts, script-to-video scene ranges, transcript GA, and assistant API refinements

This release reshapes transcripts around timed words, exposes both the structured transcript and its plain text on file reads, brings caller-provided scene ranges to script-to-video, graduates the pre-computed upload transcript and voiceover scene ranges out of beta, and refines the Assistant API.

Added

  • transcriptText on file reads: GET /v1/files/{fileId} now returns a plain transcriptText string alongside the structured transcript object, for audio and video files that have a transcript. It is the flattened spoken text (no timing) and is null for images or when no transcript has been generated. Use transcriptText when you only need the words and transcript when you need per-word timing.
  • Scene ranges on script-to-video: POST /v1/workflows/script-to-video accepts optional scenes (SceneDescriptionRange[]: startSeconds, endSeconds, description) to direct what appears on screen over absolute time ranges, matching the existing field on voiceover-to-video. Passed ranges override the automatic scene split only where they are defined; the workflow fills the gaps and keeps section boundaries off your range edges. Ranges must be sorted by startSeconds and non-overlapping, and timings may extend past the finished video (they are cropped). Omit to let the workflow choose visuals automatically.

Changed

  • Breaking: transcripts are now timed words instead of segments. The Transcript type used by the optional transcript on POST /v1/files/upload now carries words ({ startSeconds, endSeconds, word }) instead of segments ({ startSeconds, endSeconds, text }), with an optional languageCode. Each entry is a single spoken word, so caption timing is pinned at word granularity. Words must be sorted by startSeconds and non-overlapping. Update any upload requests that previously sent segments.
  • Breaking: GET /v1/files/{fileId} returns a structured transcript. The transcript field is now a Transcript object (timed words plus optional languageCode) rather than a plain string. The previous plain-string value now lives on the new transcriptText field. transcript is null for images or when no transcript has been generated.
  • Pre-computed transcript on upload is no longer beta. The optional transcript field on POST /v1/files/upload is now stable. Provide it for an audio or video upload to skip re-transcription so caption timing matches your transcript exactly.
  • Voiceover scene ranges are no longer beta. The optional scenes field on POST /v1/workflows/voiceover-to-video is now stable. Ranges must be sorted by startSeconds and non-overlapping; omit to let the workflow choose visuals automatically.
  • Assistant message polling endpoint renamed: GET /v1/assistant/messages/{messageId} is now GET /v1/assistant-messages/{messageId}, consistent with the other /v1/assistants routes. Update any hard-coded polling URLs; the SDKs, CLI, and assistant_message.* webhook subscribers are unaffected.
  • Nullable assistantId on projects: ProjectResponse.assistantId is now nullable. New API projects get an assistant chat at creation time, so assistantId is populated; projects created before assistant chats were attached return null. Reading a project no longer creates a chat as a side effect.
  • Reliable generation and error on assistant messages: an assistant message’s generation (the workflow run a turn kicked off) and error (on failed / cancelled turns) are now resolved directly from the message, so polled and webhook payloads report them accurately.