curl --request POST \
--url https://api.tella.com/v1/library \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sourceId": "su_abc123def456",
"name": "Intro camera take",
"scope": "private"
}
'import requests
url = "https://api.tella.com/v1/library"
payload = {
"sourceId": "su_abc123def456",
"name": "Intro camera take",
"scope": "private"
}
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({sourceId: 'su_abc123def456', name: 'Intro camera take', scope: 'private'})
};
fetch('https://api.tella.com/v1/library', 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/library",
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([
'sourceId' => 'su_abc123def456',
'name' => 'Intro camera take',
'scope' => 'private'
]),
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/library"
payload := strings.NewReader("{\n \"sourceId\": \"su_abc123def456\",\n \"name\": \"Intro camera take\",\n \"scope\": \"private\"\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/library")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sourceId\": \"su_abc123def456\",\n \"name\": \"Intro camera take\",\n \"scope\": \"private\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/library")
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 \"sourceId\": \"su_abc123def456\",\n \"name\": \"Intro camera take\",\n \"scope\": \"private\"\n}"
response = http.request(request)
puts response.read_body{
"item": {
"createdAt": "<string>",
"id": "media_abc123def456",
"name": "Intro camera take",
"scope": "private",
"type": "video",
"updatedAt": "<string>",
"dimensions": {
"height": 0,
"width": 0
},
"durationMs": 4200,
"sourceId": "su_abc123def456",
"url": "<string>"
}
}{
"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."
}
}Add a source to the library
Saves an uploaded source to the library so it can be listed and reused later, both here and in the editor’s media panels. Create the source via POST /v1/sources and upload the bytes first, then pass its sourceId. Without this a source is only reachable through the clips that already reference it.
curl --request POST \
--url https://api.tella.com/v1/library \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sourceId": "su_abc123def456",
"name": "Intro camera take",
"scope": "private"
}
'import requests
url = "https://api.tella.com/v1/library"
payload = {
"sourceId": "su_abc123def456",
"name": "Intro camera take",
"scope": "private"
}
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({sourceId: 'su_abc123def456', name: 'Intro camera take', scope: 'private'})
};
fetch('https://api.tella.com/v1/library', 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/library",
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([
'sourceId' => 'su_abc123def456',
'name' => 'Intro camera take',
'scope' => 'private'
]),
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/library"
payload := strings.NewReader("{\n \"sourceId\": \"su_abc123def456\",\n \"name\": \"Intro camera take\",\n \"scope\": \"private\"\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/library")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sourceId\": \"su_abc123def456\",\n \"name\": \"Intro camera take\",\n \"scope\": \"private\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/library")
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 \"sourceId\": \"su_abc123def456\",\n \"name\": \"Intro camera take\",\n \"scope\": \"private\"\n}"
response = http.request(request)
puts response.read_body{
"item": {
"createdAt": "<string>",
"id": "media_abc123def456",
"name": "Intro camera take",
"scope": "private",
"type": "video",
"updatedAt": "<string>",
"dimensions": {
"height": 0,
"width": 0
},
"durationMs": 4200,
"sourceId": "su_abc123def456",
"url": "<string>"
}
}{
"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
Body
Save an uploaded source to the library so it can be listed and reused later
Source ID from POST /v1/sources, with the bytes already uploaded to its uploadUrl
"su_abc123def456"
Display name shown in the library. Defaults to the item's type.
1 - 255"Intro camera take"
Where to save the item (default: private). workspace shares it with everyone in the workspace and requires an owner or member role; viewers get a 403.
private, workspace "private"
Expected item type. Optional — the type is taken from the source's own kind; supplying a value that disagrees is an error.
image, video, sound-effect Response
Created
The newly created library item
A reusable piece of media saved to a workspace's library — the same items the editor's media panels show
Show child attributes
Show child attributes
Was this page helpful?