curl --request GET \
--url https://api.framelane.io/v1/capabilitiesimport requests
url = "https://api.framelane.io/v1/capabilities"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.framelane.io/v1/capabilities', 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.framelane.io/v1/capabilities",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.framelane.io/v1/capabilities"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.framelane.io/v1/capabilities")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.framelane.io/v1/capabilities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"api_version": "<string>",
"onboarding": {
"self_serve": true,
"summary": "<string>",
"steps": [
{
"method": "<string>",
"path": "<string>",
"auth_required": true,
"description": "<string>"
}
],
"action_mcp_url": "<string>",
"action_mcp_auth": "<string>",
"docs": {
"llms_txt": "<string>",
"skill": "<string>",
"raw_markdown": "<string>"
},
"verification_gates_usage": true,
"free_plan": "<string>"
},
"output_formats": [
{
"value": "<string>",
"description": "<string>",
"supported": true,
"alpha_capable": true
}
],
"input_formats": [
{
"extension": "<string>",
"mime_type": "<string>",
"kind": "<string>"
}
],
"element_types": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"element_schemas": {},
"request_schema": {},
"effects": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"motions": [
{
"value": "<string>",
"description": "<string>",
"supported": true,
"element_entrance": true,
"element_exit": true,
"character": true,
"text_block": true
}
],
"transitions": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"word_animations": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"blend_modes": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"easings": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"motion_scopes": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"task_types": [
{
"value": "<string>",
"description": "<string>",
"provider": "<string>",
"params": [
{
"name": "<string>",
"type": "<string>",
"required": true,
"minimum": 123,
"maximum": 123,
"default": "<unknown>",
"options": [
"<string>"
],
"description": "<string>"
}
]
}
],
"limits": {
"canvas_min": 123,
"canvas_max": 123,
"frame_rate_min": 123,
"frame_rate_max": 123,
"frame_rate_default": 123,
"max_source_bytes": 123,
"pagination_default_limit": 123,
"pagination_max_limit": 123
},
"rate_limits": [
{
"scope": "<string>",
"limit": 123,
"window_seconds": 123
}
]
}List render and task capabilities
Return the catalog of everything an agent can use in a render or task — effects, motions, transitions, output/input formats, element types, task parameters, and global limits — each flagged with whether it is supported today.
curl --request GET \
--url https://api.framelane.io/v1/capabilitiesimport requests
url = "https://api.framelane.io/v1/capabilities"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.framelane.io/v1/capabilities', 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.framelane.io/v1/capabilities",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.framelane.io/v1/capabilities"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.framelane.io/v1/capabilities")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.framelane.io/v1/capabilities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"api_version": "<string>",
"onboarding": {
"self_serve": true,
"summary": "<string>",
"steps": [
{
"method": "<string>",
"path": "<string>",
"auth_required": true,
"description": "<string>"
}
],
"action_mcp_url": "<string>",
"action_mcp_auth": "<string>",
"docs": {
"llms_txt": "<string>",
"skill": "<string>",
"raw_markdown": "<string>"
},
"verification_gates_usage": true,
"free_plan": "<string>"
},
"output_formats": [
{
"value": "<string>",
"description": "<string>",
"supported": true,
"alpha_capable": true
}
],
"input_formats": [
{
"extension": "<string>",
"mime_type": "<string>",
"kind": "<string>"
}
],
"element_types": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"element_schemas": {},
"request_schema": {},
"effects": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"motions": [
{
"value": "<string>",
"description": "<string>",
"supported": true,
"element_entrance": true,
"element_exit": true,
"character": true,
"text_block": true
}
],
"transitions": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"word_animations": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"blend_modes": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"easings": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"motion_scopes": [
{
"value": "<string>",
"description": "<string>",
"supported": true
}
],
"task_types": [
{
"value": "<string>",
"description": "<string>",
"provider": "<string>",
"params": [
{
"name": "<string>",
"type": "<string>",
"required": true,
"minimum": 123,
"maximum": 123,
"default": "<unknown>",
"options": [
"<string>"
],
"description": "<string>"
}
]
}
],
"limits": {
"canvas_min": 123,
"canvas_max": 123,
"frame_rate_min": 123,
"frame_rate_max": 123,
"frame_rate_default": 123,
"max_source_bytes": 123,
"pagination_default_limit": 123,
"pagination_max_limit": 123
},
"rate_limits": [
{
"scope": "<string>",
"limit": 123,
"window_seconds": 123
}
]
}Response
Successful Response
The full capability catalog returned by GET /v1/capabilities.
API build version this catalog reflects.
How to self-provision an API key (agent-native signup flow).
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Full JSON Schema for every field each element type accepts, keyed by element type value (e.g. 'text', 'video') — everything element_types doesn't cover (accepted fields, types, defaults, constraints, enum options), including nested sub-objects like motion/effects/word_animation inlined under each entry's own $defs. Generated directly from the same Pydantic models the API validates requests against, so it can't drift out of sync.
Show child attributes
Show child attributes
Full JSON Schema of the render request body itself — the composition-level surface element_schemas doesn't cover: groups (transform groups, nesting, stack layout), custom_animations (inline keyframe animation registries), motion_blur, background_gradient, transitions, canvas and output settings. The elements array's per-type schemas are NOT duplicated here — read them from element_schemas. Generated from the same Pydantic model the API validates against, so it can't drift out of sync.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes

