Увеличивает разрешение загруженного видео и делает картинку более чёткой, стараясь сохранить реальные детали без лишней дорисовки. Цена - от 15 до 3000 ₽ за секунду видео, зависит от выбранного целевого разрешения от 1 до 200 МП.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Clarity AI Crystal Video Upscaler увеличивает видео и делает картинку чётче, но старается не выдумывать лишнего: лица, надписи и фактуры остаются такими, как в исходнике, без «пластикового» вида. Размер результата задаётся не классом разрешения, а числом мегапикселей в кадре, поэтому его можно подобрать точно под задачу.
Когда пригодится:
Пропорции кадра, длительность и звук сохраняются. Вызов создаёт асинхронную операцию: сразу приходит id, готовое видео забирается проверкой статуса. Модель работает не быстро: пятисекундный ролик до 1 МП обрабатывается около 3,5 минуты.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Режим у нейросети один. Вы передаёте ссылку на видео и целевой размер кадра target_megapixels, от него зависит цена за секунду.
{
"tool": "clarity-ai-crystal-video-upscaler",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"target_megapixels": 2
}
}
tool - slug нейросети, всегда "clarity-ai-crystal-video-upscaler".input - параметры запуска. Поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
video | string (url) | Да | Ссылка на исходное видео. Один файл, внешний http/https URL с расширением .mp4, .mov или .webm. Ссылка должна открываться без авторизации, файл до 128 МБ. Длительность от 1 секунды. |
target_megapixels | integer | Да | Сколько мегапикселей будет в кадре результата. Целое число от 1 до 200. Ориентиры для кадра 16:9: 1 - около 1330×750, 2 - около 1885×1060 (почти Full HD), 4 - около 2665×1500, 8 - около 3770×2120 (почти 4K), 9 - чуть больше 4K. Каждый мегапиксель добавляет 15 ₽ к цене секунды. Дробные значения не принимаются. Если поле не передать, будет 2. |
Длительность вы не передаёте: сервер сам определяет её по файлу и по ней считает цену.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "clarity-ai-crystal-video-upscaler",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"target_megapixels": 2
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'clarity-ai-crystal-video-upscaler',
input: {
video: 'https://cdn.example.com/source-video-1.mp4',
target_megapixels: 2,
},
}),
})
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': 'clarity-ai-crystal-video-upscaler',
'input': {
'video': 'https://cdn.example.com/source-video-1.mp4',
'target_megapixels': 2,
},
},
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": "clarity-ai-crystal-video-upscaler",
"input": {
"video": "https://cdn.example.com/product-shot-1.mov",
"target_megapixels": 8
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'clarity-ai-crystal-video-upscaler',
input: {
video: 'https://cdn.example.com/product-shot-1.mov',
target_megapixels: 8,
},
}),
})
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': 'clarity-ai-crystal-video-upscaler',
'input': {
'video': 'https://cdn.example.com/product-shot-1.mov',
'target_megapixels': 8,
},
},
timeout=60,
)
print(response.status_code)
print(response.json())
Для ролика длиной 5 секунд и target_megapixels: 1:
{
"id": "op_uuid-123",
"status": "queued",
"tool": "clarity-ai-crystal-video-upscaler",
"cost": 75,
"balance_after": 425,
"created_at": "2026-09-30T19:49:41.665777+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "clarity-ai-crystal-video-upscaler",
"cost": 75,
"created_at": "2026-09-30T19:49:41.665777+00:00",
"completed_at": "2026-09-30T19:53:06.629559+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/clarity-ai-crystal-video-upscaler/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, 15000))
}
}
Одну операцию можно опрашивать не чаще раза в секунду, иначе придёт 429. Для этой модели хватит запроса раз в 15-30 секунд.
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/clarity-ai-crystal-video-upscaler/video-1.mp4"
]
}
type - всегда "video".urls - массив из одной ссылки на готовый MP4.Пропорции кадра сохраняются, а площадь кадра подгоняется под target_megapixels. Что получалось на реальных роликах:
| Исходник | target_megapixels | Результат |
|---|---|---|
| 960×540 | 1 | 1332×750 |
| 960×540 | 2 | 1884×1060 |
| 752×560 | 2 | 1636×1220 |
Длительность, частота кадров и звуковая дорожка остаются как в исходнике.
Цена считается за каждую секунду видео: 15 ₽ × target_megapixels. Длительность берётся из самого файла, неполная секунда округляется вверх. Сумма списывается при создании операции и приходит в поле cost.
target_megapixels | За секунду | 5 секунд | 10 секунд | 1 минута |
|---|---|---|---|---|
1 | 15 ₽ | 75 ₽ | 150 ₽ | 900 ₽ |
2 | 30 ₽ | 150 ₽ | 300 ₽ | 1 800 ₽ |
4 | 60 ₽ | 300 ₽ | 600 ₽ | 3 600 ₽ |
8 | 120 ₽ | 600 ₽ | 1 200 ₽ | 7 200 ₽ |
10 | 150 ₽ | 750 ₽ | 1 500 ₽ | 9 000 ₽ |
50 | 750 ₽ | 3 750 ₽ | 7 500 ₽ | 45 000 ₽ |
200 | 3 000 ₽ | 15 000 ₽ | 30 000 ₽ | 180 000 ₽ |
Если target_megapixels не передан, считается по 2.
POST /api/v1/operations не идемпотентен: повторный запрос создаёт новую операцию и списывает деньги ещё раз. Если ответ на POST потерялся, не повторяйте его вслепую.queued, результат забирайте через GET /api/v1/operations/{id}.video принимаются только внешние http/https ссылки на .mp4, .mov или .webm, доступные без авторизации. Ссылки на localhost и внутренние адреса отклоняются.target_megapixels дробный либо вне диапазона 1-200, API вернёт validation_error, операция не создастся и деньги не спишутся.target_megapixels больше, чем в исходном кадре: у 1280×720 уже 0,9 МП, у 1920×1080 - 2,1 МП. Для большинства задач хватает 2-9 МП, значения выше 9 дают кадр больше 4K.