lowpoly будет отключён 30 окт. 2026 г.. Перейдите на другую модель до этих дат, чтобы избежать ошибок в запросах. Все устаревшие функции

Creative Lab Fidget Pixel API

Превратите фотографию в многоцветную, пригодную для 3D-печати пиксель-арт фиджет-доску в два этапа. Задача прототипа превращает фотографию в изображение в стиле пиксель-арт. Задача сборки превращает это изображение в соединяющиеся друг с другом детали в едином файле 3MF, принимая в качестве input_task_id идентификатор задачи прототипа.

  • POST /openapi/creative-lab/fidget-pixel/v1/prototype
  • POST /openapi/creative-lab/fidget-pixel/v1/build

Оба endpoint'а POST требуют платного тарифного плана. Запрос с бесплатного аккаунта возвращает 402.


POST/openapi/creative-lab/fidget-pixel/v1/prototype

Создание задачи прототипа Fidget Pixel

Создаёт одно изображение в стиле пиксель-арт из фотографии. Чтобы собрать части, передайте ID этой задачи в эндпоинт сборки в качестве input_task_id. Описание полей задачи см. в разделе Объект задачи прототипа Fidget Pixel.

Если изображение вам не понравилось, создайте ещё одну задачу прототипа. Каждая задача оплачивается отдельно.

Request

POST
/openapi/creative-lab/fidget-pixel/v1/prototype
# Stage 1: pixelize the source photo
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "image_url": "<your publicly accessible image url or base64-encoded data URI>",
    "type": "person"
  }'

Response

{
  "result": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7"
}

Параметры

  • Name
    image_url
    Type
    string
    Обязательный
    Description

    Фотография для преобразования в пиксель-арт — в виде публичного URL или Data URI (data:image/jpeg;base64,<ваши данные изображения в кодировке base64>).

    Изображение должно быть файлом JPG, JPEG, PNG или WebP размером не более 20 МБ. Meshy определяет формат по данным изображения, а не по расширению файла в URL. URL без расширения тоже подходит, и Meshy следует по перенаправлениям (redirects).

  • Name
    type
    Type
    string
    Обязательный
    Description

    Что изображено на фотографии — определяет стиль пиксель-арта. Эти два стиля заметно отличаются друг от друга. Любое другое значение вернёт 400.

    Допустимые значения:

    • person: человек на портретном или полноростовом фото. Meshy рисует пиксельный спрайт в стиле чиби.
    • other: любой другой объект, например питомец, предмет, маскот, логотип или пейзаж. Meshy рисует пиксельную иконку в стиле бисерной мозаики.
  • Name
    name
    Type
    string
    Description

    Название задачи, до 100 символов. Оно возвращается в поле name задачи. При превышении длины возвращается 400.

Возвращаемое значение

Поле result содержит ID новой задачи прототипа. Получите задачу или получайте её поток обновлений, пока status не станет SUCCEEDED. Затем передайте ID в эндпоинт сборки в качестве input_task_id.

