Skip to content

Sora Get Video Content

Get the video file content of a completed video task.

This interface proxies and returns the video file stream, which can be directly downloaded or played in a browser.

API Details

Endpoint: GET /v1/videos/{task_id}/content

Description: Get the video file generated by the specified video task. Returns the video file's binary stream, suitable for downloading or direct playback.

Authentication: Bearer Token

http
Authorization: Bearer YOUR_API_TOKEN

Request Parameters

Path Parameters

ParameterTypeRequiredDescriptionExample
task_idstringYesVideo task IDvid_abc123xyz456

Response Parameters

Success Response (200)

Content-Type: video/mp4

Returns the video file's binary stream.

Error Response (404)

Content-Type: application/json

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

Code Examples

cURL

bash
# Download video to local file
curl -X GET "https://api.ezmodel.cloud/v1/videos/vid_abc123xyz456/content" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -o video.mp4

# Or view response headers in terminal
curl -I "https://api.ezmodel.cloud/v1/videos/vid_abc123xyz456/content" \
  -H "Authorization: Bearer YOUR_API_KEY"

Python

python
import requests

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

# Download video
response = requests.get(url, headers=headers, stream=True)

if response.status_code == 200:
    # Save to local file
    with open("output_video.mp4", "wb") as f:
        for chunk in response.iter_content(chunk_size=8192):
            f.write(chunk)
    print("Video downloaded successfully!")
elif response.status_code == 404:
    error = response.json()
    print(f"Error: {error.get('error', {}).get('message')}")
else:
    print(f"Request failed: {response.status_code}")

JavaScript (Node.js)

javascript
const fs = require('fs');
const https = require('https');

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

const options = {
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
};

// Download video
https.get(url, options, (response) => {
  if (response.statusCode === 200) {
    const fileStream = fs.createWriteStream('output_video.mp4');
    response.pipe(fileStream);
    
    fileStream.on('finish', () => {
      fileStream.close();
      console.log('Video downloaded successfully!');
    });
  } else {
    console.error(`Request failed: ${response.statusCode}`);
  }
}).on('error', (err) => {
  console.error('Download error:', err.message);
});

JavaScript (Browser)

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

// Download video file
async function downloadVideo() {
  try {
    const response = await fetch(url, {
      method: 'GET',
      headers: {
        'Authorization': 'Bearer YOUR_API_KEY'
      }
    });
    
    if (response.ok) {
      const blob = await response.blob();
      const downloadUrl = window.URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = downloadUrl;
      a.download = 'video.mp4';
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
      window.URL.revokeObjectURL(downloadUrl);
      console.log('Video downloaded successfully!');
    } else {
      const error = await response.json();
      console.error('Error:', error.error?.message);
    }
  } catch (err) {
    console.error('Download error:', err);
  }
}

// Or play directly in browser
function playVideo() {
  const videoElement = document.getElementById('video-player');
  videoElement.src = url;
  videoElement.play();
}

Go

go
package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
)

func main() {
    taskID := "vid_abc123xyz456"
    url := fmt.Sprintf("https://api.ezmodel.cloud/v1/videos/%s/content", taskID)
    
    // Create request
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        panic(err)
    }
    req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
    
    // Send request
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    if resp.StatusCode == 200 {
        // Create output file
        out, err := os.Create("output_video.mp4")
        if err != nil {
            panic(err)
        }
        defer out.Close()
        
        // Write to file
        _, err = io.Copy(out, resp.Body)
        if err != nil {
            panic(err)
        }
        
        fmt.Println("Video downloaded successfully!")
    } else {
        fmt.Printf("Request failed: %d\n", resp.StatusCode)
    }
}

Java

java
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;

public class SoraVideoContentExample {
    public static void main(String[] args) throws Exception {
        String taskId = "vid_abc123xyz456";
        String url = "https://api.ezmodel.cloud/v1/videos/" + taskId + "/content";
        
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .header("Authorization", "Bearer YOUR_API_KEY")
            .GET()
            .build();
        
        HttpResponse<InputStream> response = client.send(request,
            HttpResponse.BodyHandlers.ofInputStream());
        
        if (response.statusCode() == 200) {
            // Save to file
            try (FileOutputStream fos = new FileOutputStream("output_video.mp4");
                 InputStream is = response.body()) {
                byte[] buffer = new byte[8192];
                int bytesRead;
                while ((bytesRead = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, bytesRead);
                }
            }
            System.out.println("Video downloaded successfully!");
        } else {
            System.out.println("Request failed: " + response.statusCode());
        }
    }
}

