Generate Videos

February 23, 2026 (August 14, 2026)

Table of contents

  1. Input Modes
    1. Aspect ratio auto-detection
  2. Model Capabilities
    1. What is new in seedance-2.5
    2. Content on seedance-2.5
  3. Request Headers
  4. Request Body
  5. Responses
  6. Model
  7. Examples
  8. Try It

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 of 720p.
  • 1080p on the CA region, added August 14, 2026.
  • Attaching an omni video reference makes a generation cheaper per second, not more expensive, at 480p and 720p. Reference videos may be up to 30.2 seconds each and are billed on top of the output duration. The discount does not apply at 1080p, 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_imageRef or firstFrameRef, 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

Request Body

{
  "prompt": "A serene mountain landscape at sunset with camera slowly panning right",
  "model": "seedance-2.0",
  "ratio": "16:9",
  "duration": 5
}
  • account is optional. Specific account to use. Auto-inferred from image refs if provided. Auto-selected (random with available capacity) if omitted.
  • prompt is required for prompt mode. Optional for first_frame and end_frame. Cannot be used with multi_frame mode (use frame_N_prompt instead). Maximum 15000 characters on seedance-2.5, 5000 on every other model.
  • model is optional, the AI model to use (default: seedance-2.0). Available models depend on account region — see Model Capabilities table.
  • ratio is optional, video aspect ratio (default: 16:9). Cannot be specified when image refs are provided (image aspect ratio is used).
  • duration is optional, video duration in seconds (default: 5). Valid values depend on model — see Model Capabilities table.
  • resolution is optional, one of 480p, 720p, 1080p or 4k. Each model accepts only some of these — see the Resolution column in Model Capabilities above. Defaults to 720p, except seedance-2.5 which defaults to 480p.
  • firstFrameRef is optional, imageRef from POST /assets/account for the starting frame. Triggers first_frame mode.
  • endFrameRef is optional, imageRef for the ending frame. Triggers end_frame mode. Requires firstFrameRef.
  • frame_N_imageRef is optional (N=1-10), imageRef for keyframe N. Triggers multi_frame mode when at least 2 frames are provided.
  • frame_N_prompt is optional, per-frame prompt for multi_frame mode. Maximum 5000 characters.
  • frame_N_duration is optional, per-frame duration in seconds for multi_frame mode (1-6, default: 5).
  • replyUrl is 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/jobid response.
  • replyRef is optional, custom reference string passed back in webhook callbacks.
  • omni_N_imageRef, omni_N_videoRef and omni_N_audioRef are optional assetRef values from POST /assets/account, and trigger Omni Reference mode. Mention each one in the prompt as @imageN, @videoN or @audioN — for example "Make @image1 dance like @video1 while @audio1 plays". Supported by seedance-2.5, seedance-2.0, seedance-2.0-fast and seedance-2.0-mini; per-model counts are in the reference-limit table below.
  • maxJobs is 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, and seedance-2.0-mini models
  • Prompt must contain @imageN, @videoN, and/or @audioN placeholders matching the provided omni_N_*Ref params
  • A reference that is uploaded but never mentioned in the prompt is ignored, and is not billed
  • Cannot be combined with firstFrameRef, endFrameRef, or frame_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 prompt cannot be used (use frame_N_prompt instead)
  • firstFrameRef/endFrameRef cannot be combined with multi_frame
  • Total duration of non-last frames must equal a valid model duration

Responses

  • 200 OK

    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/jobid for completion status, or use replyUrl for webhook callbacks.

  • 400 Bad Request

    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"
    }
    
  • 401 Unauthorized

    Invalid API token.

    {
      "error": "Unauthorized"
    }
    
  • 402 Payment Required

    Subscription expired or insufficient credits.

    {
      "error": "Account has no subscription or subscription expired"
    }
    
  • 429 Too Many Requests

    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)
    

Try It