Marketing
Video Editing
Edit a source video using product images and placement instructions.
POST
/
v3
/
agents
/
video-editing
Video Editing
curl --request POST \
--url https://api.darwin.so/api/v3/agents/video-editing \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"videoUrl": "https://media.example.com/source.mp4",
"productImages": [
"https://media.example.com/product.png"
],
"instructions": "Place the product on the table, keeping the original camera motion and lighting."
}
'import requests
url = "https://api.darwin.so/api/v3/agents/video-editing"
payload = {
"videoUrl": "https://media.example.com/source.mp4",
"productImages": ["https://media.example.com/product.png"],
"instructions": "Place the product on the table, keeping the original camera motion and lighting."
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
videoUrl: 'https://media.example.com/source.mp4',
productImages: ['https://media.example.com/product.png'],
instructions: 'Place the product on the table, keeping the original camera motion and lighting.'
})
};
fetch('https://api.darwin.so/api/v3/agents/video-editing', 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.darwin.so/api/v3/agents/video-editing",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'videoUrl' => 'https://media.example.com/source.mp4',
'productImages' => [
'https://media.example.com/product.png'
],
'instructions' => 'Place the product on the table, keeping the original camera motion and lighting.'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.darwin.so/api/v3/agents/video-editing"
payload := strings.NewReader("{\n \"videoUrl\": \"https://media.example.com/source.mp4\",\n \"productImages\": [\n \"https://media.example.com/product.png\"\n ],\n \"instructions\": \"Place the product on the table, keeping the original camera motion and lighting.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.darwin.so/api/v3/agents/video-editing")
.header("Idempotency-Key", "<idempotency-key>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"videoUrl\": \"https://media.example.com/source.mp4\",\n \"productImages\": [\n \"https://media.example.com/product.png\"\n ],\n \"instructions\": \"Place the product on the table, keeping the original camera motion and lighting.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.darwin.so/api/v3/agents/video-editing")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"videoUrl\": \"https://media.example.com/source.mp4\",\n \"productImages\": [\n \"https://media.example.com/product.png\"\n ],\n \"instructions\": \"Place the product on the table, keeping the original camera motion and lighting.\"\n}"
response = http.request(request)
puts response.read_body{
"video": {
"url": "<string>",
"durationSeconds": 44,
"mimeType": "video/mp4"
}
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}Use a Darwin API key with
tools:execute. Send the source video, one to three product images, and specific editing instructions. Source and output videos are limited to 45 seconds. Keep the same Idempotency-Key when retrying the exact request.
See the Video Editing guide for preparing assets and reviewing the result.Authorizations
apiKeyapiKeyBearer
Headers
Reuse the same key only for an identical request.
Required string length:
1 - 200Body
application/json
Source MP4 or MOV video, up to 45 seconds.
Maximum string length:
2048Describe the requested changes and what should stay consistent.
Required string length:
1 - 4000One to three JPG, PNG, or WebP images of the same product.
Required array length:
1 - 3 elementsMaximum string length:
2048Response
Generated video.
Show child attributes
Show child attributes
Last modified on October 19, 2026
⌘I
Video Editing
curl --request POST \
--url https://api.darwin.so/api/v3/agents/video-editing \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"videoUrl": "https://media.example.com/source.mp4",
"productImages": [
"https://media.example.com/product.png"
],
"instructions": "Place the product on the table, keeping the original camera motion and lighting."
}
'import requests
url = "https://api.darwin.so/api/v3/agents/video-editing"
payload = {
"videoUrl": "https://media.example.com/source.mp4",
"productImages": ["https://media.example.com/product.png"],
"instructions": "Place the product on the table, keeping the original camera motion and lighting."
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
videoUrl: 'https://media.example.com/source.mp4',
productImages: ['https://media.example.com/product.png'],
instructions: 'Place the product on the table, keeping the original camera motion and lighting.'
})
};
fetch('https://api.darwin.so/api/v3/agents/video-editing', 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.darwin.so/api/v3/agents/video-editing",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'videoUrl' => 'https://media.example.com/source.mp4',
'productImages' => [
'https://media.example.com/product.png'
],
'instructions' => 'Place the product on the table, keeping the original camera motion and lighting.'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.darwin.so/api/v3/agents/video-editing"
payload := strings.NewReader("{\n \"videoUrl\": \"https://media.example.com/source.mp4\",\n \"productImages\": [\n \"https://media.example.com/product.png\"\n ],\n \"instructions\": \"Place the product on the table, keeping the original camera motion and lighting.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.darwin.so/api/v3/agents/video-editing")
.header("Idempotency-Key", "<idempotency-key>")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"videoUrl\": \"https://media.example.com/source.mp4\",\n \"productImages\": [\n \"https://media.example.com/product.png\"\n ],\n \"instructions\": \"Place the product on the table, keeping the original camera motion and lighting.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.darwin.so/api/v3/agents/video-editing")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"videoUrl\": \"https://media.example.com/source.mp4\",\n \"productImages\": [\n \"https://media.example.com/product.png\"\n ],\n \"instructions\": \"Place the product on the table, keeping the original camera motion and lighting.\"\n}"
response = http.request(request)
puts response.read_body{
"video": {
"url": "<string>",
"durationSeconds": 44,
"mimeType": "video/mp4"
}
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}{
"code": "<string>",
"message": "<string>",
"supportEmail": "<string>"
}