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,
"breakAfter": true,
"hidden": true,
"keepWithNext": true,
"text": "Tella"
}
]
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words"
payload = { "words": [
{
"index": 12,
"breakAfter": True,
"hidden": True,
"keepWithNext": 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, breakAfter: true, hidden: true, keepWithNext: 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,
'breakAfter' => true,
'hidden' => true,
'keepWithNext' => 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 \"breakAfter\": true,\n \"hidden\": true,\n \"keepWithNext\": 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 \"breakAfter\": true,\n \"hidden\": true,\n \"keepWithNext\": 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 \"breakAfter\": true,\n \"hidden\": true,\n \"keepWithNext\": true,\n \"text\": \"Tella\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"words": [
{
"breakAfter": false,
"endTimeMs": 1800,
"hidden": false,
"index": 12,
"keepWithNext": false,
"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": "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."
}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,
"breakAfter": true,
"hidden": true,
"keepWithNext": true,
"text": "Tella"
}
]
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/clips/{clipId}/transcript/words"
payload = { "words": [
{
"index": 12,
"breakAfter": True,
"hidden": True,
"keepWithNext": 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, breakAfter: true, hidden: true, keepWithNext: 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,
'breakAfter' => true,
'hidden' => true,
'keepWithNext' => 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 \"breakAfter\": true,\n \"hidden\": true,\n \"keepWithNext\": 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 \"breakAfter\": true,\n \"hidden\": true,\n \"keepWithNext\": 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 \"breakAfter\": true,\n \"hidden\": true,\n \"keepWithNext\": true,\n \"text\": \"Tella\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"words": [
{
"breakAfter": false,
"endTimeMs": 1800,
"hidden": false,
"index": 12,
"keepWithNext": false,
"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": "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
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 elementsHide child attributes
Hide child attributes
Index of the word to edit, as reported by the clip's transcript.
0 <= x <= 900719925474099112
true forces a subtitle break after the word, so the next word starts a new subtitle block; false removes it. Leaves the word's text and visibility alone.
true
true hides the word from captions and subtitles without touching the audio; false shows it again. A correction already made to the word is preserved.
true
true keeps the word's subtitle block together with the next word even where punctuation or a pause would end it; false restores the automatic split. The lines-per-block limit still applies, and breakAfter wins.
true
Corrected text for the word. Replaces what the transcript, captions and subtitles say, and unhides the word. Must not be empty — hide a word with hidden instead.
1"Tella"
Response
OK
The words that were edited, after the edit.
The edited words in their new state, in the order they were sent.
Hide child attributes
Hide child attributes
Whether a subtitle break is forced after this word, so the next word always starts a new subtitle block
false
Word end time, in ms on the clip's playback timeline
x >= 01800
Whether the word is hidden by an edit
false
Stable index of the word in the source recording
0 <= x <= 900719925474099112
Whether this word's subtitle block is kept together with the next word across punctuation and pauses. The lines-per-block limit still applies and breakAfter wins.
false
Word start time, in ms on the clip's playback timeline
x >= 01500
Word text
"Hello"
Was this page helpful?