Skip to main content
Seedance 2.0 (ByteDance) is a multimodal video generation model. It supports four input types — text-to-video, image-to-video, first-last frame, and reference-video — and the output includes synced audio by default. RuAPI exposes an OpenAI-compatible async video API: submit a task → poll status → download the video. Billed in USDT, no foreign card required.
Audio is on by default — Seedance 2.0 videos come with a synced audio track (dialogue / ambient / SFX), no extra parameters needed.
Generated videos are kept for 7 days only. Download and save them right after generation; the link stops working once it expires.

Available models

For exact prices, see the pricing page (video is billed per token).

URLs & auth

  • Base URL: https://www.ruapi.ai/v1
  • Auth: header Authorization: Bearer sk-YOUR_KEY (create one in the console under “API Keys”)
Generation is async, in three steps:
1

Submit a task

POST /v1/videos → returns a task id
2

Poll the status

GET /v1/videos/{id} → until status becomes completed
3

Download the video

GET /v1/videos/{id}/content → get the MP4

Step 1. Submit a task (text-to-video)

Response (id is the task number, used in the next two steps):

Step 2. Poll the status

Query the GET /v1/videos/{id} route about every 5 seconds. status goes through queued → in_progress → completed.
Once complete (metadata.url is the download link):

Step 3. Download the video

Full example: the whole flow in one script

Copy-paste and run, replacing sk-YOUR_KEY with your own key:
Python

The same with curl

One command for macOS, Linux and Windows (Git Bash / WSL): it submits the task, waits until it is ready (usually 1–3 minutes) and saves seedance.mp4. Put your key on the first line. If anything goes wrong, it prints the API response with the reason.

Parameters

Top-level fields: Fields inside metadata:
Higher resolution and longer duration use more tokens and cost more. If unsure, start with 480p / 5 seconds, then tune.

The four input modes

input_type usually doesn’t need to be set — it’s inferred from the number of images/videos; you can also set it explicitly via metadata.input_type.
Images / videos must be publicly reachable URLs (the server has to download them); images support JPG / PNG / WebP, videos support MP4. base64 inline is not supported (an oversized request body will fail).
Below, each mode shows only step 1 “Submit”; steps 2 (poll) and 3 (download) are identical for all modes.

Mode 1. Text-to-video

Just a text prompt — generated entirely from the description.

Mode 2. Image-to-video (1 image)

Put 1 image URL in metadata.images; it’s used as the basis to animate. Describe the motion / camera in prompt.

Mode 3. First-last frame (2 images)

Put 2 images in metadata.images: the 1st = start frame, the 2nd = end frame. It generates a smooth transition from the first to the second.

Mode 4. Reference-video (1 video)

Put 1 short video URL in metadata.videos; the model reinterprets it while keeping the subject’s motion (e.g. restyle or change the scene).
Reference-video is picky about input: use a short clip that is ≤ 15 seconds with a clear subject (e.g. a person). Cartoons, clips without an obvious subject, or overly long videos often fail. It’s best if the reference’s aspect ratio matches your target ratio (e.g. a vertical source → 9:16).

Advanced: multiple images / videos

images and videos are arrays — you can pass several references at once (both verified):
  • Multiple images: put 3 or more images in images (officially up to 9). The model combines subject / scene / style across them. With 3+ images, input_type is auto-detected as reference.
  • Multiple videos: put 2 or more clips in videos (officially up to 3, total duration ≤ 15 seconds).
Same for videos: replace images with videos and pass several short clips (each ideally ≤ 7 seconds with a clear subject, ≤ 15 seconds total).

Task statuses

Billing

Video is billed per token (resolution × duration). A pre-charge is held on submit, then recalculated by actual usage on completion — the difference is refunded. The final charge is what actually got deducted. See the pricing page.

FAQ

Check two things: is the model name correct (e.g. doubao-seedance-2.0-fast) — otherwise you get a 503 with the code model_not_found; and is the address https://www.ruapi.ai/v1/videos (with /v1) — otherwise a 404.
That’s normal. Generation usually takes 1–3 minutes; keep polling and don’t set the interval too short.
It’s likely been more than 7 days and the download link has expired. Download right after generation.
This mode is picky about input. Make sure the reference video is ≤ 15 seconds, has a clear subject, and is a publicly reachable MP4. Cartoons or clips without an obvious subject often fail.
Use the plural GET /v1/videos/{id}. It’s the OpenAI-compatible format, and metadata.url in the response is directly the download link.

Next