Преобразует одно изображение в 3D-модель с настройками формы, детализации и текстуры. Цена зависит от разрешения: 1024p - 45 ₽ за изображение, 1536p - 60 ₽ за изображение.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Pixal3D превращает одну картинку в текстурированную 3D-модель GLB. Подходит для игрушек, фигурок, посуды, мебели и других предметов, которые хорошо видны на снимке целиком. Через API можно управлять каждым этапом построения: насколько форма и текстура держатся исходника, сколько шагов уходит на детали, сколько вершин останется в модели и какого размера будет текстура.
Вызов создаёт асинхронную операцию: сразу приходит её id, готовая модель забирается отдельным запросом. Цена зависит только от разрешения: 45 ₽ за 1024, 60 ₽ за 1536.
POST /api/v1/operationsAuthorization: Bearer brth_...id и статус queued. Результат забирается по id.Сценарий один - модель по картинке. Обязательно только image_url, остальные параметры можно не передавать: тогда берутся значения по умолчанию, они подходят для большинства предметов.
{
"tool": "pixal3d",
"input": {
"image_url": "https://cdn.example.com/toy-robot-1.png",
"resolution": "1024"
}
}
tool - slug нейросети, всегда "pixal3d".input - параметры запуска, прямо внутри input, без дополнительной вложенности.Построение идёт в три этапа: базовая форма (ss_*), уточнение формы (shape_slat_*) и текстура (tex_slat_*). У каждого этапа одинаковый набор настроек: сила следования картинке (*_guidance_strength), смягчение артефактов (*_guidance_rescale), число шагов (*_sampling_steps) и резкость (*_rescale_t).
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
image_url | string (url) | Да | Картинка предмета: JPG, JPEG, PNG или WebP, не больше 4096 × 4096 пикселей. |
resolution | string | Нет | Разрешение построения: 1024 (по умолчанию, 45 ₽) или 1536 - детальнее, дольше, 60 ₽. |
ss_guidance_strength | number | Нет | Базовая форма: насколько следовать картинке, от 0 до 10, по умолчанию 7.5. Выше - ближе к исходнику, но больше шума. |
ss_guidance_rescale | number | Нет | Базовая форма: смягчение артефактов при высокой силе, от 0 до 1, по умолчанию 0.7. |
ss_sampling_steps | number | Нет | Базовая форма: число шагов, целое от 1 до 50, по умолчанию 12. Больше шагов - качественнее, но дольше. |
ss_rescale_t | number | Нет | Базовая форма: резкость переходов, от 1 до 6, по умолчанию 5. |
shape_slat_guidance_strength | number | Нет | Уточнение формы: насколько детали следуют картинке, от 0 до 10, по умолчанию 7.5. |
shape_slat_guidance_rescale | number | Нет | Уточнение формы: смягчение артефактов, от 0 до 1, по умолчанию 0.5. Если геометрия шумная, увеличьте. |
shape_slat_sampling_steps | number | Нет | Уточнение формы: число шагов, целое от 1 до 50, по умолчанию 12. |
shape_slat_rescale_t | number | Нет | Уточнение формы: резкость деталей, от 1 до 6, по умолчанию 3. |
tex_slat_guidance_strength | number | Нет | Текстура: насколько следовать цветам картинки, от 0 до 10, по умолчанию 1. Выше - ярче, но цвет может перенасытиться. |
tex_slat_guidance_rescale | number | Нет | Текстура: смягчение артефактов, от 0 до 1, по умолчанию 0.7. Если поверхность полосатая или шумная, увеличьте. |
tex_slat_sampling_steps | number | Нет | Текстура: число шагов, целое от 1 до 50, по умолчанию 12. |
tex_slat_rescale_t | number | Нет | Текстура: резкость мелких деталей, от 1 до 6, по умолчанию 3. |
mesh_scale | number | Нет | Масштаб сетки, от 0.1 до 4, по умолчанию 1. Влияет на то, как модель оценивает расстояние до камеры; обычно лучше оставить 1. |
max_num_tokens | number | Нет | Объём мелкой геометрии, от 4096 до 131072 с шагом 1024, по умолчанию 49152. Больше - больше мелких форм, но дольше. |
decimation_target | number | Нет | Сколько вершин останется в модели, от 10000 до 1580000 с шагом 10000, по умолчанию 200000. Меньше - легче файл, но проще форма. |
texture_size | string | Нет | Размер текстуры: 1024, 2048 (по умолчанию) или 4096. Больше - детальнее поверхность и тяжелее файл. |
remesh | boolean | Нет | true (по умолчанию) - перестроить сетку в аккуратные треугольники, удобнее для дальнейшей работы, но дольше. |
Только картинка и разрешение. 45 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pixal3d",
"input": {
"image_url": "https://cdn.example.com/toy-robot-1.png",
"resolution": "1024"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pixal3d',
input: {
image_url: 'https://cdn.example.com/toy-robot-1.png',
resolution: '1024',
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'pixal3d',
'input': {
'image_url': 'https://cdn.example.com/toy-robot-1.png',
'resolution': '1024',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Разрешение 1536, больше шагов на каждом этапе, больше мелкой геометрии и текстура 4096. 60 ₽, строится дольше.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pixal3d",
"input": {
"image_url": "https://cdn.example.com/carved-chair-1.jpg",
"resolution": "1536",
"ss_sampling_steps": 25,
"shape_slat_sampling_steps": 25,
"tex_slat_sampling_steps": 25,
"max_num_tokens": 98304,
"decimation_target": 500000,
"texture_size": "4096",
"remesh": true
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pixal3d',
input: {
image_url: 'https://cdn.example.com/carved-chair-1.jpg',
resolution: '1536',
ss_sampling_steps: 25,
shape_slat_sampling_steps: 25,
tex_slat_sampling_steps: 25,
max_num_tokens: 98304,
decimation_target: 500000,
texture_size: '4096',
remesh: true,
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'pixal3d',
'input': {
'image_url': 'https://cdn.example.com/carved-chair-1.jpg',
'resolution': '1536',
'ss_sampling_steps': 25,
'shape_slat_sampling_steps': 25,
'tex_slat_sampling_steps': 25,
'max_num_tokens': 98304,
'decimation_target': 500000,
'texture_size': '4096',
'remesh': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Мало вершин и текстура 1024: файл небольшой, подойдёт для веба и AR. 45 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "pixal3d",
"input": {
"image_url": "https://cdn.example.com/mug-1.webp",
"resolution": "1024",
"decimation_target": 30000,
"texture_size": "1024",
"remesh": true
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'pixal3d',
input: {
image_url: 'https://cdn.example.com/mug-1.webp',
resolution: '1024',
decimation_target: 30000,
texture_size: '1024',
remesh: true,
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'pixal3d',
'input': {
'image_url': 'https://cdn.example.com/mug-1.webp',
'resolution': '1024',
'decimation_target': 30000,
'texture_size': '1024',
'remesh': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "pixal3d",
"cost": 45,
"balance_after": 955,
"created_at": "2026-10-01T16:20:11.512Z"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "pixal3d",
"cost": 45,
"created_at": "2026-10-01T16:20:11.512Z",
"completed_at": "2026-10-01T16:27:40.218Z",
"result": {
"type": "file",
"files": [
{ "url": "https://storage.bratuha.ru/results/pixal3d/model.glb", "name": "result" }
]
},
"error_message": null
}
Операция завершается статусом failed, result равен null, причина - в error_message. Деньги возвращаются на баланс.
{
"id": "op_uuid-123",
"status": "failed",
"tool": "pixal3d",
"cost": 45,
"created_at": "2026-10-01T16:20:11.512Z",
"completed_at": "2026-10-01T16:20:18.144Z",
"result": null,
"error_message": "Ваш запрос не прошел модерацию."
}
Сохраните id из ответа на создание и проверяйте операцию по нему:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
async function waitForModel(id) {
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.files[0].url
if (op.status === 'failed') throw new Error(op.error_message)
await new Promise((r) => setTimeout(r, 15000))
}
}
Статус одной операции можно запрашивать не чаще раза в секунду, иначе придёт 429 rate_limit_exceeded. Модель строится от нескольких минут до получаса, в зависимости от очереди и настроек, так что хватает опроса раз в 15-30 секунд. Закладывайте ожидание до 40 минут.
В result приходит один файл модели:
{
"type": "file",
"files": [
{ "url": "https://storage.bratuha.ru/results/pixal3d/model.glb", "name": "result" }
]
}
type - всегда "file".files - массив из одного элемента: url - ссылка на GLB, name - служебное имя "result".<model-viewer>. Вес файла зависит от decimation_target и texture_size.Скачайте файл к себе после завершения операции, если он нужен надолго.
Цена зависит только от resolution:
resolution | Цена |
|---|---|
1024 | 45 ₽ |
1536 | 60 ₽ |
Остальные параметры (шаги, вершины, размер текстуры, remesh) цену не меняют, но влияют на время построения.
Сумма списывается при создании операции и приходит в поле cost, остаток баланса - в balance_after. Если операция завершилась ошибкой, деньги возвращаются на баланс, а cost в ответе остаётся суммой запуска.
POST /api/v1/operations не идемпотентен: каждый запрос создаёт новую операцию и списывает деньги. Если ответ не дошёл из-за обрыва сети, не повторяйте запрос автоматически - сначала проверьте баланс или историю в аккаунте.queued, дальше статус проверяется по id.http/https. Адреса localhost, loopback и частные IP не принимаются. Ссылка должна открываться без авторизации и cookies, файл - до 128 МБ. Расширение в ссылке - .jpg, .jpeg, .png или .webp, иначе API сразу вернёт 400 validation_error и деньги не спишутся.400 validation_error, без списания.