From BytePlus ModelArk (Seedance)
Move Seedance video generation from the ModelArk API to RawFrame.
If you call Seedance through BytePlus ModelArk's video task API today, the move is mostly renaming fields. Both are asynchronous: you create a task, then check it until it's done.
What changes
- One key for every model. Replace the ModelArk API key with a RawFrame key. The same request shape then works for Seedance and every other video model.
- Prepaid credits. Generations are paid from your RawFrame balance, not your BytePlus account.
- Outputs on our storage. Results are copied to our storage and returned as signed links that you can refresh for 30 days, rather than the provider's temporary video URL.
- Webhooks and streaming. Besides polling, you can stream status or receive signed webhooks.
Requests
| ModelArk | RawFrame |
|---|---|
POST {base}/contents/generations/tasks | POST https://api.rawframe.dev/v1/generations |
model: a ModelArk model or endpoint id | model: "bytedance/seedance-2.5" |
content[] item { "type": "text", "text": ... } | prompt |
content[] item { "type": "image_url", "image_url": { "url": ... }, "role": "first_frame" } | references: [{ "role": "first_frame", "url": ... }], or an upload_id |
roles last_frame, reference_image | the same role names |
ratio | params.aspect_ratio |
duration | params.duration_seconds |
resolution | params.resolution |
seed | params.seed |
generate_audio | params.audio |
watermark | Not needed: we always request outputs without a watermark. |
| Other ModelArk fields | provider_options, passed through as is |
Supported values for each parameter are on the Seedance 2.5 page.
Unlike ModelArk, unsupported values are rejected before the job is created, with invalid_parameters.
Checking on it
| ModelArk | RawFrame |
|---|---|
GET {base}/contents/generations/tasks/{id} | GET /v1/generations/{id}, or the SDKs' waitForCompletion / wait_for_completion |
| task status | status: queued, submitting, running, finalizing, then succeeded, failed or canceled |
content.video_url | outputs[0].url |
error | error.code (normalized, e.g. content_rejected) and error.message |
Before and after
from rawframe import RawFrame
rf = RawFrame()
video = rf.generations.create_and_wait(
model="bytedance/seedance-2.5",
prompt="A paper boat drifting down a rain-soaked city gutter",
references=[{"role": "first_frame", "url": "https://example.com/boat.png"}],
params={"aspect_ratio": "16:9", "duration_seconds": 5},
)
print(video.outputs[0].url)