Меняет соотношение сторон видео и дорисовывает новые области кадра, чтобы ролик лучше смотрелся в нужном формате. Цена зависит от разрешения: 720p - 15 ₽/сек., 1080p - 30 ₽/сек.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
LTX-2.3 Reframe меняет пропорции видео и дорисовывает недостающие части кадра, а не обрезает их. Горизонтальный ролик становится вертикальным для Reels, Shorts и сторис, вертикальный - горизонтальным для YouTube, любой - квадратным для ленты или 4:5 для карточки товара.
Когда пригодится:
Нейросеть достраивает фон, небо, стены и прочее окружение по краям, исходная сцена остаётся в центре. Вызов создаёт асинхронную операцию: сразу приходит id, готовое видео забирается проверкой статуса. Пятисекундный ролик обрабатывается около 40 секунд, полуминутный - 3-5 минут.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Режим у нейросети один: вы передаёте видео, нужные пропорции aspect_ratio и разрешение resolution. От разрешения зависит цена за секунду.
{
"tool": "ltx-2-3-reframe",
"input": {
"video_url": "https://cdn.example.com/source-video-1.mp4",
"aspect_ratio": "9:16",
"resolution": "720p"
}
}
tool - slug нейросети, всегда "ltx-2-3-reframe".input - параметры запуска. Поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
video_url | string (url) | Да | Ссылка на исходное видео. Один файл, внешний http/https URL с расширением .mp4, .mov или .webm. Длительность от 1 до 60 секунд, файл до 128 МБ, ссылка должна открываться без авторизации. |
aspect_ratio | enum | Да | Пропорции результата: 16:9 - горизонтальное видео, 9:16 - вертикальное, 1:1 - квадрат, 4:5 - вертикальное для ленты, 5:4 - слегка горизонтальное. Если поле не передать, будет 16:9. |
resolution | enum | Да | Разрешение результата по короткой стороне: 720p или 1080p. От него зависит цена. Если поле не передать, будет 1080p. |
Длительность вы не передаёте: сервер сам определяет её по файлу и по ней считает цену.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "ltx-2-3-reframe",
"input": {
"video_url": "https://cdn.example.com/source-video-1.mp4",
"aspect_ratio": "9:16",
"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: 'ltx-2-3-reframe',
input: {
video_url: 'https://cdn.example.com/source-video-1.mp4',
aspect_ratio: '9:16',
resolution: '720p',
},
}),
})
const operation = await response.json()
console.log(operation.id, operation.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'ltx-2-3-reframe',
'input': {
'video_url': 'https://cdn.example.com/source-video-1.mp4',
'aspect_ratio': '9:16',
'resolution': '720p',
},
},
timeout=60,
)
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": "ltx-2-3-reframe",
"input": {
"video_url": "https://cdn.example.com/vertical-video-1.mp4",
"aspect_ratio": "16:9",
"resolution": "1080p"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'ltx-2-3-reframe',
input: {
video_url: 'https://cdn.example.com/vertical-video-1.mp4',
aspect_ratio: '16:9',
resolution: '1080p',
},
}),
})
const operation = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'ltx-2-3-reframe',
'input': {
'video_url': 'https://cdn.example.com/vertical-video-1.mp4',
'aspect_ratio': '16:9',
'resolution': '1080p',
},
},
timeout=60,
)
print(response.json())
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "ltx-2-3-reframe",
"input": {
"video_url": "https://cdn.example.com/source-video-2.mov",
"aspect_ratio": "1:1",
"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: 'ltx-2-3-reframe',
input: {
video_url: 'https://cdn.example.com/source-video-2.mov',
aspect_ratio: '1:1',
resolution: '720p',
},
}),
})
const operation = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'ltx-2-3-reframe',
'input': {
'video_url': 'https://cdn.example.com/source-video-2.mov',
'aspect_ratio': '1:1',
'resolution': '720p',
},
},
timeout=60,
)
print(response.json())
Для ролика длиной 5 секунд и resolution: "720p":
{
"id": "op_uuid-123",
"status": "queued",
"tool": "ltx-2-3-reframe",
"cost": 75,
"balance_after": 425,
"created_at": "2026-09-30T21:33:44.471743+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "ltx-2-3-reframe",
"cost": 75,
"created_at": "2026-09-30T21:33:44.471743+00:00",
"completed_at": "2026-09-30T21:34:13.193414+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/ltx-2-3-reframe/video-1.mp4"
]
},
"error_message": null
}
Пока видео обрабатывается, status будет queued или processing, а result - null. При ошибке придёт status: "failed", result: null и текст причины в error_message, деньги вернутся на баланс.
Сохраните id из ответа на создание и запрашивайте операцию по нему:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
Пример ожидания результата на JavaScript / TypeScript:
async function waitForVideo(id: string) {
while (true) {
const res = await fetch(`https://bratuha.ru/api/v1/operations/${id}`, {
headers: { Authorization: 'Bearer brth_ваш_ключ' },
})
const op = await res.json()
if (op.status === 'completed') return op.result.urls[0]
if (op.status === 'failed') throw new Error(op.error_message)
await new Promise((r) => setTimeout(r, 10000))
}
}
Одну операцию можно опрашивать не чаще раза в секунду, иначе придёт 429. Для видео хватит запроса раз в 10 секунд.
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/ltx-2-3-reframe/video-1.mp4"
]
}
type - всегда "video".urls - массив из одной ссылки на готовый MP4 (H.264).Кадр получается в выбранных пропорциях, короткая сторона равна выбранному разрешению. Например, ролик 960×540 при aspect_ratio: "9:16" и resolution: "720p" вернулся размером 720×1280. Длительность и частота кадров остаются как в исходнике, звуковая дорожка сохраняется.
Цена считается за каждую секунду видео и зависит от resolution. Пропорции на цену не влияют. Длительность берётся из самого файла в целых секундах с округлением вверх. Сумма списывается при создании операции и приходит в поле cost.
resolution | За секунду | 5 секунд | 10 секунд | 60 секунд (максимум) |
|---|---|---|---|---|
720p | 15 ₽ | 75 ₽ | 150 ₽ | 900 ₽ |
1080p | 30 ₽ | 150 ₽ | 300 ₽ | 1 800 ₽ |
Если resolution не передан, считается по 1080p - вдвое дороже 720p.
POST /api/v1/operations не идемпотентен: повторный запрос создаёт новую операцию и списывает деньги ещё раз. Если ответ на POST потерялся, не повторяйте его вслепую.queued, результат забирайте через GET /api/v1/operations/{id}.video_url принимаются только внешние http/https ссылки на .mp4, .mov или .webm, доступные без авторизации. Ссылки на localhost и внутренние адреса отклоняются.400 validation_error, операция не создастся и деньги не спишутся. Длинное видео порежьте на куски до минуты..mov с телефонов и из загрузчиков модель прочитать не может: операция завершается failed с сообщением «Не удалось прочитать видеофайл», деньги возвращаются. Надёжнее всего отправлять MP4 с кодеком H.264.aspect_ratio совпадают, дорисовывать нечего - такой запуск не имеет смысла.720p: это вдвое дешевле, а по нему видно, как нейросеть достраивает края.