Создаёт 3D-модель по картинке, нескольким фото объекта с разных сторон или текстовому описанию. Цена - от 120 ₽ за модель: без текстур 120 ₽, с текстурами 200 ₽, авто-риггинг +40 ₽, анимация +20 ₽.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Meshy 7.1 делает готовую 3D-модель в формате GLB из фотографии, из нескольких снимков одного объекта или из текстового описания. Подходит для игровых ассетов, товаров для AR и карточек магазина, фигурок под 3D-печать. Человекоподобного персонажа можно сразу получить со скелетом и анимацией: модель вернёт персонажа со скелетом, ходьбу, бег и выбранное движение отдельными GLB-файлами.
Сценарии:
image - модель по одной картинке;multi_image - модель по 1-4 снимкам одного объекта с разных сторон;text - модель по описанию.В любом сценарии можно выключить текстуры (только геометрия, дешевле) и включить авто-риггинг с анимацией. Вызов создаёт асинхронную операцию: сразу приходит её id, готовая модель забирается отдельным запросом через несколько минут. Цена от 120 ₽.
POST /api/v1/operationsAuthorization: Bearer brth_...id и статус queued. Результат забирается по id.Сценарий выбирается полем meshy_generation_type:
image, нужен image_url.multi_image, нужен массив image_urls.text, нужен prompt.{
"tool": "meshy-7-1",
"input": {
"meshy_generation_type": "image",
"image_url": "https://cdn.example.com/ceramic-vase-1.jpg",
"should_texture": true
}
}
tool - slug нейросети, всегда "meshy-7-1".input - параметры запуска, прямо внутри input, без дополнительной вложенности.text API не учитывает image_url, а при выключенном enable_rigging - поля анимации и роста. На цену и результат они не влияют.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
meshy_generation_type | string | Нет | Сценарий: image - по одной картинке (используется, если поле не передано), multi_image - по нескольким снимкам, text - по описанию. |
image_url | string (url) | Да, для image | Только для image. Картинка объекта: JPG, JPEG или PNG. |
image_urls | string[] (url) | Да, для multi_image | Только для multi_image. От 1 до 4 снимков одного объекта с разных сторон: JPG, JPEG или PNG. |
prompt | string | Да, для text | Только для text. Описание объекта, до 600 символов. Можно писать по-русски. |
should_texture | boolean | Нет | Текстуры: true (по умолчанию) - модель с цветами и материалами, false - только геометрия, серая модель. Без текстур дешевле на 80 ₽. |
enable_rigging | boolean | Нет | Авто-риггинг: добавляет скелет человекоподобному персонажу и базовые анимации ходьбы и бега. Лучше всего работает, когда у персонажа хорошо видны руки и ноги. +40 ₽. |
rigging_height_meters | number | Нет | Только при enable_rigging: true. Примерный рост персонажа в метрах, от 0.5 до 3, по умолчанию 1.7. Нужен, чтобы скелет получился в правильном масштабе. |
enable_animation | boolean | Нет | Только при enable_rigging: true. Добавляет персонажу движение из библиотеки анимаций Meshy. +20 ₽. |
animation_action_id | number | Нет | Только при enable_animation: true. Номер движения из библиотеки анимаций Meshy, целое число от 0 до 696, по умолчанию 92. 0 - стойка на месте. |
use_advanced | boolean | Нет | true включает дополнительные настройки ниже. При false (по умолчанию) они не учитываются, модель строится со стандартными значениями. |
model_type | string | Нет | При use_advanced: true, кроме multi_image. Тип сетки: standard - детальная, lowpoly - упрощённая с малым числом полигонов, smart-topology - аккуратная сетка, собранная из отдельных частей. |
geometry_resolution | string | Нет | При use_advanced: true. Точность формы: standard, 2k, 4k. 4k недоступно для multi_image. |
remesh_mode | string | Нет | При use_advanced: true, кроме model_type: "lowpoly". on - перестроить сетку, off - оставить необработанную треугольную сетку (тогда topology и число полигонов не учитываются). |
topology | string | Нет | При use_advanced: true и remesh_mode: "on", кроме lowpoly. triangle - треугольники, лучше передают мелкие детали; quad - четырёхугольники, удобнее для доработки в редакторе. |
target_polycount | number | Нет | При use_advanced: true, remesh_mode: "on" и model_type: "standard". Целевое число полигонов, от 1000 до 300000 с шагом 1000, по умолчанию 30000. |
smart_target_polycount | number | Нет | При use_advanced: true, remesh_mode: "on" и model_type: "smart-topology". Число полигонов для умной топологии, от 1000 до 15000 с шагом 500, по умолчанию 4000. |
symmetry_mode | string | Нет | При use_advanced: true. Симметрия: auto - определить самой модели, on - всегда симметрично, off - без симметрии. |
pose_mode | string | Нет | При use_advanced: true. Поза персонажа: none - как на исходнике, a-pose или t-pose - стандартная поза с разведёнными руками, такую модель проще риггить и анимировать. |
enable_pbr | boolean | Нет | При use_advanced: true и should_texture: true. Добавляет карты металличности, шероховатости и нормалей поверх цвета. |
texture_prompt | string | Нет | При use_advanced: true и should_texture: true. Подсказка для текстур, до 600 символов. |
texture_image_url | string (url) | Нет | При use_advanced: true и should_texture: true. Образец цветов и материалов: JPG, JPEG или PNG. |
seed | number | Нет | При use_advanced: true и text. Целое число: одинаковые описание и seed обычно дают одинаковый результат. |
enable_prompt_expansion | boolean | Нет | При use_advanced: true и text. Модель дополнит описание деталями, сохранив смысл. |
safety_checker_mode | string | Нет | При use_advanced: true. Проверка входных данных на недопустимый контент: on или off. |
Самый частый сценарий: одна картинка, модель с текстурами. 200 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "meshy-7-1",
"input": {
"meshy_generation_type": "image",
"image_url": "https://cdn.example.com/ceramic-vase-1.jpg",
"should_texture": 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-7-1',
input: {
meshy_generation_type: 'image',
image_url: 'https://cdn.example.com/ceramic-vase-1.jpg',
should_texture: 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-7-1',
'input': {
'meshy_generation_type': 'image',
'image_url': 'https://cdn.example.com/ceramic-vase-1.jpg',
'should_texture': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Три снимка кроссовка с разных сторон, только геометрия без текстур. 120 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "meshy-7-1",
"input": {
"meshy_generation_type": "multi_image",
"image_urls": [
"https://cdn.example.com/sneaker-front-1.jpg",
"https://cdn.example.com/sneaker-side-2.jpg",
"https://cdn.example.com/sneaker-back-3.jpg"
],
"should_texture": 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-7-1',
input: {
meshy_generation_type: 'multi_image',
image_urls: [
'https://cdn.example.com/sneaker-front-1.jpg',
'https://cdn.example.com/sneaker-side-2.jpg',
'https://cdn.example.com/sneaker-back-3.jpg',
],
should_texture: 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-7-1',
'input': {
'meshy_generation_type': 'multi_image',
'image_urls': [
'https://cdn.example.com/sneaker-front-1.jpg',
'https://cdn.example.com/sneaker-side-2.jpg',
'https://cdn.example.com/sneaker-back-3.jpg',
],
'should_texture': False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Описание можно писать по-русски. С текстурами - 200 ₽, без текстур (should_texture: false) - 120 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "meshy-7-1",
"input": {
"meshy_generation_type": "text",
"prompt": "Деревянный сундук пирата с коваными железными уголками, приоткрытая крышка, внутри золотые монеты",
"should_texture": 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-7-1',
input: {
meshy_generation_type: 'text',
prompt: 'Деревянный сундук пирата с коваными железными уголками, приоткрытая крышка, внутри золотые монеты',
should_texture: 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-7-1',
'input': {
'meshy_generation_type': 'text',
'prompt': 'Деревянный сундук пирата с коваными железными уголками, приоткрытая крышка, внутри золотые монеты',
'should_texture': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Картинка человекоподобного персонажа в полный рост, авто-риггинг и анимация. Модель вернёт пять GLB-файлов: саму модель, персонажа со скелетом, ходьбу, бег и выбранное движение. 260 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "meshy-7-1",
"input": {
"meshy_generation_type": "image",
"image_url": "https://cdn.example.com/hero-full-body-1.png",
"should_texture": true,
"enable_rigging": true,
"rigging_height_meters": 1.7,
"enable_animation": true,
"animation_action_id": 92
}
}'
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-7-1',
input: {
meshy_generation_type: 'image',
image_url: 'https://cdn.example.com/hero-full-body-1.png',
should_texture: true,
enable_rigging: true,
rigging_height_meters: 1.7,
enable_animation: true,
animation_action_id: 92,
},
}),
})
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-7-1',
'input': {
'meshy_generation_type': 'image',
'image_url': 'https://cdn.example.com/hero-full-body-1.png',
'should_texture': True,
'enable_rigging': True,
'rigging_height_meters': 1.7,
'enable_animation': True,
'animation_action_id': 92,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Без текстур, максимальная точность формы и 300 000 полигонов. 120 ₽. Такие модели строятся дольше обычного, до 15 минут.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "meshy-7-1",
"input": {
"meshy_generation_type": "image",
"image_url": "https://cdn.example.com/knight-figure-1.jpg",
"should_texture": false,
"use_advanced": true,
"model_type": "standard",
"geometry_resolution": "4k",
"remesh_mode": "on",
"topology": "triangle",
"target_polycount": 300000,
"symmetry_mode": "auto",
"pose_mode": "none",
"safety_checker_mode": "on"
}
}'
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-7-1',
input: {
meshy_generation_type: 'image',
image_url: 'https://cdn.example.com/knight-figure-1.jpg',
should_texture: false,
use_advanced: true,
model_type: 'standard',
geometry_resolution: '4k',
remesh_mode: 'on',
topology: 'triangle',
target_polycount: 300000,
symmetry_mode: 'auto',
pose_mode: 'none',
safety_checker_mode: 'on',
},
}),
})
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-7-1',
'input': {
'meshy_generation_type': 'image',
'image_url': 'https://cdn.example.com/knight-figure-1.jpg',
'should_texture': False,
'use_advanced': True,
'model_type': 'standard',
'geometry_resolution': '4k',
'remesh_mode': 'on',
'topology': 'triangle',
'target_polycount': 300000,
'symmetry_mode': 'auto',
'pose_mode': 'none',
'safety_checker_mode': 'on',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Описание, аккуратная сетка на 8000 полигонов, PBR-карты и образец цветов для текстур. 200 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "meshy-7-1",
"input": {
"meshy_generation_type": "text",
"prompt": "Сидящая лиса для мобильной игры, мультяшный стиль",
"should_texture": true,
"use_advanced": true,
"model_type": "smart-topology",
"geometry_resolution": "standard",
"remesh_mode": "on",
"topology": "quad",
"smart_target_polycount": 8000,
"symmetry_mode": "on",
"pose_mode": "none",
"enable_pbr": true,
"texture_prompt": "рыжий мех, белая грудка, чёрные лапы",
"texture_image_url": "https://cdn.example.com/fox-colors-1.png",
"seed": 42,
"enable_prompt_expansion": false,
"safety_checker_mode": "on"
}
}'
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-7-1',
input: {
meshy_generation_type: 'text',
prompt: 'Сидящая лиса для мобильной игры, мультяшный стиль',
should_texture: true,
use_advanced: true,
model_type: 'smart-topology',
geometry_resolution: 'standard',
remesh_mode: 'on',
topology: 'quad',
smart_target_polycount: 8000,
symmetry_mode: 'on',
pose_mode: 'none',
enable_pbr: true,
texture_prompt: 'рыжий мех, белая грудка, чёрные лапы',
texture_image_url: 'https://cdn.example.com/fox-colors-1.png',
seed: 42,
enable_prompt_expansion: false,
safety_checker_mode: 'on',
},
}),
})
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-7-1',
'input': {
'meshy_generation_type': 'text',
'prompt': 'Сидящая лиса для мобильной игры, мультяшный стиль',
'should_texture': True,
'use_advanced': True,
'model_type': 'smart-topology',
'geometry_resolution': 'standard',
'remesh_mode': 'on',
'topology': 'quad',
'smart_target_polycount': 8000,
'symmetry_mode': 'on',
'pose_mode': 'none',
'enable_pbr': True,
'texture_prompt': 'рыжий мех, белая грудка, чёрные лапы',
'texture_image_url': 'https://cdn.example.com/fox-colors-1.png',
'seed': 42,
'enable_prompt_expansion': False,
'safety_checker_mode': 'on',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "meshy-7-1",
"cost": 260,
"balance_after": 740,
"created_at": "2026-10-01T16:20:11.512Z"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "meshy-7-1",
"cost": 260,
"created_at": "2026-10-01T16:20:11.512Z",
"completed_at": "2026-10-01T16:24:35.901Z",
"result": {
"type": "file",
"files": [
{ "url": "https://storage.bratuha.ru/results/meshy-7-1/model.glb", "name": "3D-модель" },
{ "url": "https://storage.bratuha.ru/results/meshy-7-1/rigged.glb", "name": "Модель со скелетом" },
{ "url": "https://storage.bratuha.ru/results/meshy-7-1/walking.glb", "name": "Ходьба" },
{ "url": "https://storage.bratuha.ru/results/meshy-7-1/running.glb", "name": "Бег" },
{ "url": "https://storage.bratuha.ru/results/meshy-7-1/animation.glb", "name": "Анимация" }
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "meshy-7-1",
"cost": 200,
"created_at": "2026-10-01T16:20:11.512Z",
"completed_at": "2026-10-01T16:23:28.044Z",
"result": {
"type": "file",
"files": [
{ "url": "https://storage.bratuha.ru/results/meshy-7-1/model.glb", "name": "result" }
]
},
"error_message": null
}
Операция завершается статусом failed, result равен null, причина - в error_message. Деньги возвращаются на баланс.
{
"id": "op_uuid-123",
"status": "failed",
"tool": "meshy-7-1",
"cost": 200,
"created_at": "2026-10-01T16:20:11.512Z",
"completed_at": "2026-10-01T16:20:24.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
if (op.status === 'failed') throw new Error(op.error_message)
await new Promise((r) => setTimeout(r, 15000))
}
}
Статус одной операции можно запрашивать не чаще раза в секунду, иначе придёт 429 rate_limit_exceeded. Модель строится обычно 3-5 минут, с geometry_resolution: "4k" - до 15 минут, так что хватает опроса раз в 15-30 секунд.
В result всегда "type": "file" и массив files, у каждого файла url и name. Все файлы - GLB, текстуры (если они включены) упакованы внутрь. Их можно сразу открыть в Blender, three.js, <model-viewer> или загрузить в движок.
Без авто-риггинга приходит один файл - модель, name у него служебный ("result").
С авто-риггингом файлов несколько, name подписывает каждый:
name | Что внутри | Когда приходит |
|---|---|---|
3D-модель | модель без скелета | всегда, первым элементом |
Модель со скелетом | тот же персонаж со скелетом, готов к анимации | enable_rigging: true |
Ходьба | персонаж с анимацией ходьбы | enable_rigging: true |
Бег | персонаж с анимацией бега | enable_rigging: true |
Анимация | персонаж с движением animation_action_id | enable_animation: true |
Выбирайте файлы по name, а не по номеру в массиве. Расширение берите из url. Скачайте файлы к себе после завершения операции, если они нужны надолго.
Цена складывается из основы и надбавок, сценарий (image, multi_image, text) на неё не влияет.
| Что | Цена |
|---|---|
Модель без текстур (should_texture: false) | 120 ₽ |
Модель с текстурами (should_texture: true) | 200 ₽ |
Авто-риггинг (enable_rigging: true) | +40 ₽ |
Анимация (enable_animation: true, только вместе с риггингом) | +20 ₽ |
Примеры итоговой цены:
| Запрос | Цена |
|---|---|
| Без текстур | 120 ₽ |
| С текстурами | 200 ₽ |
| Без текстур + риггинг + анимация | 180 ₽ |
| С текстурами + риггинг | 240 ₽ |
| С текстурами + риггинг + анимация | 260 ₽ |
Дополнительные настройки (use_advanced и всё, что под ним, включая 4k и число полигонов) цену не меняют. enable_animation без enable_rigging не учитывается и не оплачивается.
Сумма списывается при создании операции и приходит в поле cost, остаток баланса - в balance_after. Если операция завершилась ошибкой, деньги возвращаются на баланс, а cost в ответе остаётся суммой запуска.
POST /api/v1/operations не идемпотентен: каждый запрос создаёт новую операцию и списывает деньги. Если ответ не дошёл из-за обрыва сети, не повторяйте запрос автоматически - сначала проверьте баланс или историю в аккаунте.queued, дальше статус проверяется по id.http/https. Адреса localhost, loopback и частные IP не принимаются. Ссылка должна открываться без авторизации и cookies, файл - до 128 МБ. Расширение в ссылке - .jpg, .jpeg или .png, иначе API сразу вернёт 400 validation_error и деньги не спишутся.animation_action_id больше 696 или дробный, рост вне 0.5-3, описание или подсказка для текстур длиннее 600 символов, дробный seed, 4k для multi_image) API отклоняет сразу с 400 validation_error, без списания.multi_image все снимки должны показывать один и тот же объект при похожем свете и масштабе.