curl --request PATCH \
--url https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"words": [
{
"index": 12,
"hidden": true,
"text": "Tella"
}
]
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words"
payload = { "words": [
{
"index": 12,
"hidden": True,
"text": "Tella"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({words: [{index: 12, hidden: true, text: 'Tella'}]})
};
fetch('https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words', 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}/transcript/words",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'words' => [
[
'index' => 12,
'hidden' => true,
'text' => 'Tella'
]
]
]),
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}/transcript/words"
payload := strings.NewReader("{\n \"words\": [\n {\n \"index\": 12,\n \"hidden\": true,\n \"text\": \"Tella\"\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"words\": [\n {\n \"index\": 12,\n \"hidden\": true,\n \"text\": \"Tella\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"words\": [\n {\n \"index\": 12,\n \"hidden\": true,\n \"text\": \"Tella\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"words": [
{
"endTimeMs": 1800,
"hidden": false,
"index": 12,
"startTimeMs": 1500,
"text": "Hello"
}
]
}{
"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": "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."
}Correct transcript words
Correct what a clip’s transcript says, one or more words at a time (at most 100 per request). Each edit addresses a word by its transcript index and sets either text (the corrected wording, which also unhides the word) or hidden (whether the word appears in captions and subtitles). Edits change the transcript, captions and subtitles only — never the audio or the clip’s timing; use cut-by-transcript to remove spoken words from the video. Visibility and wording are independent: hiding a word preserves any correction made to it. The whole batch is applied atomically as a single transaction, so a request never changes only some of its words. A 500 does not by itself mean nothing changed — the words can land and a later step of the commit still fail — so treat the outcome as either fully applied or not applied at all. Every edit assigns a word outright, so re-sending the identical request is safe and settles it.
curl --request PATCH \
--url https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"words": [
{
"index": 12,
"hidden": true,
"text": "Tella"
}
]
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words"
payload = { "words": [
{
"index": 12,
"hidden": True,
"text": "Tella"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({words: [{index: 12, hidden: true, text: 'Tella'}]})
};
fetch('https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words', 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}/transcript/words",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'words' => [
[
'index' => 12,
'hidden' => true,
'text' => 'Tella'
]
]
]),
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}/transcript/words"
payload := strings.NewReader("{\n \"words\": [\n {\n \"index\": 12,\n \"hidden\": true,\n \"text\": \"Tella\"\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"words\": [\n {\n \"index\": 12,\n \"hidden\": true,\n \"text\": \"Tella\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"words\": [\n {\n \"index\": 12,\n \"hidden\": true,\n \"text\": \"Tella\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"words": [
{
"endTimeMs": 1800,
"hidden": false,
"index": 12,
"startTimeMs": 1500,
"text": "Hello"
}
]
}{
"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": "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."
}Authorizations
API key obtained from your Tella account settings
Path Parameters
Video identifier
"vid_abc123def456"
Clip identifier
"cl_xyz789ghi012"
Body
Correct what the transcript says. Word edits change the transcript, captions and subtitles only — they never change the audio or the clip's timing. Use cut-by-transcript to remove spoken words from the video. The whole batch is applied atomically, so a request never changes only some of its words. A 500 does not by itself mean nothing changed — the words can land and a later step of the commit still fail — so treat the outcome as either fully applied or not applied at all, and re-send the identical request to settle it; every edit assigns a word outright, so re-sending is safe.
Word edits to apply, at most one per word index and at most 100 per request. Indices are stable across cuts, but a word that is currently cut out of the clip cannot be edited.
1 - 100 elementsShow child attributes
Show child attributes
Response
OK
The words that were edited, after the edit.
The edited words in their new state, in the order they were sent.
Show child attributes
Show child attributes
Related topics
Cut clip ranges by transcript word indicesModel Context Protocol (MCP)Style subtitlesFind & replace subtitlesEdit with the transcriptWas this page helpful?