# API Seedance 2.0: teks ke video dan gambar ke video dengan Python

> Panggil Seedance 2.0 dari Python dengan satu skrip: field permintaan teks dan gambar ke video, polling, batas, error, serta dua klip 720p asli 30 Oktober 2026.

- Canonical HTML: https://omniakey.com/id/blog/seedance-2-0-api
- Markdown: https://omniakey.com/id/blog/seedance-2-0-api.md
- Published: 2026-10-30 (updated 2026-10-30)
- Author: Kiki, COO at OmniaKey
- Language: id
- Category: API setup
- Reading time: 11 min
- All posts: https://omniakey.com/blog/llms.txt

---

[Seedance 2.0](https://omniakey.com/id/dreamina-seedance-2-0-260128) 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_video` dan `reference_to_video` ([dokumentasi video API](https://docs.omniakey.com/en/media/video) 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 statusnya `succeeded` ([ringkasan API media](https://docs.omniakey.com/en/media/overview) 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](https://omniakey.com/id/dreamina-seedance-2-0-260128).

## 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, atau `reference_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` (`adaptive` mengikuti frame)
- `generate_audio`: `true` secara bawaan, atau `false` (`false` menghasilkan MP4 tanpa suara)
- `n`: `1` (harus 1)

Kedua daftar mengikuti [dokumentasi video API](https://docs.omniakey.com/en/media/video) dan [ringkasan API media](https://docs.omniakey.com/en/media/overview) 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`.

```python
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-Key` acak; 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].url` adalah tautan bertanda tangan yang berlaku sekitar satu jam, jadi skrip mengunduh begitu tugas berhasil (ringkasan API media, diperiksa 30 Oktober 2026).
- `progress.percent` bisa tertahan di 0 selama tugas berjalan, jadi loop hanya mengikuti `status` dan 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](https://omniakey.com/id/blog/kling-3-0-api), 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.

```prompt
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.
```

![Delapan frame gelas tinggi berisi air soda di atas bar kayu, dari tuangan pertama sampai gelas penuh dengan gelembung di dekat dasar.](https://omniakey.com/_img/blog/seedance-2-0-api/seedance-sparkling-glass-frames.e6c0aae7.1280.webp)

_Delapan frame dari klip gelas dalam urutan waktu, 0.0 sampai 5.0 detik. Seedance 2.0 melalui API OmniaKey, teks ke video, 5 detik, 720P, dibuat 30 Oktober 2026._

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"`.

```prompt
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.
```

![Delapan frame kucing oranye yang tidur di atas tumpukan buku di dekat jendela berhujan, bangun, meregangkan kaki, dan menguap.](https://omniakey.com/_img/blog/seedance-2-0-api/seedance-cat-wakes-frames.32a57df5.1280.webp)

_Delapan frame dari klip kucing dalam urutan waktu, 0.0 sampai 5.0 detik. Seedance 2.0 melalui API OmniaKey, gambar ke video, 5 detik, 720P, dibuat 30 Oktober 2026._

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.

![Di kiri, gambar kucing oranye yang dikirim sebagai frame pertama; di kanan, frame terakhir klip itu dengan kaki terentang di atas buku dan kepala menoleh ke jendela.](https://omniakey.com/_img/blog/seedance-2-0-api/cat-first-last.60a2db0f.1600.webp)

_Kiri: gambar diam yang dikirim sebagai frame pertama. Kanan: frame terakhir klip kucing. Seedance 2.0 melalui API OmniaKey, gambar ke video, 5 detik, 720P, dibuat 30 Oktober 2026._

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](https://omniakey.com/id/blog/happyhorse-1-1-vs-seedance-2-0) 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](https://omniakey.com/id/dreamina-seedance-2-5-260628) (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](https://docs.omniakey.com/en/api/errors), 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](https://omniakey.com/id/dreamina-seedance-2-0-260128), `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](https://omniakey.com/id/dreamina-seedance-2-0-fast-260128), `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](https://omniakey.com/id/dreamina-seedance-2-0-mini-260615), `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](https://omniakey.com/id/dreamina-seedance-2-5-260628), `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](https://omniakey.com/id/blog/seedance-2-5-review).

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](https://omniakey.com/id/dreamina-seedance-2-0-260128).

## 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](https://docs.byteplus.com/en/docs/ModelArk/seedance-2-0), diperiksa 30 Oktober 2026
- [BytePlus ModelArk: API buat tugas pembuatan video](https://docs.byteplus.com/en/docs/ModelArk/create-video-generation-task-api), diperiksa 30 Oktober 2026
- [BytePlus ModelArk: harga model dan rumus token](https://docs.byteplus.com/en/docs/ModelArk/model-pricing), diperiksa 30 Oktober 2026

Dokumentasi OmniaKey sendiri, diperiksa 30 Oktober 2026: [video API](https://docs.omniakey.com/en/media/video), [ringkasan API media](https://docs.omniakey.com/en/media/overview) dan [error API](https://docs.omniakey.com/en/api/errors).
