Песочница
curl --request POST \
--url https://api.widerouter.com/v1/task/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"input.prompt": "<string>",
"input.mode": "<string>",
"input.duration": 123,
"input.resolution": "<string>",
"input.aspect_ratio": "<string>",
"input.images": [
"<string>"
],
"input.video": "<string>",
"input.reference_images": [
"<string>"
],
"input.voice_ids": [
"<string>"
],
"input.generate_audio": true
},
"callback_url": "<string>"
}
'import requests
url = "https://api.widerouter.com/v1/task/submit"
payload = {
"model": "<string>",
"input": {
"input.prompt": "<string>",
"input.mode": "<string>",
"input.duration": 123,
"input.resolution": "<string>",
"input.aspect_ratio": "<string>",
"input.images": ["<string>"],
"input.video": "<string>",
"input.reference_images": ["<string>"],
"input.voice_ids": ["<string>"],
"input.generate_audio": True
},
"callback_url": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
input: {
'input.prompt': '<string>',
'input.mode': '<string>',
'input.duration': 123,
'input.resolution': '<string>',
'input.aspect_ratio': '<string>',
'input.images': ['<string>'],
'input.video': '<string>',
'input.reference_images': ['<string>'],
'input.voice_ids': ['<string>'],
'input.generate_audio': true
},
callback_url: '<string>'
})
};
fetch('https://api.widerouter.com/v1/task/submit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.widerouter.com/v1/task/submit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => '<string>',
'input' => [
'input.prompt' => '<string>',
'input.mode' => '<string>',
'input.duration' => 123,
'input.resolution' => '<string>',
'input.aspect_ratio' => '<string>',
'input.images' => [
'<string>'
],
'input.video' => '<string>',
'input.reference_images' => [
'<string>'
],
'input.voice_ids' => [
'<string>'
],
'input.generate_audio' => true
],
'callback_url' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.widerouter.com/v1/task/submit"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"input.prompt\": \"<string>\",\n \"input.mode\": \"<string>\",\n \"input.duration\": 123,\n \"input.resolution\": \"<string>\",\n \"input.aspect_ratio\": \"<string>\",\n \"input.images\": [\n \"<string>\"\n ],\n \"input.video\": \"<string>\",\n \"input.reference_images\": [\n \"<string>\"\n ],\n \"input.voice_ids\": [\n \"<string>\"\n ],\n \"input.generate_audio\": true\n },\n \"callback_url\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.widerouter.com/v1/task/submit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"input.prompt\": \"<string>\",\n \"input.mode\": \"<string>\",\n \"input.duration\": 123,\n \"input.resolution\": \"<string>\",\n \"input.aspect_ratio\": \"<string>\",\n \"input.images\": [\n \"<string>\"\n ],\n \"input.video\": \"<string>\",\n \"input.reference_images\": [\n \"<string>\"\n ],\n \"input.voice_ids\": [\n \"<string>\"\n ],\n \"input.generate_audio\": true\n },\n \"callback_url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.widerouter.com/v1/task/submit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"input\": {\n \"input.prompt\": \"<string>\",\n \"input.mode\": \"<string>\",\n \"input.duration\": 123,\n \"input.resolution\": \"<string>\",\n \"input.aspect_ratio\": \"<string>\",\n \"input.images\": [\n \"<string>\"\n ],\n \"input.video\": \"<string>\",\n \"input.reference_images\": [\n \"<string>\"\n ],\n \"input.voice_ids\": [\n \"<string>\"\n ],\n \"input.generate_audio\": true\n },\n \"callback_url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "task_IIISyUlKs0fJDptkSCLbcJvXWZLpECKM",
"status": "queued",
"created_at": 1788189046
}
Grok Imagine видео
Песочница
Отправьте с этой страницы реальную задачу генерации видео с использованием Grok Imagine, а затем проверяйте её статус с помощью возвращённого идентификатора задачи.
POST
/
v1
/
task
/
submit
Песочница
curl --request POST \
--url https://api.widerouter.com/v1/task/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"input.prompt": "<string>",
"input.mode": "<string>",
"input.duration": 123,
"input.resolution": "<string>",
"input.aspect_ratio": "<string>",
"input.images": [
"<string>"
],
"input.video": "<string>",
"input.reference_images": [
"<string>"
],
"input.voice_ids": [
"<string>"
],
"input.generate_audio": true
},
"callback_url": "<string>"
}
'import requests
url = "https://api.widerouter.com/v1/task/submit"
payload = {
"model": "<string>",
"input": {
"input.prompt": "<string>",
"input.mode": "<string>",
"input.duration": 123,
"input.resolution": "<string>",
"input.aspect_ratio": "<string>",
"input.images": ["<string>"],
"input.video": "<string>",
"input.reference_images": ["<string>"],
"input.voice_ids": ["<string>"],
"input.generate_audio": True
},
"callback_url": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
input: {
'input.prompt': '<string>',
'input.mode': '<string>',
'input.duration': 123,
'input.resolution': '<string>',
'input.aspect_ratio': '<string>',
'input.images': ['<string>'],
'input.video': '<string>',
'input.reference_images': ['<string>'],
'input.voice_ids': ['<string>'],
'input.generate_audio': true
},
callback_url: '<string>'
})
};
fetch('https://api.widerouter.com/v1/task/submit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.widerouter.com/v1/task/submit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => '<string>',
'input' => [
'input.prompt' => '<string>',
'input.mode' => '<string>',
'input.duration' => 123,
'input.resolution' => '<string>',
'input.aspect_ratio' => '<string>',
'input.images' => [
'<string>'
],
'input.video' => '<string>',
'input.reference_images' => [
'<string>'
],
'input.voice_ids' => [
'<string>'
],
'input.generate_audio' => true
],
'callback_url' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.widerouter.com/v1/task/submit"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"input.prompt\": \"<string>\",\n \"input.mode\": \"<string>\",\n \"input.duration\": 123,\n \"input.resolution\": \"<string>\",\n \"input.aspect_ratio\": \"<string>\",\n \"input.images\": [\n \"<string>\"\n ],\n \"input.video\": \"<string>\",\n \"input.reference_images\": [\n \"<string>\"\n ],\n \"input.voice_ids\": [\n \"<string>\"\n ],\n \"input.generate_audio\": true\n },\n \"callback_url\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.widerouter.com/v1/task/submit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"input.prompt\": \"<string>\",\n \"input.mode\": \"<string>\",\n \"input.duration\": 123,\n \"input.resolution\": \"<string>\",\n \"input.aspect_ratio\": \"<string>\",\n \"input.images\": [\n \"<string>\"\n ],\n \"input.video\": \"<string>\",\n \"input.reference_images\": [\n \"<string>\"\n ],\n \"input.voice_ids\": [\n \"<string>\"\n ],\n \"input.generate_audio\": true\n },\n \"callback_url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.widerouter.com/v1/task/submit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"input\": {\n \"input.prompt\": \"<string>\",\n \"input.mode\": \"<string>\",\n \"input.duration\": 123,\n \"input.resolution\": \"<string>\",\n \"input.aspect_ratio\": \"<string>\",\n \"input.images\": [\n \"<string>\"\n ],\n \"input.video\": \"<string>\",\n \"input.reference_images\": [\n \"<string>\"\n ],\n \"input.voice_ids\": [\n \"<string>\"\n ],\n \"input.generate_audio\": true\n },\n \"callback_url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "task_IIISyUlKs0fJDptkSCLbcJvXWZLpECKM",
"status": "queued",
"created_at": 1788189046
}
Введите свой API key и промпт, затем отправьте запрос. Это обращается к рабочему API — к тому же
эндпоинту, который вызывал бы ваш код, и это единственный способ обратиться к видеомоделям.
Завершённая задача содержит массив
Файл предоставляется как
Запросы, отправленные с этой страницы, являются реальными и тарифицируются по вашему ключу.
Видео тарифицируется за секунду: клип
480p продолжительностью одну секунду стоит от $0.05 до $0.08,
а клип 1080p продолжительностью пятнадцать секунд стоит несколько долларов. Начните с небольшой длительности.Параметры
string
обязательно
Модель для запуска. Принимает
grok-imagine-video или grok-imagine-video-1.5,
с точным совпадением. Только grok-imagine-video может редактировать или расширять существующий клип;
только grok-imagine-video-1.5 обеспечивает доступ к 1080p и предустановленным голосам.object
обязательно
Параметры генерации. Любой ключ, не указанный ниже, отклоняется с
invalid_params.Показать input
Показать input
string
обязательно
Что нужно сгенерировать или что изменить при редактировании.
string
по умолчанию:"generate"
generate, edit или extend. Для edit и extend требуется
input.video, и они работают только с grok-imagine-video.integer
Длительность в секундах: от 1 до 15. В режиме
extend вышестоящая модель
сужает этот диапазон до 2–10; это ограничение применяется после постановки задачи
в очередь, а не во время отправки. Не используется для edit, который
наследует длительность исходного материала.string
по умолчанию:"480p"
480p, 720p или 1080p только для grok-imagine-video-1.5. Отклоняется в режиме
edit и ограничивается значением 720p, если задан input.reference_images.string
по умолчанию:"16:9"
Одно из значений
1:1 16:9 9:16 4:3 3:4 3:2 2:3. Здесь нет
auto, в отличие от моделей для изображений.string[]
Ровно одно изображение, используемое как первый кадр клипа. URL
https
или URI данных в формате base64. Нельзя использовать вместе с input.reference_images.string
Исходный клип для
edit и extend. URL https или URI данных видео
в формате base64 длительностью не менее 2 секунд. Оплата взимается за каждую секунду входных данных.string[]
До 3 изображений, из которых модель берёт стиль и объект. Ограничивает результат значением
720p. Нельзя использовать вместе с input.images.string[]
До 3 предустановленных голосов, только
grok-imagine-video-1.5. Значение не
проверяется во время отправки, поэтому неправильное имя приведёт к сбою задачи позднее.boolean
по умолчанию:"true"
Установите
false для создания клипа без звука. На стоимость это не влияет.string
URL
https, на который методом POST отправляется завершённая задача, чтобы можно было отказаться от опроса.
Поскольку обработка видео занимает от 20 до 50 секунд, стоит настроить обратный вызов.Что возвращается
После отправки запрос возвращается немедленно — значительно меньше чем за секунду. Клип не входит в этот ответ: генерация выполняется в фоновом режиме.| Поле | Тип | Примечания |
|---|---|---|
id | string | Идентификатор задачи. Он требуется для всего остального. |
status | string | queued для новой задачи. |
created_at | integer | Секунды Unix, UTC. |
{
"id": "task_IIISyUlKs0fJDptkSCLbcJvXWZLpECKM",
"status": "queued",
"created_at": 1788189046
}
Затем опрашивайте результат
Эта песочница охватывает только вызов создания. Возьмитеid из приведённого выше ответа и проверяйте задачу, пока status не достигнет completed или failed — в зависимости от длительности и разрешения это обычно занимает от 20 до 50 секунд.
curl https://api.widerouter.com/v1/task/$TASK_ID \
-H "Authorization: Bearer $WIDEROUTER_API_KEY"
outputs с одним файлом MP4:
{
"id": "task_IIISyUlKs0fJDptkSCLbcJvXWZLpECKM",
"model": "grok-imagine-video",
"status": "completed",
"created_at": 1788189046,
"completed_at": 1788189065,
"expires_at": 1788275465,
"outputs": ["https://r2cdn.agisuitepro.com/o/2026/08/31/task_IIISyUlKs0fJDptkSCLbcJvXWZLpECKM_0.mp4"],
"counts": { "requested": 1, "succeeded": 1, "failed": 0 },
"usage": { "cost_in_usd_ticks": 500000000 }
}
video/mp4 и воспроизводится встроенно. Его длительность примерно на 0,04 секунды больше запрошенной.
URL-адреса вывода не требуют аутентификации и становятся недействительными через 24 часа после завершения задачи.
usage.cost_in_usd_ticks — это публичная цена; ваш баланс изменяется на эту
сумму, умноженную на коэффициент тарифа вашей группы — см.
тарификацию.Следующие шаги
Обзор
Режимы, уровни продолжительности и разрешения, референсные изображения, голоса и цены.
API асинхронных задач
Цикл опроса, обратные вызовы и полная таблица ошибок.