Retrieve Job Status

February 23, 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 job by its job ID.

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

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

Request Headers

Authorization: Bearer {API token}

Path Parameters

  • jobid is required, the unique job identifier returned from POST /videos.

Responses

  • 200 OK

    Returns the job record with current status and details.

    Processing (status: created):

    {
      "jobid": "j0223140530123456789v-u12345-US:[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-US:[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": {
        "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-US:[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'                    // 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"
        firstFrameRef?: string
        endFrameRef?: string
        frames?: number                // Number of keyframes (multi_frame)
        replyUrl?: string
        replyRef?: string
      }
    
      response: {
        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
      }
    
      code: number                     // 200
    }
    
  • Video generation failed. Includes error details.

    {
      jobid: string                    // Unique job identifier
      type: 'video'
      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-US:[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-US:[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-US:[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