Возможные ошибки

  • Name
    400 - Bad Request
    Description

    Запрос не может быть выполнен. Например:

    • Отсутствует image_url или type.
    • type не равен person или other.
    • Изображение не является файлом JPG, JPEG, PNG или WebP.
    • Изображение слишком маленькое, превышает 20 МБ или превышает максимальное количество пикселей.
    • Meshy не может загрузить изображение, например потому что URL возвращает 404 или истекло время ожидания.
    • Data URI не является корректным base64.
    • Изображение было помечено как NSFW.

    В сообщении об ошибке указано, в чём проблема. Исправьте запрос и отправьте его снова.

  • Name
    401 - Unauthorized
    Description

    API-ключ отсутствует или недействителен. Проверьте заголовок Authorization.

  • Name
    402 - Payment Required
    Description

    Применимо одно из следующего:

    • На счёте недостаточно кредитов.
    • API-ключ, рабочая область или участник достигли лимита кредитов.
    • Аккаунт использует бесплатный тарифный план.

    Проверьте количество кредитов и тарифный план, затем повторите попытку.

  • Name
    403 - Forbidden
    Description

    В вашей команде включена функция IP Filtering, и Meshy пометила изображение как содержащее стороннюю интеллектуальную собственность. Отправьте изображение, на использование которого у вас есть права.

  • Name
    429 - Too Many Requests
    Description

    Достигнут один из следующих лимитов:

    • Вы отправили больше запросов, чем допускает ограничение частоты. Подождите несколько секунд и повторите попытку. См. Ограничения частоты.
    • Слишком много ваших задач находятся в очереди или выполняются. Дождитесь завершения части из них, затем повторите попытку.
    • На безлимитном тарифном плане без оставшихся кредитов вы достигли количества задач, которые могут выполняться без кредитов. Дождитесь завершения задачи или пополните баланс кредитов.
  • Name
    500 - Internal Server Error
    Description

    Meshy столкнулась с серверной ошибкой, например из-за невозможности выполнить проверку изображения на интеллектуальную собственность. Meshy не создаёт задачу и возвращает все списанные кредиты. Повторите запрос.


POST/openapi/creative-lab/fidget-pixel/v1/build

Создание задачи сборки Fidget Pixel

Создаёт детали для 3D-печати на основе успешно выполненной задачи создания прототипа. Meshy сэмплирует изображение в пиксель-арт стиле на сетку и сокращает его до не более чем color_count цветов. Каждая ячейка объекта становится отдельной соединяемой деталью, а фон не печатается.

Результатом является один многоцветный файл 3MF, готовый к цветной печати. У каждой детали серый корпус и верхняя часть в цвете её пикселя. Описание полей см. в разделе Объект задачи сборки Fidget Pixel.

Request

POST
/openapi/creative-lab/fidget-pixel/v1/build
# Stage 2: chain build off a succeeded prototype task
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "input_task_id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
    "options": {
      "shape": "square",
      "grid_size": 32,
      "piece_size_mm": 8,
      "color_count": 8,
      "piece_height_mm": 15
    },
    "output": {
      "format": "3mf"
    }
  }'

Response

{
  "result": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98"
}

Параметры

  • Name
    input_task_id
    Type
    string
    Обязательный
    Description

    ID задачи создания прототипа, которую нужно собрать. Это должна быть задача, созданная вашим аккаунтом с помощью POST /openapi/creative-lab/fidget-pixel/v1/prototype, со статусом SUCCEEDED.

    ID, не являющийся одной из ваших задач создания прототипа Fidget Pixel через API, возвращает 404, включая прототип, созданный в веб-приложении.

  • Name
    name
    Type
    string
    Description

    Название задачи, до 100 символов. Оно возвращается в поле name задачи. Более длинное название возвращает 400.

options

Настройки формы и размера деталей. У каждого поля есть значение по умолчанию, поэтому отправляйте только те поля, которые хотите изменить. 0 использует значение по умолчанию для поля. Это те же настройки, что и в веб-приложении Creative Lab. Остальные настройки формы зафиксированы, и Meshy устанавливает их на основе shape и piece_size_mm.

  • Name
    shape
    Type
    string
    по умолчанию square
    Description

    Форма основания каждой детали. Любое другое значение возвращает 400.

    Доступные значения:

    • square: квадратные детали на квадратной сетке
    • hex: шестиугольные детали на шестиугольной сетке, со значением piece_size_mm, равным 6 или 8
  • Name
    grid_size
    Type
    integer
    по умолчанию 32
    Description

    Количество ячеек сетки вдоль каждой стороны доски, 16 или 32. Любое другое значение возвращает 400. Сетка 32 сохраняет больше деталей. Сетка 16 даёт меньше деталей того же размера, поэтому доска получается примерно вдвое уже.

  • Name
    piece_size_mm
    Type
    integer
    по умолчанию 8
    Description

    Длина стороны каждой детали в миллиметрах: 6, 8 или 10. Любое другое значение возвращает 400. Вместе с grid_size определяет размер печатаемой доски. Например, сетка 32 из деталей 8 мм имеет размер около 26,5 см с каждой стороны.

    10 не работает с hex и возвращает 400, поскольку наклонная грань шестиугольника создаёт нависание на большинстве потребительских FDM-принтеров.

  • Name
    color_count
    Type
    integer
    по умолчанию 8
    Description

    Максимальное количество цветов в палитре пиксель-арта, от 1 до 8. Значение вне диапазона возвращает 400. Для печати вам потребуется до color_count плюс один филамент: по одному на цвет и один для серых корпусов.

  • Name
    piece_height_mm
    Type
    integer
    по умолчанию 15
    Description

    Высота каждой детали в миллиметрах, от 10 до 80. Значение вне диапазона возвращает 400.

