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.0-image-to-video",
"image": "https://example.com/input.jpg",
"prompt": "A serene lake at sunset with ripples"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "seedance-2.0-image-to-video",
"image": "https://example.com/input.jpg",
"prompt": "A serene lake at sunset with ripples"
}
r = requests.post(url, headers=headers, json=payload, timeout=30)
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.0-image-to-video',
image: 'https://example.com/input.jpg',
prompt: 'A serene lake at sunset with ripples'
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
url := "https://api.vibetool.ai/v1/videos/generations"
payload := map[string]interface{}{
"model": "seedance-2.0-image-to-video",
"image": "https://example.com/input.jpg",
"prompt": "A serene lake at sunset with ripples",
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"task_id": "vid_202512261557_b4fcbb08",
"status": "pending",
"created_at": 1767072426
}
{
"error": {
"message": "Invalid API Key provided",
"type": "authentication_error",
"param": null,
"code": 401
}
}
Seedance Series
Seedance 2.0 Image To Video
Generate a video from an input image and text prompt using ByteDance’s Seedance 2.0 model. Supports real human video generation.
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.0-image-to-video",
"image": "https://example.com/input.jpg",
"prompt": "A serene lake at sunset with ripples"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "seedance-2.0-image-to-video",
"image": "https://example.com/input.jpg",
"prompt": "A serene lake at sunset with ripples"
}
r = requests.post(url, headers=headers, json=payload, timeout=30)
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.0-image-to-video',
image: 'https://example.com/input.jpg',
prompt: 'A serene lake at sunset with ripples'
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
url := "https://api.vibetool.ai/v1/videos/generations"
payload := map[string]interface{}{
"model": "seedance-2.0-image-to-video",
"image": "https://example.com/input.jpg",
"prompt": "A serene lake at sunset with ripples",
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"task_id": "vid_202512261557_b4fcbb08",
"status": "pending",
"created_at": 1767072426
}
{
"error": {
"message": "Invalid API Key provided",
"type": "authentication_error",
"param": null,
"code": 401
}
}
Pricing: See vibetool.ai/pricing for current rates.
Seedance 2.0 produces videos asynchronously. The creation endpoint returns a
task_id. Use the Get Video Result endpoint to poll for completion.Authorization
string
required
All API requests require Bearer Token authentication. Provide your key as
Bearer YOUR_API_KEY.Request Body
string
required
The model ID. Always use
"seedance-2.0-image-to-video".string
required
The input image URL or a base64-encoded data URI. Must be in JPEG or PNG format.
string
required
A text description of the desired video content. Maximum 1000 characters.
string
Text describing what to avoid in the generated video.
number
Desired video duration in seconds. Supported range depends on the plan. Defaults to 4 seconds if not specified.
boolean
Whether to apply enhancement post-processing. Defaults to
false.Response Body
string
required
Unique identifier for the generation task. Use this to poll for results.
enum<string>
required
Initial task status. Always
Possible values:
"pending" immediately after creation.Possible values:
pending, processing, completed, failed.integer | string
required
Unix timestamp (seconds) when the task was created.
Request Examples
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.0-image-to-video",
"image": "https://example.com/input.jpg",
"prompt": "A serene lake at sunset with ripples"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "seedance-2.0-image-to-video",
"image": "https://example.com/input.jpg",
"prompt": "A serene lake at sunset with ripples"
}
r = requests.post(url, headers=headers, json=payload, timeout=30)
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.0-image-to-video',
image: 'https://example.com/input.jpg',
prompt: 'A serene lake at sunset with ripples'
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
url := "https://api.vibetool.ai/v1/videos/generations"
payload := map[string]interface{}{
"model": "seedance-2.0-image-to-video",
"image": "https://example.com/input.jpg",
"prompt": "A serene lake at sunset with ripples",
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
Response Examples
{
"task_id": "vid_202512261557_b4fcbb08",
"status": "pending",
"created_at": 1767072426
}
{
"error": {
"message": "Invalid API Key provided",
"type": "authentication_error",
"param": null,
"code": 401
}
}
Get Video Result
Once a task is created, poll its status with:GET https://api.vibetool.ai/v1/videos/status/{task_id}
The response includes progress, video_url (when completed), and error (on failure). See the Get Video Result reference for full details.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Use seedance-2.0-image-to-video.
Available options:
seedance-2.0-image-to-video Input image used as the starting frame
Text description of the video to generate
Content to avoid in the generated video
Duration in seconds
Enable prompt enhancement
Was this page helpful?