curl --request PUT \
--url https://api.tella.com/v1/videos/{id}/chapters \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"chapters": [
{
"description": "Overview of what we'll cover",
"timestampSeconds": 0,
"title": "Introduction"
}
]
}
EOFimport requests
url = "https://api.tella.com/v1/videos/{id}/chapters"
payload = { "chapters": [
{
"description": "Overview of what we'll cover",
"timestampSeconds": 0,
"title": "Introduction"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
chapters: [
{
description: 'Overview of what we\'ll cover',
timestampSeconds: 0,
title: 'Introduction'
}
]
})
};
fetch('https://api.tella.com/v1/videos/{id}/chapters', 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}/chapters",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'chapters' => [
[
'description' => 'Overview of what we\'ll cover',
'timestampSeconds' => 0,
'title' => 'Introduction'
]
]
]),
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}/chapters"
payload := strings.NewReader("{\n \"chapters\": [\n {\n \"description\": \"Overview of what we'll cover\",\n \"timestampSeconds\": 0,\n \"title\": \"Introduction\"\n }\n ]\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.tella.com/v1/videos/{id}/chapters")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"chapters\": [\n {\n \"description\": \"Overview of what we'll cover\",\n \"timestampSeconds\": 0,\n \"title\": \"Introduction\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/chapters")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"chapters\": [\n {\n \"description\": \"Overview of what we'll cover\",\n \"timestampSeconds\": 0,\n \"title\": \"Introduction\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"chapters": [
{
"description": "Overview of what we'll cover",
"timestampSeconds": 0,
"title": "Introduction"
}
]
}{
"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."
}Replace video chapters
Replaces the complete chapter list. Timestamps are seconds on the final video timeline and must be non-negative, ascending, and within the video duration. Pass an empty array to clear all chapters.
curl --request PUT \
--url https://api.tella.com/v1/videos/{id}/chapters \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"chapters": [
{
"description": "Overview of what we'll cover",
"timestampSeconds": 0,
"title": "Introduction"
}
]
}
EOFimport requests
url = "https://api.tella.com/v1/videos/{id}/chapters"
payload = { "chapters": [
{
"description": "Overview of what we'll cover",
"timestampSeconds": 0,
"title": "Introduction"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
chapters: [
{
description: 'Overview of what we\'ll cover',
timestampSeconds: 0,
title: 'Introduction'
}
]
})
};
fetch('https://api.tella.com/v1/videos/{id}/chapters', 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}/chapters",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'chapters' => [
[
'description' => 'Overview of what we\'ll cover',
'timestampSeconds' => 0,
'title' => 'Introduction'
]
]
]),
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}/chapters"
payload := strings.NewReader("{\n \"chapters\": [\n {\n \"description\": \"Overview of what we'll cover\",\n \"timestampSeconds\": 0,\n \"title\": \"Introduction\"\n }\n ]\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.tella.com/v1/videos/{id}/chapters")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"chapters\": [\n {\n \"description\": \"Overview of what we'll cover\",\n \"timestampSeconds\": 0,\n \"title\": \"Introduction\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/chapters")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"chapters\": [\n {\n \"description\": \"Overview of what we'll cover\",\n \"timestampSeconds\": 0,\n \"title\": \"Introduction\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"chapters": [
{
"description": "Overview of what we'll cover",
"timestampSeconds": 0,
"title": "Introduction"
}
]
}{
"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
Unique video identifier
"vid_abc123def456"
Body
Replace all chapters on a video
Complete replacement chapter list in ascending timestamp order (maximum 100). Pass an empty array to clear all chapters.
100Hide child attributes
Hide child attributes
Chapter description. Lines formatted like a timestamp followed by a title are not allowed.
5000"Overview of what we'll cover"
Chapter start time in whole seconds
0 <= x <= 90071992547409910
Single-line chapter title
1 - 255^[^\r\n]*$"Introduction"
Response
Chapters replaced
Video chapters
Chapters on the final video timeline, ordered by timestamp
Hide child attributes
Hide child attributes
Chapter description
5000"Overview of what we'll cover"
Chapter start time in seconds
x >= 00
Chapter title
1 - 255"Introduction"
Was this page helpful?