output

Настройки для результирующего файла.

  • Name
    format
    Type
    string
    по умолчанию 3mf
    Description

    Формат файла результата. Любое другое значение возвращает 400.

    Доступные значения:

    • 3mf: один многоцветный файл model.3mf, возвращаемый в model_urls.3mf

Возвращаемые значения

Поле result содержит ID новой задачи сборки. Получите задачу или получайте её поток, пока status не станет SUCCEEDED. Затем загрузите файл 3MF из model_urls.3mf.

Режимы сбоя

  • Name
    400 - Bad Request
    Description

    Запрос не может быть выполнен. Например:

    • input_task_id отсутствует или не является допустимым ID задачи.
    • Статус задачи создания прототипа не SUCCEEDED. Если она ещё выполняется, подождите и повторите попытку. Если она завершилась неудачей или была отменена, создайте новую задачу создания прототипа.
    • Задача создания прототипа завершилась успешно, но не содержит изображения. Создайте новую задачу создания прототипа.
    • Поле options выходит за пределы допустимых значений, например grid_size, отличное от 16 или 32.
    • piece_size_mm равно 10, а shape — hex. Шестиугольные детали бывают только 6 и 8 мм.
    • output.format не равно 3mf.

    Сообщение об ошибке указывает, в чём именно проблема.

  • Name
    401 - Unauthorized
    Description

    API-ключ отсутствует или недействителен. Проверьте заголовок Authorization.

  • Name
    402 - Payment Required
    Description

    Применимо одно из следующего:

    • На аккаунте недостаточно кредитов.
    • API-ключ, рабочая область или участник достигли лимита кредитов.
    • Аккаунт находится на бесплатном плане.

    Проверьте количество кредитов и план, затем повторите попытку.

  • Name
    403 - Forbidden
    Description

    В вашей команде включена функция IP Filtering, и Meshy пометила изображение задачи создания прототипа как содержащее стороннюю интеллектуальную собственность. Создайте задачу создания прототипа из изображения, на использование которого у вас есть права.

  • Name
    404 - Not Found
    Description

    input_task_id не соответствует ни одной задаче создания прототипа Fidget Pixel, созданной вашим аккаунтом через API. Прототип, созданный в веб-приложении, также возвращает 404. Отправьте ID из поля result ответа на создание прототипа.

  • Name
    429 - Too Many Requests
    Description

    Достигнуто одно из следующих ограничений:

    • Вы отправили больше запросов, чем допускает ваше ограничение частоты. Подождите несколько секунд и повторите попытку. См. Ограничения частоты.
    • Слишком много ваших задач находится в очереди или выполняется. Дождитесь завершения части из них и повторите попытку.
    • На безлимитном плане без оставшихся кредитов вы достигли количества задач, которые могут выполняться без кредитов. Дождитесь завершения задачи или пополните кредиты.
  • Name
    500 - Internal Server Error
    Description

    В Meshy произошла ошибка сервера, например из-за невозможности выполнить проверку на интеллектуальную собственность для изображения задачи создания прототипа. Meshy не создаёт задачу и возвращает все списанные кредиты. Повторите запрос.


