Generate Videos

February 23, 2026 (April 3, 2026)

Table of contents

  1. Input Modes
  2. Model Capabilities
  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.0 only)

Aspect ratio auto-detection: When using first_frame or end_frame modes, the video aspect ratio is automatically detected from the uploaded image dimensions. The ratio parameter 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 using firstFrameRef + 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

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 5000 characters.
  • model is optional, the AI model to use (default: seedance-2.0 for CA, seedance-1.5-pro for US). 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, output resolution: 720p or 1080p (default: 720p). Only seedance-1.5-pro, seedance-1.0-mini, and seedance-1.0-fast support 1080p. Model seedance-1.0-pro is always 1080p.
  • 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.
  • replyRef is optional, custom reference string passed back in webhook callbacks.
  • omni_N_imageRef is 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_videoRef is optional (N=1-3), assetRef (video type) for inline video in Omni Reference mode. Upload video via POST /assets/account with Content-Type: video/mp4. Reference in the prompt using @videoN (e.g., "@image1 moving like @video1").
  • omni_N_audioRef is optional (N=1-3), assetRef (audio type) for inline audio in Omni Reference mode. Upload audio via POST /assets/account with Content-Type: audio/mpeg. Reference in the prompt using @audioN (e.g., "@image1 dancing while @audio1 plays").
  • maxJobs is optional, override max concurrent jobs for this request (1-50).

Omni Reference constraints:

  • Only supported by seedance-2.0 and seedance-2.0-fast models
  • Prompt must contain @imageN, @videoN, and/or @audioN placeholders matching the provided omni_N_*Ref params
  • 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_videoRef cannot exceed 15.4 seconds
  • Total audio duration across all omni_N_audioRef cannot 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, or frame_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 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.0, seedance-1.5-pro, seedance-1.0-mini"
    }
    
  • 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            // "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)
    

Try It