Replace video 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"
}
]
}{
"error": {
"code": "bad_request",
"doc_url": "https://tella.tv/docs/api-reference/errors#bad-request",
"message": "The request was malformed or contained invalid parameters."
}
}{
"error": {
"code": "unauthorized",
"doc_url": "https://tella.tv/docs/api-reference/errors#unauthorized",
"message": "Authentication is required. Provide a valid API key."
}
}{
"error": {
"code": "forbidden",
"doc_url": "https://tella.tv/docs/api-reference/errors#forbidden",
"message": "You don't have permission to access this resource."
}
}{
"error": {
"code": "not_found",
"doc_url": "https://tella.tv/docs/api-reference/errors#not-found",
"message": "The requested resource was not found."
}
}{
"error": {
"code": "unprocessable_entity",
"doc_url": "https://tella.tv/docs/api-reference/errors#unprocessable-entity",
"message": "The request was well-formed but contained semantic errors."
}
}{
"error": {
"code": "rate_limit_exceeded",
"doc_url": "https://tella.tv/docs/api-reference/errors#rate-limit-exceeded",
"message": "You have exceeded the rate limit. Please slow down."
}
}{
"error": {
"code": "internal_server_error",
"doc_url": "https://tella.tv/docs/api-reference/errors#internal-server-error",
"message": "An unexpected error occurred on the server."
}
}Videos
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.
PUT
/
v1
/
videos
/
{id}
/
chapters
Replace video 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"
}
]
}{
"error": {
"code": "bad_request",
"doc_url": "https://tella.tv/docs/api-reference/errors#bad-request",
"message": "The request was malformed or contained invalid parameters."
}
}{
"error": {
"code": "unauthorized",
"doc_url": "https://tella.tv/docs/api-reference/errors#unauthorized",
"message": "Authentication is required. Provide a valid API key."
}
}{
"error": {
"code": "forbidden",
"doc_url": "https://tella.tv/docs/api-reference/errors#forbidden",
"message": "You don't have permission to access this resource."
}
}{
"error": {
"code": "not_found",
"doc_url": "https://tella.tv/docs/api-reference/errors#not-found",
"message": "The requested resource was not found."
}
}{
"error": {
"code": "unprocessable_entity",
"doc_url": "https://tella.tv/docs/api-reference/errors#unprocessable-entity",
"message": "The request was well-formed but contained semantic errors."
}
}{
"error": {
"code": "rate_limit_exceeded",
"doc_url": "https://tella.tv/docs/api-reference/errors#rate-limit-exceeded",
"message": "You have exceeded the rate limit. Please slow down."
}
}{
"error": {
"code": "internal_server_error",
"doc_url": "https://tella.tv/docs/api-reference/errors#internal-server-error",
"message": "An unexpected error occurred on the server."
}
}Authorizations
API key obtained from your Tella account settings
Path Parameters
Unique video identifier
Example:
"vid_abc123def456"
Body
application/json
Replace all chapters on a video
Complete replacement chapter list in ascending timestamp order (maximum 100). Pass an empty array to clear all chapters.
Maximum array length:
100Show child attributes
Show child attributes
Response
Chapters replaced
Video chapters
Chapters on the final video timeline, ordered by timestamp
Show child attributes
Show child attributes
Related topics
Get video chaptersHow to replace a section of your video in TellaChaptersModel Context Protocol (MCP)YouTube chaptersWas this page helpful?
⌘I