curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-video-edit",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the clip by three seconds and add a slow camera push-in",
"duration": 6
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "seedance-2.5-video-edit",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the clip by three seconds and add a slow camera push-in",
"duration": 6
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "seedance-2.5-video-edit",
video_url: "https://example.com/input.mp4",
prompt: "extend the clip by three seconds and add a slow camera push-in",
duration: 6
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "seedance-2.5-video-edit",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the clip by three seconds and add a slow camera push-in",
"duration": 6,
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_def456",
"object": "video.generation",
"model": "seedance-2.5-video-edit",
"created_at": 1767158826,
"status": "pending",
"task_id": "vid_202601021530_a1c2d3e4"
}
{
"error": {
"message": "Invalid video URL or unsupported video format.",
"type": "invalid_request_error",
"param": "video_url",
"code": 400
}
}
Seedance Series
Seedance 2.5 Video Edit
ByteDance’s latest video model for generating, editing and extending 4–30s footage from text and video references, with native audio and per-second billing.
POST
/
v1
/
videos
/
generations
curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-video-edit",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the clip by three seconds and add a slow camera push-in",
"duration": 6
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "seedance-2.5-video-edit",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the clip by three seconds and add a slow camera push-in",
"duration": 6
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "seedance-2.5-video-edit",
video_url: "https://example.com/input.mp4",
prompt: "extend the clip by three seconds and add a slow camera push-in",
duration: 6
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "seedance-2.5-video-edit",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the clip by three seconds and add a slow camera push-in",
"duration": 6,
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_def456",
"object": "video.generation",
"model": "seedance-2.5-video-edit",
"created_at": 1767158826,
"status": "pending",
"task_id": "vid_202601021530_a1c2d3e4"
}
{
"error": {
"message": "Invalid video URL or unsupported video format.",
"type": "invalid_request_error",
"param": "video_url",
"code": 400
}
}
Pricing: See vibetool.ai/pricing for current rates.
Input Modalities
- Text — a prompt describing the desired edit, motion, or scene
- Video — an existing clip to edit or extend (optional; omit it for pure text‑driven generation)
Output Modality
- Video — an MP4 file at 480p or 720p, 4–30 seconds, with native audio
Authorization
string
required
All APIs require Bearer Token authentication. Format:
Bearer YOUR_API_KEYRequest Body
string
required
The model identifier. Use
"seedance-2.5-video-edit".string
A publicly accessible URL to an MP4 clip to edit or extend. When provided, the model uses the footage as its visual reference and applies the requested changes. Omit it to generate video from the text prompt alone.
string
Text description of the desired edit or generated content (e.g., “extend the clip, keep the subject’s motion, and soften the lighting”).
number
Requested video duration in seconds (defaults to 4, maximum 30). The model may adjust to match its capabilities.
Response Schema
string
required
Unique identifier for the generation task.
string
required
Type of object, always
"video.generation".string
required
The model used, e.g.,
"seedance-2.5-video-edit".integer
required
Unix timestamp (seconds) of task creation.
string
required
Initial status:
"pending" or "processing". Use the Get Video Status endpoint to poll for completion.string
required
The task ID to query in the status endpoint.
curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-video-edit",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the clip by three seconds and add a slow camera push-in",
"duration": 6
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "seedance-2.5-video-edit",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the clip by three seconds and add a slow camera push-in",
"duration": 6
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "seedance-2.5-video-edit",
video_url: "https://example.com/input.mp4",
prompt: "extend the clip by three seconds and add a slow camera push-in",
duration: 6
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "seedance-2.5-video-edit",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the clip by three seconds and add a slow camera push-in",
"duration": 6,
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_def456",
"object": "video.generation",
"model": "seedance-2.5-video-edit",
"created_at": 1767158826,
"status": "pending",
"task_id": "vid_202601021530_a1c2d3e4"
}
{
"error": {
"message": "Invalid video URL or unsupported video format.",
"type": "invalid_request_error",
"param": "video_url",
"code": 400
}
}
GET /v1/videos/status/{task_id}) until status is completed, then read the generated video URL from the response.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Use seedance-2.5-video-edit.
Available options:
seedance-2.5-video-edit The video to edit (output length follows the input)
Maximum array length:
1Text description of the video to generate
Output resolution tier
Available options:
480p, 720p Was this page helpful?