curl --request POST \
--url https://api.tella.com/v1/videos/{id}/clips/{clipId}/zooms \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"durationMs": 2000,
"scale": 2,
"startTimeMs": 1000,
"type": "manualZoom"
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/clips/{clipId}/zooms"
payload = {
"durationMs": 2000,
"scale": 2,
"startTimeMs": 1000,
"type": "manualZoom"
}
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({durationMs: 2000, scale: 2, startTimeMs: 1000, type: 'manualZoom'})
};
fetch('https://api.tella.com/v1/videos/{id}/clips/{clipId}/zooms', 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}/zooms",
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([
'durationMs' => 2000,
'scale' => 2,
'startTimeMs' => 1000,
'type' => 'manualZoom'
]),
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}/zooms"
payload := strings.NewReader("{\n \"durationMs\": 2000,\n \"scale\": 2,\n \"startTimeMs\": 1000,\n \"type\": \"manualZoom\"\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/videos/{id}/clips/{clipId}/zooms")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"durationMs\": 2000,\n \"scale\": 2,\n \"startTimeMs\": 1000,\n \"type\": \"manualZoom\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/clips/{clipId}/zooms")
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 \"durationMs\": 2000,\n \"scale\": 2,\n \"startTimeMs\": 1000,\n \"type\": \"manualZoom\"\n}"
response = http.request(request)
puts response.read_body{
"zoom": {
"durationMs": 2000,
"id": "ef_abc123",
"startTimeMs": 1000,
"type": "manualZoom",
"focusPoint": {
"xPct": 50,
"yPct": 50
},
"scale": 2
}
}{
"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."
}Add a zoom to a clip
Adds a zoom to the clip’s screen layer (the camera is unaffected). Use manualZoom with a focusPoint, or trackingZoom to follow the cursor.
curl --request POST \
--url https://api.tella.com/v1/videos/{id}/clips/{clipId}/zooms \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"durationMs": 2000,
"scale": 2,
"startTimeMs": 1000,
"type": "manualZoom"
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/clips/{clipId}/zooms"
payload = {
"durationMs": 2000,
"scale": 2,
"startTimeMs": 1000,
"type": "manualZoom"
}
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({durationMs: 2000, scale: 2, startTimeMs: 1000, type: 'manualZoom'})
};
fetch('https://api.tella.com/v1/videos/{id}/clips/{clipId}/zooms', 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}/zooms",
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([
'durationMs' => 2000,
'scale' => 2,
'startTimeMs' => 1000,
'type' => 'manualZoom'
]),
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}/zooms"
payload := strings.NewReader("{\n \"durationMs\": 2000,\n \"scale\": 2,\n \"startTimeMs\": 1000,\n \"type\": \"manualZoom\"\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/videos/{id}/clips/{clipId}/zooms")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"durationMs\": 2000,\n \"scale\": 2,\n \"startTimeMs\": 1000,\n \"type\": \"manualZoom\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/clips/{clipId}/zooms")
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 \"durationMs\": 2000,\n \"scale\": 2,\n \"startTimeMs\": 1000,\n \"type\": \"manualZoom\"\n}"
response = http.request(request)
puts response.read_body{
"zoom": {
"durationMs": 2000,
"id": "ef_abc123",
"startTimeMs": 1000,
"type": "manualZoom",
"focusPoint": {
"xPct": 50,
"yPct": 50
},
"scale": 2
}
}{
"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
Add a zoom to the clip's screen layer (does not affect the camera). Use manualZoom with a focusPoint, or trackingZoom to follow the cursor.
0 < x <= 90071992547409912000
Magnification factor (1 = no zoom, 3.5 = max). Required — a zoom without a scale cannot be rendered.
1 <= x <= 3.52
Start time in ms on the clip's playback timeline (cuts applied)
0 <= x <= 90071992547409911000
manualZoom zooms into a fixed focusPoint on the screen. trackingZoom automatically follows the cursor in the screen recording.
manualZoom, trackingZoom "manualZoom"
Point on the screen recording to zoom into, expressed as percentages of the screen dimensions. Required for manualZoom; ignored for trackingZoom.
Show child attributes
Show child attributes
Response
OK
A zoom on a clip
A zoom effect applied to the clip's screen layer (does not affect the camera). Use manualZoom with a focusPoint, or trackingZoom to follow the cursor automatically. Times are in ms on the clip's playback timeline (cuts applied). Internally the zoom stays anchored to the footage, so it doesn't drift when cuts change later.
Show child attributes
Show child attributes
Related topics
Model Context Protocol (MCP)Zoom in on screen recordingsList zooms on a clipAgent skills guideAdd a layout to a clipWas this page helpful?