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-extend",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the shot as the wave continues to crash and recedes, cinematic lighting",
"duration": 8
}'
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-extend",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the shot as the wave continues to crash and recedes, cinematic lighting",
"duration": 8
}
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-extend",
video_url: "https://example.com/input.mp4",
prompt: "extend the shot as the wave continues to crash and recedes, cinematic lighting",
duration: 8
})
});
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-extend",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the shot as the wave continues to crash and recedes, cinematic lighting",
"duration": 8,
}
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_abc123",
"object": "video.generation",
"model": "seedance-2.5-video-extend",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_b4fcbb08"
}
{
"error": {
"message": "Invalid video URL or unsupported video format.",
"type": "invalid_request_error",
"param": "video_url",
"code": 400
}
}
Seedance Series
Seedance 2.5 Video Extend
ByteDance’s latest video model for generating 480p/720p video from text prompts and existing footage, with native audio, 4–30s durations, and per-second billing. Available globally.
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-extend",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the shot as the wave continues to crash and recedes, cinematic lighting",
"duration": 8
}'
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-extend",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the shot as the wave continues to crash and recedes, cinematic lighting",
"duration": 8
}
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-extend",
video_url: "https://example.com/input.mp4",
prompt: "extend the shot as the wave continues to crash and recedes, cinematic lighting",
duration: 8
})
});
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-extend",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the shot as the wave continues to crash and recedes, cinematic lighting",
"duration": 8,
}
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_abc123",
"object": "video.generation",
"model": "seedance-2.5-video-extend",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_b4fcbb08"
}
{
"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 content or how the existing footage should be extended
- Video – existing footage to extend or edit
Output Modality
- Video – an MP4 file with native audio (duration within 4–30 seconds)
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-extend".string
required
A publicly accessible URL to the input footage (MP4 or another supported video format) to extend or edit.
string
Optional text description of the desired video content or extension (e.g., “extend the shot as the wave continues to crash and recedes, cinematic 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-extend".integer
required
Unix timestamp (seconds) of task creation.
string
required
Initial status:
"pending" or "processing". Poll GET /v1/videos/status/{task_id} until status is "completed".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-extend",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the shot as the wave continues to crash and recedes, cinematic lighting",
"duration": 8
}'
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-extend",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the shot as the wave continues to crash and recedes, cinematic lighting",
"duration": 8
}
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-extend",
video_url: "https://example.com/input.mp4",
prompt: "extend the shot as the wave continues to crash and recedes, cinematic lighting",
duration: 8
})
});
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-extend",
"video_url": "https://example.com/input.mp4",
"prompt": "extend the shot as the wave continues to crash and recedes, cinematic lighting",
"duration": 8,
}
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_abc123",
"object": "video.generation",
"model": "seedance-2.5-video-extend",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_b4fcbb08"
}
{
"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 retrieve the generated video URL.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Use seedance-2.5-video-extend.
Available options:
seedance-2.5-video-extend The video to extend
Maximum array length:
1Text description of the video to generate
Duration in seconds (4-30)
Required range:
4 <= x <= 30Output resolution tier
Available options:
480p, 720p Was this page helpful?