Заново текстурирует готовую 3D-модель по одной или нескольким картинкам-образцам. Цена — 50 ₽ за модель.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Meshy N1 Retexture перекрашивает уже готовую 3D-модель: форма остаётся прежней, а цвета и материалы модель берёт с картинок-образцов. Так делают другую расцветку товара, версии игрового ассета и цвет для модели, которая пришла без текстур, например из STL. Текстовое задание не нужно, результат задают только картинки.
Вызов создаёт асинхронную операцию: сразу приходит её id, готовая модель в формате GLB забирается отдельным запросом. В наших пробах это занимало от одной до двух минут. Запуск стоит 50 ₽.
POST /api/v1/operationsAuthorization: Bearer brth_...id и статус queued. Результат забирается по id.Режим один. Нужны ссылка на модель и от 1 до 4 ссылок на образцы.
{
"tool": "meshy-n1-retexture",
"input": {
"model_url": "https://cdn.example.com/sneaker-1.glb",
"multiview_image_urls": [
"https://cdn.example.com/red-sneaker-front-1.jpg"
],
"enable_original_uv": true
}
}
tool - slug нейросети, всегда "meshy-n1-retexture".input - параметры запуска, прямо внутри input, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
model_url | string (url) | Да | Ссылка на 3D-модель: .glb, .gltf, .obj, .fbx или .stl, один файл. Всё должно быть в этом файле: .bin, .mtl и другие файлы рядом с ним модель не получит, поэтому надёжнее всего GLB. |
multiview_image_urls | string[] (url) | Да | От 1 до 4 ссылок на образцы: .jpg, .jpeg, .png или .webp. Первый образец считается видом спереди, порядок остальных не важен. |
enable_original_uv | boolean | Нет | true (по умолчанию) - текстура ложится по UV-развёртке из вашего файла. false - модель строит новую развёртку. Выключайте, если развёртки в файле нет, например в STL: иначе качество может снизиться. |
Самый частый запуск: своя модель GLB с развёрткой и одна картинка с нужной расцветкой. 50 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "meshy-n1-retexture",
"input": {
"model_url": "https://cdn.example.com/sneaker-1.glb",
"multiview_image_urls": [
"https://cdn.example.com/red-sneaker-front-1.jpg"
],
"enable_original_uv": 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: 'meshy-n1-retexture',
input: {
model_url: 'https://cdn.example.com/sneaker-1.glb',
multiview_image_urls: [
'https://cdn.example.com/red-sneaker-front-1.jpg',
],
enable_original_uv: 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': 'meshy-n1-retexture',
'input': {
'model_url': 'https://cdn.example.com/sneaker-1.glb',
'multiview_image_urls': [
'https://cdn.example.com/red-sneaker-front-1.jpg',
],
'enable_original_uv': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Образцы спереди и сзади: так цвет задней стороны не приходится додумывать. Цена та же, 50 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "meshy-n1-retexture",
"input": {
"model_url": "https://cdn.example.com/knight-1.glb",
"multiview_image_urls": [
"https://cdn.example.com/gold-knight-front-1.jpg",
"https://cdn.example.com/gold-knight-back-2.jpg"
],
"enable_original_uv": 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: 'meshy-n1-retexture',
input: {
model_url: 'https://cdn.example.com/knight-1.glb',
multiview_image_urls: [
'https://cdn.example.com/gold-knight-front-1.jpg',
'https://cdn.example.com/gold-knight-back-2.jpg',
],
enable_original_uv: 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': 'meshy-n1-retexture',
'input': {
'model_url': 'https://cdn.example.com/knight-1.glb',
'multiview_image_urls': [
'https://cdn.example.com/gold-knight-front-1.jpg',
'https://cdn.example.com/gold-knight-back-2.jpg',
],
'enable_original_uv': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
В STL нет ни цвета, ни развёртки, поэтому enable_original_uv выключен. 50 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "meshy-n1-retexture",
"input": {
"model_url": "https://cdn.example.com/sneaker-2.stl",
"multiview_image_urls": [
"https://cdn.example.com/black-sneaker-1.png"
],
"enable_original_uv": false
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'meshy-n1-retexture',
input: {
model_url: 'https://cdn.example.com/sneaker-2.stl',
multiview_image_urls: [
'https://cdn.example.com/black-sneaker-1.png',
],
enable_original_uv: false,
},
}),
})
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': 'meshy-n1-retexture',
'input': {
'model_url': 'https://cdn.example.com/sneaker-2.stl',
'multiview_image_urls': [
'https://cdn.example.com/black-sneaker-1.png',
],
'enable_original_uv': False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "meshy-n1-retexture",
"cost": 50,
"balance_after": 950,
"created_at": "2026-11-07T14:20:52.521Z"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "meshy-n1-retexture",
"cost": 50,
"created_at": "2026-11-07T14:20:52.521Z",
"completed_at": "2026-11-07T14:21:59.076Z",
"result": {
"type": "file",
"files": [
{ "url": "https://storage.bratuha.ru/results/meshy-n1-retexture/model.glb", "name": "result" }
]
},
"error_message": null
}
Операция завершается статусом failed, result равен null, причина - в error_message. Деньги возвращаются на баланс.
{
"id": "op_uuid-123",
"status": "failed",
"tool": "meshy-n1-retexture",
"cost": 50,
"created_at": "2026-11-07T14:20:52.521Z",
"completed_at": "2026-11-07T14:21:10.310Z",
"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, 10000))
}
}
Статус одной операции можно запрашивать не чаще раза в секунду, иначе придёт 429 rate_limit_exceeded. Хватает опроса раз в 10-15 секунд.
В result приходит "type": "file" и массив files с одним файлом: у него url и служебное имя name. Это модель GLB с текстурами внутри, даже если на входе был другой формат. Файл можно сразу открыть в Blender, three.js, <model-viewer> или загрузить в движок. Скачайте его к себе после завершения операции, если он нужен надолго.
Цена фиксированная: 50 ₽ за запуск. Она не зависит от формата модели, числа образцов и значения enable_original_uv.
Сумма списывается при создании операции и приходит в поле cost, остаток баланса - в balance_after. Если операция завершилась ошибкой, деньги возвращаются на баланс, а cost в ответе остаётся суммой запуска.
POST /api/v1/operations не идемпотентен: каждый запрос создаёт новую операцию и списывает деньги. Если ответ не дошёл из-за обрыва сети, не повторяйте запрос автоматически - сначала проверьте баланс или историю в аккаунте.queued, дальше статус проверяется по id.http/https. Адреса localhost, loopback и частные IP не принимаются. Ссылка должна открываться без авторизации и cookies, файл - до 128 МБ. Расширение в ссылке должно быть из таблицы параметров, иначе API сразу вернёт 400 validation_error и деньги не спишутся.