Seedance 2.0 API
Bangun pembuatan video ke dalam produk Anda dengan pembuatan tugas asinkron, polling status, webhook, dan penagihan yang sadar kredit.
https://api.seedance2.aiDi halaman ini
Pendahuluan
API memungkinkan Anda mengirimkan tugas pembuatan video Seedance 2.0 secara terprogram. Pembuatan bersifat asinkron: buat tugas, segera terima ID tugas, lalu dapatkan video yang selesai dengan polling endpoint tugas atau dengan menerima webhook.
Tugas asinkron
Polling bekerja dengan baik untuk pengembangan dan integrasi sederhana.
Siap webhook
Webhook direkomendasikan untuk produksi karena menghindari polling agresif dan memberi tahu layanan Anda saat tugas mencapai status terminal.
Sadar kredit
Kredit dicadangkan saat pengiriman. Tugas yang berhasil akan dibebankan dari cadangan tersebut; tugas yang gagal atau kehabisan waktu akan dikembalikan secara otomatis.
Autentikasi
Buat kunci API di dasbor dan kirimkan sebagai token Bearer pada setiap permintaan. Kunci lengkap hanya ditampilkan sekali pada saat pembuatan.
Authorization: Bearer sk_live_xxxxxxxxGunakan kunci sk_live_ untuk lalu lintas produksi.
Gunakan kunci sk_test_ untuk pengujian integrasi sandbox dengan kontrak API yang sama.
Kunci yang hilang, tidak valid, atau dicabut mengembalikan invalid_api_key dengan HTTP 401.
Mulai Cepat
Kirim tugas terlebih dahulu. Setelah tugas diterima, pilih salah satu metode pengiriman hasil: polling endpoint tugas, atau terima hasil akhir melalui webhook.
Buat tugas video asinkron dan segera terima ID tugas.
curl https://api.seedance2.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-0",
"callback_url": "https://your-domain.com/api/seedance/webhook",
"input": {
"prompt": "a cat surfing on a neon wave, cinematic lighting",
"generation_type": "text-to-video",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false,
"seed": -1
}
}'Ambil endpoint status tugas ketika integrasi Anda lebih memilih polling eksplisit.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Lewati callback_url saat mengirimkan tugas, lalu terima callback penyelesaian atau kegagalan dan perbarui catatan tugas Anda sendiri.
export async function POST(request: Request) {
const callbackData = await request.json();
if (callbackData.status === "completed") {
const videoUrl = callbackData.data.results[0];
// Save the video URL or update your own task record here.
}
if (callbackData.status === "failed") {
const errorMessage = callbackData.data.failed_reason;
// Mark your own task record as failed here.
}
return new Response(null, { status: 200 });
}Buat tugas video
Buat tugas video dengan POST /v1/videos/generations. Badan permintaan memiliki model tingkat atas, callback_url opsional, dan objek input yang berisi pengaturan prompt dan pembuatan.
/v1/videos/generationscurl https://api.seedance2.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-0",
"callback_url": "https://your-domain.com/api/seedance/webhook",
"input": {
"prompt": "a cat surfing on a neon wave, cinematic lighting",
"generation_type": "text-to-video",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false,
"seed": -1
}
}'Mode pembuatan
generation_type mengontrol input media mana yang diterima dan bagaimana model menginterpretasikannya.
| Mode | Media yang diperlukan | Media opsional | Catatan |
|---|---|---|---|
text-to-video | prompt | duration, aspect_ratio, resolution, seed | Hanya prompt teks. image_urls, video_urls, dan audio_urls tidak diperlukan. |
image-to-video | prompt + array image_urls (1-2 URL gambar) | duration, aspect_ratio, resolution, seed | image_urls harus berupa array. Sediakan 1 URL gambar untuk bingkai pertama, atau 2 URL gambar untuk bingkai pertama dan terakhir. Video dan audio diabaikan. |
reference-to-video | prompt + setidaknya satu gambar atau video | gambar, video, dan audio dalam batas material | Audio tidak dapat digunakan sendiri dengan teks. Tambahkan setidaknya satu gambar atau video saat audio disediakan. |
text-to-videoGunakan text-to-video saat prompt adalah satu-satunya input kreatif.
curl https://api.seedance2.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-0",
"callback_url": "https://your-domain.com/api/seedance/webhook",
"input": {
"prompt": "a cinematic drone shot over a futuristic coastal city at sunrise",
"generation_type": "text-to-video",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false,
"seed": -1
}
}'image-to-videoGunakan image-to-video saat input.image_urls adalah array dengan 1-2 URL gambar: satu URL mengatur bingkai pertama, dan dua URL mengatur bingkai pertama dan terakhir. Referensi video dan audio diabaikan dalam mode ini.
curl https://api.seedance2.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-0",
"input": {
"prompt": "the subject turns toward camera, soft studio motion",
"generation_type": "image-to-video",
"image_urls": ["https://your.cdn.com/first-frame.jpg"],
"duration": 5,
"resolution": "720p"
}
}'reference-to-videoGunakan reference-to-video untuk arah yang lebih kaya dengan gambar, video, dan audio referensi. Audio tidak dapat digunakan sendiri dengan teks; sertakan setidaknya satu gambar atau video saat audio disediakan.
Batas material
- Hingga 9 gambar referensi
- Hingga 3 video referensi, total durasi <= 15 detik
- Hingga 3 audio referensi, total durasi <= 15 detik
- Maksimal 12 material secara total di semua jenis
Kombinasi input yang didukung
curl https://api.seedance2.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-0",
"input": {
"prompt": "use the product from image 1 and the camera motion from the reference video",
"generation_type": "reference-to-video",
"image_urls": ["https://your.cdn.com/product.jpg"],
"video_urls": ["https://your.cdn.com/camera-motion.mp4"],
"audio_urls": [],
"duration": 8,
"resolution": "1080p"
}
}'Parameter permintaan
Nama parameter, nilai enum, jalur endpoint, dan contoh adalah bagian dari kontrak API. Deskripsi di bawah ini menjelaskan bagaimana setiap bidang berperilaku.
Header
| Header | Wajib | Deskripsi | Contoh |
|---|---|---|---|
Authorization | Ya | Kunci API Bearer yang digunakan untuk mengautentikasi permintaan. | Bearer sk_live_xxx |
Content-Type | Ya | Semua permintaan tulis menggunakan JSON. | application/json |
Bidang tingkat atas
| Bidang | Tipe | Wajib | Default | Rentang / Enum | Mode | Contoh |
|---|---|---|---|---|---|---|
modelVarian model yang digunakan untuk pembuatan. | string | Ya | - | seedance-2-0 | seedance-2-0-fast | semua | seedance-2-0 |
callback_urlEndpoint HTTPS yang menerima callback penyelesaian dan kegagalan tugas. | string | Tidak | - | URL HTTPS, tanpa jaringan pribadi | semua | https://your-domain.com/hook |
inputPengaturan pembuatan dan referensi media. | object | Ya | - | - | semua | - |
input.* bidang
| Bidang | Tipe | Wajib | Default | Rentang / Enum | Mode | Contoh |
|---|---|---|---|---|---|---|
input.promptPrompt teks yang menjelaskan video yang akan dibuat. | string | Ya | - | teks tidak kosong | semua | a cat surfing |
input.generation_typeMode pembuatan. Default ke text-to-video. | string | Tidak | text-to-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsURL gambar yang dapat diakses publik. Untuk image-to-video, kirim 1 gambar untuk bingkai pertama atau 2 gambar untuk bingkai pertama dan terakhir. Untuk reference-to-video, kirim hingga 9 gambar sebagai referensi visual. | string[] | Kondisional | [] | Image-to-video: 1 atau 2 gambar. Reference-to-video: hingga 9 gambar. (image-to-video) (reference-to-video) | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsVideo referensi yang dapat diakses publik hanya untuk reference-to-video. Anda dapat mengirim hingga 3 file video, dan total waktu putarnya harus 15 detik atau kurang. | string[] | Tidak | [] | Hingga 3 video. Total durasi video harus 15 detik atau kurang. | reference-to-video | [] |
input.audio_urlsFile audio referensi yang dapat diakses publik hanya untuk reference-to-video. Anda dapat mengirim hingga 3 file audio, dan total waktu putarnya harus 15 detik atau kurang. | string[] | Tidak | [] | Hingga 3 file audio. Total durasi audio harus 15 detik atau kurang. | reference-to-video | [] |
input.durationDurasi video output dalam detik. | int | Tidak | 5 | 4-15 detik | semua | 5 |
input.aspect_ratioRasio aspek output. adaptif memungkinkan layanan menyimpulkan rasio terbaik. | string | Tidak | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptif | semua | 16:9 |
input.resolutionTingkatan resolusi output. | string | Tidak | 720p | 480p | 720p | 1080p | semua | 720p |
input.generate_audioApakah model harus menghasilkan audio jika didukung. | boolean | Tidak | true | true | false | semua | true |
input.watermarkApakah akan menambahkan tanda air. | boolean | Tidak | false | true | false | semua | false |
input.web_searchApakah akan mengizinkan augmentasi pencarian web jika didukung. | boolean | Tidak | false | true | false | semua | false |
input.return_last_frameApakah akan mengembalikan URL bingkai terakhir jika tersedia. | boolean | Tidak | false | true | false | semua | false |
input.seedSeed deterministik. Gunakan -1 untuk seed acak. | int | Tidak | -1 | -1 atau 0-4294967295 | semua | -1 |
Kredit bervariasi berdasarkan resolusi, durasi, model, dan apakah reference-to-video menyertakan referensi video. Nilai kredit yang dikembalikan oleh respons pembuatan adalah jumlah sebenarnya yang dicadangkan untuk tugas tersebut.
Lihat harga kreditRespons
Ini adalah respons berhasil dari POST /v1/videos/generations. Ini berarti tugas telah diterima dan kredit telah dicadangkan. Gunakan taskId yang dikembalikan untuk polling GET /v1/tasks/:id atau untuk mencocokkan callback penyelesaian atau kegagalan.
POST /v1/videos/generations respons berhasil
{
"taskId": "3f2aK9mR...",
"credits": 60
}Dapatkan status tugas
Gunakan GET /v1/tasks/:id untuk mengambil status tugas saat ini. Polling tidak lebih dari sekali setiap 10 detik. Untuk sistem produksi, lebih pilih webhook.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Respons tugas yang selesai
{
"id": "3f2aK9mR...",
"status": "completed",
"created_at": 1781234567,
"model": "seedance-2-0",
"billing_status": "charged",
"credits": 60,
"failed_reason": null,
"data": {
"results": ["https://cdn.seedance2.ai/.../x.mp4"],
"video_expires_at": "2026-06-13T10:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Respons tugas yang gagal
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-0",
"billing_status": "refunded",
"credits": 60,
"failed_reason": "provider_failed"
}| Nilai | Arti |
|---|---|
status=queued | Diterima dan menunggu untuk dikirimkan atau diproses. |
status=generating | Penyedia sedang memproses pembuatan. |
status=completed | Video selesai dan data.results berisi URL hasilnya. |
status=failed | Pembuatan gagal atau kehabisan waktu. |
billing_status=reserved | Kredit dicadangkan saat tugas sedang berlangsung. |
billing_status=charged | Tugas berhasil dan cadangan diselesaikan. |
billing_status=refunded | Tugas gagal atau kehabisan waktu dan kredit dikembalikan. |
billing_status=refund_failed | Transaksi pengembalian dana gagal dan memerlukan penanganan manual. |
Setelah video_expires_at, data.results kosong. Unduh dan simpan file sebelum jendela validitas berakhir.
Webhook
Ketika callback_url ada, Seedance memanggil endpoint Anda saat tugas selesai atau gagal, dan mengirimkan data JSON yang menjelaskan hasil akhir. Jika endpoint Anda mengembalikan respons non-2xx atau tidak merespons dalam waktu 15 detik, pengiriman akan dicoba ulang hingga 5 kali. Percobaan ulang menggunakan id tugas yang sama, jadi hapus duplikasi berdasarkan id. Kembalikan respons 200 segera setelah Anda berhasil merekam data callback.
Callback penyelesaian tugas
{
"id": "3f2aK9mR...",
"status": "completed",
"created_at": 1781234567,
"model": "seedance-2-0",
"data": {
"results": ["https://cdn.seedance2.ai/.../x.mp4"],
"video_expires_at": "2026-06-13T10:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Callback kegagalan tugas
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-0",
"data": {
"failed_reason": "provider_failed",
"credits_refunded": 60
}
}export async function POST(request: Request) {
const callbackData = await request.json();
if (callbackData.status === "completed") {
const videoUrl = callbackData.data.results[0];
// Save the video URL or update your own task record here.
}
if (callbackData.status === "failed") {
const errorMessage = callbackData.data.failed_reason;
// Mark your own task record as failed here.
}
return new Response(null, { status: 200 });
}Validasi bentuk data callback, hapus duplikasi berdasarkan id, perbarui catatan tugas Anda sendiri, dan respons dengan cepat.
callback_url harus HTTPS dan tidak boleh menunjuk ke rentang jaringan pribadi, loopback, atau link-local.
Kesalahan
POST /v1/videos/generations dan GET /v1/tasks/:id mengembalikan bentuk kesalahan ini ketika permintaan API itu sendiri gagal, seperti parameter tidak valid, kunci API tidak valid, kredit tidak cukup, pembatasan laju, atau tugas tidak ditemukan. Beberapa kesalahan menyertakan bidang tambahan seperti required, available, atau retry_after tergantung pada situasinya.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 60,
"available": 12
}
}| Kode | HTTP | Arti | Coba lagi? |
|---|---|---|---|
invalid_request | 400 | Parameter hilang atau tidak valid. | Tidak, perbaiki permintaannya. |
invalid_api_key | 401 | Kunci API hilang, tidak valid, atau dicabut. | Tidak, gunakan kunci yang valid. |
insufficient_credits | 402 | Kredit tidak cukup. Tugas tidak diterima atau dibebankan. | Setelah pengisian ulang. |
forbidden | 403 | Kunci API tidak memiliki cakupan yang diperlukan. | Tidak. |
not_found | 404 | Tugas tidak ada atau bukan milik pemilik kunci. | Tidak. |
rate_limited | 429 | Laju permintaan terlampaui. | Ya, ikuti Retry-After. |
internal_error | 500 | Kesalahan server. | Ya, coba lagi nanti. |
Batas laju
Batas laju diterapkan per kunci API dengan jendela geser. Pembuatan default ke 60 permintaan per menit; kueri status lebih longgar. Respons HTTP 429 menyertakan Retry-After.
Pembuatan
60/min
Kueri status
Lebih longgar
Header 429
Retry-After
Penagihan & kredit
API menggunakan cadangan saat pengiriman, tagihan saat berhasil, dan pengembalian dana saat gagal. Halaman penggunaan Dasbor menunjukkan riwayat kredit API, log tugas, dan statistik penggunaan berdasarkan waktu.
Dicadangkan
Kredit diperiksa dan dicadangkan saat tugas diterima.
Dibebankan
Tugas yang selesai menyelesaikan cadangan yang ada.
Dikembalikan
Tugas yang gagal atau kehabisan waktu mengembalikan kredit yang dicadangkan secara otomatis.
Periksa penggunaan di dasbor
Lihat log API, linimasa tugas, riwayat kredit, dan metrik penggunaan berdasarkan waktu.