Rendley docs

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

POSThttps://api.rendley.com/v1/export

Start 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

Body

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.

settingsoptionalobject

Optional 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.

POSThttps://api.rendley.com/v1/export/cost

Don't have one? Create an API key

Body

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.

settingsoptionalobject

Optional 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.

POSThttps://api.rendley.com/v1/projects/{projectId}/export

Don't have one? Create an API key

Body
settingsoptionalobject

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/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"
  }
}