curl --request GET \
--url 'https://toapis.com/v1/videos/generations/task_01K9S419324DREZFBWNSVXYR6H' \
--header 'Authorization: Bearer <token>'
import requests
import time
API_BASE = 'https://toapis.com'
API_KEY = 'sk-xxxxxxxxxxxxxxxxxxxxxx'
headers = {
'Authorization': f'Bearer {API_KEY}'
}
def get_video_status(task_id):
response = requests.get(f'{API_BASE}/v1/videos/generations/{task_id}', headers=headers)
return response.json()
def wait_for_video(task_id, max_attempts=60, interval=10):
for _ in range(max_attempts):
result = get_video_status(task_id)
status = result.get('status')
progress = result.get('progress', 0)
print(f"Статус: {status}, Прогресс: {progress}%")
if status == 'completed':
return result
elif status == 'failed':
raise Exception(f"Задача не выполнена: {result}")
time.sleep(interval)
raise Exception("Таймаут задачи")
# Пример использования
task_id = "task_01K9S419324DREZFBWNSVXYR6H"
result = wait_for_video(task_id)
print(f"URL видео: {result['result']['data'][0]['url']}")
const API_BASE = 'https://toapis.com';
const API_KEY = 'sk-xxxxxxxxxxxxxxxxxxxxxx';
async function getVideoStatus(taskId) {
const response = await fetch(`${API_BASE}/v1/videos/generations/${taskId}`, {
headers: {
'Authorization': `Bearer ${API_KEY}`
}
});
return response.json();
}
async function waitForVideo(taskId, maxAttempts = 60, interval = 10000) {
for (let i = 0; i < maxAttempts; i++) {
const result = await getVideoStatus(taskId);
const status = result.status;
const progress = result.progress || 0;
console.log(`Статус: ${status}, Прогресс: ${progress}%`);
if (status === 'completed') {
return result;
} else if (status === 'failed') {
throw new Error(`Задача не выполнена: ${JSON.stringify(result)}`);
}
await new Promise(r => setTimeout(r, interval));
}
throw new Error('Таймаут задачи');
}
// Пример использования
const taskId = 'task_01K9S419324DREZFBWNSVXYR6H';
waitForVideo(taskId).then(result => {
console.log('URL видео:', result.result.data[0].url);
console.log('Формат:', result.result.data[0].format);
});
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)
func getVideoStatus(taskId string) (map[string]interface{}, error) {
url := fmt.Sprintf("https://toapis.com/v1/videos/generations/%s", taskId)
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer <token>")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
var result map[string]interface{}
json.Unmarshal(body, &result)
return result, nil
}
func main() {
taskId := "task_01K9S419324DREZFBWNSVXYR6H"
for i := 0; i < 60; i++ {
result, _ := getVideoStatus(taskId)
status := result["status"].(string)
progress := int(result["progress"].(float64))
fmt.Printf("Статус: %s, Прогресс: %d%%\n", status, progress)
if status == "completed" {
fmt.Println("Генерация видео завершена!")
resultData := result["result"].(map[string]interface{})
dataArray := resultData["data"].([]interface{})
videoData := dataArray[0].(map[string]interface{})
fmt.Println("URL видео:", videoData["url"])
break
}
time.Sleep(10 * time.Second)
}
}
{
"id": "video_7497f4d5-3a88-44c7-923a-967fa7d941a0",
"object": "generation.task",
"model": "sora-2",
"status": "queued",
"progress": 0,
"created_at": 1768380222
}
{
"id": "video_7497f4d5-3a88-44c7-923a-967fa7d941a0",
"object": "generation.task",
"model": "sora-2",
"status": "in_progress",
"progress": 65,
"created_at": 1768380222
}
{
"id": "tsk_vid_01KRDG4S50XXXXXXXXXXXXXXX",
"object": "generation.task",
"model": "seedance-2",
"status": "completed",
"progress": 100,
"created_at": 1778569600,
"completed_at": 1778569900,
"expires_at": 1778656300,
"result": {
"type": "video",
"data": [
{
"url": "https://files.toapis.com/videos/tsk_vid_01KRDG4S50XXXXXXXXXXXXXXX/********_********.mp4",
"format": "mp4"
}
]
}
}
{
"id": "video_7497f4d5-3a88-44c7-923a-967fa7d941a0",
"object": "generation.task",
"model": "sora-2",
"status": "failed",
"progress": 0,
"created_at": 1768380222,
"error": {
"code": "generation_failed",
"message": "Генерация не удалась: Контент нарушает политику контента"
}
}
{
"error": {
"code": 404,
"message": "Задача не найдена",
"type": "not_found_error"
}
}
{
"error": {
"code": 401,
"message": "Ошибка аутентификации, проверьте ваш API ключ",
"type": "authentication_error"
}
}
Управление задачами
Получить статус задачи видео
Запрос статуса и результатов задачи генерации видео
GET
/
v1
/
videos
/
generations
/
{task_id}
curl --request GET \
--url 'https://toapis.com/v1/videos/generations/task_01K9S419324DREZFBWNSVXYR6H' \
--header 'Authorization: Bearer <token>'
import requests
import time
API_BASE = 'https://toapis.com'
API_KEY = 'sk-xxxxxxxxxxxxxxxxxxxxxx'
headers = {
'Authorization': f'Bearer {API_KEY}'
}
def get_video_status(task_id):
response = requests.get(f'{API_BASE}/v1/videos/generations/{task_id}', headers=headers)
return response.json()
def wait_for_video(task_id, max_attempts=60, interval=10):
for _ in range(max_attempts):
result = get_video_status(task_id)
status = result.get('status')
progress = result.get('progress', 0)
print(f"Статус: {status}, Прогресс: {progress}%")
if status == 'completed':
return result
elif status == 'failed':
raise Exception(f"Задача не выполнена: {result}")
time.sleep(interval)
raise Exception("Таймаут задачи")
# Пример использования
task_id = "task_01K9S419324DREZFBWNSVXYR6H"
result = wait_for_video(task_id)
print(f"URL видео: {result['result']['data'][0]['url']}")
const API_BASE = 'https://toapis.com';
const API_KEY = 'sk-xxxxxxxxxxxxxxxxxxxxxx';
async function getVideoStatus(taskId) {
const response = await fetch(`${API_BASE}/v1/videos/generations/${taskId}`, {
headers: {
'Authorization': `Bearer ${API_KEY}`
}
});
return response.json();
}
async function waitForVideo(taskId, maxAttempts = 60, interval = 10000) {
for (let i = 0; i < maxAttempts; i++) {
const result = await getVideoStatus(taskId);
const status = result.status;
const progress = result.progress || 0;
console.log(`Статус: ${status}, Прогресс: ${progress}%`);
if (status === 'completed') {
return result;
} else if (status === 'failed') {
throw new Error(`Задача не выполнена: ${JSON.stringify(result)}`);
}
await new Promise(r => setTimeout(r, interval));
}
throw new Error('Таймаут задачи');
}
// Пример использования
const taskId = 'task_01K9S419324DREZFBWNSVXYR6H';
waitForVideo(taskId).then(result => {
console.log('URL видео:', result.result.data[0].url);
console.log('Формат:', result.result.data[0].format);
});
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)
func getVideoStatus(taskId string) (map[string]interface{}, error) {
url := fmt.Sprintf("https://toapis.com/v1/videos/generations/%s", taskId)
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer <token>")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
var result map[string]interface{}
json.Unmarshal(body, &result)
return result, nil
}
func main() {
taskId := "task_01K9S419324DREZFBWNSVXYR6H"
for i := 0; i < 60; i++ {
result, _ := getVideoStatus(taskId)
status := result["status"].(string)
progress := int(result["progress"].(float64))
fmt.Printf("Статус: %s, Прогресс: %d%%\n", status, progress)
if status == "completed" {
fmt.Println("Генерация видео завершена!")
resultData := result["result"].(map[string]interface{})
dataArray := resultData["data"].([]interface{})
videoData := dataArray[0].(map[string]interface{})
fmt.Println("URL видео:", videoData["url"])
break
}
time.Sleep(10 * time.Second)
}
}
{
"id": "video_7497f4d5-3a88-44c7-923a-967fa7d941a0",
"object": "generation.task",
"model": "sora-2",
"status": "queued",
"progress": 0,
"created_at": 1768380222
}
{
"id": "video_7497f4d5-3a88-44c7-923a-967fa7d941a0",
"object": "generation.task",
"model": "sora-2",
"status": "in_progress",
"progress": 65,
"created_at": 1768380222
}
{
"id": "tsk_vid_01KRDG4S50XXXXXXXXXXXXXXX",
"object": "generation.task",
"model": "seedance-2",
"status": "completed",
"progress": 100,
"created_at": 1778569600,
"completed_at": 1778569900,
"expires_at": 1778656300,
"result": {
"type": "video",
"data": [
{
"url": "https://files.toapis.com/videos/tsk_vid_01KRDG4S50XXXXXXXXXXXXXXX/********_********.mp4",
"format": "mp4"
}
]
}
}
{
"id": "video_7497f4d5-3a88-44c7-923a-967fa7d941a0",
"object": "generation.task",
"model": "sora-2",
"status": "failed",
"progress": 0,
"created_at": 1768380222,
"error": {
"code": "generation_failed",
"message": "Генерация не удалась: Контент нарушает политику контента"
}
}
{
"error": {
"code": 404,
"message": "Задача не найдена",
"type": "not_found_error"
}
}
{
"error": {
"code": 401,
"message": "Ошибка аутентификации, проверьте ваш API ключ",
"type": "authentication_error"
}
}
- Запрос статуса выполнения и результатов асинхронной задачи генерации видео
- Обновление статуса и отслеживание прогресса в реальном времени
- Получение сгенерированных видео при завершении задачи
- Поддержка многоязычности (zh/en/ko/ja)
Авторизация
string
обязательно
Все эндпоинты требуют аутентификации Bearer TokenПолучить API ключ:Посетите Страницу управления API ключами для получения API ключаДобавьте в заголовок запроса:
Authorization: Bearer YOUR_API_KEY
Параметры пути
string
обязательно
ID задачи, возвращенный API генерации видео
curl --request GET \
--url 'https://toapis.com/v1/videos/generations/task_01K9S419324DREZFBWNSVXYR6H' \
--header 'Authorization: Bearer <token>'
import requests
import time
API_BASE = 'https://toapis.com'
API_KEY = 'sk-xxxxxxxxxxxxxxxxxxxxxx'
headers = {
'Authorization': f'Bearer {API_KEY}'
}
def get_video_status(task_id):
response = requests.get(f'{API_BASE}/v1/videos/generations/{task_id}', headers=headers)
return response.json()
def wait_for_video(task_id, max_attempts=60, interval=10):
for _ in range(max_attempts):
result = get_video_status(task_id)
status = result.get('status')
progress = result.get('progress', 0)
print(f"Статус: {status}, Прогресс: {progress}%")
if status == 'completed':
return result
elif status == 'failed':
raise Exception(f"Задача не выполнена: {result}")
time.sleep(interval)
raise Exception("Таймаут задачи")
# Пример использования
task_id = "task_01K9S419324DREZFBWNSVXYR6H"
result = wait_for_video(task_id)
print(f"URL видео: {result['result']['data'][0]['url']}")
const API_BASE = 'https://toapis.com';
const API_KEY = 'sk-xxxxxxxxxxxxxxxxxxxxxx';
async function getVideoStatus(taskId) {
const response = await fetch(`${API_BASE}/v1/videos/generations/${taskId}`, {
headers: {
'Authorization': `Bearer ${API_KEY}`
}
});
return response.json();
}
async function waitForVideo(taskId, maxAttempts = 60, interval = 10000) {
for (let i = 0; i < maxAttempts; i++) {
const result = await getVideoStatus(taskId);
const status = result.status;
const progress = result.progress || 0;
console.log(`Статус: ${status}, Прогресс: ${progress}%`);
if (status === 'completed') {
return result;
} else if (status === 'failed') {
throw new Error(`Задача не выполнена: ${JSON.stringify(result)}`);
}
await new Promise(r => setTimeout(r, interval));
}
throw new Error('Таймаут задачи');
}
// Пример использования
const taskId = 'task_01K9S419324DREZFBWNSVXYR6H';
waitForVideo(taskId).then(result => {
console.log('URL видео:', result.result.data[0].url);
console.log('Формат:', result.result.data[0].format);
});
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)
func getVideoStatus(taskId string) (map[string]interface{}, error) {
url := fmt.Sprintf("https://toapis.com/v1/videos/generations/%s", taskId)
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer <token>")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
var result map[string]interface{}
json.Unmarshal(body, &result)
return result, nil
}
func main() {
taskId := "task_01K9S419324DREZFBWNSVXYR6H"
for i := 0; i < 60; i++ {
result, _ := getVideoStatus(taskId)
status := result["status"].(string)
progress := int(result["progress"].(float64))
fmt.Printf("Статус: %s, Прогресс: %d%%\n", status, progress)
if status == "completed" {
fmt.Println("Генерация видео завершена!")
resultData := result["result"].(map[string]interface{})
dataArray := resultData["data"].([]interface{})
videoData := dataArray[0].(map[string]interface{})
fmt.Println("URL видео:", videoData["url"])
break
}
time.Sleep(10 * time.Second)
}
}
{
"id": "video_7497f4d5-3a88-44c7-923a-967fa7d941a0",
"object": "generation.task",
"model": "sora-2",
"status": "queued",
"progress": 0,
"created_at": 1768380222
}
{
"id": "video_7497f4d5-3a88-44c7-923a-967fa7d941a0",
"object": "generation.task",
"model": "sora-2",
"status": "in_progress",
"progress": 65,
"created_at": 1768380222
}
{
"id": "tsk_vid_01KRDG4S50XXXXXXXXXXXXXXX",
"object": "generation.task",
"model": "seedance-2",
"status": "completed",
"progress": 100,
"created_at": 1778569600,
"completed_at": 1778569900,
"expires_at": 1778656300,
"result": {
"type": "video",
"data": [
{
"url": "https://files.toapis.com/videos/tsk_vid_01KRDG4S50XXXXXXXXXXXXXXX/********_********.mp4",
"format": "mp4"
}
]
}
}
{
"id": "video_7497f4d5-3a88-44c7-923a-967fa7d941a0",
"object": "generation.task",
"model": "sora-2",
"status": "failed",
"progress": 0,
"created_at": 1768380222,
"error": {
"code": "generation_failed",
"message": "Генерация не удалась: Контент нарушает политику контента"
}
}
{
"error": {
"code": 404,
"message": "Задача не найдена",
"type": "not_found_error"
}
}
{
"error": {
"code": 401,
"message": "Ошибка аутентификации, проверьте ваш API ключ",
"type": "authentication_error"
}
}
Ответ
string
Уникальный идентификатор задачи
string
Тип объекта, всегда
generation.taskstring
Статус задачи
queued- Отправлена, ожидает обработкиin_progress- Обрабатываетсяcompleted- Успешно завершеноfailed- Ошибка
integer
Прогресс задачи в процентах (0-100)
string
Используемая модель генерации видео
integer
Время создания задачи (Unix timestamp)
integer
Время завершения задачи (Unix timestamp, возвращается только при завершении)
integer
Ожидаемое время завершения (секунды)
object
Результат задачи (возвращается только при успехе)
object
Использование инструментов модели. Для Seedance 2 с
tools: [{ "type": "web_search" }] поле usage.tool_usage.web_search содержит фактическое число поисков; 0 означает отсутствие поиска.integer
Время истечения URL видео (Unix timestamp)
object
Справка по статусам задач
| Статус | Описание | Финальный | Рекомендуемое действие |
|---|---|---|---|
queued | Задача отправлена, ожидает в очереди | ❌ | Подождите 5-10 секунд и повторите запрос |
in_progress | Задача обрабатывается | ❌ | Подождите 10-15 секунд и повторите запрос |
completed | Задача успешно завершена | ✅ | Получите видео из result.data[0].url |
failed | Обработка задачи не удалась | ✅ | Проверьте информацию об ошибке |
Стратегия опроса
Начальное ожидание: 5 секунд
Интервал опроса: 10 секунд
Максимальное ожидание: 600 секунд (10 минут)
Типичное время: 1-5 минут
Пример опроса на Python
import time
import random
import requests
def poll_video_task(task_id, api_key, max_wait=600):
"""Опрос задачи генерации видео до завершения или таймаута"""
start_time = time.time()
interval = 10 # Интервал 10 секунд
# Начальное ожидание 5 секунд
time.sleep(5)
while time.time() - start_time < max_wait:
response = requests.get(
f'https://toapis.com/v1/videos/generations/{task_id}',
headers={'Authorization': f'Bearer {api_key}'}
)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', interval))
time.sleep(retry_after + random.uniform(0, 1))
interval = min(interval * 2, 120)
continue
response.raise_for_status()
data = response.json()
print(f"Статус: {data['status']}, Прогресс: {data.get('progress', 0)}%")
if data['status'] == 'completed':
return {
'url': data['result']['data'][0]['url'],
'format': data['result']['data'][0].get('format'),
'expires_at': data.get('expires_at')
}
elif data['status'] == 'failed':
raise Exception(f"Генерация не удалась: {data['error']['message']}")
time.sleep(interval + random.uniform(0, 1))
raise TimeoutError("Таймаут задачи")
Срок действия ресурсов
URL сгенерированных видео действительны 24 часа
- Загрузите и сохраните видео в течение срока действия
- Поле
expires_atуказывает время истечения видео (Unix timestamp) - После истечения срока видео недоступны; для повторного получения отправьте новую задачу
- Превью истекает одновременно с видео
Коды ошибок
| HTTP код | Тип ошибки | Описание |
|---|---|---|
| 400 | invalid_request | Неверные параметры запроса |
| 401 | unauthorized | Ошибка аутентификации, проверьте API Key |
| 402 | insufficient_quota | Недостаточно средств |
| 404 | task_not_found | Задача не найдена |
| 422 | content_policy_violation | Нарушение политики контента |
| 429 | rate_limit_exceeded | Превышен лимит запросов |
| 500 | internal_error | Внутренняя ошибка сервера |
Советы по производительности
Генерация видео занимает больше времени, рекомендации:
- Используйте ToAPIs Task Webhook: Webhook — основной канал, polling — резерв
- Интервал polling: не менее 5–10 секунд с jitter; при 429 соблюдайте
Retry-Afterи exponential backoff - Установите таймаут: Длинные видео могут занимать 5-10 минут, установите разумный таймаут
- Загружайте своевременно: Видео истекают через 24 часа, обязательно сохраните в своё хранилище немедленно
⌘I