API reference
Exports
Render a project to MP4. Export a stored project by id, send a timeline inline, or price the render first with the /cost twin.
#Create an export
https://api.rendley.com/v1/exportStart an export render job. Provide either project_id (a project stored on Rendley) or project (render-ready project JSON), but not both. When sending project inline, every media item referenced in the JSON (video, image, audio, font) must use a permanent, publicly reachable URL so the render server can resolve and download it; expiring/signed URLs will fail the render. The response returns a job ID; poll GET /jobs/{id} for status and the resulting file.
Don't have one? Create an API key
Render-ready project JSON to export inline, used instead of project_id when the project is not stored on Rendley. Every media item referenced in the JSON (video, image, audio, font) must use a permanent, publicly reachable URL so the render server can resolve and download it. Temporary or signed URLs that expire will cause the render to fail.
ID of a project already stored on Rendley to export. Provide either project_id or project, not both.
settingsoptionalOptional render settings. Defaults are applied when omitted.
Optional. Video codec to render with. Defaults are applied server-side when omitted.
Optional. Render quality (encoder bitrate). Defaults to high when omitted. Higher quality produces larger files.
Optional. Output resolution. Defaults to 1080p when omitted. Applies to the canvas's short edge for standard aspect ratios (a 9:16 project exports as 1080x1920 at 1080p) and to the long edge for custom canvas sizes; the aspect ratio is always preserved.
const res = await fetch("https://api.rendley.com/v1/export", {
method: "POST",
headers: { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"project_id": "<project_id>",
"settings": {
"target_resolution": "1080p",
"codec": "h264"
}
}),
});
const { data } = await res.json();curl -X POST "https://api.rendley.com/v1/export" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_id": "<project_id>",
"settings": {
"target_resolution": "1080p",
"codec": "h264"
}
}'import requests
res = requests.post(
"https://api.rendley.com/v1/export",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"project_id": "<project_id>",
"settings": {
"target_resolution": "1080p",
"codec": "h264"
}
},
)
data = res.json()["data"]$ch = curl_init("https://api.rendley.com/v1/export");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer YOUR_API_KEY", "Content-Type: application/json"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(["project_id" => "<project_id>", "settings" => ["target_resolution" => "1080p", "codec" => "h264"]]));
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true)["data"];package main
import (
"fmt"
"io"
"net/http"
"bytes"
)
func main() {
body := bytes.NewBufferString(`{
"project_id": "<project_id>",
"settings": {
"target_resolution": "1080p",
"codec": "h264"
}
}`)
req, _ := http.NewRequest("POST", "https://api.rendley.com/v1/export", body)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
b, _ := io.ReadAll(res.Body)
fmt.Println(string(b))
}require "net/http"
require "json"
uri = URI("https://api.rendley.com/v1/export")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer YOUR_API_KEY"
req["Content-Type"] = "application/json"
req.body = { project_id: "<project_id>", settings: { target_resolution: "1080p", codec: "h264" } }.to_json
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)["data"]Response 200
{
"data": {
"job_id": "d97241f2-e1e4-4651-b078-8663fc35c584"
}
}#Calculate export cost
Calculate the credit cost of an export without starting the render.
https://api.rendley.com/v1/export/costDon't have one? Create an API key
Render-ready project JSON to export inline, used instead of project_id when the project is not stored on Rendley. Every media item referenced in the JSON (video, image, audio, font) must use a permanent, publicly reachable URL so the render server can resolve and download it. Temporary or signed URLs that expire will cause the render to fail.
ID of a project already stored on Rendley to export. Provide either project_id or project, not both.
settingsoptionalOptional render settings. Defaults are applied when omitted.
Optional. Video codec to render with. Defaults are applied server-side when omitted.
Optional. Render quality (encoder bitrate). Defaults to high when omitted. Higher quality produces larger files.
Optional. Output resolution. Defaults to 1080p when omitted. Applies to the canvas's short edge for standard aspect ratios (a 9:16 project exports as 1080x1920 at 1080p) and to the long edge for custom canvas sizes; the aspect ratio is always preserved.
const res = await fetch("https://api.rendley.com/v1/export/cost", {
method: "POST",
headers: { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"project_id": "<project_id>",
"settings": {
"target_resolution": "1080p",
"codec": "h264"
}
}),
});
const { data } = await res.json();curl -X POST "https://api.rendley.com/v1/export/cost" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_id": "<project_id>",
"settings": {
"target_resolution": "1080p",
"codec": "h264"
}
}'import requests
res = requests.post(
"https://api.rendley.com/v1/export/cost",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"project_id": "<project_id>",
"settings": {
"target_resolution": "1080p",
"codec": "h264"
}
},
)
data = res.json()["data"]$ch = curl_init("https://api.rendley.com/v1/export/cost");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer YOUR_API_KEY", "Content-Type: application/json"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(["project_id" => "<project_id>", "settings" => ["target_resolution" => "1080p", "codec" => "h264"]]));
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true)["data"];package main
import (
"fmt"
"io"
"net/http"
"bytes"
)
func main() {
body := bytes.NewBufferString(`{
"project_id": "<project_id>",
"settings": {
"target_resolution": "1080p",
"codec": "h264"
}
}`)
req, _ := http.NewRequest("POST", "https://api.rendley.com/v1/export/cost", body)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
b, _ := io.ReadAll(res.Body)
fmt.Println(string(b))
}require "net/http"
require "json"
uri = URI("https://api.rendley.com/v1/export/cost")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer YOUR_API_KEY"
req["Content-Type"] = "application/json"
req.body = { project_id: "<project_id>", settings: { target_resolution: "1080p", codec: "h264" } }.to_json
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)["data"]Response 200
{
"data": {
"credits": 0
}
}#Export a stored project
Start an export for the project identified by the path. Returns a job ID for polling.
https://api.rendley.com/v1/projects/{projectId}/exportDon't have one? Create an API key
settingsoptionalOptional. Video codec to render with. Defaults are applied server-side when omitted.
Optional. Render quality (encoder bitrate). Defaults to high when omitted. Higher quality produces larger files.
Optional. Output resolution. Defaults to 1080p when omitted. Applies to the canvas's short edge for standard aspect ratios (a 9:16 project exports as 1080x1920 at 1080p) and to the long edge for custom canvas sizes; the aspect ratio is always preserved.
const res = await fetch("https://api.rendley.com/v1/projects/PROJECT_ID/export", {
method: "POST",
headers: { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"settings": {
"codec": "h264",
"quality": "high",
"target_resolution": "360p"
}
}),
});
const { data } = await res.json();curl -X POST "https://api.rendley.com/v1/projects/PROJECT_ID/export" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"settings": {
"codec": "h264",
"quality": "high",
"target_resolution": "360p"
}
}'import requests
res = requests.post(
"https://api.rendley.com/v1/projects/PROJECT_ID/export",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"settings": {
"codec": "h264",
"quality": "high",
"target_resolution": "360p"
}
},
)
data = res.json()["data"]$ch = curl_init("https://api.rendley.com/v1/projects/PROJECT_ID/export");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer YOUR_API_KEY", "Content-Type: application/json"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(["settings" => ["codec" => "h264", "quality" => "high", "target_resolution" => "360p"]]));
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true)["data"];package main
import (
"fmt"
"io"
"net/http"
"bytes"
)
func main() {
body := bytes.NewBufferString(`{
"settings": {
"codec": "h264",
"quality": "high",
"target_resolution": "360p"
}
}`)
req, _ := http.NewRequest("POST", "https://api.rendley.com/v1/projects/PROJECT_ID/export", body)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
b, _ := io.ReadAll(res.Body)
fmt.Println(string(b))
}require "net/http"
require "json"
uri = URI("https://api.rendley.com/v1/projects/PROJECT_ID/export")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer YOUR_API_KEY"
req["Content-Type"] = "application/json"
req.body = { settings: { codec: "h264", quality: "high", target_resolution: "360p" } }.to_json
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)["data"]Response 200
{
"data": {
"job_id": "d97241f2-e1e4-4651-b078-8663fc35c584"
}
}