GET/openapi/creative-lab/fidget-pixel/v1/(prototype|build)/:id

Получить задачу Fidget Pixel

Возвращает задачу прототипа или сборки. Путь должен соответствовать этапу задачи. Задача сборки, запрошенная через /prototype/:id, вернёт 404, как и задача прототипа, запрошенная через /build/:id.

Описание полей см. в разделах Объект задачи прототипа Fidget Pixel и Объект задачи сборки Fidget Pixel.

Request

GET
/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# Build
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Prototype Response

{
  "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
  "type": "creative-lab-fidget-pixel-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001000000,
  "started_at": 1757001005000,
  "finished_at": 1757001178000,
  "expires_at": 1757260378000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 6,
  "image_urls": [
    "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
  ]
}

Build Response

{
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

Параметры

  • Name
    id
    Type
    path
    Description

    ID задачи из ответа на создание.

Возвращает

Объект задачи прототипа или объект задачи сборки, в зависимости от этапа, указанного в пути.

Варианты ошибок

  • Name
    400 - Bad Request
    Description

    id не является допустимым ID задачи. Отправьте ID result из ответа на создание.

  • Name
    403 - Forbidden
    Description

    В вашей команде включена функция IP Filtering, и Meshy пометил изображение задачи прототипа как нарушающее права интеллектуальной собственности третьих лиц. Для задач сборки и команд на плане Enterprise эта ошибка не возникает. Создайте задачу прототипа на основе изображения, на использование которого у вас есть права.

  • Name
    404 - Not Found
    Description

    Задача Fidget Pixel с таким ID не принадлежит вашему аккаунту, либо этап задачи не соответствует пути. Проверьте ID и используйте /prototype или /build в соответствии с задачей.

  • Name
    500 - Internal Server Error
    Description

    Meshy не удалось выполнить проверку интеллектуальной собственности. Повторите запрос.


DELETE/openapi/creative-lab/fidget-pixel/v1/(prototype|build)/:id

Удалить задачу Fidget Pixel

Отменяет задачу Fidget Pixel. Отмена задачи со статусом PENDING возвращает её кредиты. Задача со статусом IN_PROGRESS отменяется без возврата средств, поскольку воркер уже приступил к её выполнению. Задачу с окончательным статусом (SUCCEEDED, FAILED или CANCELED) отменить нельзя.

Путь должен соответствовать стадии задачи. Например, DELETE на /prototype/:id с ID задачи сборки вернёт 404.

Request

DELETE
/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7
curl --request DELETE \
  --url https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

// Returns 204 No Content on success (empty body).

Параметры пути

  • Name
    id
    Type
    path
    Description

    ID задачи, которую нужно отменить.

Возвращает

204 No Content с пустым телом ответа.

Варианты ошибок

  • Name
    400 - Bad Request
    Description

    Применимо одно из следующего:

    • id не является допустимым ID задачи. Отправьте ID result из ответа на создание.
    • Задача уже имеет окончательный статус (SUCCEEDED, FAILED или CANCELED), поэтому её нельзя отменить.
  • Name
    404 - Not Found
    Description

    Задача Fidget Pixel с таким ID не принадлежит вашему аккаунту, либо стадия задачи не соответствует пути. Проверьте ID и используйте /prototype или /build в соответствии с задачей.


GET/openapi/creative-lab/fidget-pixel/v1/(prototype|build)/:id/stream

Потоковая передача задачи Fidget Pixel

Передаёт обновления задачи Fidget Pixel в виде событий Server-Sent Events (SSE). Путь должен соответствовать стадии задачи. Если это не так, например, если ID задачи сборки (build) используется в /prototype/:id/stream, поток отправляет одно событие error со status_code: 404 и закрывается. Если id не является допустимым ID задачи, происходит то же самое, но со status_code: 400.

Request

GET
/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/stream
curl -N https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/stream \
-H "Authorization: Bearer ${YOUR_API_KEY}"

Response Stream

// Error event example (wrong stage or task not found)
event: error
data: {
  "status_code": 404,
  "message": "Task not found"
}

// Message event examples illustrate task progress.
// Every frame is the full task object for the stage; fields not yet populated are null / empty.
event: message
data: {
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "PENDING",
  "progress": 0,
  "created_at": 1757001300000,
  "started_at": null,
  "finished_at": null,
  "expires_at": 1757260500000,
  "preceding_tasks": 2,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {}
}

event: message
data: {
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

Параметры

  • Name
    id
    Type
    path
    Description

    ID задачи из ответа на создание.

Возвращает

Поток объектов задачи prototype или build. Каждое событие содержит полный объект задачи, в таком же виде, в каком его возвращает Получение задачи Fidget Pixel. Пока задача находится в состоянии PENDING или IN_PROGRESS, её выходные поля всё ещё пусты (null, [] или {}), а finished_at равно null.

Если IP Filtering блокирует результат задачи, поток отправляет вместо него одно событие error с тем же status_code, который вернул бы запрос get.


GET/openapi/creative-lab/fidget-pixel/v1/(prototype|build)

Получение списка задач Fidget Pixel

Возвращает ваши задачи Fidget Pixel одного этапа, по одной странице за раз. Путь определяет этап. /prototype возвращает только задачи прототипирования, а /build возвращает только задачи сборки.

Request

GET
/openapi/creative-lab/fidget-pixel/v1/prototype
# List prototype tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype?page_size=10 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# List build tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build?page_size=10 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response (List Prototype Tasks)

[
  {
    "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
    "type": "creative-lab-fidget-pixel-prototype",
    "name": "",
    "status": "SUCCEEDED",
    "progress": 100,
    "created_at": 1757001000000,
    "started_at": 1757001005000,
    "finished_at": 1757001178000,
    "expires_at": 1757260378000,
    "preceding_tasks": 0,
    "task_error": null,
    "consumed_credits": 6,
    "image_urls": [
      "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
    ]
  }
]

Параметры пути

  • Name
    stage
    Type
    path
    Обязательный
    Description

    Этап для вывода списка: prototype или build.

Параметры запроса

  • Name
    page_num
    Type
    integer
    по умолчанию 1
    Description

    Возвращаемая страница, от 1 до 255. 0 возвращает первую страницу. Значение за пределами диапазона 0–255 приводит к ошибке 400.

  • Name
    page_size
    Type
    integer
    по умолчанию 10
    Description

    Количество задач на странице, до 100. Значение от 101 до 255 возвращает 100 задач, а 0 использует значение по умолчанию. Значение за пределами диапазона 0–255 приводит к ошибке 400.

  • Name
    sort_by
    Type
    string
    по умолчанию -created_at
    Description

    Порядок сортировки.

    Доступные значения:

    • -created_at: сначала новые
    • +created_at: сначала старые

Возвращает

Массив объектов задачи прототипирования или объектов задачи сборки, в соответствии с этапом, указанным в пути.


Объект задачи прототипа Fidget Pixel

Задача прототипа превращает фото в изображение в стиле пиксель-арт. Чтобы превратить изображение в детали для 3D-печати, передайте ID задачи в эндпоинт сборки как input_task_id.

Свойства

Example Fidget Pixel Prototype Task Object

{
  "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
  "type": "creative-lab-fidget-pixel-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001000000,
  "started_at": 1757001005000,
  "finished_at": 1757001178000,
  "expires_at": 1757260378000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 6,
  "image_urls": [
    "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
  ]
}
  • Name
    id
    Type
    string
    Description

    ID задачи. Не полагайтесь на его формат.

  • Name
    type
    Type
    string
    Description

    Тип задачи, всегда creative-lab-fidget-pixel-prototype.

  • Name
    name
    Type
    string
    Description

    Значение name, отправленное при создании задачи, или "", если вы его не отправляли.

  • Name
    status
    Type
    string
    Description

    Статус задачи.

    Доступные значения:

    • PENDING: ожидание в очереди
    • IN_PROGRESS: генерация результата
    • SUCCEEDED: финальный статус, с результатом
    • FAILED: финальный статус, с причиной в task_error
    • CANCELED: финальный статус, без результата
  • Name
    progress
    Type
    integer
    Description

    Процент выполненной работы, от 0 до 100. Равен 0 до начала выполнения задачи и 100, когда она завершается успешно.

  • Name
    created_at
    Type
    timestamp
    Description

    Время создания задачи, в миллисекундах Unix.

  • Name
    started_at
    Type
    timestamp
    Description

    Время, когда обработчик начал выполнение задачи, в миллисекундах Unix. До этого момента — null.

  • Name
    finished_at
    Type
    timestamp
    Description

    Время, когда задача достигла финального статуса, в миллисекундах Unix. До этого момента — null.

  • Name
    expires_at
    Type
    timestamp
    Description

    Время истечения срока действия результата задачи, в миллисекундах Unix. Это 3 дня после finished_at, либо 3 дня после created_at, пока задача не завершена. Для аккаунтов Enterprise, которые хранят результаты API бессрочно, это значение указывает примерно на 100 лет вперёд. См. Хранение ресурсов.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Позиция задачи в очереди, пока она находится в статусе PENDING. 1 означает, что она будет обработана следующей. После выхода задачи из очереди — 0, и в результатах списка всегда 0.

  • Name
    task_error
    Type
    object
    Description

    Причина сбоя задачи. null, если status не равен FAILED. См. Ошибки.

  • Name
    consumed_credits
    Type
    integer
    Description

    Количество кредитов, списанных за задачу, с учётом любого возврата. За запрос, вернувший ошибку, плата не взимается. Для неудавшейся задачи значение равно 0, так как Meshy возвращает средства. Отмена задачи возвращает средства только пока она находится в статусе PENDING. Если Meshy не может определить сумму списания, поле отсутствует в ответе get или stream, а запрос списка возвращает 500. В этом случае повторите запрос.

  • Name
    image_urls
    Type
    array of strings
    Description

    URL-адреса для скачивания изображения в стиле пиксель-арт. Массив содержит один URL после успешного завершения задачи, а до этого он пуст.

    URL-адреса подписаны, поэтому запрашивайте их без заголовка Authorization. Они остаются действительными до expires_at. Повторное получение задачи до этого момента возвращает те же URL-адреса, а не заново подписанные. Срок действия истёкшего URL нельзя продлить, поэтому скачайте и сохраните файлы заранее.


Объект задачи сборки Fidget Pixel

Задача сборки генерирует детали для 3D-печати из успешно выполненной задачи прототипа. Meshy отображает пиксель-арт изображение на сетку и возвращает детали в виде единого многоцветного файла 3MF.

Свойства

Example Fidget Pixel Build Task Object

{
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}
  • Name
    id
    Type
    string
    Description

    ID задачи. Не полагайтесь на его формат.

  • Name
    type
    Type
    string
    Description

    Тип задачи, всегда creative-lab-fidget-pixel-build.

  • Name
    name
    Type
    string
    Description

    Значение name, которое вы отправили при создании задачи, или "", если вы его не отправляли.

  • Name
    status
    Type
    string
    Description

    Статус задачи.

    Доступные значения:

    • PENDING: ожидание в очереди
    • IN_PROGRESS: генерация результата
    • SUCCEEDED: завершено, с результатом
    • FAILED: завершено, с причиной в task_error
    • CANCELED: завершено, без результата
  • Name
    progress
    Type
    integer
    Description

    Процент выполненной работы, от 0 до 100. Равен 0, пока задача не начата, и 100, когда она успешно завершена.

  • Name
    created_at
    Type
    timestamp
    Description

    Время создания задачи, в миллисекундах Unix.

  • Name
    started_at
    Type
    timestamp
    Description

    Время, когда воркер начал выполнение задачи, в миллисекундах Unix. До этого момента — null.

  • Name
    finished_at
    Type
    timestamp
    Description

    Время, когда задача достигла финального статуса, в миллисекундах Unix. До этого момента — null.

  • Name
    expires_at
    Type
    timestamp
    Description

    Время истечения срока действия результата задачи, в миллисекундах Unix. Это 3 дня после finished_at, либо 3 дня после created_at, пока задача не завершена. Для корпоративных аккаунтов (Enterprise), которые хранят результаты API бессрочно, это значение указывает примерно на 100 лет вперёд. См. Хранение ресурсов.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Позиция задачи в очереди, пока она находится в статусе PENDING. 1 означает, что она начнётся следующей. 0 после того, как задача покидает очередь, и всегда 0 в результатах списка.

  • Name
    task_error
    Type
    object
    Description

    Причина сбоя задачи. null, если status не равен FAILED. См. Ошибки.

  • Name
    consumed_credits
    Type
    integer
    Description

    Количество кредитов, списанных за задачу, с учётом возможного возврата. Запрос, вернувший ошибку, не оплачивается. Для неудавшейся задачи значение равно 0, так как Meshy возвращает кредиты. Отмена возвращает кредиты за задачу только пока она находится в статусе PENDING. Если Meshy не может определить сумму списания, в ответе на get-запрос или поток это поле отсутствует, а запрос списка возвращает 500. В этом случае повторите запрос.

  • Name
    model_urls
    Type
    object
    Description

    URL-адреса для скачивания результата, с ключами по формату файла. Объект содержит одну запись — для формата output.format, который вы отправили, и остаётся пустым до завершения задачи.

    URL-адреса подписаны, поэтому запрашивайте их без заголовка Authorization. Они остаются действительными до expires_at. Повторное получение задачи до этого момента возвращает те же URL-адреса, а не вновь подписанные. Истёкший URL-адрес нельзя обновить, поэтому скачивайте и сохраняйте файлы до истечения срока.

    • Name
      3mf
      Type
      string
      Description

      URL для скачивания многоцветного файла 3MF. Каждая деталь имеет серое тело и верхнюю часть цвета своего пикселя. Присутствует, когда output.format равен 3mf, что является значением по умолчанию.


Полный пример

Следующие скрипты на cURL и Python выполняют весь процесс. Каждый скрипт создаёт задачу прототипа из фотографии и ожидает её успешного завершения. Затем он создаёт задачу сборки, ожидает её завершения и скачивает файл 3MF из model_urls.3mf.

Для скрипта cURL требуются curl и jq, а для скрипта Python — пакет requests. Чтобы запустить скрипт, выполните следующие шаги:

  1. Установите MESHY_API_KEY равным вашему API-ключу.
  2. Установите IMAGE_PATH равным пути к локальной фотографии, либо IMAGE_URL равным публичному URL изображения.
  3. Необязательно: чтобы пикселизировать объект, отличный от человека, установите PIXEL_TYPE равным other.
  4. Запустите скрипт.

Обычно задача прототипа завершается в течение нескольких минут. Задача сборки обычно завершается значительно быстрее минуты.

В своём приложении показывайте пользователю изображение из image_urls перед созданием задачи сборки. Если оно ему не понравится, создайте вместо этого ещё одну задачу прототипа. Таким образом вы тратите кредиты на сборку только на то изображение, которое он одобрил.

Complete flow

POST
/openapi/creative-lab/fidget-pixel/v1
#!/usr/bin/env bash
set -euo pipefail

# Requires curl and jq. Point IMAGE_PATH at a local photo, or IMAGE_URL at a public one:
#   export MESHY_API_KEY=msy_...
#   export IMAGE_PATH=./portrait.jpg          # or: export IMAGE_URL=https://...
#   export PIXEL_TYPE=person                  # or: other
: "${MESHY_API_KEY:?export MESHY_API_KEY first}"
if [[ -z "${IMAGE_PATH:-}" && -z "${IMAGE_URL:-}" ]]; then
  echo "export IMAGE_PATH (local file) or IMAGE_URL (public url) first" >&2
  exit 1
fi
PIXEL_TYPE=${PIXEL_TYPE:-person}

BASE="https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1"
AUTH="Authorization: Bearer $MESHY_API_KEY"

# api METHOD URL [curl args...] -> prints the response body, non-zero on failure.
# Note we do not use -f/--fail: it discards the body, and the body is the only
# place the reason appears.
api() {
  local method=$1 url=$2 out http_code body
  shift 2
  out=$(curl --silent --show-error --max-time 60 --write-out $'\n%{http_code}' \
    -X "$method" "$url" -H "$AUTH" "$@") || return 1
  http_code=${out##*$'\n'}
  body=${out%$'\n'*}
  if ((http_code >= 400)); then
    echo "HTTP $http_code for $url: $body" >&2
    return 1
  fi
  printf '%s' "$body"
}

# Each task gets its own 40-minute budget.
poll() {
  local kind=$1 id=$2 delay=5 task_status deadline
  deadline=$(($(date +%s) + 2400))
  while :; do
    if (($(date +%s) >= deadline)); then
      echo "gave up waiting for $kind $id" >&2
      return 1
    fi
    task_status=$(api GET "$BASE/$kind/$id" | jq -r '.status')
    echo "$kind: $task_status"
    case "$task_status" in
    SUCCEEDED) return 0 ;;
    FAILED | CANCELED) return 1 ;;
    esac
    sleep "$delay"
    delay=$((delay * 2 > 30 ? 30 : delay * 2))
  done
}

# Build the request body in a file. A base64 data URI must never go on the
# command line or into an exported variable - a photo of any real size will
# exceed the OS argument limit.
BODY=$(mktemp)
trap 'rm -f "$BODY"' EXIT
if [[ -n "${IMAGE_PATH:-}" ]]; then
  # Declare the real type: the API accepts JPEG, PNG and WebP.
  case "$(printf '%s' "${IMAGE_PATH##*.}" | tr 'A-Z' 'a-z')" in
    png) MIME=image/png ;;
    webp) MIME=image/webp ;;
    *) MIME=image/jpeg ;;
  esac
  {
    printf '{"type":"%s","image_url":"data:%s;base64,' "$PIXEL_TYPE" "$MIME"
    base64 <"$IMAGE_PATH" | tr -d '\n'
    printf '"}'
  } >"$BODY"
else
  jq -n --arg t "$PIXEL_TYPE" --arg u "$IMAGE_URL" \
    '{type: $t, image_url: $u}' >"$BODY"
fi

# 1. Create the prototype task
PROTO_ID=$(api POST "$BASE/prototype" \
  -H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')

# 2. Wait for the pixel-art image (show image_urls[0] to a user in production)
poll prototype "$PROTO_ID"

# 3. Create the build task (defaults: square pieces, 32x32 grid, 8 mm, 8 colors, 15 mm tall)
jq -n --arg p "$PROTO_ID" \
  '{input_task_id: $p, options: {shape: "square", grid_size: 32, piece_size_mm: 8, color_count: 8, piece_height_mm: 15}, output: {format: "3mf"}}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
  -H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')

# 4. Wait for the pieces
poll build "$BUILD_ID"

# 5. Download the 3MF. This is a signed URL: no Authorization header,
#    and it stays valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
  -o fidget-pixel.3mf "$(jq -r '.model_urls["3mf"]' <<<"$TASK")"
echo "Done: fidget-pixel.3mf"