S
Panduan API Seedance 2.0

API Generasi Video Seedance 2.0

Akses model generasi video ByteDance Seedance 2.0 melalui API terpadu TokenHub. Mendukung text-to-video, image-to-video, pengeditan video, generasi berbasis audio, dan lainnya. Panduan ini memandu Anda melalui proses integrasi lengkap.

Text → VideoImage → VideoVideo → VideoAudio Reference480p / 720p / 1080p4–15 dtk

1Dapatkan API Key Anda

  1. Kunjungi tokenhub.store untuk membuat akun (masuk GitHub / Google didukung)
  2. Buka Dashboard → API Keys, klik "Create New Key"
  3. Buka Dashboard → Billing untuk menambahkan Credits (1 Credit = $1 USD)
  4. Salin API Key Anda (format: th-xxxxxxxxxxxx...
⚠️ API Key hanya ditampilkan sekali saat dibuat. Simpan dengan aman. Jika hilang, Anda harus membuat yang baru.

2Ringkasan API

Base URL

https://tokenhub.store/api/v1

Autentikasi

Semua request memerlukan API Key di header:

Header
Authorization: Bearer th-your-api-key

Dua Endpoint

POST
/videos/generations

Buat tugas pembuatan video, mengembalikan task ID

GET
/videos/generations/{task_id}

Periksa status task, mengembalikan URL video saat berhasil

3Model & Harga

ID ModelInputHargaDeskripsi
doubao-seedance-2.0Tanpa input video$6.970/1M (1080p $7.727)Flagship model, highest quality
Dengan input video$4.242/1M (1080p $4.697)Model unggulan dengan input video, hemat biaya.
doubao-seedance-2.0-fastTanpa input video$5.606/1MFast model, quicker generation
Dengan input video$3.333/1MOpsi paling terjangkau

Detail Billing:

  • Video output: ditagihkan per 1M token (jumlah token bergantung pada resolusi dan durasi)
  • Gambar input: gratis (tanpa biaya)
  • Video input: ditagihkan per 1M token pada tarif dengan input video
  • Total biaya = total token yang digunakan × tarif per token (lihat tabel di atas)

Contoh: doubao-seedance-2.0 tanpa input video (≤720p), menghasilkan video 5 detik dengan ~1M token → biaya ≈ $6.970

4Parameter Request

ParameterTipeWajibDeskripsi
modelstringWajibModel ID, mis. "doubao-seedance-2.0"
promptstringWajibTeks deskripsi video. Prompt bahasa Inggris umumnya menghasilkan hasil yang lebih baik
durationnumberOpsionalDurasi video (detik), rentang 4–15, default 5
resolutionstringOpsional"480p", "720p", atau "1080p" (default 720p; 1080p hanya untuk doubao-seedance-2.0)
aspect_ratiostringOpsionalRasio aspek: "adaptive" (default), "16:9", "9:16", "1:1", dll.
image_urlstringOpsionalURL gambar referensi (image-to-video)
image_urlsstring[]OpsionalArray berisi beberapa URL gambar referensi
video_urlstringOpsionalURL video referensi (video editing / video-to-video)
video_urlsstring[]OpsionalArray berisi beberapa URL video referensi (maks 3)
video_durationsnumber[]OpsionalArray durasi per video dalam detik, mis. [3, 5]
input_video_durationnumberOpsionalTotal durasi video input dalam detik (alternatif untuk video_durations)
audio_urlstringOpsionalURL audio referensi (musik latar / SFX)
audio_urlsstring[]OpsionalArray berisi beberapa URL audio referensi (maks 3)
generate_audiobooleanOpsionalApakah akan menghasilkan audio, default true
watermarkbooleanOpsionalApakah akan menambahkan watermark, default false
contentarrayOpsionalArray aset media. Setiap item: { type: "image_url", image_url: { url }, role }. Role yang didukung: first_frame (maks 1), last_frame (maks 1), reference_image, reference_video, reference_audio

5Batas Input

Anda dapat menggabungkan teks, gambar, video, dan audio sebagai input. Perhatikan batas berikut:

Gambar: 0–9 per permintaan
Video: 0–3 per permintaan, masing-masing 2–15s, durasi total ≤ 15s
Audio: 0–3 per permintaan, masing-masing 2–15s, durasi total ≤ 15s
❌ Input "Text + Audio only" dan "Pure Audio" TIDAK didukung

Format yang Didukung

  • Format gambar: JPEG, PNG, WebP, BMP, TIFF, GIF (maks 30MB masing-masing)
  • Format video: MP4, MOV (H.264/H.265, maks 50MB masing-masing)
  • Format audio: WAV, MP3 (maks 15MB masing-masing)
⚡ Tip: Hanya durasi video yang memengaruhi penagihan. Total biaya = (durasi video input + durasi video output) × rate. Gambar input gratis.

6Contoh API Lengkap

Penggunaan paling dasar — jelaskan sebuah adegan dalam teks untuk menghasilkan video.

bash
curl -X POST https://tokenhub.store/api/v1/videos/generations \
  -H "Authorization: Bearer th-your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "doubao-seedance-2.0",
    "prompt": "A golden retriever running on a sunny beach, waves crashing in the background, cinematic slow motion, 4K quality",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "watermark": false
  }'

