const response = await fetch("https://api.sudomock.com/api/v1/renders/video", {
method: "POST",
headers: {
"x-api-key": "sm_your_api_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}),
});
const data = await response.json();
console.log(data);
<?php
$payload = <<<'JSON'
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
JSON;
$ch = curl_init("https://api.sudomock.com/api/v1/renders/video");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-api-key: sm_your_api_key",
"Content-Type: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests
payload = {
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
response = requests.post(
"https://api.sudomock.com/api/v1/renders/video",
headers={"x-api-key": "sm_your_api_key"},
json=payload,
)
response.raise_for_status()
print(response.json())
require "net/http"
require "uri"
uri = URI("https://api.sudomock.com/api/v1/renders/video")
request = Net::HTTP::Post.new(uri)
request["x-api-key"] = "sm_your_api_key"
request["Content-Type"] = "application/json"
request.body = <<~JSON
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
JSON
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts response.body
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}`)
req, err := http.NewRequest("POST", "https://api.sudomock.com/api/v1/renders/video", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("x-api-key", "sm_your_api_key")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String payload = """
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sudomock.com/api/v1/renders/video"))
.header("x-api-key", "sm_your_api_key")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System.Net.Http;
using System.Text;
var payload = """
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.sudomock.com/api/v1/renders/video");
request.Headers.Add("x-api-key", "sm_your_api_key");
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
var client = new HttpClient();
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
curl -X POST "https://api.sudomock.com/api/v1/renders/video" \
-H "x-api-key: sm_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}'
Render a video mockup
Animates a mockup: produces a still render from the given smart objects, then animates it. Returns 202 with a job_id to poll (GET /api/v1/jobs/).
const response = await fetch("https://api.sudomock.com/api/v1/renders/video", {
method: "POST",
headers: {
"x-api-key": "sm_your_api_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}),
});
const data = await response.json();
console.log(data);
<?php
$payload = <<<'JSON'
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
JSON;
$ch = curl_init("https://api.sudomock.com/api/v1/renders/video");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-api-key: sm_your_api_key",
"Content-Type: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests
payload = {
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
response = requests.post(
"https://api.sudomock.com/api/v1/renders/video",
headers={"x-api-key": "sm_your_api_key"},
json=payload,
)
response.raise_for_status()
print(response.json())
require "net/http"
require "uri"
uri = URI("https://api.sudomock.com/api/v1/renders/video")
request = Net::HTTP::Post.new(uri)
request["x-api-key"] = "sm_your_api_key"
request["Content-Type"] = "application/json"
request.body = <<~JSON
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
JSON
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts response.body
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}`)
req, err := http.NewRequest("POST", "https://api.sudomock.com/api/v1/renders/video", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("x-api-key", "sm_your_api_key")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String payload = """
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sudomock.com/api/v1/renders/video"))
.header("x-api-key", "sm_your_api_key")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System.Net.Http;
using System.Text;
var payload = """
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.sudomock.com/api/v1/renders/video");
request.Headers.Add("x-api-key", "sm_your_api_key");
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
var client = new HttpClient();
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
curl -X POST "https://api.sudomock.com/api/v1/renders/video" \
-H "x-api-key: sm_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}'
const response = await fetch("https://api.sudomock.com/api/v1/renders/video", {
method: "POST",
headers: {
"x-api-key": "sm_your_api_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}),
});
const data = await response.json();
console.log(data);
<?php
$payload = <<<'JSON'
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
JSON;
$ch = curl_init("https://api.sudomock.com/api/v1/renders/video");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-api-key: sm_your_api_key",
"Content-Type: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests
payload = {
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
response = requests.post(
"https://api.sudomock.com/api/v1/renders/video",
headers={"x-api-key": "sm_your_api_key"},
json=payload,
)
response.raise_for_status()
print(response.json())
require "net/http"
require "uri"
uri = URI("https://api.sudomock.com/api/v1/renders/video")
request = Net::HTTP::Post.new(uri)
request["x-api-key"] = "sm_your_api_key"
request["Content-Type"] = "application/json"
request.body = <<~JSON
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
JSON
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts response.body
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}`)
req, err := http.NewRequest("POST", "https://api.sudomock.com/api/v1/renders/video", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("x-api-key", "sm_your_api_key")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String payload = """
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sudomock.com/api/v1/renders/video"))
.header("x-api-key", "sm_your_api_key")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System.Net.Http;
using System.Text;
var payload = """
{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}
""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.sudomock.com/api/v1/renders/video");
request.Headers.Add("x-api-key", "sm_your_api_key");
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
var client = new HttpClient();
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
curl -X POST "https://api.sudomock.com/api/v1/renders/video" \
-H "x-api-key: sm_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"mockup_uuid": "123e4567-e89b-12d3-a456-426614174000",
"smart_objects": [
{
"asset": {
"fit": "fill",
"url": "https://example.com/user-design.png"
},
"uuid": "223e4567-e89b-12d3-a456-426614174001"
}
],
"video": {
"audio": false,
"duration_seconds": 4,
"motion": "ambient",
"advanced_model": null
},
"webhook": {
"url": "https://example.com/hooks/render-done"
}
}'
Authorizations
API key with sm_ prefix. Get your key at https://sudomock.com/dashboard/api-keys
Body
Request body for POST /api/v1/renders/video.
Supply exactly one of two input modes. Render mode (mockup_uuid and smart_objects, optionally export_options) mirrors a still render: the still is produced first, then animated. Raw-image mode (image_url) animates a public https png or jpg directly with no render step, and the render fields are ignored.
Both modes take the video animation options and an optional completion webhook. The call always queues a job; poll GET /api/v1/jobs/{job_id} for the result. Sending both modes, or neither, returns 400.
RENDER MODE: UUID of the mockup to animate (from GET /api/v1/psd-mockups or POST /api/v1/psd/upload). Required in render mode; omit in raw-image mode.
^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$RENDER MODE: smart objects with their assets, identical to a still render (at least 1 required). Required in render mode; omit in raw-image mode.
1Hide child attributes
Hide child attributes
UUID of the smart object to render
^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"b41a7e52-93c8-4d61-8f07-2ae5c9d04713"
Asset configuration (image to place)
Hide child attributes
Hide child attributes
URL to the user's image (HTTP/HTTPS or data: URL). Either url or base64 must be provided. Server downloads the image, adding network latency.
"https://example.com/user-design.png"
Raw base64-encoded image bytes (no data: prefix). RECOMMENDED for best performance: eliminates server-side download latency (50-500ms faster than URL). Either url or base64 must be provided.
MIME type when using base64 field. Supported: image/png, image/jpeg, image/webp, image/gif. Defaults to image/png if omitted.
^image/(png|jpeg|webp|gif)$"image/png"
How the artwork meets the smart object area. 'fit' scales it until it fits inside, keeping proportions, which can leave empty space. 'fill' stretches it to the bounds and does not keep its proportions. 'crop' covers the area and cuts the overflow, keeping proportions. 'contain' and 'cover' are the older names for 'fit' and 'crop' and are still accepted. Defaults to 'fit': a caller who says nothing is not asking to have their artwork distorted, and a silently stretched design is a defect the caller cannot see.
fill, fit, crop Custom size override in pixels. Width and height are both optional and each must be at least 1 pixel.
Custom position override (top/left in pixels). The top-left corner of the size box, which stays axis-aligned: rotate turns the artwork inside it, never the box.
Rotation angle in degrees (clockwise positive). Applied to the artwork before it is fitted, so the turned artwork, corners included, is what fit places inside the still axis-aligned size box at position.
-360 <= x <= 36015
Flip artwork horizontally (left-right mirror)
Flip artwork vertically (top-bottom mirror)
Remove the image background before placing the artwork; the subject is isolated onto a clean transparent cutout. Adds 25 credits per artwork to the render cost.
{ "fit": "fill", "flip_horizontal": false, "flip_vertical": false, "position": { "left": 20, "top": 10 }, "rotate": 15, "size": { "height": 600, "width": 800 }, "url": "https://example.com/user-design.png" }
Color overlay configuration
Hide child attributes
Hide child attributes
Hex color code (e.g., '#FF5733'). Send this or 'label'.
^#[0-9A-Fa-f]{6}$"#FF5733"
One of the colours saved on this mockup, by the name you gave it. Send this instead of 'hex' to keep calling a colour what your own catalogue calls it. Names match exactly, and are set with PATCH /api/v1/psd-mockups/{uuid}.
1 - 32Blend mode for color overlay. Common values: 'normal', 'multiply' (fabric/textile mockups), 'screen', 'overlay', 'soft_light'. All 27 Photoshop blend modes supported.
"multiply"
{ "blending_mode": "multiply", "hex": "#FF5733" }
Image adjustments applied to your artwork after the fit transform and before it is blended into the mockup. PSD-level adjustment layers are not affected.
Hide child attributes
Hide child attributes
Brightness adjustment (-150 to 150). 0=no change.
-150 <= x <= 150Contrast adjustment (-100 to 100). 0=no change.
-100 <= x <= 100Artwork opacity (0=fully transparent, 100=fully opaque). Default 100.
0 <= x <= 100Saturation adjustment (-100 to 100). 0=no change, -100=grayscale.
-100 <= x <= 100Vibrance adjustment (-100 to 100). Similar to saturation but preserves skin tones.
-100 <= x <= 100Gaussian blur amount (0=sharp, 100=max blur). Useful for background effects.
0 <= x <= 100RENDER MODE: still-render export configuration (the i2v input frame). Format/size/quality. Ignored in raw-image mode.
Hide child attributes
Hide child attributes
Output format: 'webp' (30-70% smaller, recommended), 'png' (lossless), 'jpg' (smallest, no transparency)
png, jpg, webp Output width in pixels (100-10000). Height auto-calculated from the source aspect ratio. Powers of 2 (1024, 2048, 4096) recommended for best quality. Renders on an account in trial are capped at 1024: a larger image_size is rejected with error_code OUTPUT_RESOLUTION_LIMIT (HTTP 402) and is never silently downscaled. Add a payment method to render at full width.
100 <= x <= 10000Compression quality for JPG/WebP (1-100). Ignored for PNG (always lossless). Default: 90.
1 <= x <= 100Resolution tag stamped into the output file metadata (JPG/WebP via Exif XResolution, PNG via pHYs), e.g. 300 for print. This is metadata only: it does NOT change the pixels. Pixel dimensions are controlled by image_size: set image_size = print_size_inches * dpi for a true print-ready file (e.g. 12 in * 300 = 3600 px). Range 72-2400. Default: null (opt-in). Omitting it does not leave the file untagged: the encoder writes a default ~25.4 DPI (1 px/mm) tag. All three formats carry the tag, but for maximum print-tool compatibility prefer jpg or png, because WebP stores resolution in Exif and not every viewer surfaces it.
72 <= x <= 2400300
{ "image_format": "webp", "image_size": 2048, "quality": 95 }
RAW-IMAGE MODE: a public https png/jpg URL to animate directly (general image-to-video, no render). Supply this OR (mockup_uuid + smart_objects), never both.
Animation options (duration, audio, motion, optional advanced_model override).
Hide child attributes
Hide child attributes
Clip length in seconds chosen by the customer. Must be one of the supported durations; the endpoint rejects an unsupported value with 400. The credit cost scales with this value.
1 <= x <= 15Generate sound with the clip. Default OFF (muted clips are cheaper). Audio increases the credit cost on models that charge an audio premium. Note: motion='showcase' always includes sound, so the endpoint treats it as audio=true and prices it accordingly.
'ambient' = subtle looping hero motion that keeps the print readable (muted unless audio=true); 'showcase' = one deliberate cinematic camera/product move, always with sound (priced as audio=true).
ambient, showcase Advanced override for the automatic quality selection. Unsupported values are rejected. null = automatic (recommended).
Optional completion webhook, e.g. {"url": "https://..."}. Best-effort push; poll (GET /api/v1/jobs/{job_id}) remains the source of truth.
Response
Successful Response
Was this page helpful?