curl --request POST \
--url https://api.tella.com/v1/videos/{id}/publish \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"accountId": "<string>",
"description": "<string>",
"export": {
"resolution": "4k",
"subtitles": true
},
"uploadCaptions": true
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/publish"
payload = {
"title": "<string>",
"accountId": "<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>',
accountId: '<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>',
'accountId' => '<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 \"accountId\": \"<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 \"accountId\": \"<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 \"accountId\": \"<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": {
"accountId": "<string>",
"accountName": "<string>",
"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 export with the export settings, reusing a finished or running one or starting one, so there is no need to export first. The account must already be connected in Tella (Settings → Connections, or Share → Publish in the editor); a 403 means it isn’t, or that the plan doesn’t include the export’s resolution or frame rate. With several accounts connected for a destination, pass accountId from GET /v1/social-accounts; without it the oldest connected one posts. To post to several accounts, call once per account. TikTok can only be published from the Tella app, because TikTok requires its consent form. Returns 202 with a queued publication, which stays queued while the export renders; poll GET /v1/videos//publish for the result. One publish per destination and account 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>",
"accountId": "<string>",
"description": "<string>",
"export": {
"resolution": "4k",
"subtitles": true
},
"uploadCaptions": true
}
'import requests
url = "https://api.tella.com/v1/videos/{id}/publish"
payload = {
"title": "<string>",
"accountId": "<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>',
accountId: '<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>',
'accountId' => '<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 \"accountId\": \"<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 \"accountId\": \"<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 \"accountId\": \"<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": {
"accountId": "<string>",
"accountName": "<string>",
"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.
1Which of your connected accounts to post with, from GET /v1/social-accounts. Defaults to the oldest connected account for the destination.
YouTube description, or the post text on LinkedIn and X.
Settings of the export to upload, as POST /v1/videos/{id}/exports takes them. A finished or running export with these settings is reused; otherwise one is started. 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
The connected account it was published with; null for publishes made before Tella supported several accounts
That account's name in Tella
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?