C#

csharp
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

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}/content";
        
        client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_API_KEY");
        
        try
        {
            var response = await client.GetAsync(url);
            
            if (response.IsSuccessStatusCode)
            {
                // Download and save video
                using var fileStream = new FileStream("output_video.mp4", FileMode.Create);
                await response.Content.CopyToAsync(fileStream);
                Console.WriteLine("Video downloaded successfully!");
            }
            else if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
            {
                var error = await response.Content.ReadAsStringAsync();
                Console.WriteLine($"Error: {error}");
            }
            else
            {
                Console.WriteLine($"Request failed: {response.StatusCode}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Download error: {ex.Message}");
        }
    }
}

Response Examples

Success Response (200)

Headers:

HTTP/1.1 200 OK
Content-Type: video/mp4
Content-Length: 15728640
Content-Disposition: attachment; filename="video.mp4"

Body: Video file binary stream

Error Response (404)

json
{
  "error": {
    "message": "Video not found or not ready",
    "code": "video_not_found"
  }
}

Use Cases

1. Direct Download and Save

python
import requests

def download_video(task_id, output_path):
    url = f"https://api.ezmodel.cloud/v1/videos/{task_id}/content"
    headers = {"Authorization": "Bearer YOUR_API_KEY"}
    
    response = requests.get(url, headers=headers, stream=True)
    
    if response.status_code == 200:
        with open(output_path, "wb") as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)
        return True
    return False

# Usage
if download_video("vid_abc123xyz456", "my_video.mp4"):
    print("Download successful!")

2. Play in Web Browser

html
<!DOCTYPE html>
<html>
<head>
    <title>Video Playback</title>
</head>
<body>
    <video id="videoPlayer" controls width="640" height="360">
        Your browser does not support video playback.
    </video>
    
    <script>
        const taskId = 'vid_abc123xyz456';
        const apiKey = 'YOUR_API_KEY';
        const url = `https://api.ezmodel.cloud/v1/videos/${taskId}/content`;
        
        // Method 1: Set video source directly (requires CORS support)
        const video = document.getElementById('videoPlayer');
        video.src = url;
        
        // Method 2: Fetch blob via fetch and play
        fetch(url, {
            headers: {
                'Authorization': `Bearer ${apiKey}`
            }
        })
        .then(response => response.blob())
        .then(blob => {
            const blobUrl = URL.createObjectURL(blob);
            video.src = blobUrl;
        })
        .catch(error => console.error('Failed to load video:', error));
    </script>
</body>
</html>

3. Complete Download Flow (with Status Polling)

python
import requests
import time

def wait_and_download(task_id, output_path):
    base_url = "https://api.ezmodel.cloud/v1/videos"
    headers = {"Authorization": "Bearer YOUR_API_KEY"}
    
    # Poll task status
    while True:
        status_response = requests.get(f"{base_url}/{task_id}", headers=headers)
        result = status_response.json()
        
        if result['status'] == 'completed':
            print("Video generation completed, starting download...")
            break
        elif result['status'] == 'failed':
            print(f"Video generation failed: {result.get('error', {}).get('message')}")
            return False
        
        print(f"Progress: {result['progress']}%")
        time.sleep(5)
    
    # Download video
    content_response = requests.get(
        f"{base_url}/{task_id}/content",
        headers=headers,
        stream=True
    )
    
    if content_response.status_code == 200:
        with open(output_path, "wb") as f:
            for chunk in content_response.iter_content(chunk_size=8192):
                f.write(chunk)
        print(f"Video saved to: {output_path}")
        return True
    
    return False

# Usage
wait_and_download("vid_abc123xyz456", "final_video.mp4")

Important Notes

  1. Task Status: Only tasks with status completed can retrieve video content
  2. File Size: Video files can be large, recommend using streaming download (stream=True)
  3. Timeout Settings: Increase request timeout for large file downloads
  4. Network Retry: Implement retry mechanism for download failures
  5. Storage Space: Ensure sufficient disk space before downloading
  6. Content-Type: Response Content-Type is usually video/mp4, but may be other video formats
  7. CORS Settings: Direct browser playback requires server to support cross-origin access

Common Error Codes

Error CodeDescriptionSolution
video_not_foundVideo task does not existCheck if task_id is correct
video_not_readyVideo not yet generatedWait for task completion before requesting
video_expiredVideo has expiredVideo has been deleted, need to regenerate
unauthorizedAuthentication failedCheck if API Key is correct

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