API Seedance 2.0: teks ke video dan gambar ke video dengan Python
Satu skrip membuat tugas, melakukan polling, dan menyimpan MP4. Berikut field, batasnya, dan dua klip 5 detik yang kami buat pada 30 Oktober 2026.
Di halaman ini
- Jawaban singkat
- Apa yang perlu disiapkan sebelum panggilan pertama?
- Field apa saja yang dipakai permintaan Seedance 2.0?
- Skrip Python
- Bagaimana cara mengirim frame pertama untuk gambar ke video?
- Dua klip yang kami buat
- Apa yang terukur dari file
- Error dan batas apa yang akan Anda temui?
- Seedance 2.0, Fast, Mini, atau 2.5?
- FAQ
- Apakah ada API Seedance 2.0 resmi?
- Bisakah saya mengirim URL gambar alih-alih base64?
- Bagaimana cara mematikan suara?
- Mengapa permintaan saya timeout?
- Berapa lama tautan video berlaku?
- Sumber yang diperiksa
Seedance 2.0 berjalan di API media OmniaKey dengan ID model dreamina-seedance-2-0-260128. Anda POST tugas ke https://api.omniakey.com/v1/media/tasks, melakukan polling ID tugas, lalu mengunduh MP4-nya. Dua klip 720p 5 detik kami, satu dari teks dan satu dari gambar diam, selesai dalam 159 dan 139 detik pada 30 Oktober 2026.
Jawaban singkat
- ID model
dreamina-seedance-2-0-260128, dengan tiga operasi:text_to_video,image_to_videodanreference_to_video(dokumentasi video API OmniaKey, diperiksa 30 Oktober 2026). - Buat, polling, unduh: panggilan buat menjawab 202 dengan sebuah id, lalu Anda GET
/v1/media/tasks/{id}setiap beberapa detik sampai statusnyasucceeded(ringkasan API media OmniaKey, diperiksa 30 Oktober 2026). - Durasi berjalan dari 4 sampai 15 detik penuh, dan ID 2.0 lengkap merender 480P, 720P dan 1080P.
- Seluruh body permintaan tetap di bawah 1 MiB, termasuk base64 inline.
- Dua render 720p 5 detik kami selesai dalam 159 detik (teks ke video) dan 139 detik (frame pertama).
Apa yang perlu disiapkan sebelum panggilan pertama?
Kunci API OmniaKey, Python 3, dan ID model yang tepat. Skrip hanya mengimpor pustaka standar, jadi bisa dijalankan tanpa virtualenv dan tanpa memasang paket.
Ekspor kunci sebagai OMNIAKEY_API_KEY sebelum panggilan pertama. Skrip membacanya sekali dan mengirimkannya sebagai Bearer token di setiap permintaan, sehingga kunci tetap berada di luar file dan riwayat git Anda.
Buat dengan POST https://api.omniakey.com/v1/media/tasks dan polling dengan GET https://api.omniakey.com/v1/media/tasks/{id}. Keduanya ditambah POST /v1/media/tasks/{id}/cancel adalah seluruh API media (ringkasan API media, diperiksa 30 Oktober 2026).
Tulis ID model secara lengkap. OmniaKey tidak melayani alias pendek seedance-2 dan seedance-2-5, dan keduanya menjawab 503 no_available_channel (dokumentasi video API, diperiksa 30 Oktober 2026).
Tugas video ditagih di muka per detik output yang dihasilkan, dan biayanya kembali otomatis saat tugas berakhir failed atau canceled (ringkasan API media, diperiksa 30 Oktober 2026). Untuk tarif per detik saat ini, lihat halaman model Seedance 2.0.
Field apa saja yang dipakai permintaan Seedance 2.0?
Empat field tingkat atas membawa tugas, dan objek parameters membawa pengaturan output. Hanya duration yang tidak punya nilai bawaan yang masuk akal, jadi selalu kirimkan.
model: ID model lengkap (alias pendek gagal)type:video(jenis media)operation:text_to_video,image_to_video,reference_to_video(nama tanpa awalan)input.prompt: satu string (adegan, aksi dan kamera, hingga 12,000 karakter)input.media[]:{"type": "first_frame", "url": …}(frame pertama, ataureference_image)
Di dalam parameters:
duration: 4 sampai 15, detik penuh (menentukan harga)resolution:480P,720P,1080P(Fast dan Mini berhenti di 720P)ratio:16:9,9:16,1:1,4:3,3:4,21:9,adaptive(adaptivemengikuti frame)generate_audio:truesecara bawaan, ataufalse(falsemenghasilkan MP4 tanpa suara)n:1(harus 1)
Kedua daftar mengikuti dokumentasi video API dan ringkasan API media OmniaKey (diperiksa 30 Oktober 2026), dengan batas prompt dari halaman model.
Kirim nama operasi tanpa awalan; OmniaKey menambahkan awalan jenis media sendiri (dokumentasi video API, diperiksa 30 Oktober 2026). Parameter yang tidak dikenali diteruskan ke penyedia apa adanya (ringkasan API media, diperiksa 30 Oktober 2026).
Satu jebakan menanti mereka yang mulai dari dokumentasi vendor: API buat-tugas BytePlus menaruh field di dalam content[] dan di tingkat atas, jadi kode dari tutorial BytePlus tidak berjalan apa adanya terhadap /v1/media/tasks (API buat-tugas BytePlus, diperiksa 30 Oktober 2026).
Skrip Python
Satu file menjalankan kedua operasi, dan satu-satunya perbedaan adalah body yang disusunnya. Simpan sebagai seedance_video.py dan jalankan python3 seedance_video.py.
import base64
import json
import os
import time
import urllib.error
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
MODEL = "dreamina-seedance-2-0-260128"
def request(method, url, body=None, extra_headers=None):
headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body).encode()
headers.update(extra_headers or {})
req = urllib.request.Request(url, data=data, headers=headers, method=method)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def poll(url, attempts=5):
for attempt in range(attempts):
try:
return request("GET", url)
except urllib.error.HTTPError as err:
if err.code < 500 or attempt == attempts - 1:
raise
except urllib.error.URLError:
if attempt == attempts - 1:
raise
time.sleep(5 * (attempt + 1))
def run_task(body, out_path):
task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
print("task", task, flush=True)
for _ in range(180): # polling 5 detik, sampai 15 menit
time.sleep(5)
state = poll(f"{API}/{task}")
if state["status"] not in ("queued", "processing"):
break
else:
raise TimeoutError(f"{task} is still {state['status']}: poll it again later, do not resubmit")
if state["status"] != "succeeded":
raise RuntimeError(state.get("error") or state["status"])
asset_url = state["assets"][0]["url"] # tautan bertanda tangan: berumur pendek, unduh sekarang
req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
with urllib.request.urlopen(req, timeout=300) as resp, open(out_path, "wb") as f:
f.write(resp.read())
return task
def text_to_video(prompt, out_path, duration=5, resolution="720P", ratio="16:9"):
body = {
"model": MODEL,
"type": "video",
"operation": "text_to_video",
"input": {"prompt": prompt},
"parameters": {"duration": duration, "resolution": resolution, "ratio": ratio},
}
return run_task(body, out_path)
def image_to_video(prompt, image_path, out_path, duration=5, resolution="720P", audio=False):
with open(image_path, "rb") as f:
raw = f.read()
if len(raw) > 700_000: # base64 menambah sepertiga, dan seluruh body harus di bawah 1 MiB
raise ValueError("first frame too large: save it as a JPEG about 1024 px wide")
frame = "data:image/jpeg;base64," + base64.b64encode(raw).decode()
body = {
"model": MODEL,
"type": "video",
"operation": "image_to_video",
"input": {"prompt": prompt, "media": [{"type": "first_frame", "url": frame}]},
"parameters": {"duration": duration, "resolution": resolution, "ratio": "adaptive",
"generate_audio": audio},
}
return run_task(body, out_path)
if __name__ == "__main__":
print("done", text_to_video(
"Close-up of a tall glass on a wooden bar counter. Sparkling water is poured over ice; bubbles "
"rise and the ice cubes clink and shift. Warm evening light from the left. The camera slowly "
"pushes in. Sound of pouring, fizzing and clinking ice. No people, no text.",
"sparkling-glass.mp4",
))
print("done", image_to_video(
"The cat slowly wakes, stretches its front paws and yawns, then looks toward the window. "
"Raindrops keep running down the glass. The camera stays still.",
"cat.jpg",
"cat-wakes.mp4",
))
Ada enam bagian file ini yang perlu Anda pahami sebelum mengubah apa pun.
- Setiap permintaan buat membawa
Idempotency-Keyacak; memutar ulang kunci itu dengan body yang sama mengembalikan tugas asli dengan HTTP 200 dan tidak menagih dua kali (ringkasan API media, diperiksa 30 Oktober 2026). - Loop tidur 5 detik di antara polling dan berhenti setelah 180 percobaan, yaitu 15 menit.
- Timeout berarti tugas masih dirender. Polling ID tugas yang sama lagi nanti dan jangan pernah mengirim ulang, atau Anda membayar klip kedua.
assets[0].urladalah tautan bertanda tangan yang berlaku sekitar satu jam, jadi skrip mengunduh begitu tugas berhasil (ringkasan API media, diperiksa 30 Oktober 2026).progress.percentbisa tertahan di 0 selama tugas berjalan, jadi loop hanya mengikutistatusdan tidak yang lain (dokumentasi video API, diperiksa 30 Oktober 2026).- Fungsi gambar menolak file di atas 700,000 byte, karena base64 menambah sepertiga dan body harus tetap di bawah 1 MiB.
Bentuk permintaan sama dengan Kling 3.0 di API yang sama, jadi berganti model hanya mengubah ID model dan parameternya, bukan kode di sekitarnya.
Bagaimana cara mengirim frame pertama untuk gambar ke video?
Letakkan gambar di input.media[] dengan "type": "first_frame", inline sebagai URI data:image/jpeg;base64,..., bentuk yang dipakai klip kucing kami.
input.media[] menerima URL HTTPS publik atau data URI inline, dan seluruh body dibatasi 1 MiB (dokumentasi video API, diperiksa 30 Oktober 2026). Uji OmniaKey sendiri melihat tautan frame HTTPS biasa ditolak dengan provider_submit_rejected, karena itu contoh ini mengirim data URI (dokumentasi video API, diperiksa 30 Oktober 2026).
Base64 menambah sepertiga, jadi mulai dari JPEG selebar sekitar 1024 piksel: frame pertama kami 134,356 byte, dan PNG 4 MB akan ditolak.
Pertahankan parameters.ratio di adaptive di sini: nilainya mengikuti bentuk gambar yang Anda kirim, dan begitulah gambar diam 1024×571 menjadi klip 1280×720. Untuk reference_to_video, array yang sama menerima "type": "reference_image" (dokumentasi video API, diperiksa 30 Oktober 2026).
Dua klip yang kami buat
Kedua tugas dikirim pada 30 Oktober 2026 dengan file di atas, tanpa perubahan. Yang pertama teks ke video, tugas task_uF2QUtbeAAUW11lXEaLxNw1ZnBUoqvNk, dibuat pukul 01:39:43 UTC dan berhasil pukul 01:42:22 UTC. Prompt meminta suara tuangan, jadi audio tetap menyala.
Close-up of a tall glass on a wooden bar counter. Sparkling water is poured over ice; bubbles rise and the ice cubes clink and shift. Warm evening light from the left. The camera slowly pushes in. Sound of pouring, fizzing and clinking ice. No people, no text.

