Retrieve Job Status

February 23, 2026 (April 2, 2026)

Table of contents

  1. Request Headers
  2. Path Parameters
  3. Responses
  4. Model
  5. Examples
  6. Try It

Retrieve the status and result of a video generation, upscale, or interpolation job by its job ID.

Use this endpoint to poll for completion after submitting a video via POST /videos, POST /videos/upscale, or POST /videos/interpolate. Jobs are retained for 30 days.

https://api.useapi.net/v1/dreamina/videos/jobid

Request Headers

Authorization: Bearer {API token}

Path Parameters

Responses

  • 200 OK

    Returns the job record with current status and details.

    Processing (status: created):

    {
      "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",
        "model": "seedance-2.0",
        "ratio": "16:9",
        "duration": 5,
        "inputMode": "prompt"
      },
      "response": {
        "forecastCost": 125
      },
      "code": 200
    }
    

    Completed:

    {
      "jobid": "j0223140530123456789v-u12345-CA:[email protected]:dreamina",
      "type": "video",
      "status": "completed",
      "model": "seedance-2.0",
      "created": "2026-02-23T14:05:30.123Z",
      "updated": "2026-02-23T14:07:15.456Z",
      "request": {
        "prompt": "A serene mountain landscape at sunset",
        "model": "seedance-2.0",
        "ratio": "16:9",
        "duration": 5,
        "inputMode": "prompt"
      },
      "response": {
        "assetId": "CA:[email protected]:7341234567890123456",
        "videoUrl": "https://v3-web.douyinvod.com/...",
        "videoId": "7341234567890123456",
        "coverUrl": "https://p9-sign.douyinpic.com/...",
        "width": 1280,
        "height": 720,
        "durationMs": 5042,
        "hasAudio": false,
        "forecastCost": 125,
        "finishTime": 1708700835
      },
      "code": 200
    }
    

    Failed:

    {
      "jobid": "j0223140530123456789v-u12345-CA:[email protected]:dreamina",
      "type": "video",
      "status": "failed",
      "model": "seedance-2.0",
      "created": "2026-02-23T14:05:30.123Z",
      "updated": "2026-02-23T14:07:15.456Z",
      "request": {
        "prompt": "A test prompt",
        "model": "seedance-2.0",
        "ratio": "16:9",
        "duration": 5,
        "inputMode": "prompt"
      },
      "error": "fail_code: 2043",
      "errorDetails": "OutputVideoRisk",
      "code": 2043
    }
    

    Note: Jobs older than 1 hour that are still created are auto-marked as failed with "Generation timed out" (code 408).

  • 401 Unauthorized

    Invalid API token.

    {
      "error": "Unauthorized"
    }
    
  • 404 Not Found

    Job not found, belongs to a different user, or has expired (>30 days).

    {
      "error": "Job not found"
    }
    

Model

  • Video generation completed. Includes video URL and metadata.

    {
      jobid: string                    // Unique job identifier
      type: 'video' | 'video-upscale' | 'video-interpolate'  // Job type
      status: 'completed'
      model: string                    // Model used
      created: string                  // ISO 8601 timestamp
      updated: string                  // ISO 8601 timestamp
    
      request: {
        prompt?: string
        model: string
        ratio?: string
        duration?: number
        inputMode: string              // "prompt" | "first_frame" | "end_frame" | "multi_frame" | "unified_edit"
        resolution?: string            // "720p" or "1080p"
        firstFrameRef?: string
        endFrameRef?: string
        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
        replyUrl?: string
        replyRef?: string
      }
    
      response: {
        assetId: string                // For DELETE /assets/<assetId>
        videoUrl: string               // Direct video URL (MP4)
        videoId: string                // Dreamina video ID
        coverUrl: string               // Video cover/thumbnail URL
        width: number                  // Video width in pixels
        height: number                 // Video height in pixels
        durationMs: number             // Video duration in milliseconds
        hasAudio: boolean              // Whether video has audio
        forecastCost: number           // Credit cost
        finishTime: number             // Unix timestamp of completion
        upscaleJobid?: string          // Set after POST /videos/upscale
      }
    
      code: number                     // 200
    }
    
  • Video generation failed. Includes error details.

    {
      jobid: string                    // Unique job identifier
      type: 'video' | 'video-upscale' | 'video-interpolate'
      status: 'failed'
      model: string
      created: string                  // ISO 8601 timestamp
      updated: string                  // ISO 8601 timestamp
    
      request: {
        prompt?: string
        model: string
        ratio?: string
        duration?: number
        inputMode: string
        firstFrameRef?: string
        endFrameRef?: string
        replyUrl?: string
        replyRef?: string
      }
    
      error: string                    // Error summary (e.g., "fail_code: 2043")
      errorDetails?: string            // Additional details (e.g., "OutputVideoRisk")
      code: number                     // Error code (e.g., 2043, 408, 596)
    }
    

    Common error codes:

    Code Meaning
    408 Generation timed out (>1 hour)
    596 Account session expired
    2038 Content filtered
    2043 Output video moderation risk

