Generate Videos
February 23, 2026 (October 23, 2026)
Table of contents
Generate videos using Dreamina AI models from text prompts with optional image frames. All video generation is asynchronous — this endpoint returns immediately with a job ID. Poll GET /videos/jobid for completion, or use replyUrl webhook for automatic callbacks.
Video generation typically completes within 60-180 seconds depending on the model and duration. The long_video and edit modes on seedance-2.5 take considerably longer — a 21-second edit measured 13 minutes and a 35-second long video 17, so use replyUrl rather than polling for those.
Input Modes
The input mode is automatically determined from the provided parameters:
| Mode | API Value | Trigger | Description |
|---|---|---|---|
| Prompt | prompt | No image refs | Text-to-video generation |
| First Frame | first_frame | firstFrameRef provided | Video starts from uploaded image |
| First/Last Frame | end_frame | firstFrameRef + endFrameRef | Video transitions between two images |
| Multi-Frame | multi_frame | frame_N_imageRef params | 2-10 keyframe images with per-frame prompts |
| Omni Reference | unified_edit | omni_N_imageRef/omni_N_videoRef/omni_N_audioRef in prompt | Interleaved text, image, video, and audio references (Seedance 2.5, 2.0, 2.0 Fast, 2.0 Mini, Wan 3.0; HappyHorse 1.1 images only) |
| Long Video | long_video | duration above 30 | 31-180 second generation (seedance-2.5 only) |
| Edit | edit | editVideoRef provided | Re-cut an existing video (seedance-2.5 only) |
Aspect ratio auto-detection
In first_frame and end_frame modes the aspect ratio is taken from the uploaded image, and the closest standard ratio (21:9, 16:9, 4:3, 1:1, 3:4, 9:16) is used. The ratio parameter cannot be supplied alongside image refs. When using firstFrameRef together with endFrameRef, both images must share the same aspect ratio.
Model Capabilities
| Model | Region | Durations | Resolution | Input Modes |
|---|---|---|---|---|
seedance-2.5 | US, CA | 4-30s, or 31-180s in long video mode | 480p (default), 720p, 1080p | Prompt, First/Last Frame, Omni Reference, Long Video, Edit |
seedance-2.0 | US, CA | 4-15s | 720p, 1080p, 4k | Prompt, First/Last Frame, Omni Reference |
seedance-2.0-fast | US, CA | 4-15s | 720p, 1080p, 2k, 4k (above 720p, upscaled from 720p) | Prompt, First/Last Frame, Omni Reference |
seedance-2.0-mini | US, CA | 4-15s | 720p, 1080p, 2k, 4k (above 720p, upscaled from 720p) | Prompt, First/Last Frame, Omni Reference |
seedance-1.5-pro | US, CA | 5, 10, 12s | 720p, 1080p (1080p is CA only) | Prompt, First/Last Frame |
seedance-1.0-pro | CA | 5, 10s | 1080p | Prompt, First Frame |
seedance-1.0-mini | US | 5, 10s | 720p | Prompt, First Frame, Multi-Frame |
seedance-1.0-fast | CA | 5, 10s | 720p, 1080p | Prompt, First Frame, Multi-Frame |
happyhorse-1.1 | CA | 4-15s | 720p (default), 1080p | Prompt, First Frame, Omni Reference (images only) |
wan-3.0 | CA | 4-15s | 720p (default), 1080p | Prompt, First/Last Frame, Omni Reference |
Both regions run the same resolutions on the Seedance 2.0 and 2.5 models. seedance-2.5 runs 1080p on CA since August 14, 2026 and on US since October 23, 2026. seedance-2.0-fast and seedance-2.0-mini render at 720p, and Dreamina upscales 1080p, 2k and 4k from that 720p video (as of October 23, 2026). 480p arrived with seedance-2.5 on August 7, 2026. On seedance-1.5-pro, 1080p is CA only. See Setup Dreamina for per-region setup and pricing.
happyhorse-1.1 (by Alibaba) and wan-3.0 (by Tongyi Lab) run on CA accounts as of October 23, 2026. Both make 4 to 15-second videos with sound at 720p or 1080p. HappyHorse takes up to 9 reference images, and Wan up to 10 images, 5 videos and 5 audio clips.
What is new in seedance-2.5
- Up to 30 seconds in one call, twice the 15-second ceiling of the 2.0 family.
- Up to 50 omni references — 30 images, 10 videos, 10 audio clips — against the 2.0 family’s 12.
- Defaults to
480p, which costs roughly half of720p. 1080p, added on CA August 14, 2026 and on US October 23, 2026.- Long video — pass a
durationof 31 to 180 and the generation switches to long video mode, six times the ordinary 30-second ceiling. Works from a plain prompt or with omni references. Priced on its own, higher, per-second rate. - Edit — pass
editVideoRefand Seedance re-cuts an existing 4-30 second video instead of generating a new one, keeping its motion and framing while applying whatever the prompt asks for. Combine it withomni_N_imageRefreferences to bring new elements in. - Attaching an omni video reference makes a generation cheaper per second at
480pon both regions (as of October 21, 2026, US720pno longer has the lower rate). Reference videos may be up to 30.2 seconds each and are billed on top of the output duration.
Content on seedance-2.5
Markedly more permissive than the 2.0 family:
- Real human faces are accepted. A photographic portrait works directly as
omni_N_imageReforfirstFrameRef, and the identity carries through the clip. The 2.0 family rejects them, so the face-grid workaround in the Seedance 2.0 real-faces tutorial is not needed here. - Cinematic violence renders. Stylised action — fight scenes, impacts, blood spray — is generated rather than refused.
- Recognisable third-party content is refused, as
fail_code 2053. It is judged against the finished video two to four minutes into generation, not against your prompt text — so a prompt naming no person and no property can still fail if it describes one, such as a costumed superhero, a trademarked landmark, or a character written as an unmistakable celebrity. Failed generations are not charged.
https://api.useapi.net/v1/dreamina/videos
Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
API tokenis required, see Setup useapi.net for details.
Request Body
{
"prompt": "A serene mountain landscape at sunset with camera slowly panning right",
"model": "seedance-2.0",
"ratio": "16:9",
"duration": 5
}
accountis optional. Specific account to use. Auto-inferred from image refs if provided. If omitted, a random account with free capacity is picked among those whose region offersmodel.promptis required forpromptmode. Optional forfirst_frameandend_frame. Cannot be used withmulti_framemode (useframe_N_promptinstead). Maximum 20000 characters onwan-3.0, 15000 onseedance-2.5, 2500 onhappyhorse-1.1, 5000 on every other model.modelis optional, the AI model to use (default:seedance-2.0). Available models depend on account region — see Model Capabilities table.ratiois optional, video aspect ratio (default:16:9). One of21:9,16:9,4:3,1:1,3:4,9:16, plus4:5,5:4and9:21onhappyhorse-1.1.wan-3.0takes16:9,4:3,1:1,3:4and9:16. Cannot be specified when image refs are provided (image aspect ratio is used).durationis optional, video duration in seconds (default:5). Valid values depend on model — see Model Capabilities table. Onseedance-2.5any value from 31 to 180 switches the request to long video mode, which is priced separately. Cannot be used witheditVideoRef, where the output always matches the source video.resolutionis optional, one of480p,720p,1080p,2kor4k. Each model accepts only some of these — see the Resolution column in Model Capabilities above. Defaults to720p, exceptseedance-2.5which defaults to480p.firstFrameRefis optional,imageReffrom POST /assets/accountfor the starting frame. Triggersfirst_framemode.endFrameRefis optional,imageReffor the ending frame. Triggersend_framemode. RequiresfirstFrameRef.editVideoRefis optional,videoReffrom POST /assets/accountfor the video to re-cut. Triggerseditmode,seedance-2.5only. The source must be 4-30 seconds. The output inherits the source’s length and aspect ratio, sodurationandratiocannot be supplied alongside it. May be combined withomni_N_imageRef/omni_N_videoRefreferences, mentioned in the prompt as usual.frame_N_imageRefis optional (N=1-10),imageReffor keyframe N. Triggersmulti_framemode when at least 2 frames are provided.frame_N_promptis optional, per-frame prompt for multi_frame mode. Maximum 5000 characters.frame_N_durationis optional, per-frame duration in seconds for multi_frame mode (1-6, default:5).replyUrlis optional, webhook URL for job status callbacks. Receives POST requests with the job record on submission and on completion/failure. Callback body has the same JSON shape as GET /videos/jobidresponse.replyRefis optional, custom reference string passed back in webhook callbacks.omni_N_imageRef,omni_N_videoRefandomni_N_audioRefare optionalassetRefvalues from POST /assets/account, and trigger Omni Reference mode. Mention each one in the prompt as@imageN,@videoNor@audioN— for example"Make @image1 dance like @video1 while @audio1 plays". Supported byseedance-2.5,seedance-2.0,seedance-2.0-fast,seedance-2.0-mini,wan-3.0, andhappyhorse-1.1(images only); per-model counts are in the reference-limit table below.maxJobsis optional, override max concurrent jobs for this request (1-50).
Omni Reference constraints:
- Only supported by
seedance-2.5,seedance-2.0,seedance-2.0-fast,seedance-2.0-mini,wan-3.0, andhappyhorse-1.1(images only) - Prompt must contain
@imageN,@videoN, and/or@audioNplaceholders matching the providedomni_N_*Refparams - A reference that is uploaded but never mentioned in the prompt is ignored, and is not billed
- The Seedance 2.0 models and
wan-3.0need at least one image or video reference. Audio references alone are refused with400.seedance-2.5accepts audio alone - Cannot be combined with
firstFrameRef,endFrameRef, orframe_N_imageRef
Reference limits differ by model:
| Limit | seedance-2.5 | Seedance 2.0 family | wan-3.0 | happyhorse-1.1 |
|---|---|---|---|---|
| Image references | 30 | 9 | 10 | 9 |
| Video references | 10 | 3 | 5 | — |
| Audio references | 10 | 3 | 5 | — |
| Total materials combined | 50 | 12 | 20 | 9 |
| Total video duration across all refs | 30.2s | 15.4s | 15s | — |
| Total audio duration across all refs | 30.2s | 15s | 15s | — |
| Individual video | 1.8-30.2s, 300-6000px | 2-15.4s, 200-2160px | 1-15s, 240-4096px | — |
| Individual audio | 1.8-30.2s | 2-15s | 1-15s | — |
Uploads via POST /assets/account are accepted up to the loosest of these limits (video 1.8-30.2s, audio 1.8-30.2s, video max 50 MB, audio max 15 MB), so one asset can be reused across models. The per-model limits above are checked when you submit the generation.
Multi-frame constraints:
- Minimum 2 frames, maximum 10 frames
- No gaps allowed (frame_1 through frame_N must be contiguous)
- All frame images must have the same aspect ratio
- Top-level
promptcannot be used (useframe_N_promptinstead) firstFrameRef/endFrameRefcannot be combined with multi_frame- Total duration of non-last frames must equal a valid model duration
Responses
-
Job created successfully. Video is generating in the background.
{ "jobid": "j0223140530123456789v-u12345-CA:[email protected]:dreamina", "type": "video", "status": "created", "model": "seedance-2.0", "created": "2026-02-23T14:05:30.123Z", "request": { "prompt": "A serene mountain landscape at sunset with camera slowly panning right", "model": "seedance-2.0", "ratio": "16:9", "duration": 5, "inputMode": "prompt" }, "response": { "forecastCost": 125 }, "code": 200 }Poll GET /videos/
jobidfor completion status, or usereplyUrlfor webhook callbacks. -
Validation error.
{ "error": "Parameter model (invalid-model) valid values: seedance-2.5, seedance-2.0, seedance-2.0-fast, seedance-2.0-mini, seedance-1.5-pro, seedance-1.0-mini, seedance-1.0-pro, seedance-1.0-fast, happyhorse-1.1, wan-3.0" } -
Invalid API token.
{ "error": "Unauthorized" } -
Subscription expired or insufficient credits.
{ "error": "Account has no subscription or subscription expired" } -
One of two reasons, and
retsays which.ret5006: the account has no Dreamina subscription that includes this model. Dreamina runs it only on a paid plan, and credits bought separately don’t count. Subscribe the account, or use one that has a plan.{ "error": "Account US:[email protected] needs a paid Dreamina subscription for seedance-2.5: Dreamina refused the job because the account has no plan that includes it (credits bought separately don't count). Subscribe at https://dreamina.capcut.com/pricing/dreamina-price, or use an account that has one. Dreamina: credit miss role", "ret": "5006", "errmsg": "credit miss role", "account": "US:[email protected]", "model": "seedance-2.5" }ret4010: Dreamina asks for its one-time “Before you continue” confirmation on this account (currently Seedance 2.x). We accept it automatically and resubmit, so you only get this response when that did not clear it. Retry once. If it persists, sign in at dreamina.capcut.com with the account, start a generation with the same model, click Agree, then retry.{ "error": "Dreamina asks for a one-time confirmation on account US:[email protected] and our automatic confirmation did not clear it. Retry once. If it persists, sign in at https://dreamina.capcut.com with this account, start a seedance-2.0 generation, click Agree on \"Before you continue\", then retry. Dreamina: Couldn't generate. Refresh and agree to the confirmation before you continue.", "ret": "4010", "errmsg": "Couldn't generate. Refresh and agree to the confirmation before you continue.", "failCode": "4010", "account": "US:[email protected]", "model": "seedance-2.0" } -
All accounts at maximum capacity. Wait for current jobs to complete or increase
maxJobs.{ "error": "All accounts at capacity" } -
596 Session Error
Account session expired. Re-add the account using POST /accounts with correct credentials.
{ "error": "Session expired" }
Model
{
jobid: string // Unique job identifier
type: 'video' // Job type
status: 'created' // Initial status
model: string // Model used
created: string // ISO 8601 timestamp
request: {
prompt?: string
model: string
ratio?: string // "16:9", "9:16", etc.
duration?: number // Seconds
inputMode: string // "prompt" | "first_frame" | "end_frame" | "multi_frame" | "unified_edit" | "long_video" | "edit"
resolution?: string // "480p", "720p", "1080p", "2k" or "4k"
firstFrameRef?: string // assetRef (image) for first frame
endFrameRef?: string // assetRef (image) for end frame
frame_1_imageRef?: string // Keyframe refs (multi_frame mode)
frame_1_prompt?: string
frame_1_duration?: number
frame_2_imageRef?: string
frame_2_prompt?: string
frame_2_duration?: number
omni_1_imageRef?: string // Omni image refs (use @image1 in prompt)
omni_2_imageRef?: string
omni_1_videoRef?: string // Omni video refs (use @video1 in prompt)
omni_1_audioRef?: string // Omni audio refs (use @audio1 in prompt)
replyUrl?: string // Webhook URL
replyRef?: string // Custom reference
}
response: {
forecastCost: number // Estimated generation time in seconds, NOT a price
}
code: number // HTTP status code
error?: string // Error message
}
Examples
-
# Text-to-video curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "prompt": "A serene mountain landscape at sunset", "model": "seedance-2.0", "ratio": "16:9", "duration": 5 }' \ "https://api.useapi.net/v1/dreamina/videos" # Image-to-video (first frame — ratio auto-detected from image) curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "prompt": "Camera slowly pans across the scene", "model": "seedance-2.0", "firstFrameRef": "CA:[email protected]:w685:h900:s86866-uri:tos-useast5-i-wopfjsm1ax-tx/abc123", "duration": 5 }' \ "https://api.useapi.net/v1/dreamina/videos" # Omni Reference (image + audio) curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "prompt": "@image1 slowly moving forward while @audio1 plays in background", "model": "seedance-2.0", "ratio": "16:9", "duration": 4, "omni_1_imageRef": "CA:[email protected]:w2560:h1440:s580914-uri:tos-alisg-i-wopfjsm1ax-sg/abc123", "omni_1_audioRef": "CA:[email protected]:d14040-vid:v10762g50003d77l5uvog65nl4esjs2g" }' \ "https://api.useapi.net/v1/dreamina/videos" -
const token = 'YOUR_API_TOKEN'; const apiUrl = 'https://api.useapi.net/v1/dreamina/videos'; // Text-to-video const response = await fetch(apiUrl, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ prompt: 'A serene mountain landscape at sunset', model: 'seedance-2.0', ratio: '16:9', duration: 5 }) }); const result = await response.json(); console.log('Job created:', result.jobid); // Poll for completion const poll = async (jobid) => { while (true) { const res = await fetch(`https://api.useapi.net/v1/dreamina/videos/${jobid}`, { headers: { 'Authorization': `Bearer ${token}` } }); const job = await res.json(); console.log('Status:', job.status); if (job.status === 'completed') { console.log('Video URL:', job.response.videoUrl); return job; } if (job.status === 'failed') throw new Error(job.error); await new Promise(r => setTimeout(r, 10000)); } }; const completed = await poll(result.jobid); -
import requests import time token = 'YOUR_API_TOKEN' api_url = 'https://api.useapi.net/v1/dreamina/videos' headers = { 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json' } # Text-to-video data = { 'prompt': 'A serene mountain landscape at sunset', 'model': 'seedance-2.0', 'ratio': '16:9', 'duration': 5 } response = requests.post(api_url, headers=headers, json=data) result = response.json() print(f"Job created: {result['jobid']}") # Poll for completion jobid = result['jobid'] while True: job = requests.get( f'https://api.useapi.net/v1/dreamina/videos/{jobid}', headers={'Authorization': f'Bearer {token}'} ).json() print(f"Status: {job['status']}") if job['status'] == 'completed': print(f"Video URL: {job['response']['videoUrl']}") break if job['status'] == 'failed': raise Exception(job.get('error')) time.sleep(10)