Общая документация Public API · API-ключ можно создать в настройках аккаунта
Grok Video делает короткие ролики длительностью от 6 до 30 секунд: оживляет готовые изображения или создаёт видео только по текстовому описанию. Сценарий задаётся параметром model:
grok-imagine/image-to-video) - передайте ссылки на изображения в image_urls и опишите, что должно происходить в кадре;grok-imagine/text-to-video) - достаточно задания и соотношения сторон.Каждый запуск создаёт асинхронную операцию. Сразу после запроса API возвращает id, а готовое видео нужно получить отдельной проверкой статуса.
POST /api/v1/operationshttps://bratuha.ru/api/v1/operationsAuthorization: Bearer brth_...Если model не передан, используется grok-imagine/image-to-video, и тогда нужен image_urls. Поэтому для видео из текста всегда явно передавайте model.
{
"tool": "grok-video",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "grok-video".input - параметры запуска. Все поля передаются напрямую внутри этого объекта, без дополнительного вложенного объекта input.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
model | enum | Да | Сценарий: grok-imagine/image-to-video - видео из изображений, grok-imagine/text-to-video - видео из текста. |
prompt | string | Да | Описание ролика: что происходит в кадре, как движется камера, какой стиль и настроение. До 5000 символов. |
image_urls | string[] (url) | Для grok-imagine/image-to-video | Ссылки на изображения, которые нужно оживить. От 1 до 7 изображений с расширениями jpg, jpeg, png, webp. В сценарии видео из текста не используется. |
aspect_ratio | enum | Нет | Соотношение сторон для видео из текста: 16:9, 9:16, 1:1, 3:2, 2:3. Если поле не передано, используется 16:9. При оживлении изображений пропорции берутся из исходных кадров. |
duration | number | Да | Длительность ролика в секундах: целое число от 6 до 30. |
resolution | enum | Да | Разрешение: 480p или 720p. |
mode | enum | Нет | Значение переключателя «Режим» из формы сайта: normal, fun, spicy. На результат генерации через API не влияет, передавать его не нужно. Значение spicy недоступно для grok-imagine/image-to-video. |
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "grok-video",
"input": {
"model": "grok-imagine/text-to-video",
"prompt": "Космический корабль медленно пролетает сквозь фиолетовую туманность, камера плавно следует за ним, кинематографичный свет",
"aspect_ratio": "16:9",
"duration": 6,
"resolution": "480p"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'grok-video',
input: {
model: 'grok-imagine/text-to-video',
prompt:
'Космический корабль медленно пролетает сквозь фиолетовую туманность, камера плавно следует за ним, кинематографичный свет',
aspect_ratio: '16:9',
duration: 6,
resolution: '480p',
},
}),
})
const data = await response.json()
console.log(data)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'grok-video',
'input': {
'model': 'grok-imagine/text-to-video',
'prompt': 'Космический корабль медленно пролетает сквозь фиолетовую туманность, камера плавно следует за ним, кинематографичный свет',
'aspect_ratio': '16:9',
'duration': 6,
'resolution': '480p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "grok-video",
"input": {
"model": "grok-imagine/image-to-video",
"prompt": "Девушка поворачивается к камере и улыбается, волосы развеваются на ветру, камера медленно приближается",
"image_urls": [
"https://cdn.example.com/source-image-1.jpg",
"https://cdn.example.com/source-image-2.jpg"
],
"duration": 10,
"resolution": "720p"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'grok-video',
input: {
model: 'grok-imagine/image-to-video',
prompt:
'Девушка поворачивается к камере и улыбается, волосы развеваются на ветру, камера медленно приближается',
image_urls: [
'https://cdn.example.com/source-image-1.jpg',
'https://cdn.example.com/source-image-2.jpg',
],
duration: 10,
resolution: '720p',
},
}),
})
const data = await response.json()
console.log(data)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'grok-video',
'input': {
'model': 'grok-imagine/image-to-video',
'prompt': 'Девушка поворачивается к камере и улыбается, волосы развеваются на ветру, камера медленно приближается',
'image_urls': [
'https://cdn.example.com/source-image-1.jpg',
'https://cdn.example.com/source-image-2.jpg',
],
'duration': 10,
'resolution': '720p',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "9f4d2f65-4b2c-4df8-bf2a-9c6e8b86b352",
"status": "queued",
"tool": "grok-video",
"cost": 12,
"balance_after": 488,
"created_at": "2026-09-15T12:00:00Z"
}
{
"id": "9f4d2f65-4b2c-4df8-bf2a-9c6e8b86b352",
"status": "completed",
"tool": "grok-video",
"cost": 12,
"created_at": "2026-09-15T12:00:00Z",
"completed_at": "2026-09-15T12:01:30Z",
"result": {
"type": "video",
"urls": [
"https://af778c3b-be3c-4447-a63c-25ebabf0a68f.selstorage.ru/user_files/result-video-1.mp4"
]
},
"error_message": null
}
{
"id": "9f4d2f65-4b2c-4df8-bf2a-9c6e8b86b352",
"status": "failed",
"tool": "grok-video",
"cost": 12,
"created_at": "2026-09-15T12:00:00Z",
"completed_at": "2026-09-15T12:01:30Z",
"result": null,
"error_message": "Не удалось выполнить операцию"
}
Если запрос не прошёл проверку, операция не создаётся и деньги не списываются:
{
"error": {
"code": "validation_error",
"message": "Длительность видео должна быть от 6 до 30 секунд",
"request_id": "0b6f1d7e-3a52-4c1e-9d0a-5f2f7c8e41b3"
}
}
Основные коды: unauthorized - нет заголовка Authorization, invalid_api_key - ключ неверный или отключён, validation_error - ошибка в параметрах, insufficient_funds - не хватает средств на балансе.
После создания операции сохраните id из ответа и проверяйте статус этим запросом:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/9f4d2f65-4b2c-4df8-bf2a-9c6e8b86b352
const operationId = '9f4d2f65-4b2c-4df8-bf2a-9c6e8b86b352'
const response = await fetch(
`https://bratuha.ru/api/v1/operations/${operationId}`,
{
headers: {
Authorization: 'Bearer brth_ваш_ключ',
},
},
)
const operation = await response.json()
console.log(operation.status, operation.result)
Статус проходит путь queued -> processing -> completed или failed. Генерация видео занимает заметно больше времени, чем изображений, поэтому опрашивайте статус с паузой в несколько секунд. Проверять одну операцию чаще раза в секунду нельзя: API вернёт 429 с кодом rate_limit_exceeded.
После успешного завершения в поле result возвращается объект видео:
{
"type": "video",
"urls": [
"https://af778c3b-be3c-4447-a63c-25ebabf0a68f.selstorage.ru/user_files/result-video-1.mp4"
]
}
type - тип результата, для этой нейросети это "video".urls - массив ссылок на готовые ролики в формате mp4. Даже если ролик один, он приходит в массиве.Стоимость считается за секунду ролика и зависит только от разрешения:
| Разрешение | Цена за секунду |
|---|---|
480p | 2 ₽ |
720p | 3 ₽ |
Итоговая цена = цена за секунду × duration. Дробная длительность округляется вверх до целой секунды.
Примеры расчёта:
480p, 6 секунд - 12 ₽ (минимальная стоимость);720p, 10 секунд - 30 ₽;720p, 30 секунд - 90 ₽.Цена не зависит от сценария, количества изображений и соотношения сторон. Итоговая стоимость приходит в поле cost сразу после создания операции. Если на балансе недостаточно средств, операция не будет создана, а API вернёт ошибку insufficient_funds.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую операцию и повторно списывает стоимость при успешном создании.id.http/https URL, доступные серверу без авторизации.localhost, приватные IP-адреса и внутренние адреса.image_urls можно передать до 7 изображений. В примере выше показаны две ссылки, но в реальном запросе можно отправить и одну.heic и heif по ссылке не принимаются: перед отправкой сконвертируйте их в jpg или png.