Examples

  • # Get job status
    curl "https://api.useapi.net/v1/dreamina/videos/j0223140530123456789v-u12345-CA:[email protected]:dreamina" \
      -H "Authorization: Bearer YOUR_API_TOKEN"
    
    # Poll for completion (check every 10 seconds)
    while true; do
      RESULT=$(curl -s "https://api.useapi.net/v1/dreamina/videos/$JOBID" \
        -H "Authorization: Bearer YOUR_API_TOKEN")
    
      STATUS=$(echo "$RESULT" | jq -r '.status')
      echo "Status: $STATUS"
    
      if [[ "$STATUS" == "completed" ]]; then
        echo "$RESULT" | jq -r '.response.videoUrl'
        break
      fi
    
      if [[ "$STATUS" == "failed" ]]; then
        echo "$RESULT" | jq -r '.error'
        break
      fi
    
      sleep 10
    done
    
  • const apiToken = 'YOUR_API_TOKEN'
    const jobId = 'j0223140530123456789v-u12345-CA:[email protected]:dreamina'
    
    async function getJobStatus(jobId) {
      const response = await fetch(`https://api.useapi.net/v1/dreamina/videos/${jobId}`, {
        headers: {
          'Authorization': `Bearer ${apiToken}`
        }
      })
      return await response.json()
    }
    
    // Poll until completion
    async function waitForCompletion(jobId, intervalMs = 10000) {
      while (true) {
        const job = await getJobStatus(jobId)
        console.log(`Status: ${job.status}`)
    
        if (job.status === 'completed') {
          console.log('Video URL:', job.response.videoUrl)
          console.log('Dimensions:', `${job.response.width}x${job.response.height}`)
          console.log('Duration:', `${job.response.durationMs}ms`)
          return job
        }
    
        if (job.status === 'failed') {
          console.error('Job failed:', job.error)
          throw new Error(job.error)
        }
    
        await new Promise(resolve => setTimeout(resolve, intervalMs))
      }
    }
    
    const job = await waitForCompletion(jobId)
    
  • import requests
    import time
    
    api_token = 'YOUR_API_TOKEN'
    job_id = 'j0223140530123456789v-u12345-CA:[email protected]:dreamina'
    
    def get_job_status(job_id: str) -> dict:
        response = requests.get(
            f'https://api.useapi.net/v1/dreamina/videos/{job_id}',
            headers={'Authorization': f'Bearer {api_token}'}
        )
        response.raise_for_status()
        return response.json()
    
    def wait_for_completion(job_id: str, interval_sec: int = 10) -> dict:
        while True:
            job = get_job_status(job_id)
            print(f"Status: {job['status']}")
    
            if job['status'] == 'completed':
                print(f"Video URL: {job['response']['videoUrl']}")
                print(f"Dimensions: {job['response']['width']}x{job['response']['height']}")
    
                # Download video
                video_response = requests.get(job['response']['videoUrl'])
                with open('output.mp4', 'wb') as f:
                    f.write(video_response.content)
                print('Video saved to output.mp4')
                return job
    
            if job['status'] == 'failed':
                raise Exception(f"Job failed: {job.get('error')}")
    
            time.sleep(interval_sec)
    
    job = wait_for_completion(job_id)
    

Try It