roasOS
ModelsUGC

Seedance 2.5 UGC

Seedance 2.5 UGC makes an ad clip from a scene frame or from an ordered reference set. It holds the longest durations of every UGC lane and takes the widest reference budget.

Family ugc · model seedance-2.5 · catalog model-catalog@2026-10-06.v5 · pricing customer-pricing@2026-11-05.v15.

Endpoint

POST https://api.roasos.com/v1/ugc/seedance-2.5

Send 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 long clip (up to 30 seconds) and an ad that needs several product shots. Native audio. Reference mode takes a saved person, a saved product and your own style references together. Seedance accepts a face reference, a real photo or a saved avatar. If the provider refuses a face, the run fails with provider_rejects_face_references and roasOS refunds the reservation.

Pricing

The unit is one clip. Pricing key: seedance-2.5.

RequestCredits
4s_720p12
12s_720p36
30s_720p90
4s_720p_no_audio12

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

  • standard
  • reference

roasOS selects the mode from the media fields of your request. You do not send a mode.

Provider endpoints: bytedance/seedance-2.5/image-to-video · bytedance/seedance-2.5/reference-to-video.

Request fields

FieldTypeRequiredDefaultRule
aspect_ratioenumno9:16auto, 9:16, 1:1, 3:4, 4:3, 16:9, 21:9
avatar_idstringno—UUID; only in reference
avatar_uploadstringno—https URL; ≤ 4,096 characters; only in reference
duration_secondsinteger enumno54, 5, 6, 8, 10, 12, 15, 20, 25, 30
generate_audiobooleannotrue—
product_idstringno—UUID; only in reference
prompt_modeenumno—wrapped, exact
quote_idstringno—UUID
quote_onlybooleannofalse—
referencesstring[]no—≤ 30 items; only in reference
resolutionenumno720p480p, 720p, 1080p
scene_idstringno—UUID; only in standard
scene_imagestringno—https URL; ≤ 4,096 characters; only in standard
scriptstringyes—≥ 1 character; ≤ 10,000 characters
video_urlsstring[]no—≤ 3 items; only in reference
wait_timeout_secondsintegerno00–60
webhook_urlstringno—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 frame
  • product_id — product; resolves to the product image list
  • references — style and appearance references
  • scene_id — first frame — a scene this workspace owns
  • scene_image — first frame — a CDN image
  • video_urls — reference videos
RoleItemsMaximum sizeContent typesDuration
references≤ 3010 MBimage/jpeg, image/png, image/webp—
scene_image≤ 110 MBimage/jpeg, image/png, image/webp—
video_urls≤ 3100 MBvideo/mp42–30 s

Every other role is refused: elements, product_images, reference_images, image_url, end_image_url, video_url, audio_urls, audio_url, voice_id. A refused role gets 400 unsupported_option.

Each media URL must be an immutable object on 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 @Image tags 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 @ImageN tags. 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.

  • duration_seconds — these values are not available: 7, 9, 11, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29.
  • video_urls — not accepted by this public endpoint.
  • audio_urls — not accepted by this public endpoint.
  • seed — not accepted by this public endpoint.
  • end_image_url — not accepted by this public endpoint.
  • bitrate_mode — pinned to standard on every UGC request.

Result

The result kind is ugc. Always present: url.

{
  "data": {
    "id": "gen_…",
    "kind": "ugc",
    "model": "seedance-2.5",
    "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.5 \
  -H "Authorization: Bearer roasos_sk_live_..." \
  -H "Idempotency-Key: 0f1c9e2a-seedance-2.5-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.5", "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.5 \
  -H "Authorization: Bearer roasos_sk_live_..." \
  -H "Idempotency-Key: 0f1c9e2a-seedance-2.5-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.5", async: true } sends the same request. Use this endpoint instead: it is live.

See also

  • llms.txt for this model — the same facts as one plain-text file for an agent.
  • GET https://api.roasos.com/v1/catalog/seedance-2.5 — 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.5/image-to-video · bytedance/seedance-2.5/reference-to-video.

On this page