Skip to content

Sora Get Video Task Status

OpenAI-compatible video task status query interface.

Returns detailed status information for a video task, including progress, completion status, and generation results.

API Details

Endpoint: GET /v1/videos/{task_id}

Description: Query the status and detailed information of a specified video task. Used for polling task progress and retrieving the generated video URL.

Authentication: Bearer Token

http
Authorization: Bearer YOUR_API_TOKEN

Request Parameters

Path Parameters

ParameterTypeRequiredDescriptionExample
task_idstringYesVideo task IDvid_abc123xyz456

Response Parameters

Success Response (200)

ParameterTypeDescription
idstringVideo task ID
objectstringObject type, always video
modelstringModel name used
statusstringTask status: pending, processing, completed, failed
progressintegerProgress percentage (0-100)
created_atintegerCreation timestamp (Unix timestamp)
secondsstringVideo duration
completed_atintegerCompletion timestamp (optional)
expires_atintegerExpiration timestamp (optional)
sizestringVideo dimensions in format {width}x{height}
urlstringVideo download URL (available after task completion)
errorobjectError information (available when task fails)
error.messagestringError description
error.codestringError code
metadataobjectAdditional metadata

Error Response (404)

ParameterTypeDescription
errorobjectError information object
error.messagestringError description
error.codestringError code

Task Status Description

StatusDescription
pendingTask submitted, waiting for processing
processingTask is being processed
completedTask completed, video generated successfully
failedTask failed

Code Examples

cURL

bash
# Query task status
curl -X GET "https://api.ezmodel.cloud/v1/videos/vid_abc123xyz456" \
  -H "Authorization: Bearer YOUR_API_KEY"

Python

python
import requests
import time
import json

task_id = "vid_abc123xyz456"
url = f"https://api.ezmodel.cloud/v1/videos/{task_id}"
headers = {
    "Authorization": "Bearer YOUR_API_KEY"
}

# Poll task status
while True:
    response = requests.get(url, headers=headers)
    result = response.json()
    
    print(f"Status: {result['status']}, Progress: {result['progress']}%")
    
    if result['status'] == 'completed':
        print(f"Video generated successfully!")
        print(f"Download URL: {result.get('url')}")
        break
    elif result['status'] == 'failed':
        print(f"Task failed: {result.get('error', {}).get('message')}")
        break
    
    time.sleep(5)  # Wait 5 seconds before next query

JavaScript

javascript
const taskId = 'vid_abc123xyz456';
const url = `https://api.ezmodel.cloud/v1/videos/${taskId}`;

// Poll task status
async function pollTaskStatus() {
  while (true) {
    const response = await fetch(url, {
      method: 'GET',
      headers: {
        'Authorization': 'Bearer YOUR_API_KEY'
      }
    });
    
    const result = await response.json();
    console.log(`Status: ${result.status}, Progress: ${result.progress}%`);
    
    if (result.status === 'completed') {
      console.log('Video generated successfully!');
      console.log('Download URL:', result.url);
      break;
    } else if (result.status === 'failed') {
      console.log('Task failed:', result.error?.message);
      break;
    }
    
    await new Promise(resolve => setTimeout(resolve, 5000)); // Wait 5 seconds
  }
}

pollTaskStatus();

Go

go
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "time"
)

type VideoTaskResponse struct {
    ID         string `json:"id"`
    Object     string `json:"object"`
    Model      string `json:"model"`
    Status     string `json:"status"`
    Progress   int    `json:"progress"`
    CreatedAt  int64  `json:"created_at"`
    Seconds    string `json:"seconds"`
    URL        string `json:"url,omitempty"`
    Error      *struct {
        Message string `json:"message"`
        Code    string `json:"code"`
    } `json:"error,omitempty"`
}

func main() {
    taskID := "vid_abc123xyz456"
    url := fmt.Sprintf("https://api.ezmodel.cloud/v1/videos/%s", taskID)
    
    client := &http.Client{}
    
    // Poll task status
    for {
        req, _ := http.NewRequest("GET", url, nil)
        req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
        
        resp, err := client.Do(req)
        if err != nil {
            panic(err)
        }
        
        body, _ := io.ReadAll(resp.Body)
        resp.Body.Close()
        
        var result VideoTaskResponse
        json.Unmarshal(body, &result)
        
        fmt.Printf("Status: %s, Progress: %d%%\n", result.Status, result.Progress)
        
        if result.Status == "completed" {
            fmt.Println("Video generated successfully!")
            fmt.Printf("Download URL: %s\n", result.URL)
            break
        } else if result.Status == "failed" {
            if result.Error != nil {
                fmt.Printf("Task failed: %s\n", result.Error.Message)
            }
            break
        }
        
        time.Sleep(5 * time.Second)
    }
}

