GET /v1/platform/videos/:id
Returns the current status and details of a video generation request. Use this
to poll for completion in async mode, or to check the most recent
renderStatus after triggering a render.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | string | The video request ID returned by the create endpoint. |
Example Request
curl https://api.tutorflow.io/v1/platform/videos/e41a085a-e43f-4f63-92f4-9e11250f6e63 \
-H "Authorization: Bearer tf_platform_..."Response
Returns the same VideoResDto structure as the create endpoint, with
renderStatus and videoKey reflecting the latest state. See
Create Video for all fields.
Example Response (Render Complete)
{
"id": "e41a085a-e43f-4f63-92f4-9e11250f6e63",
"videoId": "e10b8286-94ad-4139-a946-3548b46f6d07",
"status": "COMPLETED",
"isTerminal": true,
"title": "What Is Photosynthesis for Kids?",
"language": "en",
"sceneCount": 4,
"aspectRatio": "16:9",
"targetDurationSeconds": 30,
"slug": "what-is-photosynthesis-for-kids-d6a02f3b",
"tier": "default",
"mode": "sync",
"priceSnapshot": {
"category": "video",
"catalogKey": "video.default",
"tier": "default",
"unit": "scene",
"unitPrice": 0.04,
"units": 4,
"amountUsd": 0.16,
"currency": "USD",
"source": "platform_pricing_catalog_v2"
},
"shareToken": "b64adc04eca28e709add5568af2c414c",
"editToken": "2dce05b2f639b93ec7559d779b3db71c",
"editTokenExpiresAt": "2026-04-25T15:15:28.628Z",
"previewUrl": "https://tutorflow.io/en/platform/videos/edit/2dce...",
"publicUrl": "https://tutorflow.io/en/platform/videos/b64adc04eca28e709add5568af2c414c",
"renderStatus": "COMPLETED",
"videoKey": "platform/{workspaceId}/videos/{videoId}/rendered/what-is-photosynthesis-for-kids-1dvr.mp4",
"renderPollUrl": "GET /v1/platform/videos/edit/2dce.../",
"renderTriggerUrl": "POST /v1/platform/videos/edit/2dce.../render",
"createdAt": "2026-04-25T04:14:47.546Z",
"completedAt": "2026-04-25T04:15:28.677Z"
}Get-by-Edit-Token
If you only have an editToken, use the editor endpoint instead:
curl https://api.tutorflow.io/v1/platform/videos/edit/{editToken}This returns a VideoEditResDto with the full scene array (script, TTS keys,
clip keys, subtitles, transitions, durations) plus renderStatus, videoKey,
bgmAudioKey, and a refreshed editTokenExpiresAt.
Render Status Lifecycle
| renderStatus | Meaning | Next action |
|---|---|---|
IDLE | Scenes generated. No render yet. | POST /edit/:editToken/render |
RENDERING | Lambda is composing the mp4. | Poll every 5–10 s. |
COMPLETED | mp4 is at videoKey. | Download / share. |
FAILED | Render error. | Inspect, fix scenes, retrigger render. |
Polling Pattern (Async + Render)
// Step 1: kick off generation
const create = await POST('/v1/platform/videos', { prompt, mode: 'async' })
// Step 2: wait for scene generation
let req = create
while (!req.isTerminal) {
await sleep(req.pollAfterMs ?? 3000)
req = await GET(`/v1/platform/videos/${create.id}`)
}
// Step 3: trigger render
let edit = await POST(`/v1/platform/videos/edit/${req.editToken}/render`)
// Step 4: poll render status
while (edit.renderStatus === 'RENDERING') {
await sleep(8000)
edit = await GET(`/v1/platform/videos/edit/${req.editToken}`)
}
// Step 5: edit.videoKey now points at the final mp4