curl --request POST \
--url https://api.tella.com/v1/text-presets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Product callout",
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"fontFamily": "Inter",
"fontSizeScale": 0.6,
"fontWeight": 500.5,
"fontWidth": 1,
"outline": "#000000FF",
"textAlign": "center",
"textOverlayId": "ly_abc123",
"videoId": "vid_abc123"
}
'import requests
url = "https://api.tella.com/v1/text-presets"
payload = {
"name": "Product callout",
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"fontFamily": "Inter",
"fontSizeScale": 0.6,
"fontWeight": 500.5,
"fontWidth": 1,
"outline": "#000000FF",
"textAlign": "center",
"textOverlayId": "ly_abc123",
"videoId": "vid_abc123"
}
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({
name: 'Product callout',
backgroundShape: 'squircle',
color: '#FFFFFFFF',
fontFamily: 'Inter',
fontSizeScale: 0.6,
fontWeight: 500.5,
fontWidth: 1,
outline: '#000000FF',
textAlign: 'center',
textOverlayId: 'ly_abc123',
videoId: 'vid_abc123'
})
};
fetch('https://api.tella.com/v1/text-presets', 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/text-presets",
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([
'name' => 'Product callout',
'backgroundShape' => 'squircle',
'color' => '#FFFFFFFF',
'fontFamily' => 'Inter',
'fontSizeScale' => 0.6,
'fontWeight' => 500.5,
'fontWidth' => 1,
'outline' => '#000000FF',
'textAlign' => 'center',
'textOverlayId' => 'ly_abc123',
'videoId' => 'vid_abc123'
]),
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/text-presets"
payload := strings.NewReader("{\n \"name\": \"Product callout\",\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"fontFamily\": \"Inter\",\n \"fontSizeScale\": 0.6,\n \"fontWeight\": 500.5,\n \"fontWidth\": 1,\n \"outline\": \"#000000FF\",\n \"textAlign\": \"center\",\n \"textOverlayId\": \"ly_abc123\",\n \"videoId\": \"vid_abc123\"\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/text-presets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Product callout\",\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"fontFamily\": \"Inter\",\n \"fontSizeScale\": 0.6,\n \"fontWeight\": 500.5,\n \"fontWidth\": 1,\n \"outline\": \"#000000FF\",\n \"textAlign\": \"center\",\n \"textOverlayId\": \"ly_abc123\",\n \"videoId\": \"vid_abc123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/text-presets")
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 \"name\": \"Product callout\",\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"fontFamily\": \"Inter\",\n \"fontSizeScale\": 0.6,\n \"fontWeight\": 500.5,\n \"fontWidth\": 1,\n \"outline\": \"#000000FF\",\n \"textAlign\": \"center\",\n \"textOverlayId\": \"ly_abc123\",\n \"videoId\": \"vid_abc123\"\n}"
response = http.request(request)
puts response.read_body{
"preset": {
"name": "Label",
"presetId": "default:label",
"scope": "default",
"style": {
"background": {
"color": "#5E51F8FF",
"type": "solid"
},
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"fontFamily": "Space Grotesk",
"fontSizeScale": 0.6,
"fontWeight": 600,
"fontWidth": 100,
"outline": "#000000FF",
"textAlign": "center"
}
}
}{
"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."
}Save a text preset
Saves a personal text preset, like the editor’s “Save style” on a text overlay. The style starts from an existing text overlay when videoId and textOverlayId are given (keeping a custom font and reading the size relative to that video’s canvas), else from the editor’s default text look; every style field sent alongside overrides it. The preset then appears in GET /v1/text-presets and in the editor’s Text panel.
curl --request POST \
--url https://api.tella.com/v1/text-presets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Product callout",
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"fontFamily": "Inter",
"fontSizeScale": 0.6,
"fontWeight": 500.5,
"fontWidth": 1,
"outline": "#000000FF",
"textAlign": "center",
"textOverlayId": "ly_abc123",
"videoId": "vid_abc123"
}
'import requests
url = "https://api.tella.com/v1/text-presets"
payload = {
"name": "Product callout",
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"fontFamily": "Inter",
"fontSizeScale": 0.6,
"fontWeight": 500.5,
"fontWidth": 1,
"outline": "#000000FF",
"textAlign": "center",
"textOverlayId": "ly_abc123",
"videoId": "vid_abc123"
}
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({
name: 'Product callout',
backgroundShape: 'squircle',
color: '#FFFFFFFF',
fontFamily: 'Inter',
fontSizeScale: 0.6,
fontWeight: 500.5,
fontWidth: 1,
outline: '#000000FF',
textAlign: 'center',
textOverlayId: 'ly_abc123',
videoId: 'vid_abc123'
})
};
fetch('https://api.tella.com/v1/text-presets', 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/text-presets",
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([
'name' => 'Product callout',
'backgroundShape' => 'squircle',
'color' => '#FFFFFFFF',
'fontFamily' => 'Inter',
'fontSizeScale' => 0.6,
'fontWeight' => 500.5,
'fontWidth' => 1,
'outline' => '#000000FF',
'textAlign' => 'center',
'textOverlayId' => 'ly_abc123',
'videoId' => 'vid_abc123'
]),
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/text-presets"
payload := strings.NewReader("{\n \"name\": \"Product callout\",\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"fontFamily\": \"Inter\",\n \"fontSizeScale\": 0.6,\n \"fontWeight\": 500.5,\n \"fontWidth\": 1,\n \"outline\": \"#000000FF\",\n \"textAlign\": \"center\",\n \"textOverlayId\": \"ly_abc123\",\n \"videoId\": \"vid_abc123\"\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/text-presets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Product callout\",\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"fontFamily\": \"Inter\",\n \"fontSizeScale\": 0.6,\n \"fontWeight\": 500.5,\n \"fontWidth\": 1,\n \"outline\": \"#000000FF\",\n \"textAlign\": \"center\",\n \"textOverlayId\": \"ly_abc123\",\n \"videoId\": \"vid_abc123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/text-presets")
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 \"name\": \"Product callout\",\n \"backgroundShape\": \"squircle\",\n \"color\": \"#FFFFFFFF\",\n \"fontFamily\": \"Inter\",\n \"fontSizeScale\": 0.6,\n \"fontWeight\": 500.5,\n \"fontWidth\": 1,\n \"outline\": \"#000000FF\",\n \"textAlign\": \"center\",\n \"textOverlayId\": \"ly_abc123\",\n \"videoId\": \"vid_abc123\"\n}"
response = http.request(request)
puts response.read_body{
"preset": {
"name": "Label",
"presetId": "default:label",
"scope": "default",
"style": {
"background": {
"color": "#5E51F8FF",
"type": "solid"
},
"backgroundShape": "squircle",
"color": "#FFFFFFFF",
"fontFamily": "Space Grotesk",
"fontSizeScale": 0.6,
"fontWeight": 600,
"fontWidth": 100,
"outline": "#000000FF",
"textAlign": "center"
}
}
}{
"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
Body
Save a personal text preset. The style starts from the given text overlay, else from the editor's default text look; every style field sent alongside overrides it.
1 - 255"Product callout"
Background behind a text overlay, in the same object shape as a clip background.
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"
One of Tella's catalog font families — the same list the editor's font picker offers.
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"
Font size relative to the editor's default (7.5% of the canvas's shorter side): 1 is the default, 0.6 a caption, 1.4 a headline. Presets are video-independent, so this is a scale rather than pixels; adding an overlay resolves it for the video it lands on.
x > 00.6
1 <= x <= 1000x > 0Outline color, or null for none.
^#(?:[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$"#000000FF"
Horizontal alignment of the text inside its overlay box.
left, center, right "center"
Text overlay to copy the style from, keeping a custom font and reading its size relative to that video's canvas. Goes together with videoId.
"ly_abc123"
Video holding the text overlay to copy the style from. Goes together with textOverlayId.
"vid_abc123"
Response
Preset saved
Hide child attributes
Hide child attributes
"Label"
Pass this ID as presetId when adding or updating a text overlay
"default:label"
default for Tella's built-in styles, personal for presets saved by the authenticated user
default, personal Everything about a text overlay except its text, timing and placement.
Hide child attributes
Hide child attributes
Background behind a text overlay, in the same object shape as a clip background.
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"
"Space Grotesk"
Font size relative to the editor's default (7.5% of the canvas's shorter side): 1 is the default, 0.6 a caption, 1.4 a headline. Presets are video-independent, so this is a scale rather than pixels; adding an overlay resolves it for the video it lands on.
x > 00.6
600
100
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"
Horizontal alignment of the text inside its overlay box.
left, center, right "center"
Was this page helpful?