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_TOKENRequest Parameters
Path Parameters
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
| task_id | string | Yes | Video task ID | vid_abc123xyz456 |
Response Parameters
Success Response (200)
Content-Type: video/mp4
Returns the video file's binary stream.
Error Response (404)
Content-Type: application/json
| Parameter | Type | Description |
|---|---|---|
| error | object | Error information object |
| error.message | string | Error description |
| error.code | string | Error 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
- Task Status: Only tasks with status
completedcan retrieve video content - File Size: Video files can be large, recommend using streaming download (stream=True)
- Timeout Settings: Increase request timeout for large file downloads
- Network Retry: Implement retry mechanism for download failures
- Storage Space: Ensure sufficient disk space before downloading
- Content-Type: Response Content-Type is usually
video/mp4, but may be other video formats - CORS Settings: Direct browser playback requires server to support cross-origin access
Common Error Codes
| Error Code | Description | Solution |
|---|---|---|
video_not_found | Video task does not exist | Check if task_id is correct |
video_not_ready | Video not yet generated | Wait for task completion before requesting |
video_expired | Video has expired | Video has been deleted, need to regenerate |
unauthorized | Authentication failed | Check if API Key is correct |
