curl --request GET \
--url https://api.framelane.io/v1/renders/{render_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.framelane.io/v1/renders/{render_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.framelane.io/v1/renders/{render_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.framelane.io/v1/renders/{render_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.framelane.io/v1/renders/{render_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.framelane.io/v1/renders/{render_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.framelane.io/v1/renders/{render_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "render_01J8QR2K5VKDGN2T4FBM3CZYX7",
"kind": "render",
"workspace_id": "ws_01J8QR2K5VKDGN2T4FBM3CZYX8",
"status": "queued",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"is_preview": false,
"task_type": "transcribe",
"progress_percent": 0,
"progress_stage": "compositing",
"output": {
"url": "https://cdn-user.framelane.io/render_01J.../output.mp4",
"width": 1920,
"height": 1080,
"duration": 15.3,
"size_bytes": 12582912
},
"result": {
"language_code": "en",
"text": "Welcome back to the show."
},
"error": {
"code": "invalid_source",
"message": "Source URL returned 404."
},
"metadata": {
"project_id": "proj_123",
"user_ref": "usr_abc"
},
"completed_at": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}Get a render
Fetch a render’s status. Pass wait (seconds) to long-poll: the request holds until the render reaches a terminal status (completed/failed/cancelled) or the hold elapses, then returns the current status — one call instead of a poll loop, which is the agent-first way to wait (also covers preview renders). When it returns still in-flight, Retry-After: 0 is set; re-call to keep waiting.
curl --request GET \
--url https://api.framelane.io/v1/renders/{render_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.framelane.io/v1/renders/{render_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.framelane.io/v1/renders/{render_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.framelane.io/v1/renders/{render_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.framelane.io/v1/renders/{render_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.framelane.io/v1/renders/{render_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.framelane.io/v1/renders/{render_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "render_01J8QR2K5VKDGN2T4FBM3CZYX7",
"kind": "render",
"workspace_id": "ws_01J8QR2K5VKDGN2T4FBM3CZYX8",
"status": "queued",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"is_preview": false,
"task_type": "transcribe",
"progress_percent": 0,
"progress_stage": "compositing",
"output": {
"url": "https://cdn-user.framelane.io/render_01J.../output.mp4",
"width": 1920,
"height": 1080,
"duration": 15.3,
"size_bytes": 12582912
},
"result": {
"language_code": "en",
"text": "Welcome back to the show."
},
"error": {
"code": "invalid_source",
"message": "Source URL returned 404."
},
"metadata": {
"project_id": "proj_123",
"user_ref": "usr_abc"
},
"completed_at": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Query Parameters
Seconds to block until the render is terminal (capped server-side; values above the cap are clamped). 0 (default) returns immediately.
x >= 0Response
Successful Response
A render job or AI task.
Unique job ID. Prefix indicates type: render_ or task_.
"render_01J8QR2K5VKDGN2T4FBM3CZYX7"
Whether this is a render or a task.
render, task "render"
ID of the workspace that owns this job.
"ws_01J8QR2K5VKDGN2T4FBM3CZYX8"
Current lifecycle state: queued → processing → completed / failed / cancelled.
ingesting, queued, processing, completed, failed, cancelled "queued"
ISO-8601 UTC timestamp when the job was created.
ISO-8601 UTC timestamp of the last status change.
True for a cheap preview render. Previews are not billed and are excluded from the renders list.
false
For task jobs only — the specific AI operation.
transcribe "transcribe"
0–100 progress indicator updated by the render engine.
0 <= x <= 1000
Current processing phase within a job.
downloading, compositing, encoding, uploading "compositing"
Populated once status == completed. Contains the signed artifact URL.
Show child attributes
Show child attributes
Structured JSON result for tasks that return data rather than a file — transcribe returns the transcript here (text, words, utterances, and any requested analysis). Populated once status == completed; null for renders and for any job whose only artifact is the file at output.url.
{
"language_code": "en",
"text": "Welcome back to the show."
}
Populated when status == failed. Contains a structured error code.
Show child attributes
Show child attributes
Caller-supplied key-value pairs echoed back on every webhook and response.
{
"project_id": "proj_123",
"user_ref": "usr_abc"
}
ISO-8601 UTC timestamp when the job reached a terminal state.