Respons:

json
{
  "id": "xxxxxx-task-id",
  "object": "video.generation.task",
  "model": "doubao-seedance-2.0",
  "status": "queued",
  "created": 1719900000
}

Pembuatan video bersifat asinkron — lakukan polling status hingga selesai.

bash
# Poll task status using the task_id from creation response
curl https://tokenhub.store/api/v1/videos/generations/YOUR_TASK_ID \
  -H "Authorization: Bearer th-your-api-key"

Task sedang berlangsung:

json
{
  "id": "YOUR_TASK_ID",
  "object": "video.generation.task",
  "model": "doubao-seedance-2.0",
  "status": "running",
  "created": 1719900000
}

Task selesai (URL video diterima):

json
{
  "id": "YOUR_TASK_ID",
  "object": "video.generation.task",
  "model": "doubao-seedance-2.0",
  "status": "succeeded",
  "created": 1719900000,
  "data": [
    {
      "video_url": "https://tokenhub-data.tos-cn-hongkong.volces.com/user_sd_file/YOUR_TASK_ID.mp4",
      "cover_image_url": "https://tokenhub-data.tos-cn-hongkong.volces.com/user_sd_file/YOUR_TASK_ID_cover.jpg"
    }
  ],
  "usage": {
    "video_duration": 5
  }
}
💡 Interval polling yang direkomendasikan: setiap 3-5 detik. Nilai status: queued → waiting, running → generating, succeeded → done, failed → error

7Contoh Lengkap Python

python
import requests
import time

API_BASE = "https://tokenhub.store/api/v1"
API_KEY = "th-your-api-key"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# Step 1: Create video generation task
payload = {
    "model": "doubao-seedance-2.0",
    "prompt": "A majestic eagle soaring over snow-capped mountains, golden hour lighting, cinematic aerial shot",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "watermark": False
}

resp = requests.post(f"{API_BASE}/videos/generations", json=payload, headers=headers)
task = resp.json()
task_id = task["id"]
print(f"Task created: {task_id}, status: {task['status']}")

# Step 2: Poll for result
while True:
    resp = requests.get(f"{API_BASE}/videos/generations/{task_id}", headers=headers)
    result = resp.json()
    status = result["status"]
    print(f"Status: {status}")

    if status == "succeeded":
        video_url = result["data"][0]["video_url"]
        duration = result["usage"]["video_duration"]
        print(f"Video ready! Duration: {duration}s")
        print(f"URL: {video_url}")
        break
    elif status == "failed":
        print(f"Failed: {result.get('error', {}).get('message', 'Unknown error')}")
        break

    time.sleep(5)

8Contoh Lengkap JavaScript / Node.js

javascript
const API_BASE = "https://tokenhub.store/api/v1";
const API_KEY = "th-your-api-key";

const headers = {
  "Authorization": `Bearer ${API_KEY}`,
  "Content-Type": "application/json"
};

// Step 1: Create task
const createResp = await fetch(`${API_BASE}/videos/generations`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    model: "doubao-seedance-2.0",
    prompt: "A majestic eagle soaring over snow-capped mountains, cinematic aerial shot",
    duration: 5,
    resolution: "720p",
    aspect_ratio: "16:9",
    watermark: false,
  }),
});
const task = await createResp.json();
console.log("Task created:", task.id);

// Step 2: Poll for result
const poll = async () => {
  while (true) {
    const resp = await fetch(`${API_BASE}/videos/generations/${task.id}`, { headers });
    const result = await resp.json();
    console.log("Status:", result.status);

    if (result.status === "succeeded") {
      console.log("Video URL:", result.data[0].video_url);
      console.log("Duration:", result.usage.video_duration, "seconds");
      return result;
    }
    if (result.status === "failed") {
      console.error("Failed:", result.error?.message);
      return result;
    }
    await new Promise(r => setTimeout(r, 5000));
  }
};

await poll();

9Contoh Python Image-to-Video

python
import requests, time

API_BASE = "https://tokenhub.store/api/v1"
headers = {
    "Authorization": "Bearer th-your-api-key",
    "Content-Type": "application/json"
}

# Image-to-Video with a single reference image
payload = {
    "model": "doubao-seedance-2.0",
    "prompt": "The woman in the photo turns to face the camera and smiles warmly, her hair gently blowing in the wind",
    "duration": 5,
    "resolution": "720p",
    "image_url": "https://your-bucket.com/portrait.jpg",
    "watermark": False
}