Frame-frame itu memperlihatkan gelas berisi es di atas bar kayu, dengan botol dan cahaya hangat yang kabur di belakangnya. Gelas membesar dari frame pertama ke frame terakhir, dorongan kamera yang diminta prompt, dan berakhir penuh dengan gelembung di dekat dasar.
Yang kedua gambar ke video, tugas task_u85W0jn1sQLkrszJlxqXF1hxJYhsndxK, dibuat pukul 01:42:33 UTC dan berhasil pukul 01:44:52 UTC. Frame pertamanya adalah gambar diam kucing oranye yang tidur di atas tumpukan buku tua di dekat jendela berhujan (1024×571 piksel), dikirim sebagai data URI dengan "type": "first_frame".
The cat slowly wakes, stretches its front paws and yawns, then looks toward the window. Raindrops keep running down the glass. The camera stays still.

Kucing mengangkat kepala, membuka mata, meregangkan kedua kaki depannya melewati tepi buku, menguap lebar, dan menoleh ke jendela, sesuai urutan yang diberikan prompt. Hujan terus mengalir di kaca dan pembingkaian tetap diam seperti diminta.

Dua percobaan ini mencakup teks ke video dan frame pertama pada 720P selama 5 detik. Kami tidak menguji 1080P, Fast, Mini, 2.5, reference_to_video, tautan frame HTTPS, atau durasi lain.
Apa yang terukur dari file
Kedua unduhan adalah MP4 H.264 1280×720 dan 24 fps: 121 frame, 5.04 detik.
| Klip | Gelas | Kucing |
|---|---|---|
| Operasi | teks ke video | gambar ke video |
| Waktu selesai | 159 s | 139 s |
| Ukuran file | 2,070,248 bytes | 1,352,027 bytes |
| Video | 1280×720, 24 fps, 121 frame | 1280×720, 24 fps, 121 frame |
| Audio | trek AAC | tidak ada |
Trek klip gelas membawa suara tuangan, desis, dan denting es, tanpa suara manusia dan tanpa musik. Klip kucing tidak punya trek sama sekali, karena permintaannya mengirim generate_audio: false.
Kedua catatan tugas melaporkan usage.completion_tokens: 108900, yaitu 121 × 1280 × 720 ÷ 1024, rumus token yang dipakai BytePlus untuk memperkirakan tagihan video (halaman harga BytePlus, diperiksa 30 Oktober 2026).
Dokumentasi OmniaKey menyebut klip 720p 6 detik biasanya selesai dalam sekitar satu menit (dokumentasi video API, diperiksa 30 Oktober 2026). Milik kami butuh 159 dan 139 detik, dan tiga klip 720p 5 detik dalam perbandingan kami pada 26 Oktober butuh 144.8, 319.0 dan 184.7 detik. Rencanakan 2 sampai 5 menit dan lakukan polling alih-alih menahan permintaan tetap terbuka.
Error dan batas apa yang akan Anda temui?
Periksa tiga pengaturan lebih dulu: ID model, durasi 4 sampai 15, dan audio yang bisa ditolak filter penyedia.
| Status / Kode | Yang perlu diubah |
|---|---|
400 invalid_request | body atau input.prompt |
400 model_price_error | durasi ke 4–15 s |
403 model_not_allowed | akses model kunci |
409 idempotency_key_reused | kunci baru per body |
503 no_available_channel | ID lengkap, operasi tanpa awalan |
| tugas gagal, error penyedia | baca error, lalu coba lagi |
Kode-kode itu berasal dari ringkasan API media dan dokumentasi video API (diperiksa 30 Oktober 2026). Tugas yang berakhir failed mengembalikan tagihan di muka, jadi render yang ditolak hanya memakan waktu Anda.
Perhatikan pengaturan audio. Seedance merender trek secara bawaan, dan membiarkannya menyala membuat penyedia menolak permintaan 480P 4 detik dengan OutputAudioSensitiveContentDetected.PolicyViolation, jadi kirim parameters.generate_audio: false kecuali adegan membutuhkan suara (dokumentasi video API, diperiksa 30 Oktober 2026).
BytePlus menyebut seri 2.0 tidak menerima gambar atau video referensi yang memuat wajah manusia asli (halaman Seedance 2.0 BytePlus, diperiksa 30 Oktober 2026). Seedance 2.0 juga tidak punya seed dan camera_fixed, padahal keduanya field di API buat-tugas vendor (API buat-tugas BytePlus, diperiksa 30 Oktober 2026).
Lima belas detik adalah plafon keluarga ini, dan duration: -1 tidak memberi lebih; rekaman 20 atau 30 detik termasuk ke Seedance 2.5 (halaman model Seedance 2.0, diperiksa 30 Oktober 2026).
OmniaKey tidak menerbitkan batas laju tetap; perlakukan HTTP 429 sebagai bisa dicoba ulang dengan backoff eksponensial (halaman error API OmniaKey, diperiksa 30 Oktober 2026).
Seedance 2.0, Fast, Mini, atau 2.5?
Empat tingkatan menerima body permintaan yang sama, jadi berpindah hanya butuh satu ID model dan, pada Fast serta Mini, plafon resolusi yang lebih rendah.
- Seedance 2.0,
dreamina-seedance-2-0-260128: 480P, 720P dan 1080P, 4 sampai 15 detik. Harga daftar BytePlus untuk klip 5 detik adalah $0.76 pada 720p dan $0.35 pada 480p (halaman harga BytePlus, diperiksa 30 Oktober 2026). - Seedance 2.0 Fast,
dreamina-seedance-2-0-fast-260128: 480P dan 720P, 4 sampai 15 detik. Harga daftar BytePlus untuk klip 5 detik adalah $0.60 pada 720p dan $0.28 pada 480p. - Seedance 2.0 Mini,
dreamina-seedance-2-0-mini-260615: 480P dan 720P, 4 sampai 15 detik. Harga daftar BytePlus untuk klip 5 detik adalah $0.38 pada 720p dan $0.18 pada 480p. - Seedance 2.5,
dreamina-seedance-2-5-260628: satu-satunya ID di keluarga ini yang menerima rekaman 20 atau 30 detik, dan yang paling lambat: sekitar empat menit untuk klip 480P 4 detik (dokumentasi video API, diperiksa 30 Oktober 2026). Sisi gambarnya dibahas di ulasan Seedance 2.5 kami.
Halaman model OmniaKey melaporkan klip 480P 4 detik sekitar satu menit di 2.0, dua menit di Fast, dan 100 detik di Mini (diperiksa 30 Oktober 2026).
Ambil ID 2.0 lengkap saat Anda butuh master 1080P, karena Fast dan Mini berhenti di 720P (dokumentasi video API, diperiksa 30 Oktober 2026). OmniaKey menetapkan tarifnya sendiri untuk ID ini, jadi lihat tarif terkini di halaman model Seedance 2.0.
FAQ
Apakah ada API Seedance 2.0 resmi?
Ada. BytePlus ModelArk menjualnya, dan mengaktifkannya di sana membutuhkan saldo akun di atas USD 30, Savings Plan, atau paket sumber daya Seedance (halaman Seedance 2.0 BytePlus, diperiksa 30 Oktober 2026). Skrip di atas memanggil ID model yang sama melalui API media OmniaKey.
Bisakah saya mengirim URL gambar alih-alih base64?
Dokumentasi OmniaKey mencantumkan URL HTTPS publik di samping data URI inline (dokumentasi video API, diperiksa 30 Oktober 2026). Percobaan kami memakai inline karena tautan frame HTTPS kembali sebagai provider_submit_rejected dalam uji OmniaKey sendiri, jadi coba URL pada klip uji lebih dulu.
Bagaimana cara mematikan suara?
Kirim parameters.generate_audio: false, dan MP4 datang tanpa trek audio sama sekali, seperti klip kucing. Audio menyala secara bawaan di model ini.
Mengapa permintaan saya timeout?
Klipnya biasanya masih dirender, karena tugas 720p 5 detik butuh 139 sampai 319 detik dalam percobaan kami. Polling ID tugas yang sama lagi, jangan pernah mengirim ulang, dan naikkan batas loop 15 menit untuk klip 15 detik.
Berapa lama tautan video berlaku?
Tautan bertanda tangan di assets[0].url berlaku sekitar satu jam, dan catatan tugas disimpan 24 jam setelah dibuat (ringkasan API media, diperiksa 30 Oktober 2026). Unduh pada keberhasilan pertama, atau polling tugas lagi untuk tautan baru.
Sumber yang diperiksa
- BytePlus ModelArk: panduan Seedance 2.0, diperiksa 30 Oktober 2026
- BytePlus ModelArk: API buat tugas pembuatan video, diperiksa 30 Oktober 2026
- BytePlus ModelArk: harga model dan rumus token, diperiksa 30 Oktober 2026
Dokumentasi OmniaKey sendiri, diperiksa 30 Oktober 2026: video API, ringkasan API media dan error API.
Model di artikel ini
Artikel terkait
Ulasan Seedance 2.5
Peningkatan yang berarti adalah penceritaan dan kontrol produksi 30 detik, bukan berita utama 4K yang belum terverifikasi yang beredar di sekitarnya.
HappyHorse 1.1 vs Seedance 2.0: uji prompt yang sama dan harga
Tiga prompt yang sama di hari yang sama: Seedance 2.0 membuat klip lebih baik, HappyHorse 1.1 dua kali lebih cepat.
Kling 3.0 API: kode permintaan teks ke video dan klip nyata
Tugas teks ke video cukup satu POST dengan model kling-3.0. Berikut kode permintaannya, field yang diterima, dan dua klip 5 detik yang kami buat pada 29 Oktober 2026 beserta hasil ukurnya.
Artikel terbaru
- Codex: membuat gambar dengan imagegen di penyedia kustom
- Model kustom Factory Droid: Pakai Claude dan GPT dengan API key sendiri
- Gemini 4 Carbon: tanggal rilis, harga, dan akses API
- GPT Image 2.5 API: membuat dan mengedit gambar dengan Python
- Ulasan MiniMax M3.1 Flash: benchmark, kecepatan, dan bedanya dengan M3
