Retrieve Job Status
February 23, 2026
Table of contents
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}
API tokenis required, see Setup useapi.net for details.
Path Parameters
jobidis required, the unique job identifier returned from POST /videos.
Responses
-
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
createdare auto-marked as failed with"Generation timed out"(code408). -
Invalid API token.
{ "error": "Unauthorized" } -
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)