resp = requests.post(f"{API_BASE}/videos/generations", json=payload, headers=headers)
task_id = resp.json()["id"]
print(f"Task: {task_id}")

# Poll for result
while True:
    r = requests.get(f"{API_BASE}/videos/generations/{task_id}", headers=headers).json()
    if r["status"] == "succeeded":
        print(f"Done: {r['data'][0]['video_url']}")
        break
    elif r["status"] == "failed":
        print(f"Error: {r.get('error', {}).get('message')}")
        break
    time.sleep(5)

10Gambar orang nyata ke Video

Saat gambar input Anda berisi orang nyata, TokenHub secara otomatis mengarahkan request ke upstream yang mendukung pembuatan orang nyata. Tidak perlu perubahan pada client.

Dipicu otomatis saat filter konten upstream mendeteksi orang nyata pada gambar input.

Struktur request identik dengan image-to-video biasa — body POST /v1/videos/generations yang sama.

Dua bentuk response yang mungkin

  • Normal: { "id": "cgt-...", "status": "queued" } (perilaku yang sudah ada)
  • Jalur orang nyata: { "id": "pat-...", "status": "queued" } — pemrosesan aset tambahan, harapkan latensi tambahan 10-90 detik

Polling GET sama — panggil /v1/videos/generations/{id} dengan id apa pun yang dikembalikan POST, hingga status menjadi succeeded atau failed. Penulisan ulang id ditangani di sisi server; Anda selalu melihat id yang sama selama request berlangsung.

Error: unsupported_real_person_input

Dikembalikan dengan status 400 saat tidak ada provider yang mendukung orang nyata yang dikonfigurasi untuk akun Anda. Hubungi administrator Anda untuk mengaktifkan provider yang didukung.

Error: Pemrosesan aset habis waktu

Dikembalikan melalui GET dengan status: failed saat persiapan aset upstream melebihi 5 menit. Aman untuk mencoba ulang request.

Contoh siklus hidup lengkap

pat-id bersifat opak bagi client Anda — terus polling sampai status berubah.

bash
# POST
curl -X POST https://tokenhub.store/api/v1/videos/generations \
  -H "Authorization: Bearer $TH_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "doubao-seedance-2.0",
    "prompt": "let her dance and spin",
    "duration": 8,
    "resolution": "480p",
    "content": [
      { "type": "image_url", "image_url": { "url": "https://example.com/portrait.png" }, "role": "first_frame" }
    ]
  }'
# → {"id":"pat-abc123","status":"queued"}

# GET (asset still uploading)
curl https://tokenhub.store/api/v1/videos/generations/pat-abc123 -H "Authorization: Bearer $TH_KEY"
# → {"id":"pat-abc123","status":"queued"}

# GET (upstream task running)
# → {"id":"pat-abc123","status":"running"}

# GET (complete — id stays pat-, video_url in data)
# → {"id":"pat-abc123","status":"succeeded","data":[{"video_url":"..."}]}

11Tips Prompt

Struktur Dasar

Format yang direkomendasikan: [Subject] + [Action] + [Environment/Background] + [Camera/Style]

Contoh Prompt yang Baik

  • "A young woman walking through a cherry blossom garden, petals falling in slow motion, soft natural lighting, cinematic 35mm film look"
  • "Close-up of hands pouring latte art into a ceramic cup, steam rising, warm cafe ambiance, shallow depth of field"
  • "Aerial drone shot of a winding river through autumn forest, golden and red leaves, morning mist, 4K cinematic"

Tips untuk Gambar/Video Referensi

  • Gunakan "image 1", "image 2", "video 1", "audio 1" dalam prompt untuk merujuk aset Anda
  • Tentukan konten adegan per segmen waktu (mis. "0-2s: xxx, 2-4s: xxx")
  • Tentukan frame awal/akhir (mis. "first frame adalah image 1", "end frame berhenti pada image 2")
  • Tentukan sumber komposisi kamera (mis. "gunakan POV video 1 sepanjang waktu")
  • Tentukan penggunaan audio (mis. "gunakan audio 1 sebagai musik latar sepanjang waktu")

Tips

  • Prompt dalam bahasa Inggris umumnya menghasilkan hasil yang lebih baik; bahasa Mandarin juga didukung
  • Deskripsi yang lebih spesifik dan hidup menghasilkan hasil yang lebih baik
  • Hindari deskripsi yang terlalu abstrak (mis. "a nice video")
  • Istilah kamera sangat meningkatkan kualitas (slow motion, close-up, aerial shot, tracking shot...)

12FAQ

Siap Memulai?

Daftar ke TokenHub dan mulai gunakan Seedance 2.0 Video Generation API sekarang

© 2026 TokenHub · Powered by ByteDance Seedance 2.0 · support@tokenhub.store