Generate Videos
February 23, 2026 (April 3, 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.0 only) |
Aspect ratio auto-detection: When using
first_frameorend_framemodes, the video aspect ratio is automatically detected from the uploaded image dimensions. Theratioparameter cannot be specified with image refs — the closest standard ratio (21:9, 16:9, 4:3, 1:1, 3:4, 9:16) is used. When usingfirstFrameRef+endFrameRef, both images must have the same aspect ratio.
Model Capabilities
| Model | Region | Durations | Resolution | Input Modes |
|---|---|---|---|---|
seedance-2.0 | CA | 4-15s | 720p | Prompt, First/Last Frame, Omni Reference |
seedance-2.0-fast | CA | 4-15s | 720p | Prompt, First/Last Frame, Omni Reference |
seedance-1.5-pro | US, CA | 5, 10, 12s | 720p, 1080p | 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 | 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 |
As of April 3, 2026, Seedance 2.0 and 2.0 Fast are only available in the CA (Canada) region. See Setup Dreamina for CA region account setup.
Seedance 2.0 / 2.0 Fast: Real human faces are not supported and may be rejected by content moderation. Use illustrated, anime, or stylized characters instead.
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 5000 characters.modelis optional, the AI model to use (default:seedance-2.0for CA,seedance-1.5-profor US). 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, output resolution:720por1080p(default:720p). Onlyseedance-1.5-pro,seedance-1.0-mini, andseedance-1.0-fastsupport1080p. Modelseedance-1.0-prois always1080p.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.replyRefis optional, custom reference string passed back in webhook callbacks.omni_N_imageRefis optional (N=1-9),assetRef(image type) for inline image in Omni Reference mode. Reference in the prompt using@imageN(e.g.,"Make @image1 dance with @image2"). Requires Seedance 2.0 or 2.0 Fast.omni_N_videoRefis optional (N=1-3),assetRef(video type) for inline video in Omni Reference mode. Upload video via POST /assets/accountwithContent-Type: video/mp4. Reference in the prompt using@videoN(e.g.,"@image1 moving like @video1").omni_N_audioRefis optional (N=1-3),assetRef(audio type) for inline audio in Omni Reference mode. Upload audio via POST /assets/accountwithContent-Type: audio/mpeg. Reference in the prompt using@audioN(e.g.,"@image1 dancing while @audio1 plays").maxJobsis optional, override max concurrent jobs for this request (1-50).
Omni Reference constraints:
- Only supported by
seedance-2.0andseedance-2.0-fastmodels - Prompt must contain
@imageN,@videoN, and/or@audioNplaceholders matching the providedomni_N_*Refparams - Maximum 9 image references, 3 video references, and 3 audio references per request
- Maximum 12 total materials combined
- Total video duration across all
omni_N_videoRefcannot exceed 15.4 seconds - Total audio duration across all
omni_N_audioRefcannot exceed 15 seconds - Individual video: 2-15.4 seconds, 200-2160px, max 50 MB
- Individual audio: 2-15 seconds, max 15 MB
- Cannot be combined with
firstFrameRef,endFrameRef, orframe_N_imageRef
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.0, seedance-1.5-pro, seedance-1.0-mini" } -
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" } -
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 // "720p" or "1080p"
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 credit cost
}
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)