List generation models with their inputs
curl --request GET \
--url https://mvp.tryunsora.com/api/v1/catalog \
--header 'Authorization: Bearer <token>'import requests
url = "https://mvp.tryunsora.com/api/v1/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://mvp.tryunsora.com/api/v1/catalog', 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://mvp.tryunsora.com/api/v1/catalog",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://mvp.tryunsora.com/api/v1/catalog"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://mvp.tryunsora.com/api/v1/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://mvp.tryunsora.com/api/v1/catalog")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"models": [
{
"key": "seedance-2.5",
"label": "Seedance 2.5",
"provider": "ByteDance",
"icon": "/models/bytedance.svg",
"category": "video",
"description": "<string>",
"isNew": true,
"legacyDbModels": [
"<string>"
],
"modes": [
{
"key": "omni",
"label": "Omni reference",
"endpoints": [
{
"modelId": "bytedance/seedance-2.5/text-to-video",
"when": [
"<string>"
],
"fields": [
{
"key": "resolution",
"label": "Resolution",
"type": "prompt",
"required": true,
"options": [
{
"value": "<string>",
"label": "<string>"
}
],
"default": "<string>",
"offLabel": "<string>",
"media": {
"kind": "image",
"max": 123
}
}
]
}
]
}
]
}
]
}{
"error": "<string>",
"success": true,
"code": "<string>",
"message": "<string>"
}Models and pricing
List models
Every video, image and motion-control model Unsora runs, with each model’s modes and inputs: names, allowed values, ranges and defaults.
GET
/
catalog
List generation models with their inputs
curl --request GET \
--url https://mvp.tryunsora.com/api/v1/catalog \
--header 'Authorization: Bearer <token>'import requests
url = "https://mvp.tryunsora.com/api/v1/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://mvp.tryunsora.com/api/v1/catalog', 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://mvp.tryunsora.com/api/v1/catalog",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://mvp.tryunsora.com/api/v1/catalog"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://mvp.tryunsora.com/api/v1/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://mvp.tryunsora.com/api/v1/catalog")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"models": [
{
"key": "seedance-2.5",
"label": "Seedance 2.5",
"provider": "ByteDance",
"icon": "/models/bytedance.svg",
"category": "video",
"description": "<string>",
"isNew": true,
"legacyDbModels": [
"<string>"
],
"modes": [
{
"key": "omni",
"label": "Omni reference",
"endpoints": [
{
"modelId": "bytedance/seedance-2.5/text-to-video",
"when": [
"<string>"
],
"fields": [
{
"key": "resolution",
"label": "Resolution",
"type": "prompt",
"required": true,
"options": [
{
"value": "<string>",
"label": "<string>"
}
],
"default": "<string>",
"offLabel": "<string>",
"media": {
"kind": "image",
"max": 123
}
}
]
}
]
}
]
}
]
}{
"error": "<string>",
"success": true,
"code": "<string>",
"message": "<string>"
}Returns every generation model with its modes and the exact inputs each one takes, read live from the provider. Use it to see which durations, aspect ratios, resolutions and reference files a model accepts before you call Generate.
Filter with
?category=video, image or motion-control. Prices aren’t listed because they depend on the inputs; use Quote a generation.
curl "https://mvp.tryunsora.com/api/v1/catalog?category=video" \
-H "Authorization: Bearer uns_YOUR_API_KEY"

