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-fast-text-to-video",
"prompt": "A serene sunset over the ocean with waves crashing gently",
"duration": 4,
"size": "1920x1080"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"model": "seedance-2.0-fast-text-to-video",
"prompt": "A serene sunset over the ocean with waves crashing gently",
"duration": 4,
"size": "1920x1080"
}
r = requests.post(url, headers=headers, json=data, 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-fast-text-to-video",
prompt: "A serene sunset over the ocean with waves crashing gently",
duration: 4,
size: "1920x1080"
})
});
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-fast-text-to-video",
"prompt": "A serene sunset over the ocean with waves crashing gently",
"duration": 4,
"size": "1920x1080",
}
jsonPayload, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonPayload))
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": "vid_202512261557_b4fcbb08",
"object": "video.generate",
"model": "seedance-2.0-fast-text-to-video",
"created": 1767072426,
"task_id": "vid_202512261557_b4fcbb08",
"status": "pending"
}
{
"error": {
"message": "The prompt field is required",
"type": "invalid_request_error",
"param": "prompt",
"code": 400
}
}
{
"error": {
"message": "Invalid API Key provided",
"type": "authentication_error",
"param": null,
"code": 401
}
}
Seedance Series
Seedance 2.0 Fast Text To Video
ByteDance’s second-generation text-to-video model with full real human video support. Generate videos from text prompts via Vibetool’s asynchronous API.
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-fast-text-to-video",
"prompt": "A serene sunset over the ocean with waves crashing gently",
"duration": 4,
"size": "1920x1080"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"model": "seedance-2.0-fast-text-to-video",
"prompt": "A serene sunset over the ocean with waves crashing gently",
"duration": 4,
"size": "1920x1080"
}
r = requests.post(url, headers=headers, json=data, 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-fast-text-to-video",
prompt: "A serene sunset over the ocean with waves crashing gently",
duration: 4,
size: "1920x1080"
})
});
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-fast-text-to-video",
"prompt": "A serene sunset over the ocean with waves crashing gently",
"duration": 4,
"size": "1920x1080",
}
jsonPayload, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonPayload))
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": "vid_202512261557_b4fcbb08",
"object": "video.generate",
"model": "seedance-2.0-fast-text-to-video",
"created": 1767072426,
"task_id": "vid_202512261557_b4fcbb08",
"status": "pending"
}
{
"error": {
"message": "The prompt field is required",
"type": "invalid_request_error",
"param": "prompt",
"code": 400
}
}
{
"error": {
"message": "Invalid API Key provided",
"type": "authentication_error",
"param": null,
"code": 401
}
}
Pricing: See vibetool.ai/pricing for current rates.Video generation is asynchronous. After submitting a prompt, you’ll receive a
task_id to poll for the result.About
Seedance 2.0 is ByteDance’s second-generation video model for multimodal video generation, now with full real human video support. Available globally with per-second billing and accessible through Vibetool’s OpenAI-compatible API.- Input: Text prompt
- Output: Video (MP4)
- Max resolution: 1080p (depending on parameters)
Endpoint
POST https://api.vibetool.ai/v1/videos/generations
Authorization
string
required
All APIs require Bearer Token authentication. Format:
Bearer YOUR_API_KEYRequest Body
string
required
Model identifier. Use
seedance-2.0-fast-text-to-video.string
required
Text description of the video to generate. Maximum 2048 characters.
string
A description of what to avoid in the generated video. Optional, up to 1024 characters.
integer
default:"4"
Video duration in seconds. Supported values:
2, 4, or 8.string
default:"1920x1080"
Output resolution. Supported:
1920x1080, 1080x1920, 1024x1024, 720x720.integer
Optional seed for deterministic generation. If provided, same seed + prompt yields the same video.
Response Schema (Creation)
string
required
Unique task ID. Use this to poll for the result (format:
vid_...).string
required
Always
video.generate.string
required
The model used,
seedance-2.0-fast-text-to-video.integer
required
Unix timestamp (seconds) of task creation.
string
required
Alias for
id. Same value.string
required
Initial status:
pending.Polling for Results
After receiving the task ID, poll the Get Video Result endpoint with:GET https://api.vibetool.ai/v1/videos/status/{task_id}
video_url field when status is completed.
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-fast-text-to-video",
"prompt": "A serene sunset over the ocean with waves crashing gently",
"duration": 4,
"size": "1920x1080"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"model": "seedance-2.0-fast-text-to-video",
"prompt": "A serene sunset over the ocean with waves crashing gently",
"duration": 4,
"size": "1920x1080"
}
r = requests.post(url, headers=headers, json=data, 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-fast-text-to-video",
prompt: "A serene sunset over the ocean with waves crashing gently",
duration: 4,
size: "1920x1080"
})
});
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-fast-text-to-video",
"prompt": "A serene sunset over the ocean with waves crashing gently",
"duration": 4,
"size": "1920x1080",
}
jsonPayload, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonPayload))
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": "vid_202512261557_b4fcbb08",
"object": "video.generate",
"model": "seedance-2.0-fast-text-to-video",
"created": 1767072426,
"task_id": "vid_202512261557_b4fcbb08",
"status": "pending"
}
{
"error": {
"message": "The prompt field is required",
"type": "invalid_request_error",
"param": "prompt",
"code": 400
}
}
{
"error": {
"message": "Invalid API Key provided",
"type": "authentication_error",
"param": null,
"code": 401
}
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Use seedance-2.0-fast-text-to-video.
Available options:
seedance-2.0-fast-text-to-video Text description of the video to generate
Content to avoid in the generated video
Duration in seconds
Output resolution
Random seed for reproducibility
Was this page helpful?