curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "sora-2",
"url": "https://example.com/character-video.mp4",
"timestamps": "1,3"
}'
curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "sora-2",
"from_task": "task_01KBYT59JDHB4A3KDDR9N9JVWP",
"timestamps": "1,3"
}'
import requests
# Создание персонажа из URL видео
response = requests.post(
"https://toapis.com/v1/videos/generations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"model": "sora-2",
"url": "https://example.com/character-video.mp4",
"timestamps": "1,3"
}
)
task = response.json()
print(f"ID задачи: {task['id']}")
print(f"Статус: {task['status']}")
# Создание персонажа из существующей задачи
response = requests.post(
"https://toapis.com/v1/videos/generations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"model": "sora-2",
"from_task": "task_01KBYT59JDHB4A3KDDR9N9JVWP",
"timestamps": "1,3"
}
)
// Создание персонажа из URL видео
const response = await fetch('https://toapis.com/v1/videos/generations', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'sora-2',
url: 'https://example.com/character-video.mp4',
timestamps: '1,3'
})
});
const task = await response.json();
console.log(`ID задачи: ${task.id}`);
console.log(`Статус: ${task.status}`);
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
url := "https://toapis.com/v1/videos/generations"
payload := map[string]interface{}{
"model": "sora-2",
"url": "https://example.com/character-video.mp4",
"timestamps": "1,3",
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
{
"id": "task_01KBYT59JDHB4A3KDDR9N9JVWP",
"object": "generation.task",
"model": "sora-2",
"status": "queued",
"progress": 0,
"created_at": 1703884800,
"metadata": {}
}
{
"id": "task_01KC0JZCMTMQ70D68XTM56Q5D0",
"object": "generation.task",
"model": "sora-2",
"status": "completed",
"progress": 100,
"created_at": 1765251461,
"completed_at": 1765251507,
"result": {
"type": "character",
"data": {
"characters": [
{
"id": "ch_6937998961208191a45ef08447a554df",
"display_name": "Turbo Whiskers",
"profile_picture_url": "https://upload.toapis.com/f/image/character_task_xxx.jpg",
"username": "duksvfkf.turbo_whis"
}
]
}
},
"metadata": {}
}
{
"error": {
"code": 400,
"message": "Неверный запрос: диапазон timestamps должен быть от 1 до 3 секунд",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Ошибка аутентификации, проверьте ваш API ключ",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Недостаточно средств на счёте, пополните баланс",
"type": "payment_required"
}
}
Sora2
Sora2 Создание персонажа
Извлечение персонажей из видео для последующей генерации
POST
/
v1
/
videos
/
generations
curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "sora-2",
"url": "https://example.com/character-video.mp4",
"timestamps": "1,3"
}'
curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "sora-2",
"from_task": "task_01KBYT59JDHB4A3KDDR9N9JVWP",
"timestamps": "1,3"
}'
import requests
# Создание персонажа из URL видео
response = requests.post(
"https://toapis.com/v1/videos/generations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"model": "sora-2",
"url": "https://example.com/character-video.mp4",
"timestamps": "1,3"
}
)
task = response.json()
print(f"ID задачи: {task['id']}")
print(f"Статус: {task['status']}")
# Создание персонажа из существующей задачи
response = requests.post(
"https://toapis.com/v1/videos/generations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"model": "sora-2",
"from_task": "task_01KBYT59JDHB4A3KDDR9N9JVWP",
"timestamps": "1,3"
}
)
// Создание персонажа из URL видео
const response = await fetch('https://toapis.com/v1/videos/generations', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'sora-2',
url: 'https://example.com/character-video.mp4',
timestamps: '1,3'
})
});
const task = await response.json();
console.log(`ID задачи: ${task.id}`);
console.log(`Статус: ${task.status}`);
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
url := "https://toapis.com/v1/videos/generations"
payload := map[string]interface{}{
"model": "sora-2",
"url": "https://example.com/character-video.mp4",
"timestamps": "1,3",
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
{
"id": "task_01KBYT59JDHB4A3KDDR9N9JVWP",
"object": "generation.task",
"model": "sora-2",
"status": "queued",
"progress": 0,
"created_at": 1703884800,
"metadata": {}
}
{
"id": "task_01KC0JZCMTMQ70D68XTM56Q5D0",
"object": "generation.task",
"model": "sora-2",
"status": "completed",
"progress": 100,
"created_at": 1765251461,
"completed_at": 1765251507,
"result": {
"type": "character",
"data": {
"characters": [
{
"id": "ch_6937998961208191a45ef08447a554df",
"display_name": "Turbo Whiskers",
"profile_picture_url": "https://upload.toapis.com/f/image/character_task_xxx.jpg",
"username": "duksvfkf.turbo_whis"
}
]
}
},
"metadata": {}
}
{
"error": {
"code": 400,
"message": "Неверный запрос: диапазон timestamps должен быть от 1 до 3 секунд",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Ошибка аутентификации, проверьте ваш API ключ",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Недостаточно средств на счёте, пополните баланс",
"type": "payment_required"
}
}
Для пользователей из материкового Китая: используйте
https://toapis.cn в качестве эндпоинта (Base URL). Замените https://toapis.com на https://toapis.cn во всех примерах этого документа.Обзор
Функция создания персонажей Sora2 позволяет извлекать персонажей из существующих видео. После создания персонаж можно повторно использовать в последующих генерациях видео для сохранения консистентности.Важно:
- Видео должно содержать звук и узнаваемого персонажа
- Ограничение временного диапазона: минимум 1 секунда, максимум 3 секунды
- Требуется один из параметров:
urlилиfrom_task - Параметр
promptне требуется в этом режиме - После создания ID задачи персонажа можно использовать для генерации видео
Аутентификация
string
обязательно
Bearer Token аутентификацияПолучите API Key на странице управления ключами
Authorization: Bearer YOUR_API_KEY
Параметры запроса
string
по умолчанию:"sora-2"
обязательно
Название модели генерации видеоПоддерживаемые модели:
sora-2- Стандартная версияsora-2-pro- Профессиональная версия (более высокое качество)sora-2-vip- VIP версия, более высокий приоритет
string
обязательно
Временной диапазон появления персонажаЕдиница измерения — секунды, формат:
"начало,конец"Ограничения:- Минимальная разница: 1 секунда
- Максимальная разница: 3 секунды
"1,3" означает персонажа с 1-й по 3-ю секунду видеоstring
URL видео с персонажем для извлеченияТребования:
- Видео должно содержать звук
- Видео должно содержать узнаваемого персонажа
url или from_taskПример: "https://example.com/my-video.mp4"string
ID ранее созданной задачи генерации видеоСоздание персонажа из существующей задачиПримечание: Требуется
url или from_taskПример: "task_01KBYT59JDHB4A3KDDR9N9JVWP"Поля ответа
string
Уникальный идентификатор задачи для запроса статуса создания персонажаПосле завершения этот ID можно использовать в генерации видео через параметр
character_urlstring
Тип объекта, всегда
generation.taskstring
Использованная модель
string
Статус задачи:
queued- В очереди на обработкуin_progress- Обрабатываетсяcompleted- Успешно завершеноfailed- Ошибка
integer
Прогресс выполнения задачи в процентах (0-100)
integer
Время создания задачи (Unix timestamp)
integer
Время завершения задачи (Unix timestamp, только после завершения)
object
Результат создания персонажа (только после завершения)Содержит информацию о персонаже: ID, имя, изображение профиля и т.д.
curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "sora-2",
"url": "https://example.com/character-video.mp4",
"timestamps": "1,3"
}'
curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "sora-2",
"from_task": "task_01KBYT59JDHB4A3KDDR9N9JVWP",
"timestamps": "1,3"
}'
import requests
# Создание персонажа из URL видео
response = requests.post(
"https://toapis.com/v1/videos/generations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"model": "sora-2",
"url": "https://example.com/character-video.mp4",
"timestamps": "1,3"
}
)
task = response.json()
print(f"ID задачи: {task['id']}")
print(f"Статус: {task['status']}")
# Создание персонажа из существующей задачи
response = requests.post(
"https://toapis.com/v1/videos/generations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"model": "sora-2",
"from_task": "task_01KBYT59JDHB4A3KDDR9N9JVWP",
"timestamps": "1,3"
}
)
// Создание персонажа из URL видео
const response = await fetch('https://toapis.com/v1/videos/generations', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'sora-2',
url: 'https://example.com/character-video.mp4',
timestamps: '1,3'
})
});
const task = await response.json();
console.log(`ID задачи: ${task.id}`);
console.log(`Статус: ${task.status}`);
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
url := "https://toapis.com/v1/videos/generations"
payload := map[string]interface{}{
"model": "sora-2",
"url": "https://example.com/character-video.mp4",
"timestamps": "1,3",
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
{
"id": "task_01KBYT59JDHB4A3KDDR9N9JVWP",
"object": "generation.task",
"model": "sora-2",
"status": "queued",
"progress": 0,
"created_at": 1703884800,
"metadata": {}
}
{
"id": "task_01KC0JZCMTMQ70D68XTM56Q5D0",
"object": "generation.task",
"model": "sora-2",
"status": "completed",
"progress": 100,
"created_at": 1765251461,
"completed_at": 1765251507,
"result": {
"type": "character",
"data": {
"characters": [
{
"id": "ch_6937998961208191a45ef08447a554df",
"display_name": "Turbo Whiskers",
"profile_picture_url": "https://upload.toapis.com/f/image/character_task_xxx.jpg",
"username": "duksvfkf.turbo_whis"
}
]
}
},
"metadata": {}
}
{
"error": {
"code": 400,
"message": "Неверный запрос: диапазон timestamps должен быть от 1 до 3 секунд",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Ошибка аутентификации, проверьте ваш API ключ",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Недостаточно средств на счёте, пополните баланс",
"type": "payment_required"
}
}
Порядок использования
1
Отправка запроса на создание персонажа
Вызовите API с URL видео или ID существующей задачи, содержащей персонажа, а также временным диапазоном
2
Получение ID задачи
API возвращает ID задачи со статусом
queued или in_progress3
Запрос статуса задачи
Используйте Запрос статуса видео-задачи для отслеживания прогресса
4
Использование персонажа в генерации видео
После завершения создания персонажа используйте параметр
character_url для ссылки на ID задачи персонажаЛучшие практики
- Выбирайте чёткие сегменты с персонажем: Выбирайте 1-3 секундные сегменты, где черты персонажа наиболее различимы
- Обеспечьте качество видео: Видео высокого разрешения позволяет лучше извлекать характеристики персонажа
- Включайте звук: Видео должно содержать звуковую дорожку
- Избегайте нескольких персонажей: В выбранном временном диапазоне должен быть только один основной персонаж