curl --request POST \
--url https://api.framelane.io/v1/renders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"width": 1920,
"height": 1080,
"duration": 15,
"frame_rate": 30,
"output_format": "mp4",
"output_filename": "my-render",
"background_color": "#000000ff",
"background_image_url": "https://cdn.example.com/bg.jpg",
"alpha": false,
"elements": [
{
"source_url": "https://cdn.example.com/clip.mp4",
"lut_url": "<string>",
"lut_intensity": 100,
"brightness": 0,
"contrast": 0,
"saturation": 0,
"exposure": 0,
"sharpness": 0,
"blur": 0,
"noise": 0,
"vignette": 0,
"hue_rotate": 0,
"temperature": 0,
"tint": 0,
"vibrance": 0,
"highlights": 0,
"shadows": 0,
"crop_top": 0,
"crop_bottom": 0,
"crop_left": 0,
"crop_right": 0,
"border_radius": 0,
"border_color": "<string>",
"border_width": 0,
"shadow_color": "<string>",
"shadow_blur": 0,
"shadow_x": 0,
"shadow_y": 0,
"blend_mode": "none",
"mask": {
"feather": 0,
"scale": 1,
"center": {
"x": 0.5,
"y": 0.5
}
},
"mask_keyframes": [
{
"time": 1,
"feather": 123,
"scale": 123,
"center": {
"x": 0.5,
"y": 0.5
},
"easing": "<string>",
"spring": {
"stiffness": 100,
"damping": 10,
"mass": 1
},
"back": {
"overshoot": 1.70158,
"dir": "out"
},
"elastic": {
"amplitude": 1,
"period": 0.3,
"dir": "out"
},
"bezier": {
"x1": 0,
"y1": 0,
"x2": 1,
"y2": 1
}
}
],
"matte": {
"source": "<string>",
"mode": "alpha",
"invert": false
},
"backdrop_blur": 0,
"x": "50%",
"y": "50%",
"width": "40%",
"height": "80%",
"aspect_ratio": 123,
"x_anchor": "0%",
"y_anchor": "100%",
"x_rotation": "0°",
"y_rotation": "0°",
"z_rotation": "0°",
"x_scale": "100%",
"y_scale": "100%",
"flip_horizontal": false,
"flip_vertical": false,
"opacity": 100,
"z_index": 123,
"clip": false,
"color_overlay": "<string>",
"type": "video",
"id": "clip_01",
"name": "<string>",
"track": 127,
"time": 0,
"visible": true,
"in_point": 0,
"out_point": 6,
"speed": 1,
"playback_rate_keyframes": [
{
"time": 1,
"rate": 1
}
],
"volume": 100,
"fade_in_duration": 0,
"fade_out_duration": 0,
"effects": [],
"motion": []
}
],
"transitions": [
{
"type": "cross_dissolve",
"duration": 0.5,
"from_id": "video_01",
"to_id": "video_02",
"z_index": 1
}
],
"groups": [
{
"id": "hero",
"parent": "<string>",
"pivot": {
"x": 0.5,
"y": 0.5
},
"translate": {
"x": 0.5,
"y": 0.5
},
"scale": 1,
"rotation_degrees": 0,
"x_rotation": "0°",
"y_rotation": "0°",
"opacity": 1,
"members": [
"<string>"
],
"animations": [
{
"time": 1,
"duration": 123,
"custom": "<string>",
"easing": "ease_in_out",
"reversed": false,
"scope": "element",
"delay": 0,
"spacing": 1,
"loop": false,
"audio": {
"feature": "amplitude",
"scale": 0,
"opacity": 0,
"translate": {
"x": 0.5,
"y": 0.5
},
"rotate": 0
}
}
],
"layout": {
"type": "stack",
"direction": "row",
"gap": 0,
"align": "center",
"origin": {
"x": 0.5,
"y": 0.5
}
}
}
],
"motion_blur": {
"samples": 17,
"shutter": 0.5
},
"background_gradient": "linear-gradient(90deg, #ff0000 0%, #0000ff 100%)",
"watermark_url": "<string>",
"custom_animations": {
"element": [],
"text": []
},
"metadata": {
"project_id": "proj_123"
},
"webhook_url": "https://app.example.com/hooks/framelane",
"ingest_external": true
}
'import requests
url = "https://api.framelane.io/v1/renders"
payload = {
"width": 1920,
"height": 1080,
"duration": 15,
"frame_rate": 30,
"output_format": "mp4",
"output_filename": "my-render",
"background_color": "#000000ff",
"background_image_url": "https://cdn.example.com/bg.jpg",
"alpha": False,
"elements": [
{
"source_url": "https://cdn.example.com/clip.mp4",
"lut_url": "<string>",
"lut_intensity": 100,
"brightness": 0,
"contrast": 0,
"saturation": 0,
"exposure": 0,
"sharpness": 0,
"blur": 0,
"noise": 0,
"vignette": 0,
"hue_rotate": 0,
"temperature": 0,
"tint": 0,
"vibrance": 0,
"highlights": 0,
"shadows": 0,
"crop_top": 0,
"crop_bottom": 0,
"crop_left": 0,
"crop_right": 0,
"border_radius": 0,
"border_color": "<string>",
"border_width": 0,
"shadow_color": "<string>",
"shadow_blur": 0,
"shadow_x": 0,
"shadow_y": 0,
"blend_mode": "none",
"mask": {
"feather": 0,
"scale": 1,
"center": {
"x": 0.5,
"y": 0.5
}
},
"mask_keyframes": [
{
"time": 1,
"feather": 123,
"scale": 123,
"center": {
"x": 0.5,
"y": 0.5
},
"easing": "<string>",
"spring": {
"stiffness": 100,
"damping": 10,
"mass": 1
},
"back": {
"overshoot": 1.70158,
"dir": "out"
},
"elastic": {
"amplitude": 1,
"period": 0.3,
"dir": "out"
},
"bezier": {
"x1": 0,
"y1": 0,
"x2": 1,
"y2": 1
}
}
],
"matte": {
"source": "<string>",
"mode": "alpha",
"invert": False
},
"backdrop_blur": 0,
"x": "50%",
"y": "50%",
"width": "40%",
"height": "80%",
"aspect_ratio": 123,
"x_anchor": "0%",
"y_anchor": "100%",
"x_rotation": "0°",
"y_rotation": "0°",
"z_rotation": "0°",
"x_scale": "100%",
"y_scale": "100%",
"flip_horizontal": False,
"flip_vertical": False,
"opacity": 100,
"z_index": 123,
"clip": False,
"color_overlay": "<string>",
"type": "video",
"id": "clip_01",
"name": "<string>",
"track": 127,
"time": 0,
"visible": True,
"in_point": 0,
"out_point": 6,
"speed": 1,
"playback_rate_keyframes": [
{
"time": 1,
"rate": 1
}
],
"volume": 100,
"fade_in_duration": 0,
"fade_out_duration": 0,
"effects": [],
"motion": []
}
],
"transitions": [
{
"type": "cross_dissolve",
"duration": 0.5,
"from_id": "video_01",
"to_id": "video_02",
"z_index": 1
}
],
"groups": [
{
"id": "hero",
"parent": "<string>",
"pivot": {
"x": 0.5,
"y": 0.5
},
"translate": {
"x": 0.5,
"y": 0.5
},
"scale": 1,
"rotation_degrees": 0,
"x_rotation": "0°",
"y_rotation": "0°",
"opacity": 1,
"members": ["<string>"],
"animations": [
{
"time": 1,
"duration": 123,
"custom": "<string>",
"easing": "ease_in_out",
"reversed": False,
"scope": "element",
"delay": 0,
"spacing": 1,
"loop": False,
"audio": {
"feature": "amplitude",
"scale": 0,
"opacity": 0,
"translate": {
"x": 0.5,
"y": 0.5
},
"rotate": 0
}
}
],
"layout": {
"type": "stack",
"direction": "row",
"gap": 0,
"align": "center",
"origin": {
"x": 0.5,
"y": 0.5
}
}
}
],
"motion_blur": {
"samples": 17,
"shutter": 0.5
},
"background_gradient": "linear-gradient(90deg, #ff0000 0%, #0000ff 100%)",
"watermark_url": "<string>",
"custom_animations": {
"element": [],
"text": []
},
"metadata": { "project_id": "proj_123" },
"webhook_url": "https://app.example.com/hooks/framelane",
"ingest_external": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
width: 1920,
height: 1080,
duration: 15,
frame_rate: 30,
output_format: 'mp4',
output_filename: 'my-render',
background_color: '#000000ff',
background_image_url: 'https://cdn.example.com/bg.jpg',
alpha: false,
elements: [
{
source_url: 'https://cdn.example.com/clip.mp4',
lut_url: '<string>',
lut_intensity: 100,
brightness: 0,
contrast: 0,
saturation: 0,
exposure: 0,
sharpness: 0,
blur: 0,
noise: 0,
vignette: 0,
hue_rotate: 0,
temperature: 0,
tint: 0,
vibrance: 0,
highlights: 0,
shadows: 0,
crop_top: 0,
crop_bottom: 0,
crop_left: 0,
crop_right: 0,
border_radius: 0,
border_color: '<string>',
border_width: 0,
shadow_color: '<string>',
shadow_blur: 0,
shadow_x: 0,
shadow_y: 0,
blend_mode: 'none',
mask: {feather: 0, scale: 1, center: {x: 0.5, y: 0.5}},
mask_keyframes: [
{
time: 1,
feather: 123,
scale: 123,
center: {x: 0.5, y: 0.5},
easing: '<string>',
spring: {stiffness: 100, damping: 10, mass: 1},
back: {overshoot: 1.70158, dir: 'out'},
elastic: {amplitude: 1, period: 0.3, dir: 'out'},
bezier: {x1: 0, y1: 0, x2: 1, y2: 1}
}
],
matte: {source: '<string>', mode: 'alpha', invert: false},
backdrop_blur: 0,
x: '50%',
y: '50%',
width: '40%',
height: '80%',
aspect_ratio: 123,
x_anchor: '0%',
y_anchor: '100%',
x_rotation: '0°',
y_rotation: '0°',
z_rotation: '0°',
x_scale: '100%',
y_scale: '100%',
flip_horizontal: false,
flip_vertical: false,
opacity: 100,
z_index: 123,
clip: false,
color_overlay: '<string>',
type: 'video',
id: 'clip_01',
name: '<string>',
track: 127,
time: 0,
visible: true,
in_point: 0,
out_point: 6,
speed: 1,
playback_rate_keyframes: [{time: 1, rate: 1}],
volume: 100,
fade_in_duration: 0,
fade_out_duration: 0,
effects: [],
motion: []
}
],
transitions: [
{
type: 'cross_dissolve',
duration: 0.5,
from_id: 'video_01',
to_id: 'video_02',
z_index: 1
}
],
groups: [
{
id: 'hero',
parent: '<string>',
pivot: {x: 0.5, y: 0.5},
translate: {x: 0.5, y: 0.5},
scale: 1,
rotation_degrees: 0,
x_rotation: '0°',
y_rotation: '0°',
opacity: 1,
members: ['<string>'],
animations: [
{
time: 1,
duration: 123,
custom: '<string>',
easing: 'ease_in_out',
reversed: false,
scope: 'element',
delay: 0,
spacing: 1,
loop: false,
audio: {
feature: 'amplitude',
scale: 0,
opacity: 0,
translate: {x: 0.5, y: 0.5},
rotate: 0
}
}
],
layout: {
type: 'stack',
direction: 'row',
gap: 0,
align: 'center',
origin: {x: 0.5, y: 0.5}
}
}
],
motion_blur: {samples: 17, shutter: 0.5},
background_gradient: 'linear-gradient(90deg, #ff0000 0%, #0000ff 100%)',
watermark_url: '<string>',
custom_animations: {element: [], text: []},
metadata: {project_id: 'proj_123'},
webhook_url: 'https://app.example.com/hooks/framelane',
ingest_external: true
})
};
fetch('https://api.framelane.io/v1/renders', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'width' => 1920,
'height' => 1080,
'duration' => 15,
'frame_rate' => 30,
'output_format' => 'mp4',
'output_filename' => 'my-render',
'background_color' => '#000000ff',
'background_image_url' => 'https://cdn.example.com/bg.jpg',
'alpha' => false,
'elements' => [
[
'source_url' => 'https://cdn.example.com/clip.mp4',
'lut_url' => '<string>',
'lut_intensity' => 100,
'brightness' => 0,
'contrast' => 0,
'saturation' => 0,
'exposure' => 0,
'sharpness' => 0,
'blur' => 0,
'noise' => 0,
'vignette' => 0,
'hue_rotate' => 0,
'temperature' => 0,
'tint' => 0,
'vibrance' => 0,
'highlights' => 0,
'shadows' => 0,
'crop_top' => 0,
'crop_bottom' => 0,
'crop_left' => 0,
'crop_right' => 0,
'border_radius' => 0,
'border_color' => '<string>',
'border_width' => 0,
'shadow_color' => '<string>',
'shadow_blur' => 0,
'shadow_x' => 0,
'shadow_y' => 0,
'blend_mode' => 'none',
'mask' => [
'feather' => 0,
'scale' => 1,
'center' => [
'x' => 0.5,
'y' => 0.5
]
],
'mask_keyframes' => [
[
'time' => 1,
'feather' => 123,
'scale' => 123,
'center' => [
'x' => 0.5,
'y' => 0.5
],
'easing' => '<string>',
'spring' => [
'stiffness' => 100,
'damping' => 10,
'mass' => 1
],
'back' => [
'overshoot' => 1.70158,
'dir' => 'out'
],
'elastic' => [
'amplitude' => 1,
'period' => 0.3,
'dir' => 'out'
],
'bezier' => [
'x1' => 0,
'y1' => 0,
'x2' => 1,
'y2' => 1
]
]
],
'matte' => [
'source' => '<string>',
'mode' => 'alpha',
'invert' => false
],
'backdrop_blur' => 0,
'x' => '50%',
'y' => '50%',
'width' => '40%',
'height' => '80%',
'aspect_ratio' => 123,
'x_anchor' => '0%',
'y_anchor' => '100%',
'x_rotation' => '0°',
'y_rotation' => '0°',
'z_rotation' => '0°',
'x_scale' => '100%',
'y_scale' => '100%',
'flip_horizontal' => false,
'flip_vertical' => false,
'opacity' => 100,
'z_index' => 123,
'clip' => false,
'color_overlay' => '<string>',
'type' => 'video',
'id' => 'clip_01',
'name' => '<string>',
'track' => 127,
'time' => 0,
'visible' => true,
'in_point' => 0,
'out_point' => 6,
'speed' => 1,
'playback_rate_keyframes' => [
[
'time' => 1,
'rate' => 1
]
],
'volume' => 100,
'fade_in_duration' => 0,
'fade_out_duration' => 0,
'effects' => [
],
'motion' => [
]
]
],
'transitions' => [
[
'type' => 'cross_dissolve',
'duration' => 0.5,
'from_id' => 'video_01',
'to_id' => 'video_02',
'z_index' => 1
]
],
'groups' => [
[
'id' => 'hero',
'parent' => '<string>',
'pivot' => [
'x' => 0.5,
'y' => 0.5
],
'translate' => [
'x' => 0.5,
'y' => 0.5
],
'scale' => 1,
'rotation_degrees' => 0,
'x_rotation' => '0°',
'y_rotation' => '0°',
'opacity' => 1,
'members' => [
'<string>'
],
'animations' => [
[
'time' => 1,
'duration' => 123,
'custom' => '<string>',
'easing' => 'ease_in_out',
'reversed' => false,
'scope' => 'element',
'delay' => 0,
'spacing' => 1,
'loop' => false,
'audio' => [
'feature' => 'amplitude',
'scale' => 0,
'opacity' => 0,
'translate' => [
'x' => 0.5,
'y' => 0.5
],
'rotate' => 0
]
]
],
'layout' => [
'type' => 'stack',
'direction' => 'row',
'gap' => 0,
'align' => 'center',
'origin' => [
'x' => 0.5,
'y' => 0.5
]
]
]
],
'motion_blur' => [
'samples' => 17,
'shutter' => 0.5
],
'background_gradient' => 'linear-gradient(90deg, #ff0000 0%, #0000ff 100%)',
'watermark_url' => '<string>',
'custom_animations' => [
'element' => [
],
'text' => [
]
],
'metadata' => [
'project_id' => 'proj_123'
],
'webhook_url' => 'https://app.example.com/hooks/framelane',
'ingest_external' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.framelane.io/v1/renders"
payload := strings.NewReader("{\n \"width\": 1920,\n \"height\": 1080,\n \"duration\": 15,\n \"frame_rate\": 30,\n \"output_format\": \"mp4\",\n \"output_filename\": \"my-render\",\n \"background_color\": \"#000000ff\",\n \"background_image_url\": \"https://cdn.example.com/bg.jpg\",\n \"alpha\": false,\n \"elements\": [\n {\n \"source_url\": \"https://cdn.example.com/clip.mp4\",\n \"lut_url\": \"<string>\",\n \"lut_intensity\": 100,\n \"brightness\": 0,\n \"contrast\": 0,\n \"saturation\": 0,\n \"exposure\": 0,\n \"sharpness\": 0,\n \"blur\": 0,\n \"noise\": 0,\n \"vignette\": 0,\n \"hue_rotate\": 0,\n \"temperature\": 0,\n \"tint\": 0,\n \"vibrance\": 0,\n \"highlights\": 0,\n \"shadows\": 0,\n \"crop_top\": 0,\n \"crop_bottom\": 0,\n \"crop_left\": 0,\n \"crop_right\": 0,\n \"border_radius\": 0,\n \"border_color\": \"<string>\",\n \"border_width\": 0,\n \"shadow_color\": \"<string>\",\n \"shadow_blur\": 0,\n \"shadow_x\": 0,\n \"shadow_y\": 0,\n \"blend_mode\": \"none\",\n \"mask\": {\n \"feather\": 0,\n \"scale\": 1,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n },\n \"mask_keyframes\": [\n {\n \"time\": 1,\n \"feather\": 123,\n \"scale\": 123,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"easing\": \"<string>\",\n \"spring\": {\n \"stiffness\": 100,\n \"damping\": 10,\n \"mass\": 1\n },\n \"back\": {\n \"overshoot\": 1.70158,\n \"dir\": \"out\"\n },\n \"elastic\": {\n \"amplitude\": 1,\n \"period\": 0.3,\n \"dir\": \"out\"\n },\n \"bezier\": {\n \"x1\": 0,\n \"y1\": 0,\n \"x2\": 1,\n \"y2\": 1\n }\n }\n ],\n \"matte\": {\n \"source\": \"<string>\",\n \"mode\": \"alpha\",\n \"invert\": false\n },\n \"backdrop_blur\": 0,\n \"x\": \"50%\",\n \"y\": \"50%\",\n \"width\": \"40%\",\n \"height\": \"80%\",\n \"aspect_ratio\": 123,\n \"x_anchor\": \"0%\",\n \"y_anchor\": \"100%\",\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"z_rotation\": \"0°\",\n \"x_scale\": \"100%\",\n \"y_scale\": \"100%\",\n \"flip_horizontal\": false,\n \"flip_vertical\": false,\n \"opacity\": 100,\n \"z_index\": 123,\n \"clip\": false,\n \"color_overlay\": \"<string>\",\n \"type\": \"video\",\n \"id\": \"clip_01\",\n \"name\": \"<string>\",\n \"track\": 127,\n \"time\": 0,\n \"visible\": true,\n \"in_point\": 0,\n \"out_point\": 6,\n \"speed\": 1,\n \"playback_rate_keyframes\": [\n {\n \"time\": 1,\n \"rate\": 1\n }\n ],\n \"volume\": 100,\n \"fade_in_duration\": 0,\n \"fade_out_duration\": 0,\n \"effects\": [],\n \"motion\": []\n }\n ],\n \"transitions\": [\n {\n \"type\": \"cross_dissolve\",\n \"duration\": 0.5,\n \"from_id\": \"video_01\",\n \"to_id\": \"video_02\",\n \"z_index\": 1\n }\n ],\n \"groups\": [\n {\n \"id\": \"hero\",\n \"parent\": \"<string>\",\n \"pivot\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"scale\": 1,\n \"rotation_degrees\": 0,\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"opacity\": 1,\n \"members\": [\n \"<string>\"\n ],\n \"animations\": [\n {\n \"time\": 1,\n \"duration\": 123,\n \"custom\": \"<string>\",\n \"easing\": \"ease_in_out\",\n \"reversed\": false,\n \"scope\": \"element\",\n \"delay\": 0,\n \"spacing\": 1,\n \"loop\": false,\n \"audio\": {\n \"feature\": \"amplitude\",\n \"scale\": 0,\n \"opacity\": 0,\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"rotate\": 0\n }\n }\n ],\n \"layout\": {\n \"type\": \"stack\",\n \"direction\": \"row\",\n \"gap\": 0,\n \"align\": \"center\",\n \"origin\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n }\n }\n ],\n \"motion_blur\": {\n \"samples\": 17,\n \"shutter\": 0.5\n },\n \"background_gradient\": \"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)\",\n \"watermark_url\": \"<string>\",\n \"custom_animations\": {\n \"element\": [],\n \"text\": []\n },\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"ingest_external\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.framelane.io/v1/renders")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"width\": 1920,\n \"height\": 1080,\n \"duration\": 15,\n \"frame_rate\": 30,\n \"output_format\": \"mp4\",\n \"output_filename\": \"my-render\",\n \"background_color\": \"#000000ff\",\n \"background_image_url\": \"https://cdn.example.com/bg.jpg\",\n \"alpha\": false,\n \"elements\": [\n {\n \"source_url\": \"https://cdn.example.com/clip.mp4\",\n \"lut_url\": \"<string>\",\n \"lut_intensity\": 100,\n \"brightness\": 0,\n \"contrast\": 0,\n \"saturation\": 0,\n \"exposure\": 0,\n \"sharpness\": 0,\n \"blur\": 0,\n \"noise\": 0,\n \"vignette\": 0,\n \"hue_rotate\": 0,\n \"temperature\": 0,\n \"tint\": 0,\n \"vibrance\": 0,\n \"highlights\": 0,\n \"shadows\": 0,\n \"crop_top\": 0,\n \"crop_bottom\": 0,\n \"crop_left\": 0,\n \"crop_right\": 0,\n \"border_radius\": 0,\n \"border_color\": \"<string>\",\n \"border_width\": 0,\n \"shadow_color\": \"<string>\",\n \"shadow_blur\": 0,\n \"shadow_x\": 0,\n \"shadow_y\": 0,\n \"blend_mode\": \"none\",\n \"mask\": {\n \"feather\": 0,\n \"scale\": 1,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n },\n \"mask_keyframes\": [\n {\n \"time\": 1,\n \"feather\": 123,\n \"scale\": 123,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"easing\": \"<string>\",\n \"spring\": {\n \"stiffness\": 100,\n \"damping\": 10,\n \"mass\": 1\n },\n \"back\": {\n \"overshoot\": 1.70158,\n \"dir\": \"out\"\n },\n \"elastic\": {\n \"amplitude\": 1,\n \"period\": 0.3,\n \"dir\": \"out\"\n },\n \"bezier\": {\n \"x1\": 0,\n \"y1\": 0,\n \"x2\": 1,\n \"y2\": 1\n }\n }\n ],\n \"matte\": {\n \"source\": \"<string>\",\n \"mode\": \"alpha\",\n \"invert\": false\n },\n \"backdrop_blur\": 0,\n \"x\": \"50%\",\n \"y\": \"50%\",\n \"width\": \"40%\",\n \"height\": \"80%\",\n \"aspect_ratio\": 123,\n \"x_anchor\": \"0%\",\n \"y_anchor\": \"100%\",\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"z_rotation\": \"0°\",\n \"x_scale\": \"100%\",\n \"y_scale\": \"100%\",\n \"flip_horizontal\": false,\n \"flip_vertical\": false,\n \"opacity\": 100,\n \"z_index\": 123,\n \"clip\": false,\n \"color_overlay\": \"<string>\",\n \"type\": \"video\",\n \"id\": \"clip_01\",\n \"name\": \"<string>\",\n \"track\": 127,\n \"time\": 0,\n \"visible\": true,\n \"in_point\": 0,\n \"out_point\": 6,\n \"speed\": 1,\n \"playback_rate_keyframes\": [\n {\n \"time\": 1,\n \"rate\": 1\n }\n ],\n \"volume\": 100,\n \"fade_in_duration\": 0,\n \"fade_out_duration\": 0,\n \"effects\": [],\n \"motion\": []\n }\n ],\n \"transitions\": [\n {\n \"type\": \"cross_dissolve\",\n \"duration\": 0.5,\n \"from_id\": \"video_01\",\n \"to_id\": \"video_02\",\n \"z_index\": 1\n }\n ],\n \"groups\": [\n {\n \"id\": \"hero\",\n \"parent\": \"<string>\",\n \"pivot\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"scale\": 1,\n \"rotation_degrees\": 0,\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"opacity\": 1,\n \"members\": [\n \"<string>\"\n ],\n \"animations\": [\n {\n \"time\": 1,\n \"duration\": 123,\n \"custom\": \"<string>\",\n \"easing\": \"ease_in_out\",\n \"reversed\": false,\n \"scope\": \"element\",\n \"delay\": 0,\n \"spacing\": 1,\n \"loop\": false,\n \"audio\": {\n \"feature\": \"amplitude\",\n \"scale\": 0,\n \"opacity\": 0,\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"rotate\": 0\n }\n }\n ],\n \"layout\": {\n \"type\": \"stack\",\n \"direction\": \"row\",\n \"gap\": 0,\n \"align\": \"center\",\n \"origin\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n }\n }\n ],\n \"motion_blur\": {\n \"samples\": 17,\n \"shutter\": 0.5\n },\n \"background_gradient\": \"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)\",\n \"watermark_url\": \"<string>\",\n \"custom_animations\": {\n \"element\": [],\n \"text\": []\n },\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"ingest_external\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.framelane.io/v1/renders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"width\": 1920,\n \"height\": 1080,\n \"duration\": 15,\n \"frame_rate\": 30,\n \"output_format\": \"mp4\",\n \"output_filename\": \"my-render\",\n \"background_color\": \"#000000ff\",\n \"background_image_url\": \"https://cdn.example.com/bg.jpg\",\n \"alpha\": false,\n \"elements\": [\n {\n \"source_url\": \"https://cdn.example.com/clip.mp4\",\n \"lut_url\": \"<string>\",\n \"lut_intensity\": 100,\n \"brightness\": 0,\n \"contrast\": 0,\n \"saturation\": 0,\n \"exposure\": 0,\n \"sharpness\": 0,\n \"blur\": 0,\n \"noise\": 0,\n \"vignette\": 0,\n \"hue_rotate\": 0,\n \"temperature\": 0,\n \"tint\": 0,\n \"vibrance\": 0,\n \"highlights\": 0,\n \"shadows\": 0,\n \"crop_top\": 0,\n \"crop_bottom\": 0,\n \"crop_left\": 0,\n \"crop_right\": 0,\n \"border_radius\": 0,\n \"border_color\": \"<string>\",\n \"border_width\": 0,\n \"shadow_color\": \"<string>\",\n \"shadow_blur\": 0,\n \"shadow_x\": 0,\n \"shadow_y\": 0,\n \"blend_mode\": \"none\",\n \"mask\": {\n \"feather\": 0,\n \"scale\": 1,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n },\n \"mask_keyframes\": [\n {\n \"time\": 1,\n \"feather\": 123,\n \"scale\": 123,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"easing\": \"<string>\",\n \"spring\": {\n \"stiffness\": 100,\n \"damping\": 10,\n \"mass\": 1\n },\n \"back\": {\n \"overshoot\": 1.70158,\n \"dir\": \"out\"\n },\n \"elastic\": {\n \"amplitude\": 1,\n \"period\": 0.3,\n \"dir\": \"out\"\n },\n \"bezier\": {\n \"x1\": 0,\n \"y1\": 0,\n \"x2\": 1,\n \"y2\": 1\n }\n }\n ],\n \"matte\": {\n \"source\": \"<string>\",\n \"mode\": \"alpha\",\n \"invert\": false\n },\n \"backdrop_blur\": 0,\n \"x\": \"50%\",\n \"y\": \"50%\",\n \"width\": \"40%\",\n \"height\": \"80%\",\n \"aspect_ratio\": 123,\n \"x_anchor\": \"0%\",\n \"y_anchor\": \"100%\",\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"z_rotation\": \"0°\",\n \"x_scale\": \"100%\",\n \"y_scale\": \"100%\",\n \"flip_horizontal\": false,\n \"flip_vertical\": false,\n \"opacity\": 100,\n \"z_index\": 123,\n \"clip\": false,\n \"color_overlay\": \"<string>\",\n \"type\": \"video\",\n \"id\": \"clip_01\",\n \"name\": \"<string>\",\n \"track\": 127,\n \"time\": 0,\n \"visible\": true,\n \"in_point\": 0,\n \"out_point\": 6,\n \"speed\": 1,\n \"playback_rate_keyframes\": [\n {\n \"time\": 1,\n \"rate\": 1\n }\n ],\n \"volume\": 100,\n \"fade_in_duration\": 0,\n \"fade_out_duration\": 0,\n \"effects\": [],\n \"motion\": []\n }\n ],\n \"transitions\": [\n {\n \"type\": \"cross_dissolve\",\n \"duration\": 0.5,\n \"from_id\": \"video_01\",\n \"to_id\": \"video_02\",\n \"z_index\": 1\n }\n ],\n \"groups\": [\n {\n \"id\": \"hero\",\n \"parent\": \"<string>\",\n \"pivot\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"scale\": 1,\n \"rotation_degrees\": 0,\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"opacity\": 1,\n \"members\": [\n \"<string>\"\n ],\n \"animations\": [\n {\n \"time\": 1,\n \"duration\": 123,\n \"custom\": \"<string>\",\n \"easing\": \"ease_in_out\",\n \"reversed\": false,\n \"scope\": \"element\",\n \"delay\": 0,\n \"spacing\": 1,\n \"loop\": false,\n \"audio\": {\n \"feature\": \"amplitude\",\n \"scale\": 0,\n \"opacity\": 0,\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"rotate\": 0\n }\n }\n ],\n \"layout\": {\n \"type\": \"stack\",\n \"direction\": \"row\",\n \"gap\": 0,\n \"align\": \"center\",\n \"origin\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n }\n }\n ],\n \"motion_blur\": {\n \"samples\": 17,\n \"shutter\": 0.5\n },\n \"background_gradient\": \"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)\",\n \"watermark_url\": \"<string>\",\n \"custom_animations\": {\n \"element\": [],\n \"text\": []\n },\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"ingest_external\": true\n}"
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",
"ok": true,
"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",
"violations": [
{
"code": "<string>",
"message": "<string>",
"severity": "error",
"path": "<string>",
"bbox": [
123
],
"time": 123
}
]
}{
"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",
"ok": true,
"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",
"violations": [
{
"code": "<string>",
"message": "<string>",
"severity": "error",
"path": "<string>",
"bbox": [
123
],
"time": 123
}
]
}{
"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": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}Submit a render job
Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY ok + violations[] lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.
curl --request POST \
--url https://api.framelane.io/v1/renders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"width": 1920,
"height": 1080,
"duration": 15,
"frame_rate": 30,
"output_format": "mp4",
"output_filename": "my-render",
"background_color": "#000000ff",
"background_image_url": "https://cdn.example.com/bg.jpg",
"alpha": false,
"elements": [
{
"source_url": "https://cdn.example.com/clip.mp4",
"lut_url": "<string>",
"lut_intensity": 100,
"brightness": 0,
"contrast": 0,
"saturation": 0,
"exposure": 0,
"sharpness": 0,
"blur": 0,
"noise": 0,
"vignette": 0,
"hue_rotate": 0,
"temperature": 0,
"tint": 0,
"vibrance": 0,
"highlights": 0,
"shadows": 0,
"crop_top": 0,
"crop_bottom": 0,
"crop_left": 0,
"crop_right": 0,
"border_radius": 0,
"border_color": "<string>",
"border_width": 0,
"shadow_color": "<string>",
"shadow_blur": 0,
"shadow_x": 0,
"shadow_y": 0,
"blend_mode": "none",
"mask": {
"feather": 0,
"scale": 1,
"center": {
"x": 0.5,
"y": 0.5
}
},
"mask_keyframes": [
{
"time": 1,
"feather": 123,
"scale": 123,
"center": {
"x": 0.5,
"y": 0.5
},
"easing": "<string>",
"spring": {
"stiffness": 100,
"damping": 10,
"mass": 1
},
"back": {
"overshoot": 1.70158,
"dir": "out"
},
"elastic": {
"amplitude": 1,
"period": 0.3,
"dir": "out"
},
"bezier": {
"x1": 0,
"y1": 0,
"x2": 1,
"y2": 1
}
}
],
"matte": {
"source": "<string>",
"mode": "alpha",
"invert": false
},
"backdrop_blur": 0,
"x": "50%",
"y": "50%",
"width": "40%",
"height": "80%",
"aspect_ratio": 123,
"x_anchor": "0%",
"y_anchor": "100%",
"x_rotation": "0°",
"y_rotation": "0°",
"z_rotation": "0°",
"x_scale": "100%",
"y_scale": "100%",
"flip_horizontal": false,
"flip_vertical": false,
"opacity": 100,
"z_index": 123,
"clip": false,
"color_overlay": "<string>",
"type": "video",
"id": "clip_01",
"name": "<string>",
"track": 127,
"time": 0,
"visible": true,
"in_point": 0,
"out_point": 6,
"speed": 1,
"playback_rate_keyframes": [
{
"time": 1,
"rate": 1
}
],
"volume": 100,
"fade_in_duration": 0,
"fade_out_duration": 0,
"effects": [],
"motion": []
}
],
"transitions": [
{
"type": "cross_dissolve",
"duration": 0.5,
"from_id": "video_01",
"to_id": "video_02",
"z_index": 1
}
],
"groups": [
{
"id": "hero",
"parent": "<string>",
"pivot": {
"x": 0.5,
"y": 0.5
},
"translate": {
"x": 0.5,
"y": 0.5
},
"scale": 1,
"rotation_degrees": 0,
"x_rotation": "0°",
"y_rotation": "0°",
"opacity": 1,
"members": [
"<string>"
],
"animations": [
{
"time": 1,
"duration": 123,
"custom": "<string>",
"easing": "ease_in_out",
"reversed": false,
"scope": "element",
"delay": 0,
"spacing": 1,
"loop": false,
"audio": {
"feature": "amplitude",
"scale": 0,
"opacity": 0,
"translate": {
"x": 0.5,
"y": 0.5
},
"rotate": 0
}
}
],
"layout": {
"type": "stack",
"direction": "row",
"gap": 0,
"align": "center",
"origin": {
"x": 0.5,
"y": 0.5
}
}
}
],
"motion_blur": {
"samples": 17,
"shutter": 0.5
},
"background_gradient": "linear-gradient(90deg, #ff0000 0%, #0000ff 100%)",
"watermark_url": "<string>",
"custom_animations": {
"element": [],
"text": []
},
"metadata": {
"project_id": "proj_123"
},
"webhook_url": "https://app.example.com/hooks/framelane",
"ingest_external": true
}
'import requests
url = "https://api.framelane.io/v1/renders"
payload = {
"width": 1920,
"height": 1080,
"duration": 15,
"frame_rate": 30,
"output_format": "mp4",
"output_filename": "my-render",
"background_color": "#000000ff",
"background_image_url": "https://cdn.example.com/bg.jpg",
"alpha": False,
"elements": [
{
"source_url": "https://cdn.example.com/clip.mp4",
"lut_url": "<string>",
"lut_intensity": 100,
"brightness": 0,
"contrast": 0,
"saturation": 0,
"exposure": 0,
"sharpness": 0,
"blur": 0,
"noise": 0,
"vignette": 0,
"hue_rotate": 0,
"temperature": 0,
"tint": 0,
"vibrance": 0,
"highlights": 0,
"shadows": 0,
"crop_top": 0,
"crop_bottom": 0,
"crop_left": 0,
"crop_right": 0,
"border_radius": 0,
"border_color": "<string>",
"border_width": 0,
"shadow_color": "<string>",
"shadow_blur": 0,
"shadow_x": 0,
"shadow_y": 0,
"blend_mode": "none",
"mask": {
"feather": 0,
"scale": 1,
"center": {
"x": 0.5,
"y": 0.5
}
},
"mask_keyframes": [
{
"time": 1,
"feather": 123,
"scale": 123,
"center": {
"x": 0.5,
"y": 0.5
},
"easing": "<string>",
"spring": {
"stiffness": 100,
"damping": 10,
"mass": 1
},
"back": {
"overshoot": 1.70158,
"dir": "out"
},
"elastic": {
"amplitude": 1,
"period": 0.3,
"dir": "out"
},
"bezier": {
"x1": 0,
"y1": 0,
"x2": 1,
"y2": 1
}
}
],
"matte": {
"source": "<string>",
"mode": "alpha",
"invert": False
},
"backdrop_blur": 0,
"x": "50%",
"y": "50%",
"width": "40%",
"height": "80%",
"aspect_ratio": 123,
"x_anchor": "0%",
"y_anchor": "100%",
"x_rotation": "0°",
"y_rotation": "0°",
"z_rotation": "0°",
"x_scale": "100%",
"y_scale": "100%",
"flip_horizontal": False,
"flip_vertical": False,
"opacity": 100,
"z_index": 123,
"clip": False,
"color_overlay": "<string>",
"type": "video",
"id": "clip_01",
"name": "<string>",
"track": 127,
"time": 0,
"visible": True,
"in_point": 0,
"out_point": 6,
"speed": 1,
"playback_rate_keyframes": [
{
"time": 1,
"rate": 1
}
],
"volume": 100,
"fade_in_duration": 0,
"fade_out_duration": 0,
"effects": [],
"motion": []
}
],
"transitions": [
{
"type": "cross_dissolve",
"duration": 0.5,
"from_id": "video_01",
"to_id": "video_02",
"z_index": 1
}
],
"groups": [
{
"id": "hero",
"parent": "<string>",
"pivot": {
"x": 0.5,
"y": 0.5
},
"translate": {
"x": 0.5,
"y": 0.5
},
"scale": 1,
"rotation_degrees": 0,
"x_rotation": "0°",
"y_rotation": "0°",
"opacity": 1,
"members": ["<string>"],
"animations": [
{
"time": 1,
"duration": 123,
"custom": "<string>",
"easing": "ease_in_out",
"reversed": False,
"scope": "element",
"delay": 0,
"spacing": 1,
"loop": False,
"audio": {
"feature": "amplitude",
"scale": 0,
"opacity": 0,
"translate": {
"x": 0.5,
"y": 0.5
},
"rotate": 0
}
}
],
"layout": {
"type": "stack",
"direction": "row",
"gap": 0,
"align": "center",
"origin": {
"x": 0.5,
"y": 0.5
}
}
}
],
"motion_blur": {
"samples": 17,
"shutter": 0.5
},
"background_gradient": "linear-gradient(90deg, #ff0000 0%, #0000ff 100%)",
"watermark_url": "<string>",
"custom_animations": {
"element": [],
"text": []
},
"metadata": { "project_id": "proj_123" },
"webhook_url": "https://app.example.com/hooks/framelane",
"ingest_external": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
width: 1920,
height: 1080,
duration: 15,
frame_rate: 30,
output_format: 'mp4',
output_filename: 'my-render',
background_color: '#000000ff',
background_image_url: 'https://cdn.example.com/bg.jpg',
alpha: false,
elements: [
{
source_url: 'https://cdn.example.com/clip.mp4',
lut_url: '<string>',
lut_intensity: 100,
brightness: 0,
contrast: 0,
saturation: 0,
exposure: 0,
sharpness: 0,
blur: 0,
noise: 0,
vignette: 0,
hue_rotate: 0,
temperature: 0,
tint: 0,
vibrance: 0,
highlights: 0,
shadows: 0,
crop_top: 0,
crop_bottom: 0,
crop_left: 0,
crop_right: 0,
border_radius: 0,
border_color: '<string>',
border_width: 0,
shadow_color: '<string>',
shadow_blur: 0,
shadow_x: 0,
shadow_y: 0,
blend_mode: 'none',
mask: {feather: 0, scale: 1, center: {x: 0.5, y: 0.5}},
mask_keyframes: [
{
time: 1,
feather: 123,
scale: 123,
center: {x: 0.5, y: 0.5},
easing: '<string>',
spring: {stiffness: 100, damping: 10, mass: 1},
back: {overshoot: 1.70158, dir: 'out'},
elastic: {amplitude: 1, period: 0.3, dir: 'out'},
bezier: {x1: 0, y1: 0, x2: 1, y2: 1}
}
],
matte: {source: '<string>', mode: 'alpha', invert: false},
backdrop_blur: 0,
x: '50%',
y: '50%',
width: '40%',
height: '80%',
aspect_ratio: 123,
x_anchor: '0%',
y_anchor: '100%',
x_rotation: '0°',
y_rotation: '0°',
z_rotation: '0°',
x_scale: '100%',
y_scale: '100%',
flip_horizontal: false,
flip_vertical: false,
opacity: 100,
z_index: 123,
clip: false,
color_overlay: '<string>',
type: 'video',
id: 'clip_01',
name: '<string>',
track: 127,
time: 0,
visible: true,
in_point: 0,
out_point: 6,
speed: 1,
playback_rate_keyframes: [{time: 1, rate: 1}],
volume: 100,
fade_in_duration: 0,
fade_out_duration: 0,
effects: [],
motion: []
}
],
transitions: [
{
type: 'cross_dissolve',
duration: 0.5,
from_id: 'video_01',
to_id: 'video_02',
z_index: 1
}
],
groups: [
{
id: 'hero',
parent: '<string>',
pivot: {x: 0.5, y: 0.5},
translate: {x: 0.5, y: 0.5},
scale: 1,
rotation_degrees: 0,
x_rotation: '0°',
y_rotation: '0°',
opacity: 1,
members: ['<string>'],
animations: [
{
time: 1,
duration: 123,
custom: '<string>',
easing: 'ease_in_out',
reversed: false,
scope: 'element',
delay: 0,
spacing: 1,
loop: false,
audio: {
feature: 'amplitude',
scale: 0,
opacity: 0,
translate: {x: 0.5, y: 0.5},
rotate: 0
}
}
],
layout: {
type: 'stack',
direction: 'row',
gap: 0,
align: 'center',
origin: {x: 0.5, y: 0.5}
}
}
],
motion_blur: {samples: 17, shutter: 0.5},
background_gradient: 'linear-gradient(90deg, #ff0000 0%, #0000ff 100%)',
watermark_url: '<string>',
custom_animations: {element: [], text: []},
metadata: {project_id: 'proj_123'},
webhook_url: 'https://app.example.com/hooks/framelane',
ingest_external: true
})
};
fetch('https://api.framelane.io/v1/renders', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'width' => 1920,
'height' => 1080,
'duration' => 15,
'frame_rate' => 30,
'output_format' => 'mp4',
'output_filename' => 'my-render',
'background_color' => '#000000ff',
'background_image_url' => 'https://cdn.example.com/bg.jpg',
'alpha' => false,
'elements' => [
[
'source_url' => 'https://cdn.example.com/clip.mp4',
'lut_url' => '<string>',
'lut_intensity' => 100,
'brightness' => 0,
'contrast' => 0,
'saturation' => 0,
'exposure' => 0,
'sharpness' => 0,
'blur' => 0,
'noise' => 0,
'vignette' => 0,
'hue_rotate' => 0,
'temperature' => 0,
'tint' => 0,
'vibrance' => 0,
'highlights' => 0,
'shadows' => 0,
'crop_top' => 0,
'crop_bottom' => 0,
'crop_left' => 0,
'crop_right' => 0,
'border_radius' => 0,
'border_color' => '<string>',
'border_width' => 0,
'shadow_color' => '<string>',
'shadow_blur' => 0,
'shadow_x' => 0,
'shadow_y' => 0,
'blend_mode' => 'none',
'mask' => [
'feather' => 0,
'scale' => 1,
'center' => [
'x' => 0.5,
'y' => 0.5
]
],
'mask_keyframes' => [
[
'time' => 1,
'feather' => 123,
'scale' => 123,
'center' => [
'x' => 0.5,
'y' => 0.5
],
'easing' => '<string>',
'spring' => [
'stiffness' => 100,
'damping' => 10,
'mass' => 1
],
'back' => [
'overshoot' => 1.70158,
'dir' => 'out'
],
'elastic' => [
'amplitude' => 1,
'period' => 0.3,
'dir' => 'out'
],
'bezier' => [
'x1' => 0,
'y1' => 0,
'x2' => 1,
'y2' => 1
]
]
],
'matte' => [
'source' => '<string>',
'mode' => 'alpha',
'invert' => false
],
'backdrop_blur' => 0,
'x' => '50%',
'y' => '50%',
'width' => '40%',
'height' => '80%',
'aspect_ratio' => 123,
'x_anchor' => '0%',
'y_anchor' => '100%',
'x_rotation' => '0°',
'y_rotation' => '0°',
'z_rotation' => '0°',
'x_scale' => '100%',
'y_scale' => '100%',
'flip_horizontal' => false,
'flip_vertical' => false,
'opacity' => 100,
'z_index' => 123,
'clip' => false,
'color_overlay' => '<string>',
'type' => 'video',
'id' => 'clip_01',
'name' => '<string>',
'track' => 127,
'time' => 0,
'visible' => true,
'in_point' => 0,
'out_point' => 6,
'speed' => 1,
'playback_rate_keyframes' => [
[
'time' => 1,
'rate' => 1
]
],
'volume' => 100,
'fade_in_duration' => 0,
'fade_out_duration' => 0,
'effects' => [
],
'motion' => [
]
]
],
'transitions' => [
[
'type' => 'cross_dissolve',
'duration' => 0.5,
'from_id' => 'video_01',
'to_id' => 'video_02',
'z_index' => 1
]
],
'groups' => [
[
'id' => 'hero',
'parent' => '<string>',
'pivot' => [
'x' => 0.5,
'y' => 0.5
],
'translate' => [
'x' => 0.5,
'y' => 0.5
],
'scale' => 1,
'rotation_degrees' => 0,
'x_rotation' => '0°',
'y_rotation' => '0°',
'opacity' => 1,
'members' => [
'<string>'
],
'animations' => [
[
'time' => 1,
'duration' => 123,
'custom' => '<string>',
'easing' => 'ease_in_out',
'reversed' => false,
'scope' => 'element',
'delay' => 0,
'spacing' => 1,
'loop' => false,
'audio' => [
'feature' => 'amplitude',
'scale' => 0,
'opacity' => 0,
'translate' => [
'x' => 0.5,
'y' => 0.5
],
'rotate' => 0
]
]
],
'layout' => [
'type' => 'stack',
'direction' => 'row',
'gap' => 0,
'align' => 'center',
'origin' => [
'x' => 0.5,
'y' => 0.5
]
]
]
],
'motion_blur' => [
'samples' => 17,
'shutter' => 0.5
],
'background_gradient' => 'linear-gradient(90deg, #ff0000 0%, #0000ff 100%)',
'watermark_url' => '<string>',
'custom_animations' => [
'element' => [
],
'text' => [
]
],
'metadata' => [
'project_id' => 'proj_123'
],
'webhook_url' => 'https://app.example.com/hooks/framelane',
'ingest_external' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.framelane.io/v1/renders"
payload := strings.NewReader("{\n \"width\": 1920,\n \"height\": 1080,\n \"duration\": 15,\n \"frame_rate\": 30,\n \"output_format\": \"mp4\",\n \"output_filename\": \"my-render\",\n \"background_color\": \"#000000ff\",\n \"background_image_url\": \"https://cdn.example.com/bg.jpg\",\n \"alpha\": false,\n \"elements\": [\n {\n \"source_url\": \"https://cdn.example.com/clip.mp4\",\n \"lut_url\": \"<string>\",\n \"lut_intensity\": 100,\n \"brightness\": 0,\n \"contrast\": 0,\n \"saturation\": 0,\n \"exposure\": 0,\n \"sharpness\": 0,\n \"blur\": 0,\n \"noise\": 0,\n \"vignette\": 0,\n \"hue_rotate\": 0,\n \"temperature\": 0,\n \"tint\": 0,\n \"vibrance\": 0,\n \"highlights\": 0,\n \"shadows\": 0,\n \"crop_top\": 0,\n \"crop_bottom\": 0,\n \"crop_left\": 0,\n \"crop_right\": 0,\n \"border_radius\": 0,\n \"border_color\": \"<string>\",\n \"border_width\": 0,\n \"shadow_color\": \"<string>\",\n \"shadow_blur\": 0,\n \"shadow_x\": 0,\n \"shadow_y\": 0,\n \"blend_mode\": \"none\",\n \"mask\": {\n \"feather\": 0,\n \"scale\": 1,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n },\n \"mask_keyframes\": [\n {\n \"time\": 1,\n \"feather\": 123,\n \"scale\": 123,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"easing\": \"<string>\",\n \"spring\": {\n \"stiffness\": 100,\n \"damping\": 10,\n \"mass\": 1\n },\n \"back\": {\n \"overshoot\": 1.70158,\n \"dir\": \"out\"\n },\n \"elastic\": {\n \"amplitude\": 1,\n \"period\": 0.3,\n \"dir\": \"out\"\n },\n \"bezier\": {\n \"x1\": 0,\n \"y1\": 0,\n \"x2\": 1,\n \"y2\": 1\n }\n }\n ],\n \"matte\": {\n \"source\": \"<string>\",\n \"mode\": \"alpha\",\n \"invert\": false\n },\n \"backdrop_blur\": 0,\n \"x\": \"50%\",\n \"y\": \"50%\",\n \"width\": \"40%\",\n \"height\": \"80%\",\n \"aspect_ratio\": 123,\n \"x_anchor\": \"0%\",\n \"y_anchor\": \"100%\",\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"z_rotation\": \"0°\",\n \"x_scale\": \"100%\",\n \"y_scale\": \"100%\",\n \"flip_horizontal\": false,\n \"flip_vertical\": false,\n \"opacity\": 100,\n \"z_index\": 123,\n \"clip\": false,\n \"color_overlay\": \"<string>\",\n \"type\": \"video\",\n \"id\": \"clip_01\",\n \"name\": \"<string>\",\n \"track\": 127,\n \"time\": 0,\n \"visible\": true,\n \"in_point\": 0,\n \"out_point\": 6,\n \"speed\": 1,\n \"playback_rate_keyframes\": [\n {\n \"time\": 1,\n \"rate\": 1\n }\n ],\n \"volume\": 100,\n \"fade_in_duration\": 0,\n \"fade_out_duration\": 0,\n \"effects\": [],\n \"motion\": []\n }\n ],\n \"transitions\": [\n {\n \"type\": \"cross_dissolve\",\n \"duration\": 0.5,\n \"from_id\": \"video_01\",\n \"to_id\": \"video_02\",\n \"z_index\": 1\n }\n ],\n \"groups\": [\n {\n \"id\": \"hero\",\n \"parent\": \"<string>\",\n \"pivot\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"scale\": 1,\n \"rotation_degrees\": 0,\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"opacity\": 1,\n \"members\": [\n \"<string>\"\n ],\n \"animations\": [\n {\n \"time\": 1,\n \"duration\": 123,\n \"custom\": \"<string>\",\n \"easing\": \"ease_in_out\",\n \"reversed\": false,\n \"scope\": \"element\",\n \"delay\": 0,\n \"spacing\": 1,\n \"loop\": false,\n \"audio\": {\n \"feature\": \"amplitude\",\n \"scale\": 0,\n \"opacity\": 0,\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"rotate\": 0\n }\n }\n ],\n \"layout\": {\n \"type\": \"stack\",\n \"direction\": \"row\",\n \"gap\": 0,\n \"align\": \"center\",\n \"origin\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n }\n }\n ],\n \"motion_blur\": {\n \"samples\": 17,\n \"shutter\": 0.5\n },\n \"background_gradient\": \"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)\",\n \"watermark_url\": \"<string>\",\n \"custom_animations\": {\n \"element\": [],\n \"text\": []\n },\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"ingest_external\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.framelane.io/v1/renders")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"width\": 1920,\n \"height\": 1080,\n \"duration\": 15,\n \"frame_rate\": 30,\n \"output_format\": \"mp4\",\n \"output_filename\": \"my-render\",\n \"background_color\": \"#000000ff\",\n \"background_image_url\": \"https://cdn.example.com/bg.jpg\",\n \"alpha\": false,\n \"elements\": [\n {\n \"source_url\": \"https://cdn.example.com/clip.mp4\",\n \"lut_url\": \"<string>\",\n \"lut_intensity\": 100,\n \"brightness\": 0,\n \"contrast\": 0,\n \"saturation\": 0,\n \"exposure\": 0,\n \"sharpness\": 0,\n \"blur\": 0,\n \"noise\": 0,\n \"vignette\": 0,\n \"hue_rotate\": 0,\n \"temperature\": 0,\n \"tint\": 0,\n \"vibrance\": 0,\n \"highlights\": 0,\n \"shadows\": 0,\n \"crop_top\": 0,\n \"crop_bottom\": 0,\n \"crop_left\": 0,\n \"crop_right\": 0,\n \"border_radius\": 0,\n \"border_color\": \"<string>\",\n \"border_width\": 0,\n \"shadow_color\": \"<string>\",\n \"shadow_blur\": 0,\n \"shadow_x\": 0,\n \"shadow_y\": 0,\n \"blend_mode\": \"none\",\n \"mask\": {\n \"feather\": 0,\n \"scale\": 1,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n },\n \"mask_keyframes\": [\n {\n \"time\": 1,\n \"feather\": 123,\n \"scale\": 123,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"easing\": \"<string>\",\n \"spring\": {\n \"stiffness\": 100,\n \"damping\": 10,\n \"mass\": 1\n },\n \"back\": {\n \"overshoot\": 1.70158,\n \"dir\": \"out\"\n },\n \"elastic\": {\n \"amplitude\": 1,\n \"period\": 0.3,\n \"dir\": \"out\"\n },\n \"bezier\": {\n \"x1\": 0,\n \"y1\": 0,\n \"x2\": 1,\n \"y2\": 1\n }\n }\n ],\n \"matte\": {\n \"source\": \"<string>\",\n \"mode\": \"alpha\",\n \"invert\": false\n },\n \"backdrop_blur\": 0,\n \"x\": \"50%\",\n \"y\": \"50%\",\n \"width\": \"40%\",\n \"height\": \"80%\",\n \"aspect_ratio\": 123,\n \"x_anchor\": \"0%\",\n \"y_anchor\": \"100%\",\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"z_rotation\": \"0°\",\n \"x_scale\": \"100%\",\n \"y_scale\": \"100%\",\n \"flip_horizontal\": false,\n \"flip_vertical\": false,\n \"opacity\": 100,\n \"z_index\": 123,\n \"clip\": false,\n \"color_overlay\": \"<string>\",\n \"type\": \"video\",\n \"id\": \"clip_01\",\n \"name\": \"<string>\",\n \"track\": 127,\n \"time\": 0,\n \"visible\": true,\n \"in_point\": 0,\n \"out_point\": 6,\n \"speed\": 1,\n \"playback_rate_keyframes\": [\n {\n \"time\": 1,\n \"rate\": 1\n }\n ],\n \"volume\": 100,\n \"fade_in_duration\": 0,\n \"fade_out_duration\": 0,\n \"effects\": [],\n \"motion\": []\n }\n ],\n \"transitions\": [\n {\n \"type\": \"cross_dissolve\",\n \"duration\": 0.5,\n \"from_id\": \"video_01\",\n \"to_id\": \"video_02\",\n \"z_index\": 1\n }\n ],\n \"groups\": [\n {\n \"id\": \"hero\",\n \"parent\": \"<string>\",\n \"pivot\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"scale\": 1,\n \"rotation_degrees\": 0,\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"opacity\": 1,\n \"members\": [\n \"<string>\"\n ],\n \"animations\": [\n {\n \"time\": 1,\n \"duration\": 123,\n \"custom\": \"<string>\",\n \"easing\": \"ease_in_out\",\n \"reversed\": false,\n \"scope\": \"element\",\n \"delay\": 0,\n \"spacing\": 1,\n \"loop\": false,\n \"audio\": {\n \"feature\": \"amplitude\",\n \"scale\": 0,\n \"opacity\": 0,\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"rotate\": 0\n }\n }\n ],\n \"layout\": {\n \"type\": \"stack\",\n \"direction\": \"row\",\n \"gap\": 0,\n \"align\": \"center\",\n \"origin\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n }\n }\n ],\n \"motion_blur\": {\n \"samples\": 17,\n \"shutter\": 0.5\n },\n \"background_gradient\": \"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)\",\n \"watermark_url\": \"<string>\",\n \"custom_animations\": {\n \"element\": [],\n \"text\": []\n },\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"ingest_external\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.framelane.io/v1/renders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"width\": 1920,\n \"height\": 1080,\n \"duration\": 15,\n \"frame_rate\": 30,\n \"output_format\": \"mp4\",\n \"output_filename\": \"my-render\",\n \"background_color\": \"#000000ff\",\n \"background_image_url\": \"https://cdn.example.com/bg.jpg\",\n \"alpha\": false,\n \"elements\": [\n {\n \"source_url\": \"https://cdn.example.com/clip.mp4\",\n \"lut_url\": \"<string>\",\n \"lut_intensity\": 100,\n \"brightness\": 0,\n \"contrast\": 0,\n \"saturation\": 0,\n \"exposure\": 0,\n \"sharpness\": 0,\n \"blur\": 0,\n \"noise\": 0,\n \"vignette\": 0,\n \"hue_rotate\": 0,\n \"temperature\": 0,\n \"tint\": 0,\n \"vibrance\": 0,\n \"highlights\": 0,\n \"shadows\": 0,\n \"crop_top\": 0,\n \"crop_bottom\": 0,\n \"crop_left\": 0,\n \"crop_right\": 0,\n \"border_radius\": 0,\n \"border_color\": \"<string>\",\n \"border_width\": 0,\n \"shadow_color\": \"<string>\",\n \"shadow_blur\": 0,\n \"shadow_x\": 0,\n \"shadow_y\": 0,\n \"blend_mode\": \"none\",\n \"mask\": {\n \"feather\": 0,\n \"scale\": 1,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n },\n \"mask_keyframes\": [\n {\n \"time\": 1,\n \"feather\": 123,\n \"scale\": 123,\n \"center\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"easing\": \"<string>\",\n \"spring\": {\n \"stiffness\": 100,\n \"damping\": 10,\n \"mass\": 1\n },\n \"back\": {\n \"overshoot\": 1.70158,\n \"dir\": \"out\"\n },\n \"elastic\": {\n \"amplitude\": 1,\n \"period\": 0.3,\n \"dir\": \"out\"\n },\n \"bezier\": {\n \"x1\": 0,\n \"y1\": 0,\n \"x2\": 1,\n \"y2\": 1\n }\n }\n ],\n \"matte\": {\n \"source\": \"<string>\",\n \"mode\": \"alpha\",\n \"invert\": false\n },\n \"backdrop_blur\": 0,\n \"x\": \"50%\",\n \"y\": \"50%\",\n \"width\": \"40%\",\n \"height\": \"80%\",\n \"aspect_ratio\": 123,\n \"x_anchor\": \"0%\",\n \"y_anchor\": \"100%\",\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"z_rotation\": \"0°\",\n \"x_scale\": \"100%\",\n \"y_scale\": \"100%\",\n \"flip_horizontal\": false,\n \"flip_vertical\": false,\n \"opacity\": 100,\n \"z_index\": 123,\n \"clip\": false,\n \"color_overlay\": \"<string>\",\n \"type\": \"video\",\n \"id\": \"clip_01\",\n \"name\": \"<string>\",\n \"track\": 127,\n \"time\": 0,\n \"visible\": true,\n \"in_point\": 0,\n \"out_point\": 6,\n \"speed\": 1,\n \"playback_rate_keyframes\": [\n {\n \"time\": 1,\n \"rate\": 1\n }\n ],\n \"volume\": 100,\n \"fade_in_duration\": 0,\n \"fade_out_duration\": 0,\n \"effects\": [],\n \"motion\": []\n }\n ],\n \"transitions\": [\n {\n \"type\": \"cross_dissolve\",\n \"duration\": 0.5,\n \"from_id\": \"video_01\",\n \"to_id\": \"video_02\",\n \"z_index\": 1\n }\n ],\n \"groups\": [\n {\n \"id\": \"hero\",\n \"parent\": \"<string>\",\n \"pivot\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"scale\": 1,\n \"rotation_degrees\": 0,\n \"x_rotation\": \"0°\",\n \"y_rotation\": \"0°\",\n \"opacity\": 1,\n \"members\": [\n \"<string>\"\n ],\n \"animations\": [\n {\n \"time\": 1,\n \"duration\": 123,\n \"custom\": \"<string>\",\n \"easing\": \"ease_in_out\",\n \"reversed\": false,\n \"scope\": \"element\",\n \"delay\": 0,\n \"spacing\": 1,\n \"loop\": false,\n \"audio\": {\n \"feature\": \"amplitude\",\n \"scale\": 0,\n \"opacity\": 0,\n \"translate\": {\n \"x\": 0.5,\n \"y\": 0.5\n },\n \"rotate\": 0\n }\n }\n ],\n \"layout\": {\n \"type\": \"stack\",\n \"direction\": \"row\",\n \"gap\": 0,\n \"align\": \"center\",\n \"origin\": {\n \"x\": 0.5,\n \"y\": 0.5\n }\n }\n }\n ],\n \"motion_blur\": {\n \"samples\": 17,\n \"shutter\": 0.5\n },\n \"background_gradient\": \"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)\",\n \"watermark_url\": \"<string>\",\n \"custom_animations\": {\n \"element\": [],\n \"text\": []\n },\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"ingest_external\": true\n}"
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",
"ok": true,
"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",
"violations": [
{
"code": "<string>",
"message": "<string>",
"severity": "error",
"path": "<string>",
"bbox": [
123
],
"time": 123
}
]
}{
"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",
"ok": true,
"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",
"violations": [
{
"code": "<string>",
"message": "<string>",
"severity": "error",
"path": "<string>",
"bbox": [
123
],
"time": 123
}
]
}{
"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": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Body
Body for POST /v1/renders.
Defines the composition to render: dimensions, output format, timeline elements, and optional transitions. The render engine produces a single video artifact.
Output width in pixels. Must be set together with height or both omitted.
16 <= x <= 81921920
Output height in pixels. Must be set together with width or both omitted.
16 <= x <= 81921080
Total composition duration in seconds. Inferred from elements when omitted.
x > 015
Frames per second. When set, the output encodes at exactly this rate. Defaults to 30 when omitted.
1 <= x <= 24030
Container and codec for the output file.
mp4, webm, mov, gif, png, jpg "mp4"
Custom filename for the artifact (without extension). Auto-generated when omitted.
"my-render"
RGBA background color in hex format (#RRGGBBAA).
^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"#000000ff"
URL of an image to use as the composition background.
1 - 2083"https://cdn.example.com/bg.jpg"
When true, produce an alpha-channel (transparent background) output. Requires output_format=webm or output_format=mov.
false
Ordered list of timeline elements (video, image, text, audio, etc.).
- VideoElement
- AudioElement
- TextElement
- ImageElement
- ShapeElement
Show child attributes
Show child attributes
Transition effects applied between consecutive elements.
Show child attributes
Show child attributes
Transform groups over member elements (compose member→group→parent; optional stack layout). §5.
Show child attributes
Show child attributes
Shutter-based motion blur over the whole composition (§5c). Graphics motion smears; video holds its decoded frame within the shutter (as in AE). Opt-in and costly: accumulation is CPU-side, so the render falls back to software encoding — expect roughly samples× render time.
Show child attributes
Show child attributes
Canvas-sized gradient fill behind every layer (§6). Rendered for the full output slice. Accepts a Gradient object or a CSS linear-gradient(...) string.
^\s*(?:linear|radial)-gradient\s*\("linear-gradient(90deg, #ff0000 0%, #0000ff 100%)"
Watermark image overlaid on the output (§6).
1 - 2083Inline custom-animation definitions (§3), registered with the engine before any element is built. Reference an element entry by name via motion[].custom on any video/image/shape element or group; reference a text entry via a text element's animation_preset or motion[].custom. The catalog stops being a ceiling — anything expressible as keyframes is expressible in the request.
Show child attributes
Show child attributes
Arbitrary key-value pairs echoed back in all webhook payloads.
Show child attributes
Show child attributes
{ "project_id": "proj_123" }
Per-request webhook URL. Overrides workspace-level webhooks for this job only. Receives render.completed, render.failed, and progress events.
1 - 2083"https://app.example.com/hooks/framelane"
Controls handling of source URLs that are not already hosted by Framelane. When true, such public files are copied into Framelane storage before rendering: the job starts in the ingesting state and moves to queued once the copy completes (you receive an asset.ready webhook per file). When false, the URL is passed straight to the renderer (the legacy behavior; video/audio still require an explicit out_point). Defaults to the workspace setting when omitted.
true
Response
Idempotent replay — same Idempotency-Key reused.
A freshly submitted render: the job row plus the advisory lint of its composition.
Returned only by the two submit routes (POST /v1/renders,
POST /v1/projects/{id}/renders). A subclass rather than two more fields on
:class:JobOut, because JobOut is the shape of a job row on every read route
(GET /v1/renders, all /v1/tasks routes, the MCP read tools) where a lint
result does not exist and would be permanently null.
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.
Advisory — the render was still accepted and dispatched. False means the composition has error-severity findings that will likely make the output wrong (a self-transition, a fully off-canvas element); it does NOT mean the submission was refused. Everything that actually blocks a render is a 422 before you ever see this field.
true
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.
Advisory — the render was still accepted and dispatched. Cross-element and layout findings from the same linter the preview dry-run runs, attached so you can see problems on the render you just paid for instead of only in the artifact. To catch these BEFORE spending a render, call POST /v1/preview with dry_run.Truncated to the first 40 findings (errors first) on very large compositions, with a VIOLATIONS_TRUNCATED marker carrying the full count; the free dry run is never truncated.
Show child attributes
Show child attributes

