curl --request POST \
--url https://api.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"durationMs": 5000,
"startTimeMs": 1000,
"text": "Welcome back",
"animation": {
"intro": {
"preset": "slide_up"
},
"outro": {
"preset": "fade"
}
},
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"depth": "behind_presenter",
"fontFamily": "Inter",
"fontId": "media_abc123def456",
"fontSize": 81,
"fontWeight": 500,
"fontWidth": 100,
"outline": "#000000FF",
"presetId": "default:label",
"shadow": "subtle",
"textAlign": "center"
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays"
payload = {
"durationMs": 5000,
"startTimeMs": 1000,
"text": "Welcome back",
"animation": {
"intro": { "preset": "slide_up" },
"outro": { "preset": "fade" }
},
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"depth": "behind_presenter",
"fontFamily": "Inter",
"fontId": "media_abc123def456",
"fontSize": 81,
"fontWeight": 500,
"fontWidth": 100,
"outline": "#000000FF",
"presetId": "default:label",
"shadow": "subtle",
"textAlign": "center"
}
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({
durationMs: 5000,
startTimeMs: 1000,
text: 'Welcome back',
animation: {intro: {preset: 'slide_up'}, outro: {preset: 'fade'}},
backgroundShape: 'squircle',
color: '#FFFFFFFF',
depth: 'behind_presenter',
fontFamily: 'Inter',
fontId: 'media_abc123def456',
fontSize: 81,
fontWeight: 500,
fontWidth: 100,
outline: '#000000FF',
presetId: 'default:label',
shadow: 'subtle',
textAlign: 'center'
})
};
fetch('https://api.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays', 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.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays",
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([
'durationMs' => 5000,
'startTimeMs' => 1000,
'text' => 'Welcome back',
'animation' => [
'intro' => [
'preset' => 'slide_up'
],
'outro' => [
'preset' => 'fade'
]
],
'backgroundShape' => 'squircle',
'color' => '#FFFFFFFF',
'depth' => 'behind_presenter',
'fontFamily' => 'Inter',
'fontId' => 'media_abc123def456',
'fontSize' => 81,
'fontWeight' => 500,
'fontWidth' => 100,
'outline' => '#000000FF',
'presetId' => 'default:label',
'shadow' => 'subtle',
'textAlign' => 'center'
]),
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.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays"
payload := strings.NewReader("{\n \"durationMs\": 5000,\n \"startTimeMs\": 1000,\n \"text\": \"Welcome back\",\n \"animation\": {\n \"intro\": {\n \"preset\": \"slide_up\"\n },\n \"outro\": {\n \"preset\": \"fade\"\n }\n },\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"depth\": \"behind_presenter\",\n \"fontFamily\": \"Inter\",\n \"fontId\": \"media_abc123def456\",\n \"fontSize\": 81,\n \"fontWeight\": 500,\n \"fontWidth\": 100,\n \"outline\": \"#000000FF\",\n \"presetId\": \"default:label\",\n \"shadow\": \"subtle\",\n \"textAlign\": \"center\"\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.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"durationMs\": 5000,\n \"startTimeMs\": 1000,\n \"text\": \"Welcome back\",\n \"animation\": {\n \"intro\": {\n \"preset\": \"slide_up\"\n },\n \"outro\": {\n \"preset\": \"fade\"\n }\n },\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"depth\": \"behind_presenter\",\n \"fontFamily\": \"Inter\",\n \"fontId\": \"media_abc123def456\",\n \"fontSize\": 81,\n \"fontWeight\": 500,\n \"fontWidth\": 100,\n \"outline\": \"#000000FF\",\n \"presetId\": \"default:label\",\n \"shadow\": \"subtle\",\n \"textAlign\": \"center\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays")
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 \"durationMs\": 5000,\n \"startTimeMs\": 1000,\n \"text\": \"Welcome back\",\n \"animation\": {\n \"intro\": {\n \"preset\": \"slide_up\"\n },\n \"outro\": {\n \"preset\": \"fade\"\n }\n },\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"depth\": \"behind_presenter\",\n \"fontFamily\": \"Inter\",\n \"fontId\": \"media_abc123def456\",\n \"fontSize\": 81,\n \"fontWeight\": 500,\n \"fontWidth\": 100,\n \"outline\": \"#000000FF\",\n \"presetId\": \"default:label\",\n \"shadow\": \"subtle\",\n \"textAlign\": \"center\"\n}"
response = http.request(request)
puts response.read_body{
"textOverlay": {
"animation": {
"intro": {
"blur": 0,
"clip": false,
"durationMs": 500,
"easing": {
"curve": "slow_down",
"intensity": 0.5,
"bezier": [
0.25,
0.1,
0.25,
1
],
"spring": {
"damping": 12,
"mass": 1,
"stiffness": 200
}
},
"moveX": 0,
"moveY": -0.5,
"opacity": 0,
"preset": "slide_up",
"rotate": 0,
"scale": 1,
"text": {
"delayMs": 100,
"order": "forward",
"smoothing": "linear",
"unit": "words"
}
},
"motionBlur": true,
"outro": {
"blur": 0,
"clip": false,
"durationMs": 500,
"easing": {
"curve": "slow_down",
"intensity": 0.5,
"bezier": [
0.25,
0.1,
0.25,
1
],
"spring": {
"damping": 12,
"mass": 1,
"stiffness": 200
}
},
"moveX": 0,
"moveY": -0.5,
"opacity": 0,
"preset": "slide_up",
"rotate": 0,
"scale": 1,
"text": {
"delayMs": 100,
"order": "forward",
"smoothing": "linear",
"unit": "words"
}
},
"textIntro": {
"blur": 0,
"clip": false,
"durationMs": 500,
"easing": {
"curve": "slow_down",
"intensity": 0.5,
"bezier": [
0.25,
0.1,
0.25,
1
],
"spring": {
"damping": 12,
"mass": 1,
"stiffness": 200
}
},
"moveX": 0,
"moveY": -0.5,
"opacity": 0,
"preset": "slide_up",
"rotate": 0,
"scale": 1,
"text": {
"delayMs": 100,
"order": "forward",
"smoothing": "linear",
"unit": "words"
}
},
"textOutro": {
"blur": 0,
"clip": false,
"durationMs": 500,
"easing": {
"curve": "slow_down",
"intensity": 0.5,
"bezier": [
0.25,
0.1,
0.25,
1
],
"spring": {
"damping": 12,
"mass": 1,
"stiffness": 200
}
},
"moveX": 0,
"moveY": -0.5,
"opacity": 0,
"preset": "slide_up",
"rotate": 0,
"scale": 1,
"text": {
"delayMs": 100,
"order": "forward",
"smoothing": "linear",
"unit": "words"
}
}
},
"background": {
"color": "#5E51F8FF",
"type": "solid"
},
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"depth": "behind_presenter",
"dimensions": {
"height": 540,
"width": 960
},
"durationMs": 5000,
"fontFamily": "Inter",
"fontSize": 81,
"fontWeight": 500,
"fontWidth": 100,
"id": "ly_abc123",
"outline": "#000000FF",
"point": {
"xPct": 30,
"yPct": 30
},
"shadow": "subtle",
"startTimeMs": 1000,
"text": "Welcome back",
"textAlign": "center",
"transition": "hard_cut",
"zIndex": 0,
"fontId": "media_abc123def456"
}
}{
"docsUrl": "https://docs.tella.com/",
"error": "bad_request",
"message": "The request was malformed or contained invalid parameters."
}{
"docsUrl": "https://docs.tella.com/",
"error": "unauthorized",
"message": "Authentication is required. Provide a valid API key."
}{
"docsUrl": "https://docs.tella.com/",
"error": "forbidden",
"message": "You don't have permission to access this resource."
}{
"docsUrl": "https://docs.tella.com/",
"error": "not_found",
"message": "The requested resource was not found."
}{
"docsUrl": "https://docs.tella.com/",
"error": "conflict",
"message": "The request conflicts with the resource's current state, e.g. an Idempotency-Key whose first request is still in progress. Retry once it settles."
}{
"docsUrl": "https://docs.tella.com/",
"error": "rate_limited",
"message": "You have exceeded the rate limit. Please slow down."
}{
"docsUrl": "https://docs.tella.com/",
"error": "server_error",
"message": "An unexpected error occurred"
}{
"docsUrl": "https://docs.tella.com/",
"error": "not_implemented",
"message": "The requested operation is not implemented."
}{
"docsUrl": "https://docs.tella.com/",
"error": "unavailable",
"message": "A dependency was unavailable and the request was not executed. Safe to resend unchanged after the Retry-After delay."
}Add a text overlay to a clip
Adds a text overlay to a clip. Nothing needs uploading — pass the copy directly. Font, color, position and size all fall back to the editor’s defaults.
curl --request POST \
--url https://api.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"durationMs": 5000,
"startTimeMs": 1000,
"text": "Welcome back",
"animation": {
"intro": {
"preset": "slide_up"
},
"outro": {
"preset": "fade"
}
},
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"depth": "behind_presenter",
"fontFamily": "Inter",
"fontId": "media_abc123def456",
"fontSize": 81,
"fontWeight": 500,
"fontWidth": 100,
"outline": "#000000FF",
"presetId": "default:label",
"shadow": "subtle",
"textAlign": "center"
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays"
payload = {
"durationMs": 5000,
"startTimeMs": 1000,
"text": "Welcome back",
"animation": {
"intro": { "preset": "slide_up" },
"outro": { "preset": "fade" }
},
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"depth": "behind_presenter",
"fontFamily": "Inter",
"fontId": "media_abc123def456",
"fontSize": 81,
"fontWeight": 500,
"fontWidth": 100,
"outline": "#000000FF",
"presetId": "default:label",
"shadow": "subtle",
"textAlign": "center"
}
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({
durationMs: 5000,
startTimeMs: 1000,
text: 'Welcome back',
animation: {intro: {preset: 'slide_up'}, outro: {preset: 'fade'}},
backgroundShape: 'squircle',
color: '#FFFFFFFF',
depth: 'behind_presenter',
fontFamily: 'Inter',
fontId: 'media_abc123def456',
fontSize: 81,
fontWeight: 500,
fontWidth: 100,
outline: '#000000FF',
presetId: 'default:label',
shadow: 'subtle',
textAlign: 'center'
})
};
fetch('https://api.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays', 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.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays",
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([
'durationMs' => 5000,
'startTimeMs' => 1000,
'text' => 'Welcome back',
'animation' => [
'intro' => [
'preset' => 'slide_up'
],
'outro' => [
'preset' => 'fade'
]
],
'backgroundShape' => 'squircle',
'color' => '#FFFFFFFF',
'depth' => 'behind_presenter',
'fontFamily' => 'Inter',
'fontId' => 'media_abc123def456',
'fontSize' => 81,
'fontWeight' => 500,
'fontWidth' => 100,
'outline' => '#000000FF',
'presetId' => 'default:label',
'shadow' => 'subtle',
'textAlign' => 'center'
]),
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.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays"
payload := strings.NewReader("{\n \"durationMs\": 5000,\n \"startTimeMs\": 1000,\n \"text\": \"Welcome back\",\n \"animation\": {\n \"intro\": {\n \"preset\": \"slide_up\"\n },\n \"outro\": {\n \"preset\": \"fade\"\n }\n },\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"depth\": \"behind_presenter\",\n \"fontFamily\": \"Inter\",\n \"fontId\": \"media_abc123def456\",\n \"fontSize\": 81,\n \"fontWeight\": 500,\n \"fontWidth\": 100,\n \"outline\": \"#000000FF\",\n \"presetId\": \"default:label\",\n \"shadow\": \"subtle\",\n \"textAlign\": \"center\"\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.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"durationMs\": 5000,\n \"startTimeMs\": 1000,\n \"text\": \"Welcome back\",\n \"animation\": {\n \"intro\": {\n \"preset\": \"slide_up\"\n },\n \"outro\": {\n \"preset\": \"fade\"\n }\n },\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"depth\": \"behind_presenter\",\n \"fontFamily\": \"Inter\",\n \"fontId\": \"media_abc123def456\",\n \"fontSize\": 81,\n \"fontWeight\": 500,\n \"fontWidth\": 100,\n \"outline\": \"#000000FF\",\n \"presetId\": \"default:label\",\n \"shadow\": \"subtle\",\n \"textAlign\": \"center\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/clips/{clipId}/text-overlays")
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 \"durationMs\": 5000,\n \"startTimeMs\": 1000,\n \"text\": \"Welcome back\",\n \"animation\": {\n \"intro\": {\n \"preset\": \"slide_up\"\n },\n \"outro\": {\n \"preset\": \"fade\"\n }\n },\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"depth\": \"behind_presenter\",\n \"fontFamily\": \"Inter\",\n \"fontId\": \"media_abc123def456\",\n \"fontSize\": 81,\n \"fontWeight\": 500,\n \"fontWidth\": 100,\n \"outline\": \"#000000FF\",\n \"presetId\": \"default:label\",\n \"shadow\": \"subtle\",\n \"textAlign\": \"center\"\n}"
response = http.request(request)
puts response.read_body{
"textOverlay": {
"animation": {
"intro": {
"blur": 0,
"clip": false,
"durationMs": 500,
"easing": {
"curve": "slow_down",
"intensity": 0.5,
"bezier": [
0.25,
0.1,
0.25,
1
],
"spring": {
"damping": 12,
"mass": 1,
"stiffness": 200
}
},
"moveX": 0,
"moveY": -0.5,
"opacity": 0,
"preset": "slide_up",
"rotate": 0,
"scale": 1,
"text": {
"delayMs": 100,
"order": "forward",
"smoothing": "linear",
"unit": "words"
}
},
"motionBlur": true,
"outro": {
"blur": 0,
"clip": false,
"durationMs": 500,
"easing": {
"curve": "slow_down",
"intensity": 0.5,
"bezier": [
0.25,
0.1,
0.25,
1
],
"spring": {
"damping": 12,
"mass": 1,
"stiffness": 200
}
},
"moveX": 0,
"moveY": -0.5,
"opacity": 0,
"preset": "slide_up",
"rotate": 0,
"scale": 1,
"text": {
"delayMs": 100,
"order": "forward",
"smoothing": "linear",
"unit": "words"
}
},
"textIntro": {
"blur": 0,
"clip": false,
"durationMs": 500,
"easing": {
"curve": "slow_down",
"intensity": 0.5,
"bezier": [
0.25,
0.1,
0.25,
1
],
"spring": {
"damping": 12,
"mass": 1,
"stiffness": 200
}
},
"moveX": 0,
"moveY": -0.5,
"opacity": 0,
"preset": "slide_up",
"rotate": 0,
"scale": 1,
"text": {
"delayMs": 100,
"order": "forward",
"smoothing": "linear",
"unit": "words"
}
},
"textOutro": {
"blur": 0,
"clip": false,
"durationMs": 500,
"easing": {
"curve": "slow_down",
"intensity": 0.5,
"bezier": [
0.25,
0.1,
0.25,
1
],
"spring": {
"damping": 12,
"mass": 1,
"stiffness": 200
}
},
"moveX": 0,
"moveY": -0.5,
"opacity": 0,
"preset": "slide_up",
"rotate": 0,
"scale": 1,
"text": {
"delayMs": 100,
"order": "forward",
"smoothing": "linear",
"unit": "words"
}
}
},
"background": {
"color": "#5E51F8FF",
"type": "solid"
},
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"depth": "behind_presenter",
"dimensions": {
"height": 540,
"width": 960
},
"durationMs": 5000,
"fontFamily": "Inter",
"fontSize": 81,
"fontWeight": 500,
"fontWidth": 100,
"id": "ly_abc123",
"outline": "#000000FF",
"point": {
"xPct": 30,
"yPct": 30
},
"shadow": "subtle",
"startTimeMs": 1000,
"text": "Welcome back",
"textAlign": "center",
"transition": "hard_cut",
"zIndex": 0,
"fontId": "media_abc123def456"
}
}{
"docsUrl": "https://docs.tella.com/",
"error": "bad_request",
"message": "The request was malformed or contained invalid parameters."
}{
"docsUrl": "https://docs.tella.com/",
"error": "unauthorized",
"message": "Authentication is required. Provide a valid API key."
}{
"docsUrl": "https://docs.tella.com/",
"error": "forbidden",
"message": "You don't have permission to access this resource."
}{
"docsUrl": "https://docs.tella.com/",
"error": "not_found",
"message": "The requested resource was not found."
}{
"docsUrl": "https://docs.tella.com/",
"error": "conflict",
"message": "The request conflicts with the resource's current state, e.g. an Idempotency-Key whose first request is still in progress. Retry once it settles."
}{
"docsUrl": "https://docs.tella.com/",
"error": "rate_limited",
"message": "You have exceeded the rate limit. Please slow down."
}{
"docsUrl": "https://docs.tella.com/",
"error": "server_error",
"message": "An unexpected error occurred"
}{
"docsUrl": "https://docs.tella.com/",
"error": "not_implemented",
"message": "The requested operation is not implemented."
}{
"docsUrl": "https://docs.tella.com/",
"error": "unavailable",
"message": "A dependency was unavailable and the request was not executed. Safe to resend unchanged after the Retry-After delay."
}Authorizations
API key obtained from your Tella account settings
Path Parameters
Video identifier
"vid_abc123def456"
Clip identifier
"cl_xyz789ghi012"
Body
Add a text overlay to a clip. Nothing needs uploading — pass the copy directly. When point/dimensions are omitted, a centered box 60% of the artboard wide and 25% tall is used.
0 < x <= 90071992547409915000
Start time. Milliseconds on the clip playback timeline (with cuts applied) — the same timeline as the cut transcript.
0 <= x <= 90071992547409911000
1"Welcome back"
How the overlay enters and leaves; when set it replaces transition. Each side describes the hidden state the overlay moves from on the way in and back to on the way out. An omitted side stays as it is. {intro: {preset: 'slide_up'}, outro: {preset: 'fade'}} is a complete animation; on text, {textIntro: {preset: 'slide_up', text: {unit: 'words'}}} brings the words in one by one.
Hide child attributes
Hide child attributes
How the whole overlay enters, or null to appear instantly. Takes no text. Omit to keep the current intro.
Hide child attributes
Hide child attributes
Blur of the hidden state in pixels.
0 <= x <= 200Clip the motion to the overlay's box, so it wipes in like a mask.
How long the side plays, in ms (50 to 5000). On a text side, how long each unit plays. Defaults to 500.
50 <= x <= 5000How the side accelerates. Without it a new side slows down into place on the way in and speeds up on the way out.
Hide child attributes
Hide child attributes
How a side accelerates. linear keeps one speed. smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse and swing are shaped by intensity. custom follows bezier, spring follows spring.
linear, smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse, swing, custom, spring "slow_down"
For custom: the handles. Defaults to the side's current curve.
4 elements0 <= x <= 1[0.25, 0.1, 0.25, 1]
How strongly the curve shapes the motion, 0 to 1. Only curves with an intensity use it. Defaults to 0.5.
0 <= x <= 1For spring: its physics. Defaults to stiffness 200, damping 12, mass 1.
Horizontal offset of the hidden state, as a fraction of the overlay's width (of a line's height on a text side); positive is right.
-10 <= x <= 10Vertical offset of the hidden state, as a fraction of the overlay's height (of a line's height on a text side); positive is down.
-10 <= x <= 10Opacity of the hidden state, 0 to 1.
0 <= x <= 1Start from a ready-made side; the other fields adjust it. Without it the side starts from what it is now; a new whole side starts still and a new text side from fade.
fade, slide_up, slide_down, slide_left, slide_right, mask_up, mask_down, grow, shrink, blur, blur_slide_up "slide_up"
Clockwise rotation of the hidden state in degrees.
-3600 <= x <= 3600Scale of the hidden state; 1 is its resting size.
0 <= x <= 10On textIntro/textOutro only: which units play the side, each in turn. Required on a new text side.
Hide child attributes
Hide child attributes
What animates on its own.
letters, words, lines "words"
How long after one unit the next starts, in ms (0 to 2000). Defaults to 100.
0 <= x <= 2000Which unit goes first. random uses the same shuffle every time. Defaults to forward.
forward, backward, center, edges, random "forward"
Eases the delays across the units. Defaults to linear.
linear, smooth, natural, slow_down, accelerate, elastic, overshoot, impulse, swing "linear"
Blur the overlay along its motion while it moves, scales or turns. Defaults to true.
How the whole overlay leaves, or null to disappear instantly. Takes no text. Omit to keep the current outro.
Hide child attributes
Hide child attributes
Blur of the hidden state in pixels.
0 <= x <= 200Clip the motion to the overlay's box, so it wipes in like a mask.
How long the side plays, in ms (50 to 5000). On a text side, how long each unit plays. Defaults to 500.
50 <= x <= 5000How the side accelerates. Without it a new side slows down into place on the way in and speeds up on the way out.
Hide child attributes
Hide child attributes
How a side accelerates. linear keeps one speed. smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse and swing are shaped by intensity. custom follows bezier, spring follows spring.
linear, smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse, swing, custom, spring "slow_down"
For custom: the handles. Defaults to the side's current curve.
4 elements0 <= x <= 1[0.25, 0.1, 0.25, 1]
How strongly the curve shapes the motion, 0 to 1. Only curves with an intensity use it. Defaults to 0.5.
0 <= x <= 1For spring: its physics. Defaults to stiffness 200, damping 12, mass 1.
Horizontal offset of the hidden state, as a fraction of the overlay's width (of a line's height on a text side); positive is right.
-10 <= x <= 10Vertical offset of the hidden state, as a fraction of the overlay's height (of a line's height on a text side); positive is down.
-10 <= x <= 10Opacity of the hidden state, 0 to 1.
0 <= x <= 1Start from a ready-made side; the other fields adjust it. Without it the side starts from what it is now; a new whole side starts still and a new text side from fade.
fade, slide_up, slide_down, slide_left, slide_right, mask_up, mask_down, grow, shrink, blur, blur_slide_up "slide_up"
Clockwise rotation of the hidden state in degrees.
-3600 <= x <= 3600Scale of the hidden state; 1 is its resting size.
0 <= x <= 10On textIntro/textOutro only: which units play the side, each in turn. Required on a new text side.
Hide child attributes
Hide child attributes
What animates on its own.
letters, words, lines "words"
How long after one unit the next starts, in ms (0 to 2000). Defaults to 100.
0 <= x <= 2000Which unit goes first. random uses the same shuffle every time. Defaults to forward.
forward, backward, center, edges, random "forward"
Eases the delays across the units. Defaults to linear.
linear, smooth, natural, slow_down, accelerate, elastic, overshoot, impulse, swing "linear"
Text overlays only: how its letters, words or lines enter, one after another, or null for none. Plays alongside intro: both start together.
Hide child attributes
Hide child attributes
Blur of the hidden state in pixels.
0 <= x <= 200Clip the motion to the overlay's box, so it wipes in like a mask.
How long the side plays, in ms (50 to 5000). On a text side, how long each unit plays. Defaults to 500.
50 <= x <= 5000How the side accelerates. Without it a new side slows down into place on the way in and speeds up on the way out.
Hide child attributes
Hide child attributes
How a side accelerates. linear keeps one speed. smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse and swing are shaped by intensity. custom follows bezier, spring follows spring.
linear, smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse, swing, custom, spring "slow_down"
For custom: the handles. Defaults to the side's current curve.
4 elements0 <= x <= 1[0.25, 0.1, 0.25, 1]
How strongly the curve shapes the motion, 0 to 1. Only curves with an intensity use it. Defaults to 0.5.
0 <= x <= 1For spring: its physics. Defaults to stiffness 200, damping 12, mass 1.
Hide child attributes
Hide child attributes
Horizontal offset of the hidden state, as a fraction of the overlay's width (of a line's height on a text side); positive is right.
-10 <= x <= 10Vertical offset of the hidden state, as a fraction of the overlay's height (of a line's height on a text side); positive is down.
-10 <= x <= 10Opacity of the hidden state, 0 to 1.
0 <= x <= 1Start from a ready-made side; the other fields adjust it. Without it the side starts from what it is now; a new whole side starts still and a new text side from fade.
fade, slide_up, slide_down, slide_left, slide_right, mask_up, mask_down, grow, shrink, blur, blur_slide_up "slide_up"
Clockwise rotation of the hidden state in degrees.
-3600 <= x <= 3600Scale of the hidden state; 1 is its resting size.
0 <= x <= 10On textIntro/textOutro only: which units play the side, each in turn. Required on a new text side.
Hide child attributes
Hide child attributes
What animates on its own.
letters, words, lines "words"
How long after one unit the next starts, in ms (0 to 2000). Defaults to 100.
0 <= x <= 2000Which unit goes first. random uses the same shuffle every time. Defaults to forward.
forward, backward, center, edges, random "forward"
Eases the delays across the units. Defaults to linear.
linear, smooth, natural, slow_down, accelerate, elastic, overshoot, impulse, swing "linear"
Text overlays only: how its letters, words or lines leave, one after another, or null for none. Plays alongside outro: both end together.
Hide child attributes
Hide child attributes
Blur of the hidden state in pixels.
0 <= x <= 200Clip the motion to the overlay's box, so it wipes in like a mask.
How long the side plays, in ms (50 to 5000). On a text side, how long each unit plays. Defaults to 500.
50 <= x <= 5000How the side accelerates. Without it a new side slows down into place on the way in and speeds up on the way out.
Hide child attributes
Hide child attributes
How a side accelerates. linear keeps one speed. smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse and swing are shaped by intensity. custom follows bezier, spring follows spring.
linear, smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse, swing, custom, spring "slow_down"
For custom: the handles. Defaults to the side's current curve.
4 elements0 <= x <= 1[0.25, 0.1, 0.25, 1]
How strongly the curve shapes the motion, 0 to 1. Only curves with an intensity use it. Defaults to 0.5.
0 <= x <= 1For spring: its physics. Defaults to stiffness 200, damping 12, mass 1.
Hide child attributes
Hide child attributes
Horizontal offset of the hidden state, as a fraction of the overlay's width (of a line's height on a text side); positive is right.
-10 <= x <= 10Vertical offset of the hidden state, as a fraction of the overlay's height (of a line's height on a text side); positive is down.
-10 <= x <= 10Opacity of the hidden state, 0 to 1.
0 <= x <= 1Start from a ready-made side; the other fields adjust it. Without it the side starts from what it is now; a new whole side starts still and a new text side from fade.
fade, slide_up, slide_down, slide_left, slide_right, mask_up, mask_down, grow, shrink, blur, blur_slide_up "slide_up"
Clockwise rotation of the hidden state in degrees.
-3600 <= x <= 3600Scale of the hidden state; 1 is its resting size.
0 <= x <= 10On textIntro/textOutro only: which units play the side, each in turn. Required on a new text side.
Hide child attributes
Hide child attributes
What animates on its own.
letters, words, lines "words"
How long after one unit the next starts, in ms (0 to 2000). Defaults to 100.
0 <= x <= 2000Which unit goes first. random uses the same shuffle every time. Defaults to forward.
forward, backward, center, edges, random "forward"
Eases the delays across the units. Defaults to linear.
linear, smooth, natural, slow_down, accelerate, elastic, overshoot, impulse, swing "linear"
{ "intro": { "preset": "slide_up" }, "outro": { "preset": "fade" } }
Background behind the text. Defaults to transparent.
Hide child attributes
Hide child attributes
Hex color string. Required when type = 'solid'. Transparent backgrounds use #00000000.
^#(?:[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$"#5E51F8FF"
Background variant. Text overlays take a solid background; the other ClipBackground variants are not supported behind text.
solid "solid"
Defaults to none.
none, regular, squircle "squircle"
Defaults to white.
^#(?:[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$"#FFFFFFFF"
Where the overlay sits relative to the presenter: the person in the clip's camera recording, or in its uploaded footage when the clip has no camera. front paints over everything. behind_presenter paints it behind the person but over everything else: in any layout the person is matted out of their footage and redrawn above the overlay. Fullscreen and framed layouts keep the recorded room around them; a cut-out layout replaces the room with the clip background. New overlays start on front. Without a presenter the overlay paints in front either way.
front, behind_presenter "behind_presenter"
Overlay size in artboard pixels. Absolute (not a percentage) so the overlay shape never distorts when the artboard dimensions change. Both sides must be greater than 0 — the renderer lays the overlay out into this box, so a zero or negative side has no valid meaning.
One of Tella's catalog font families. Defaults to Inter. Anything outside the catalog is rejected rather than silently falling back; use fontId for an uploaded font.
Inter, Roboto Mono, Archivo, Barlow, Caveat, DM Sans, Figtree, Lora, Merriweather, Montserrat, Nunito Sans, Open Sans, Oswald, Playfair Display, Poppins, Raleway, Roboto, Roboto Flex, Source Sans 3, Space Grotesk "Inter"
A custom font from the private or workspace library: the id of a font item from GET /v1/library?type=font, such as one uploaded with POST /v1/sources (kind: font) and POST /v1/library. Sets the overlay's font family to that font. Don't combine with fontFamily.
1"media_abc123def456"
Font size in artboard pixels. Defaults to 7.5% of the video's shorter side, which is the editor's default and readable at any canvas size.
x > 081
Variable-font weight axis — 100 (thin) to 900 (black), 500 by default. Values outside the chosen font's own axis range are clamped when rendered.
1 <= x <= 1000500
Variable-font width axis, as a percentage — 100 is normal, 50 ultra-condensed, 150 extra-expanded, 100 by default. Values outside the chosen font's own axis range are clamped when rendered.
x > 0100
Defaults to no outline, or the preset's.
^#(?:[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$"#000000FF"
A preset from GET /v1/text-presets — default:<id> for a built-in style or a saved preset's ID. Supplies the font, weight, width, color, size, alignment, background, background shape and outline (not the shadow); any of those fields sent alongside overrides the preset's value.
1"default:label"
Defaults to none.
none, subtle, deep "subtle"
Defaults to center.
left, center, right "center"
Response
OK
A text overlay on a clip
A text overlay on a clip. Unlike image and video overlays it references no source — the copy and its font live on the overlay itself.
Hide child attributes
Hide child attributes
How the text enters and leaves, or null when it plays its transition.
Hide child attributes
Hide child attributes
How the whole overlay enters, or null when it appears instantly.
Hide child attributes
Hide child attributes
Blur of the hidden state in pixels.
0
Clip the motion to the overlay's box, so it wipes in like a mask.
false
How long the side plays, in ms (50 to 5000). On a text side, how long each unit plays.
-9007199254740991 <= x <= 9007199254740991500
Hide child attributes
Hide child attributes
How a side accelerates. linear keeps one speed. smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse and swing are shaped by intensity. custom follows bezier, spring follows spring.
linear, smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse, swing, custom, spring "slow_down"
How strongly the curve shapes the motion, 0 to 1. Only curves with an intensity use it.
0 <= x <= 10.5
The custom curve's handles.
4 elements0 <= x <= 1[0.25, 0.1, 0.25, 1]
The spring curve's physics.
Hide child attributes
Hide child attributes
1 <= x <= 30012
0.1 <= x <= 101
1 <= x <= 1000200
Horizontal offset of the hidden state, as a fraction of the overlay's width (of a line's height on a text side); positive is right.
0
Vertical offset of the hidden state, as a fraction of the overlay's height (of a line's height on a text side); positive is down.
-0.5
Opacity of the hidden state, 0 to 1.
0
The preset the side matches, or null once its motion is custom.
fade, slide_up, slide_down, slide_left, slide_right, mask_up, mask_down, grow, shrink, blur, blur_slide_up "slide_up"
Clockwise rotation of the hidden state in degrees.
0
Scale of the hidden state; 1 is its resting size.
1
The units a text side plays on, each in turn.
Hide child attributes
Hide child attributes
How long after one unit the next starts, in ms (0 to 2000).
0 <= x <= 2000100
Which unit goes first. random uses the same shuffle every time.
forward, backward, center, edges, random "forward"
Eases the delays across the units: linear is an even step, the other curves bunch the starts up at one end.
linear, smooth, natural, slow_down, accelerate, elastic, overshoot, impulse, swing "linear"
What animates on its own.
letters, words, lines "words"
Blur the overlay along its motion while it moves, scales or turns.
true
How the whole overlay leaves, or null when it disappears instantly.
Hide child attributes
Hide child attributes
Blur of the hidden state in pixels.
0
Clip the motion to the overlay's box, so it wipes in like a mask.
false
How long the side plays, in ms (50 to 5000). On a text side, how long each unit plays.
-9007199254740991 <= x <= 9007199254740991500
Hide child attributes
Hide child attributes
How a side accelerates. linear keeps one speed. smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse and swing are shaped by intensity. custom follows bezier, spring follows spring.
linear, smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse, swing, custom, spring "slow_down"
How strongly the curve shapes the motion, 0 to 1. Only curves with an intensity use it.
0 <= x <= 10.5
The custom curve's handles.
4 elements0 <= x <= 1[0.25, 0.1, 0.25, 1]
The spring curve's physics.
Hide child attributes
Hide child attributes
1 <= x <= 30012
0.1 <= x <= 101
1 <= x <= 1000200
Horizontal offset of the hidden state, as a fraction of the overlay's width (of a line's height on a text side); positive is right.
0
Vertical offset of the hidden state, as a fraction of the overlay's height (of a line's height on a text side); positive is down.
-0.5
Opacity of the hidden state, 0 to 1.
0
The preset the side matches, or null once its motion is custom.
fade, slide_up, slide_down, slide_left, slide_right, mask_up, mask_down, grow, shrink, blur, blur_slide_up "slide_up"
Clockwise rotation of the hidden state in degrees.
0
Scale of the hidden state; 1 is its resting size.
1
The units a text side plays on, each in turn.
Hide child attributes
Hide child attributes
How long after one unit the next starts, in ms (0 to 2000).
0 <= x <= 2000100
Which unit goes first. random uses the same shuffle every time.
forward, backward, center, edges, random "forward"
Eases the delays across the units: linear is an even step, the other curves bunch the starts up at one end.
linear, smooth, natural, slow_down, accelerate, elastic, overshoot, impulse, swing "linear"
What animates on its own.
letters, words, lines "words"
How a text overlay's letters, words or lines enter, one after another, while intro plays on the whole box. Null when they don't.
Hide child attributes
Hide child attributes
Blur of the hidden state in pixels.
0
Clip the motion to the overlay's box, so it wipes in like a mask.
false
How long the side plays, in ms (50 to 5000). On a text side, how long each unit plays.
-9007199254740991 <= x <= 9007199254740991500
Hide child attributes
Hide child attributes
How a side accelerates. linear keeps one speed. smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse and swing are shaped by intensity. custom follows bezier, spring follows spring.
linear, smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse, swing, custom, spring "slow_down"
How strongly the curve shapes the motion, 0 to 1. Only curves with an intensity use it.
0 <= x <= 10.5
The custom curve's handles.
4 elements0 <= x <= 1[0.25, 0.1, 0.25, 1]
The spring curve's physics.
Hide child attributes
Hide child attributes
1 <= x <= 30012
0.1 <= x <= 101
1 <= x <= 1000200
Horizontal offset of the hidden state, as a fraction of the overlay's width (of a line's height on a text side); positive is right.
0
Vertical offset of the hidden state, as a fraction of the overlay's height (of a line's height on a text side); positive is down.
-0.5
Opacity of the hidden state, 0 to 1.
0
The preset the side matches, or null once its motion is custom.
fade, slide_up, slide_down, slide_left, slide_right, mask_up, mask_down, grow, shrink, blur, blur_slide_up "slide_up"
Clockwise rotation of the hidden state in degrees.
0
Scale of the hidden state; 1 is its resting size.
1
The units a text side plays on, each in turn.
Hide child attributes
Hide child attributes
How long after one unit the next starts, in ms (0 to 2000).
0 <= x <= 2000100
Which unit goes first. random uses the same shuffle every time.
forward, backward, center, edges, random "forward"
Eases the delays across the units: linear is an even step, the other curves bunch the starts up at one end.
linear, smooth, natural, slow_down, accelerate, elastic, overshoot, impulse, swing "linear"
What animates on its own.
letters, words, lines "words"
How a text overlay's letters, words or lines leave, one after another, while outro plays on the whole box. Null when they don't.
Hide child attributes
Hide child attributes
Blur of the hidden state in pixels.
0
Clip the motion to the overlay's box, so it wipes in like a mask.
false
How long the side plays, in ms (50 to 5000). On a text side, how long each unit plays.
-9007199254740991 <= x <= 9007199254740991500
Hide child attributes
Hide child attributes
How a side accelerates. linear keeps one speed. smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse and swing are shaped by intensity. custom follows bezier, spring follows spring.
linear, smooth, natural, slow_down, accelerate, elastic, bounce, overshoot, impulse, swing, custom, spring "slow_down"
How strongly the curve shapes the motion, 0 to 1. Only curves with an intensity use it.
0 <= x <= 10.5
The custom curve's handles.
4 elements0 <= x <= 1[0.25, 0.1, 0.25, 1]
The spring curve's physics.
Hide child attributes
Hide child attributes
1 <= x <= 30012
0.1 <= x <= 101
1 <= x <= 1000200
Horizontal offset of the hidden state, as a fraction of the overlay's width (of a line's height on a text side); positive is right.
0
Vertical offset of the hidden state, as a fraction of the overlay's height (of a line's height on a text side); positive is down.
-0.5
Opacity of the hidden state, 0 to 1.
0
The preset the side matches, or null once its motion is custom.
fade, slide_up, slide_down, slide_left, slide_right, mask_up, mask_down, grow, shrink, blur, blur_slide_up "slide_up"
Clockwise rotation of the hidden state in degrees.
0
Scale of the hidden state; 1 is its resting size.
1
The units a text side plays on, each in turn.
Hide child attributes
Hide child attributes
How long after one unit the next starts, in ms (0 to 2000).
0 <= x <= 2000100
Which unit goes first. random uses the same shuffle every time.
forward, backward, center, edges, random "forward"
Eases the delays across the units: linear is an even step, the other curves bunch the starts up at one end.
linear, smooth, natural, slow_down, accelerate, elastic, overshoot, impulse, swing "linear"
What animates on its own.
letters, words, lines "words"
Background behind the text. Overlays with no visible box report a solid #00000000.
Hide child attributes
Hide child attributes
Hex color string. Required when type = 'solid'. Transparent backgrounds use #00000000.
^#(?:[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$"#5E51F8FF"
Background variant. Text overlays take a solid background; the other ClipBackground variants are not supported behind text.
solid "solid"
Shape of the solid background behind the text.
none, regular, squircle "squircle"
Hex color in #RRGGBB or #RRGGBBAA form. Responses use uppercase #RRGGBBAA.
^#(?:[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$"#FFFFFFFF"
Where the overlay sits relative to the presenter: the person in the clip's camera recording, or in its uploaded footage when the clip has no camera. front paints over everything. behind_presenter paints it behind the person but over everything else: in any layout the person is matted out of their footage and redrawn above the overlay. Fullscreen and framed layouts keep the recorded room around them; a cut-out layout replaces the room with the clip background. New overlays start on front. Without a presenter the overlay paints in front either way.
front, behind_presenter "behind_presenter"
Overlay size in artboard pixels. Absolute (not a percentage) so the overlay shape never distorts when the artboard dimensions change. Both sides must be greater than 0 — the renderer lays the overlay out into this box, so a zero or negative side has no valid meaning.
x >= 05000
The overlay's font family. Normally one of the catalog families accepted on write, or a library font's family when fontId is set. Overlays created before that catalog can report another bundled family, such as Graphik.
"Inter"
Font size in artboard pixels — absolute, like dimensions, so text keeps its size relative to the frame. Renderers scale it by their render scale factor.
x > 081
Variable-font weight axis — 100 (thin) to 900 (black).
500
Variable-font width axis, as a percentage — 100 is normal, 50 ultra-condensed, 150 extra-expanded.
100
Text overlay ID
"ly_abc123"
Color of the outline (stroke) drawn around the letters, or null for no outline.
^#(?:[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$"#000000FF"
Drop shadow, matching the editor's Shadow menu. It falls from the background box when the text has one, else from the letters.
none, subtle, deep "subtle"
Start time. Milliseconds on the clip playback timeline (with cuts applied) — the same timeline as the cut transcript.
x >= 01000
"Welcome back"
Horizontal alignment of the text inside its overlay box.
left, center, right "center"
Intro/outro animation: smooth fades the text in at its start and out at its end, hard_cut pops it in and out. New text overlays start on hard_cut. An animation replaces it while set.
smooth, hard_cut "hard_cut"
Stacking position among the clip's image, video and text overlays: 0 is the backmost. depth applies first — a behind_presenter overlay stays behind the presenter whatever its zIndex — so the order only matters among overlays at the same depth. Lottie overlays share the stack but aren't listed, so listed values can skip a number.
0 <= x <= 90071992547409910
The library font the overlay renders with (a font item's id), absent for a catalog family.
"media_abc123def456"
Was this page helpful?