Java

java
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import com.google.gson.Gson;
import com.google.gson.JsonObject;

public class SoraVideoStatusExample {
    public static void main(String[] args) throws Exception {
        String taskId = "vid_abc123xyz456";
        String url = "https://api.ezmodel.cloud/v1/videos/" + taskId;
        
        HttpClient client = HttpClient.newHttpClient();
        Gson gson = new Gson();
        
        // Poll task status
        while (true) {
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Authorization", "Bearer YOUR_API_KEY")
                .GET()
                .build();
            
            HttpResponse<String> response = client.send(request, 
                HttpResponse.BodyHandlers.ofString());
            
            JsonObject result = gson.fromJson(response.body(), JsonObject.class);
            String status = result.get("status").getAsString();
            int progress = result.get("progress").getAsInt();
            
            System.out.println("Status: " + status + ", Progress: " + progress + "%");
            
            if ("completed".equals(status)) {
                System.out.println("Video generated successfully!");
                System.out.println("Download URL: " + result.get("url").getAsString());
                break;
            } else if ("failed".equals(status)) {
                JsonObject error = result.getAsJsonObject("error");
                if (error != null) {
                    System.out.println("Task failed: " + error.get("message").getAsString());
                }
                break;
            }
            
            Thread.sleep(5000);
        }
    }
}

C#

csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Text.Json;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new HttpClient();
        var taskId = "vid_abc123xyz456";
        var url = $"https://api.ezmodel.cloud/v1/videos/{taskId}";
        
        client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_API_KEY");
        
        // Poll task status
        while (true)
        {
            var response = await client.GetAsync(url);
            var content = await response.Content.ReadAsStringAsync();
            var result = JsonSerializer.Deserialize<JsonElement>(content);
            
            var status = result.GetProperty("status").GetString();
            var progress = result.GetProperty("progress").GetInt32();
            
            Console.WriteLine($"Status: {status}, Progress: {progress}%");
            
            if (status == "completed")
            {
                Console.WriteLine("Video generated successfully!");
                Console.WriteLine($"Download URL: {result.GetProperty("url").GetString()}");
                break;
            }
            else if (status == "failed")
            {
                if (result.TryGetProperty("error", out var error))
                {
                    Console.WriteLine($"Task failed: {error.GetProperty("message").GetString()}");
                }
                break;
            }
            
            await Task.Delay(5000);
        }
    }
}

Response Examples

Task Processing (200)

json
{
  "id": "vid_abc123xyz456",
  "object": "video",
  "model": "sora-1.0",
  "status": "processing",
  "progress": 45,
  "created_at": 1705334400,
  "seconds": "10.0",
  "size": "1920x1080",
  "metadata": {
    "fps": 30,
    "seed": 12345
  }
}

Task Completed (200)

json
{
  "id": "vid_abc123xyz456",
  "object": "video",
  "model": "sora-1.0",
  "status": "completed",
  "progress": 100,
  "created_at": 1705334400,
  "completed_at": 1705334520,
  "expires_at": 1705420800,
  "seconds": "10.0",
  "size": "1920x1080",
  "url": "https://storage.example.com/videos/vid_abc123xyz456.mp4",
  "metadata": {
    "fps": 30,
    "seed": 12345
  }
}

Task Failed (200)

json
{
  "id": "vid_abc123xyz456",
  "object": "video",
  "model": "sora-1.0",
  "status": "failed",
  "progress": 0,
  "created_at": 1705334400,
  "seconds": "10.0",
  "error": {
    "message": "Content policy violation: inappropriate content detected",
    "code": "content_policy_violation"
  }
}

Task Not Found (404)

json
{
  "error": {
    "message": "Video task not found",
    "code": "task_not_found"
  }
}

Important Notes

  1. Polling Interval: Recommend querying status every 3-5 seconds to avoid excessive requests
  2. Timeout Handling: Video generation may take considerable time, set reasonable timeout values
  3. URL Validity: Video download links have expiration times, download before expires_at
  4. Error Retry: Implement retry mechanism for network errors
  5. Status Caching: Task status information is retained for a period after completion for querying

企业合作联系:service@ezmodel.cloud