Seedance 2 UGC
Seedance 2 UGC makes an ad clip from a scene frame or from an ordered reference set on the fast Seedance tier. It runs at 480p and 720p.
ugc · model seedance-2 · catalog model-catalog@2026-10-06.v5 · pricing customer-pricing@2026-11-05.v15.Endpoint
POST https://api.roasos.com/v1/ugc/seedance-2Send your API key as a bearer token. The key needs the scope api:write. Every paid request also needs an Idempotency-Key header.
The envelope fields quote_only, quote_id, webhook_url and wait_timeout_seconds behave the same on each model endpoint. Refer to Jobs and Quotes and credits.
Good at
A quick draft or a variant sweep. Native audio. Reference mode takes a saved person, a saved product and your own style references. Use /v1/ugc/seedance-2-pro when the cut must be 1080p or 4K.
Pricing
The unit is one clip. Pricing key: seedance-2.
| Request | Credits |
|---|---|
4s_720p | 12 |
10s_720p | 30 |
15s_720p | 44 |
4s_720p_no_audio | 12 |
The credits come from the roasOS pricing table. No other field changes the price. To get the exact price of your request, send it with quote_only: true first.
Modes
standardreference
roasOS selects the mode from the media fields of your request. You do not send a mode.
Provider endpoints: bytedance/seedance-2.0/fast/image-to-video · bytedance/seedance-2.0/fast/reference-to-video.
Request fields
| Field | Type | Required | Default | Rule |
|---|---|---|---|---|
aspect_ratio | enum | no | 9:16 | 9:16, 1:1, 3:4, 4:3, 16:9, 21:9 |
avatar_id | string | no | — | UUID; only in reference |
avatar_upload | string | no | — | https URL; ≤ 4,096 characters; only in reference |
duration_seconds | integer enum | no | 5 | 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 |
generate_audio | boolean | no | true | — |
product_id | string | no | — | UUID; only in reference |
prompt_mode | enum | no | — | wrapped, exact |
quote_id | string | no | — | UUID |
quote_only | boolean | no | false | — |
references | string[] | no | — | ≤ 9 items; only in reference |
resolution | enum | no | 720p | 480p, 720p |
scene_id | string | no | — | UUID; only in standard |
scene_image | string | no | — | https URL; ≤ 4,096 characters; only in standard |
script | string | yes | — | ≥ 1 character; ≤ 10,000 characters |
wait_timeout_seconds | integer | no | 0 | 0–60 |
webhook_url | string | no | — | https URL; ≤ 4,096 characters |
The schema is strict. A field that is not in this table gets 400 unsupported_option. The field names are the roasOS role names. One role has one name in every family.
Media
This endpoint accepts these media roles:
avatar_id— identity; the saved character reference sheet, with a derived portrait only where the model requires a single face or source frameproduct_id— product; resolves to the product image listreferences— style and appearance referencesscene_id— first frame — a scene this workspace ownsscene_image— first frame — a CDN image
| Role | Items | Maximum size | Content types | Duration |
|---|---|---|---|---|
references | ≤ 9 | 10 MB | image/jpeg, image/png, image/webp | — |
scene_image | ≤ 1 | 10 MB | image/jpeg, image/png, image/webp | — |
Every other role is refused: elements, product_images, reference_images, image_url, end_image_url, video_urls, video_url, audio_urls, audio_url, voice_id. A refused role gets 400 unsupported_option.
https://cdn.roasos.com that your workspace owns. Any other URL gets 400 reference_media_not_workspace_owned. Refer to Reference media and uploads to learn how to put a file there.Prompt
- Standard mode: the worker appends the UGC facts block ("Use the supplied first frame … The requested format is a UGC video ad; preserve the supplied script/action …") to the script.
- Reference mode: no facts block. Write no
@Imagetags yourself; the worker binds every reference. - Write the words to be spoken in quotes: says exactly with warm energy: "…".
- Describe motion as physics: "Realistic hand movements, she lifts the jar to chest height."
- Anchor the hands to an object. A contact point holds hands and fabric better.
- Use a static camera for a talking head. Use one subject and one action for each clip.
- Do not write claims, camera moves or music that the product does not have.
- Seedance reads the ordered
@ImageNtags. The worker writes them for you; do not write them yourself.
Not exposed
These catalog entries describe omitted inputs, pinned values and source constraints. They do not imply that the provider accepts every listed field.
bitrate_mode— pinned tostandard on every UGC request.aspect_ratio— pinned toauto.end_user_id— not accepted by this public endpoint.video_urls— not accepted by this public endpoint.references— these values are not available:BMP,TIFF,GIF,HEIC,HEIF.avatar_id— not accepted by this public endpoint.product_id— not accepted by this public endpoint.seed— pinned tooutput only.negative_prompt— not accepted by this public endpoint.audio_urls— not accepted by this public endpoint.end_image_url— not accepted by this public endpoint.
Result
The result kind is ugc. Always present: url.
{
"data": {
"id": "gen_…",
"kind": "ugc",
"model": "seedance-2",
"status": "completed",
"result": {
"url": "https://cdn.roasos.com/workspaces/ws_01/result"
}
}
}The files are immutable objects on https://cdn.roasos.com. A result URL is a valid media input for your next request.
Example
The three steps are always the same: quote, run, poll.
# 1. Quote. Nothing is spent.
curl -X POST https://api.roasos.com/v1/ugc/seedance-2 \
-H "Authorization: Bearer roasos_sk_live_..." \
-H "Idempotency-Key: 0f1c9e2a-seedance-2-0001" \
-H "Content-Type: application/json" \
-d '{"quote_only":true,"script":"Two drops, morning and night. That is the whole routine."}'
# 200 { "data": { "kind": "quote", "quote_id": "q_7Hk...", "credits": 12, "expires_at": "...",
# "confirmation": { "model": "seedance-2", "example": "4s_720p" } } }
# 2. Run. Same body, same Idempotency-Key, quote_id in place of quote_only.
curl -X POST https://api.roasos.com/v1/ugc/seedance-2 \
-H "Authorization: Bearer roasos_sk_live_..." \
-H "Idempotency-Key: 0f1c9e2a-seedance-2-0001" \
-H "Content-Type: application/json" \
-d '{"quote_id":"q_7Hk...","script":"Two drops, morning and night. That is the whole routine."}'
# 201 { "data": { "id": "gen_...", "status": "queued", "credits_reserved": 12 } }
# 3. Poll, then read the result.
curl https://api.roasos.com/v1/jobs/gen_.../status -H "Authorization: Bearer roasos_sk_live_..."
curl https://api.roasos.com/v1/jobs/gen_.../result -H "Authorization: Bearer roasos_sk_live_..."Today
The app route POST /api/generate/ugc-ads { sceneId | sceneImage, script, model: "seedance-2", async: true } sends the same request. Use this endpoint instead: it is live.
See also
llms.txtfor this model — the same facts as one plain-text file for an agent.GET https://api.roasos.com/v1/catalog/seedance-2— the machine-readable form: enums, defaults, limits and prices. Refer to the API reference.- Jobs — how to poll a job and read its result.
- Provider endpoints:
bytedance/seedance-2.0/fast/image-to-video·bytedance/seedance-2.0/fast/reference-to-video.
Kling 4.0 UGC
Kling 4.0 UGC animates one first frame into a spoken ad clip, or makes the clip from a saved person and product. It renders at 720p or 1080p, from 3 to 30 seconds, and it keeps the person the same across the clip.
Seedance 2 Pro UGC
Seedance 2 Pro UGC makes an ad clip from a scene frame or from an ordered reference set on the Seedance quality tier. It runs up to 4K.