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-reference-to-video",
"image_url": "https://example.com/reference.png",
"prompt": "a person walking through a neon-lit street at night, 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-reference-to-video",
"image_url": "https://example.com/reference.png",
"prompt": "a person walking through a neon-lit street at night, 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-reference-to-video",
image_url: "https://example.com/reference.png",
prompt: "a person walking through a neon-lit street at night, 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-reference-to-video",
"image_url": "https://example.com/reference.png",
"prompt": "a person walking through a neon-lit street at night, 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-reference-to-video",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_b4fcbb08"
}
{
"error": {
"message": "Invalid input. Provide at least one of prompt, image_url, or video_url.",
"type": "invalid_request_error",
"param": null,
"code": 400
}
}
Seedance Series
Seedance 2.5 Reference To Video
ByteDance’s latest video model for text-to-video, image-to-video, and reference-based editing and extending. Native audio, 4–30s durations, 480p/720p output.
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-reference-to-video",
"image_url": "https://example.com/reference.png",
"prompt": "a person walking through a neon-lit street at night, 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-reference-to-video",
"image_url": "https://example.com/reference.png",
"prompt": "a person walking through a neon-lit street at night, 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-reference-to-video",
image_url: "https://example.com/reference.png",
prompt: "a person walking through a neon-lit street at night, 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-reference-to-video",
"image_url": "https://example.com/reference.png",
"prompt": "a person walking through a neon-lit street at night, 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-reference-to-video",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_b4fcbb08"
}
{
"error": {
"message": "Invalid input. Provide at least one of prompt, image_url, or video_url.",
"type": "invalid_request_error",
"param": null,
"code": 400
}
}
Pricing: See vibetool.ai/pricing for current rates.
Input Modalities
- Text – a prompt describing the scene, motion, or edit you want
- Image – a still image used as a visual reference
- Video – an existing clip to extend or edit using the new prompt
Output Modality
- Video – an MP4 file with audio. Resolution is 480p or 720p; duration is 4–30 seconds depending on request and model limits.
Authorization
string
required
All APIs require Bearer Token authentication. Format:
Bearer YOUR_API_KEYRequest Body
string
required
The model identifier. Use
"seedance-2.5-reference-to-video".string
Text description of the video to generate, or the edit to apply to a reference image or video. Required when neither
image_url nor video_url is provided.string
A publicly accessible URL to a reference image (JPEG or PNG). Use this for image-to-video generation.
string
A publicly accessible URL to a reference video (MP4 or similar) for editing or extending existing footage.
number
Requested video duration in seconds, between 4 and 30. If omitted, the model chooses a duration within that range.
Provide at least one of
prompt, image_url, or video_url.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-reference-to-video".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-reference-to-video",
"image_url": "https://example.com/reference.png",
"prompt": "a person walking through a neon-lit street at night, 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-reference-to-video",
"image_url": "https://example.com/reference.png",
"prompt": "a person walking through a neon-lit street at night, 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-reference-to-video",
image_url: "https://example.com/reference.png",
prompt: "a person walking through a neon-lit street at night, 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-reference-to-video",
"image_url": "https://example.com/reference.png",
"prompt": "a person walking through a neon-lit street at night, 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-reference-to-video",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_b4fcbb08"
}
{
"error": {
"message": "Invalid input. Provide at least one of prompt, image_url, or video_url.",
"type": "invalid_request_error",
"param": null,
"code": 400
}
}
GET /v1/videos/status/{task_id} until status is completed, then use the returned video URL. The task_id from the response above is used in the URL path.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Use seedance-2.5-reference-to-video.
Available options:
seedance-2.5-reference-to-video Text description of the video to generate
Reference images
Maximum array length:
30Reference video clips
Maximum array length:
10Reference audio
Duration in seconds (4-30)
Required range:
4 <= x <= 30Output resolution tier
Available options:
480p, 720p Was this page helpful?