curl --request GET \
--url https://api.tella.com/v1/videos/{id}/analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.tella.com/v1/videos/{id}/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tella.com/v1/videos/{id}/analytics', 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}/analytics",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tella.com/v1/videos/{id}/analytics"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tella.com/v1/videos/{id}/analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/analytics")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"ctaClicks": 37,
"endDate": "<string>",
"geoBreakdown": [
{
"country": "US",
"uniqueSessions": 0,
"views": 0
}
],
"referrerBreakdown": [
{
"referrerDomain": "linkedin.com",
"uniqueSessions": 0,
"views": 0
}
],
"retention": [
{
"percent": 42,
"uniqueViewers": 0,
"watchCount": 0
}
],
"startDate": "<string>",
"summary": {
"avgPercentViewed": 63.5,
"pageOpens": 1610,
"totalViews": 1280,
"totalWatchTimeSeconds": 48210.4,
"uniqueSessions": 940
},
"timezone": "UTC",
"trafficSources": [
{
"campaign": "launch-week",
"medium": "email",
"source": "newsletter",
"uniqueSessions": 0,
"views": 0
}
],
"videoId": "vid_abc123def456",
"viewsOverTime": [
{
"date": "2026-01-14",
"uniqueSessions": 0,
"views": 0
}
]
}{
"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."
}Get video analytics
Viewing analytics for one video: plays, unique sessions, watch time, plays per day, retention per one-percent slice, geography, referrers, UTM traffic sources, and call-to-action clicks. Available to the video’s creator, its collaborators, and workspace members it is shared with. Dates are whole UTC days; omit both for all time.
curl --request GET \
--url https://api.tella.com/v1/videos/{id}/analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.tella.com/v1/videos/{id}/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tella.com/v1/videos/{id}/analytics', 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}/analytics",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tella.com/v1/videos/{id}/analytics"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tella.com/v1/videos/{id}/analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/analytics")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"ctaClicks": 37,
"endDate": "<string>",
"geoBreakdown": [
{
"country": "US",
"uniqueSessions": 0,
"views": 0
}
],
"referrerBreakdown": [
{
"referrerDomain": "linkedin.com",
"uniqueSessions": 0,
"views": 0
}
],
"retention": [
{
"percent": 42,
"uniqueViewers": 0,
"watchCount": 0
}
],
"startDate": "<string>",
"summary": {
"avgPercentViewed": 63.5,
"pageOpens": 1610,
"totalViews": 1280,
"totalWatchTimeSeconds": 48210.4,
"uniqueSessions": 940
},
"timezone": "UTC",
"trafficSources": [
{
"campaign": "launch-week",
"medium": "email",
"source": "newsletter",
"uniqueSessions": 0,
"views": 0
}
],
"videoId": "vid_abc123def456",
"viewsOverTime": [
{
"date": "2026-01-14",
"uniqueSessions": 0,
"views": 0
}
]
}{
"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"
Query Parameters
First day of the range, inclusive, as YYYY-MM-DD in UTC. Omit to start from the first recorded view.
^\d{4}-\d{2}-\d{2}$"2026-01-01"
Last day of the range, inclusive, as YYYY-MM-DD in UTC. Omit to run through today.
^\d{4}-\d{2}-\d{2}$"2026-01-01"
IANA time zone used to bucket viewsOverTime into days (default: UTC)
"America/New_York"
Response
OK
Viewing analytics for one video
Clicks on the video's call-to-action button in the range
-9007199254740991 <= x <= 900719925474099137
The endDate that was applied, or null for no upper bound
Plays by country, up to 100 rows by views
Show child attributes
Show child attributes
Plays by referring domain, up to 100 rows by views
Show child attributes
Show child attributes
Watch counts per one-percent slice of the video, ascending
Show child attributes
Show child attributes
The startDate that was applied, or null for no lower bound
Headline viewing metrics
Show child attributes
Show child attributes
Time zone used to bucket viewsOverTime
"UTC"
Plays by UTM source, medium and campaign, up to 100 rows by views
Show child attributes
Show child attributes
"vid_abc123def456"
Plays per day, ascending
Show child attributes
Show child attributes
Was this page helpful?