curl --request POST \
--url https://api.tella.com/v1/videos/{id}/publish \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"description": "<string>",
"export": {
"resolution": "4k",
"subtitles": true
},
"uploadCaptions": true
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/publish"
payload = {
"title": "<string>",
"description": "<string>",
"export": {
"resolution": "4k",
"subtitles": True
},
"uploadCaptions": True
}
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({
title: '<string>',
description: '<string>',
export: {resolution: '4k', subtitles: true},
uploadCaptions: true
})
};
fetch('https://api.tella.com/v1/videos/{id}/publish', 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}/publish",
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([
'title' => '<string>',
'description' => '<string>',
'export' => [
'resolution' => '4k',
'subtitles' => true
],
'uploadCaptions' => true
]),
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}/publish"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"export\": {\n \"resolution\": \"4k\",\n \"subtitles\": true\n },\n \"uploadCaptions\": true\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}/publish")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"export\": {\n \"resolution\": \"4k\",\n \"subtitles\": true\n },\n \"uploadCaptions\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/publish")
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 \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"export\": {\n \"resolution\": \"4k\",\n \"subtitles\": true\n },\n \"uploadCaptions\": true\n}"
response = http.request(request)
puts response.read_body{
"publication": {
"captionsError": "<string>",
"createdAt": "<string>",
"destination": "<string>",
"error": "<string>",
"privacy": "public",
"providerVideoId": "<string>",
"status": "queued",
"title": "<string>",
"updatedAt": "<string>",
"url": "<string>"
}
}{
"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."
}Publish a video to social media
Posts the video to one of your connected social accounts: YouTube, YouTube Shorts, LinkedIn, X, Instagram (post, reel or story) or Facebook (post or story). This posts under your own account, so check the destination, text and privacy before calling it. It uploads an existing completed export: start one with POST /v1/videos//exports, wait until it completes, then pass the same export settings here; a 409 means no completed export matches them. The account must already be connected in Tella (Settings → Connections, or Share → Publish in the editor); a 403 means it isn’t. TikTok can only be published from the Tella app, because TikTok requires its consent form. Returns 202 with a queued publication; poll GET /v1/videos//publish for the result. One publish per destination runs at a time. Requires edit access to the video.
curl --request POST \
--url https://api.tella.com/v1/videos/{id}/publish \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"description": "<string>",
"export": {
"resolution": "4k",
"subtitles": true
},
"uploadCaptions": true
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/publish"
payload = {
"title": "<string>",
"description": "<string>",
"export": {
"resolution": "4k",
"subtitles": True
},
"uploadCaptions": True
}
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({
title: '<string>',
description: '<string>',
export: {resolution: '4k', subtitles: true},
uploadCaptions: true
})
};
fetch('https://api.tella.com/v1/videos/{id}/publish', 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}/publish",
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([
'title' => '<string>',
'description' => '<string>',
'export' => [
'resolution' => '4k',
'subtitles' => true
],
'uploadCaptions' => true
]),
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}/publish"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"export\": {\n \"resolution\": \"4k\",\n \"subtitles\": true\n },\n \"uploadCaptions\": true\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}/publish")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"export\": {\n \"resolution\": \"4k\",\n \"subtitles\": true\n },\n \"uploadCaptions\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tella.com/v1/videos/{id}/publish")
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 \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"export\": {\n \"resolution\": \"4k\",\n \"subtitles\": true\n },\n \"uploadCaptions\": true\n}"
response = http.request(request)
puts response.read_body{
"publication": {
"captionsError": "<string>",
"createdAt": "<string>",
"destination": "<string>",
"error": "<string>",
"privacy": "public",
"providerVideoId": "<string>",
"status": "queued",
"title": "<string>",
"updatedAt": "<string>",
"url": "<string>"
}
}{
"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"
Body
Where to post. YouTube Shorts must be vertical or square and at most 3 minutes; LinkedIn at most 30 minutes and 500 MB, and at least 3 seconds. YouTube takes at most 15 minutes from a channel that isn't verified; X at most 20 minutes, or 125 with Premium or a checkmark.
youtube, youtube_shorts, linkedin, x Video title on YouTube. On LinkedIn and X it is the post text when description is empty.
1YouTube description, or the post text on LinkedIn and X.
Settings of the completed export to upload, as passed to POST /v1/videos/{id}/exports. Defaults to 1080p, 30 fps, no burned-in subtitles, 1x.
YouTube: private (default), unlisted or public. LinkedIn: private (connections only, default) or public. X: public only.
public, unlisted, private YouTube only: upload the transcript as a caption track (default true). Skipped when the export has burned-in subtitles.
Response
Publish queued
Hide child attributes
Hide child attributes
Set on a completed YouTube publish whose caption track was refused
One of the request destinations, or tiktok
Why a failed publish failed
public, unlisted, private, followers, friends queued, running, completed, failed The post on the destination, once completed
Was this page helpful?