Add Caption
curl --request POST \
--url https://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang} \
--header 'AccessKey: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"srclang": "<string>",
"label": "<string>",
"captionsFile": "<string>"
}
'import requests
url = "https://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}"
payload = {
"srclang": "<string>",
"label": "<string>",
"captionsFile": "<string>"
}
headers = {
"AccessKey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {AccessKey: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({srclang: '<string>', label: '<string>', captionsFile: '<string>'})
};
fetch('https://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}', 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://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}",
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([
'srclang' => '<string>',
'label' => '<string>',
'captionsFile' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"AccessKey: <api-key>",
"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://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}"
payload := strings.NewReader("{\n \"srclang\": \"<string>\",\n \"label\": \"<string>\",\n \"captionsFile\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("AccessKey", "<api-key>")
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://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}")
.header("AccessKey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"srclang\": \"<string>\",\n \"label\": \"<string>\",\n \"captionsFile\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["AccessKey"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"srclang\": \"<string>\",\n \"label\": \"<string>\",\n \"captionsFile\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"statusCode": 123,
"data": {
"valid": true,
"errorList": [
"<string>"
],
"warningList": [
"<string>"
],
"warningMessage": "<string>"
}
}{
"success": true,
"message": "<string>",
"statusCode": 123,
"data": {
"valid": true,
"errorList": [
"<string>"
],
"warningList": [
"<string>"
],
"warningMessage": "<string>"
}
}{
"success": true,
"message": "<string>",
"statusCode": 123
}{
"success": true,
"message": "<string>",
"statusCode": 123
}{
"success": true,
"message": "<string>",
"statusCode": 123
}{
"success": true,
"message": "<string>",
"statusCode": 123
}Manage Videos
Add Caption
POST
/
library
/
{libraryId}
/
videos
/
{videoId}
/
captions
/
{srclang}
Add Caption
curl --request POST \
--url https://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang} \
--header 'AccessKey: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"srclang": "<string>",
"label": "<string>",
"captionsFile": "<string>"
}
'import requests
url = "https://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}"
payload = {
"srclang": "<string>",
"label": "<string>",
"captionsFile": "<string>"
}
headers = {
"AccessKey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {AccessKey: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({srclang: '<string>', label: '<string>', captionsFile: '<string>'})
};
fetch('https://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}', 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://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}",
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([
'srclang' => '<string>',
'label' => '<string>',
'captionsFile' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"AccessKey: <api-key>",
"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://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}"
payload := strings.NewReader("{\n \"srclang\": \"<string>\",\n \"label\": \"<string>\",\n \"captionsFile\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("AccessKey", "<api-key>")
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://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}")
.header("AccessKey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"srclang\": \"<string>\",\n \"label\": \"<string>\",\n \"captionsFile\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["AccessKey"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"srclang\": \"<string>\",\n \"label\": \"<string>\",\n \"captionsFile\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"statusCode": 123,
"data": {
"valid": true,
"errorList": [
"<string>"
],
"warningList": [
"<string>"
],
"warningMessage": "<string>"
}
}{
"success": true,
"message": "<string>",
"statusCode": 123,
"data": {
"valid": true,
"errorList": [
"<string>"
],
"warningList": [
"<string>"
],
"warningMessage": "<string>"
}
}{
"success": true,
"message": "<string>",
"statusCode": 123
}{
"success": true,
"message": "<string>",
"statusCode": 123
}{
"success": true,
"message": "<string>",
"statusCode": 123
}{
"success": true,
"message": "<string>",
"statusCode": 123
}Authorizations
AccessKey based authentication
Path Parameters
The ID of the video library.
The GUID of the video.
The srclang shortcode for the caption, e.g. "en".
Body
application/json
Response
The caption was successfully uploaded
Determines if the request was successful
Human-readable message describing the result, typically populated with error details when Success is false.
The HTTP status code corresponding to the result of the request.
The response payload. Some endpoints also populate this with error details when Success is false — see the endpoint's own response documentation.
Show child attributes
Show child attributes
Last modified on September 10, 2026
Was this page helpful?