Generate Videos
February 23, 2026 (August 14, 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.
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) |
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 | 480p (default), 720p, 1080p (1080p is CA only) | Prompt, First/Last Frame, Omni Reference |
seedance-2.0 | US, CA | 4-15s | 720p, 1080p, 4k (1080p and 4k are CA only) | Prompt, First/Last Frame, Omni Reference |
seedance-2.0-fast | US, CA | 4-15s | 720p | Prompt, First/Last Frame, Omni Reference |
seedance-2.0-mini | US, CA | 4-15s | 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, CA | 5, 10s | 720p, 1080p (1080p is CA only) | Prompt, First Frame, Multi-Frame |
seedance-1.0-fast | CA | 5, 10s | 720p, 1080p | Prompt, First Frame, Multi-Frame |
sora2 | CA | 4, 8, 12s | 720p | Prompt, First Frame |
480p and 720p work on both regions. 1080p and 4k are CA-only — 1080p as of April 17, 2026, 4k (on seedance-2.0) as of June 26, 2026, and 1080p on seedance-2.5 as of August 14, 2026. 480p arrived with seedance-2.5 on August 7, 2026 and is available on both. seedance-2.0-mini is 720p only, and it runs on both regions as of August 9, 2026. See Setup Dreamina for per-region setup and pricing.
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. 1080pon the CA region, added August 14, 2026.- Attaching an omni video reference makes a generation cheaper per second, not more expensive, at
480pand720p. Reference videos may be up to 30.2 seconds each and are billed on top of the output duration. The discount does not apply at1080p, which bills the same rate either way.
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. Auto-selected (random with available capacity) if omitted.promptis required forpromptmode. Optional forfirst_frameandend_frame. Cannot be used withmulti_framemode (useframe_N_promptinstead). Maximum 15000 characters onseedance-2.5, 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). 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.resolutionis optional, one of480p,720p,1080por4k. 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.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-fastandseedance-2.0-mini; 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, andseedance-2.0-minimodels - 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
- Cannot be combined with
firstFrameRef,endFrameRef, orframe_N_imageRef
Reference limits differ by model:
| Limit | seedance-2.5 | Seedance 2.0 family |
|---|---|---|
| Image references | 30 | 9 |
| Video references | 10 | 3 |
| Audio references | 10 | 3 |
| Total materials combined | 50 | 12 |
| Total video duration across all refs | 30.2s | 15.4s |
| Total audio duration across all refs | 30.2s | 15s |
| Individual video | 1.8-30.2s, 300-6000px | 2-15.4s, 200-2160px |
| Individual audio | 1.8-30.2s | 2-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, sora2" } -
Invalid API token.
{ "error": "Unauthorized" } -
Subscription expired or insufficient credits.
{ "error": "Account has no subscription or subscription expired" } -
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"
resolution?: string // "480p", "720p", "1080p" 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)