Creative Lab — API брелока

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

  • POST /openapi/creative-lab/keychain/v1/prototype
  • POST /openapi/creative-lab/keychain/v1/build

POST/openapi/creative-lab/keychain/v1/prototype

Создание задачи прототипа брелока

Создайте одноцветное концептуальное изображение из исходной фотографии. Возвращаемый идентификатор задачи — это то, что вы передаете как input_task_id в эндпоинт сборки. Обратитесь к Объект задачи прототипа брелока для формы ответа.

Параметры

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

    Исходная фотография для Meshy, чтобы окрасить в концептуальное изображение, готовое для брелока. В настоящее время мы поддерживаем форматы .jpg, .jpeg, .png и .webp.

    Есть два способа предоставить изображение:

    • Общедоступный URL: URL, доступный из публичного интернета.
    • Data URI: Данные URI изображения, закодированные в base64. Пример Data URI: data:image/jpeg;base64,<your base64-encoded image data>.
  • Name
    name
    Type
    string
    Description

    Необязательное имя задачи для отображения. Максимум 100 символов.

  • Name
    remove_background
    Type
    boolean
    по умолчанию false
    Description

    Если установлено значение true, прототип изображения возвращается в виде прозрачного RGBA PNG с удаленным фоном, чтобы вы могли наложить объект на любой фон.

    Это управляет только изображением, которое возвращает этот эндпоинт. Это отдельно от опции сборки с тем же именем (по умолчанию true), которая управляет удалением фона перед рельефом.

Возвращает

Свойство result ответа содержит идентификатор задачи id вновь созданной задачи прототипа брелока. Опросите эндпоинт Получить задачу или подпишитесь на поток до тех пор, пока задача не достигнет SUCCEEDED, затем передайте этот идентификатор в эндпоинт сборки как input_task_id.

Режимы отказа

  • Name
    400 - Bad Request
    Description

    Запрос был неприемлем. Общие причины:

    • Отсутствующий параметр: image_url обязателен.
    • Неверный формат изображения: Предоставленный image_url не поддерживается (.jpg, .jpeg, .png, .webp).
    • Размеры изображения вне диапазона: Изображение слишком маленькое, превышает максимальный размер файла или превышает максимальное количество пикселей.
    • Недоступный URL: image_url не может быть загружен (404 или timeout).
    • Неверный Data URI: Строка base64 повреждена.
    • Контент помечен: Входное изображение было помечено модерацией NSFW или интеллектуальной собственности.
  • Name
    401 - Unauthorized
    Description

    Аутентификация не удалась. Пожалуйста, проверьте ваш API-ключ.

  • Name
    402 - Payment Required
    Description

    Недостаточно кредитов для выполнения этой задачи.

  • Name
    429 - Too Many Requests
    Description

    Вы превысили ваше ограничение частоты.

Запрос

POST
/openapi/creative-lab/keychain/v1/prototype
# Stage 1: generate a colorized keychain concept image
curl https://api.meshy.ai/openapi/creative-lab/keychain/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>"
  }'

Ответ

{
  "result": "018a210d-8ba4-705c-b111-1f1776f7f578"
}
Пример прототипа
Начните с исходной фотографии, затем создайте прототип изображения, используемого на этапе сборки брелока.
Исходная фотография, используемая в качестве входных данных для Creative Lab Keychain
Входные данные прототипа
Выходной прототип Creative Lab Keychain, созданный из исходной фотографии
Выходные данные прототипа

POST/openapi/creative-lab/keychain/v1/build

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

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

Параметры

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

    Идентификатор задачи прототипа, созданной через этот же эндпоинт OpenAPI. Прототип должен быть создан с тем же API-ключом, должен достичь SUCCEEDED и должен произвести ровно одно кандидатное изображение.

    Прототипы, созданные через веб-приложение, не принимаются — эндпоинт сборки принимает только прототипы, созданные POST /openapi/creative-lab/keychain/v1/prototype и отклоняет любой другой источник с 404.

  • Name
    name
    Type
    string
    Description

    Необязательное имя задачи для отображения. Максимум 100 символов.

options

Необязательные параметры настройки для рельефной геометрии. У каждого поля есть разумное значение по умолчанию — отправляйте только те, которые хотите переопределить.

  • Name
    badge_shape
    Type
    string
    по умолчанию circle
    Description

    Контурный силуэт медальона брелока. Доступные значения:

    • circle (по умолчанию)
    • rounded-rect
    • hexagon
    • shield
    • star
  • Name
    size_mm
    Type
    number
    по умолчанию 40
    Description

    Длина ребра ограничивающего квадрата брелока, в миллиметрах. Диапазон: (0, 400].

  • Name
    relief_height_mm
    Type
    number
    по умолчанию 2.2
    Description

    Максимальная высота рельефа над основанием, в миллиметрах. Диапазон: [0, 20].

  • Name
    relief_offset_mm
    Type
    number
    по умолчанию 0
    Description

    Вертикальное смещение, применяемое к рельефу перед экструзией, в миллиметрах. Диапазон: [0, 20].

  • Name
    base_thickness_mm
    Type
    number
    по умолчанию 0.1
    Description

    Толщина плоской базовой пластины за рельефом, в миллиметрах. Диапазон: [0, 20].

  • Name
    has_closed_back
    Type
    boolean
    по умолчанию true
    Description

    Является ли задняя часть медальона закрытой поверхностью. Установите значение false для открытой оболочки.

  • Name
    relief_curve
    Type
    string
    по умолчанию linear
    Description

    Кривая передачи, отображающая значения карты глубины на высоту рельефа. Доступные значения:

    • linear (по умолчанию)
    • gamma
    • s-curve
  • Name
    curve_param
    Type
    number
    по умолчанию 1.0
    Description

    Параметр формы для кривой передачи (имеет значение только при relief_curve равном gamma). Диапазон: (0, 10].

  • Name
    invert_depth
    Type
    boolean
    по умолчанию false
    Description

    Инвертировать интерпретацию карты глубины, чтобы более темные области становились более высокими рельефами.

  • Name
    smoothing
    Type
    number
    по умолчанию 0.24
    Description

    Сила сглаживания, применяемая к карте глубины перед извлечением рельефа. Диапазон: [0, 10].

  • Name
    relief_scale
    Type
    number
    по умолчанию 1.0
    Description

    Множитель вертикального масштаба, применяемый поверх relief_height_mm. Диапазон: (0, 10].

  • Name
    depth_threshold
    Type
    number
    по умолчанию 0.1
    Description

    Порог низкой частоты для значений карты глубины; все, что ниже этого, обрезается до нуля. Диапазон: [0, 1].

  • Name
    remove_background
    Type
    boolean
    по умолчанию true
    Description

    Автоматически удалять фон концептуального изображения прототипа перед рельефом.

    Отдельно от параметра прототипа с тем же именем (по умолчанию false), который управляет тем, возвращается ли само изображение прототипа с прозрачностью.

  • Name
    export_resolution
    Type
    integer
    по умолчанию 512
    Description

    Разрешение сетки, используемое для экспорта. Диапазон: [64, 2048].

output

Необязательный селектор формата передачи. По умолчанию glb.

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

    Пакет артефактов, возвращаемый сборкой. Доступные значения:

    • glb (по умолчанию) — возвращает единый model.glb под model_urls.glb.
    • obj — архивирует model.obj + model.mtl + texture.png и возвращает пакет под model_urls.obj.
    • zip — архивирует каждый артефакт, который генерирует генератор, и возвращает пакет под model_urls.bundle_zip.

Возвращает

Свойство result ответа содержит идентификатор задачи id вновь созданной задачи сборки брелока. Запрашивайте эндпоинт Получить задачу или подписывайтесь на поток до тех пор, пока задача не достигнет SUCCEEDED, затем загрузите артефакт из единственной записи в model_urls.

Режимы отказа

  • Name
    400 - Bad Request
    Description

    Запрос был неприемлем. Общие причины:

    • Отсутствует параметр: input_task_id обязателен.
    • Недействительный UUID: input_task_id не является допустимым UUID.
    • Родитель не завершен: Указанная задача прототипа еще не достигла SUCCEEDED.
    • Нет кандидата: Задача прототипа завершилась успешно, но не произвела кандидатное изображение.
    • Параметры вне диапазона: Одно из полей options вышло за пределы допустимого диапазона или набора перечислений.
  • Name
    401 - Unauthorized
    Description

    Аутентификация не удалась. Пожалуйста, проверьте ваш API-ключ.

  • Name
    402 - Payment Required
    Description

    Недостаточно кредитов для выполнения этой задачи.

  • Name
    404 - Not Found
    Description

    Указанная задача прототипа не существует, принадлежит другому пользователю или была создана через веб-приложение (только прототипы в режиме API могут быть связаны со сборкой).

  • Name
    429 - Too Many Requests
    Description

    Вы превысили свое ограничение частоты.

Запрос

POST
/openapi/creative-lab/keychain/v1/build
# Stage 2: chain build off a succeeded prototype task
curl https://api.meshy.ai/openapi/creative-lab/keychain/v1/build \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "input_task_id": "018a210d-8ba4-705c-b111-1f1776f7f578",
    "options": {
      "badge_shape": "circle",
      "size_mm": 40,
      "relief_height_mm": 2.5
    },
    "output": {
      "format": "glb"
    }
  }'

Ответ

{
  "result": "019c320e-9a8f-7a1c-9c11-2a1876f8a9bb"
}
Пример сборки
Задача сборки преобразует выбранное изображение прототипа в 3D-печатаемую модель брелока.
Предварительный просмотр модели сборки брелока Creative Lab
Предварительный просмотр модели сборки

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

Получение задачи брелока

Получите задачу прототипа или сборки, указав действительный id задачи. Путь URL должен соответствовать стадии задачи — задача сборки, полученная через /prototype/:id, вернет 404, и наоборот.

Обратитесь к Объект задачи прототипа брелока и Объект задачи сборки брелока для форматов ответа.

Параметры

  • Name
    id
    Type
    path
    Description

    Уникальный идентификатор задачи брелока для получения.

Возвращает

Ответ содержит объект задачи брелока. Формат зависит от запрашиваемой стадии.

Запрос

GET
/openapi/creative-lab/keychain/v1/prototype/018a210d-8ba4-705c-b111-1f1776f7f578
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/keychain/v1/prototype/018a210d-8ba4-705c-b111-1f1776f7f578 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# Build
curl https://api.meshy.ai/openapi/creative-lab/keychain/v1/build/019c320e-9a8f-7a1c-9c11-2a1876f8a9bb \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Ответ прототипа

{
  "id": "018a210d-8ba4-705c-b111-1f1776f7f578",
  "type": "creative-lab-keychain-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1729123456000,
  "started_at": 1729123460000,
  "finished_at": 1729123486000,
  "expires_at": 1729382686000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 6,
  "image_urls": [
    "https://assets.meshy.ai/***/concept.png?Expires=***"
  ]
}

Ответ сборки

{
  "id": "019c320e-9a8f-7a1c-9c11-2a1876f8a9bb",
  "type": "creative-lab-keychain-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1729123500000,
  "started_at": 1729123510000,
  "finished_at": 1729123535000,
  "expires_at": 1729382735000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 20,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c320e-9a8f-7a1c-9c11-2a1876f8a9bb/output/model.glb?Expires=***"
  }
}

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

Удаление задачи брелока

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

Путь URL должен соответствовать стадии задачи — DELETE на /prototype/:buildId возвращает 404.

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

  • Name
    id
    Type
    path
    Description

    Уникальный идентификатор задачи брелока для отмены.

Возвращает

Возвращает 204 No Content в случае успеха с пустым телом.

Режимы отказа

  • Name
    400 - Bad Request
    Description

    Задача уже находится в конечном состоянии и не может быть отменена.

  • Name
    404 - Not Found
    Description

    Задача не существует, принадлежит другому пользователю или ее стадия не соответствует пути URL.

Запрос

DELETE
/openapi/creative-lab/keychain/v1/prototype/018a210d-8ba4-705c-b111-1f1776f7f578
curl --request DELETE \
  --url https://api.meshy.ai/openapi/creative-lab/keychain/v1/prototype/018a210d-8ba4-705c-b111-1f1776f7f578 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Ответ

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

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

Трансляция задачи брелока

Транслируйте обновления в реальном времени для задачи брелока через Server-Sent Events (SSE). Путь URL должен соответствовать стадии задачи — открытие потока на /prototype/:buildId/stream выдаст единственную полезную нагрузку event: error со status_code: 404 и закроет поток.

Параметры

  • Name
    id
    Type
    path
    Description

    Уникальный идентификатор задачи брелока для трансляции.

Возвращает

Возвращает поток объектов задач Keychain Prototype или Keychain Build в виде Server-Sent Events. Для задач со статусом PENDING или IN_PROGRESS, поток ответа будет включать только необходимые поля progress и status.

Запрос

GET
/openapi/creative-lab/keychain/v1/build/019c320e-9a8f-7a1c-9c11-2a1876f8a9bb/stream
curl -N https://api.meshy.ai/openapi/creative-lab/keychain/v1/build/019c320e-9a8f-7a1c-9c11-2a1876f8a9bb/stream \
-H "Authorization: Bearer ${YOUR_API_KEY}"

Поток ответа

// 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.
// For PENDING or IN_PROGRESS tasks, the response stream will not include all fields.
event: message
data: {
  "id": "019c320e-9a8f-7a1c-9c11-2a1876f8a9bb",
  "progress": 0,
  "status": "PENDING"
}

event: message
data: {
  "id": "019c320e-9a8f-7a1c-9c11-2a1876f8a9bb",
  "type": "creative-lab-keychain-build",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1729123500000,
  "started_at": 1729123510000,
  "finished_at": 1729123535000,
  "expires_at": 1729382735000,
  "task_error": null,
  "consumed_credits": 20,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c320e-9a8f-7a1c-9c11-2a1876f8a9bb/output/model.glb?Expires=***"
  }
}

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

Список задач брелока

Получите пагинированный список ваших задач брелока для одного этапа. Путь URL выбирает этап — /prototype возвращает задачи прототипа; /build возвращает задачи сборки. Задачи с другого этапа не включены ни в один из ответов.

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

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

    Либо prototype, либо build. Коллекция возвращает только задачи, этап которых соответствует URL — запрос /prototype никогда не возвращает задачи сборки и наоборот.

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

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

    Номер страницы для пагинации.

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

    Лимит размера страницы. Максимально допустимое количество — 50 элементов.

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

    Поле для сортировки. Доступные значения:

    • +created_at: Сортировка по времени создания в порядке возрастания.
    • -created_at: Сортировка по времени создания в порядке убывания.

Возвращает

Возвращает пагинированный список объектов задач по этапам — либо объект задачи прототипа брелока при перечислении /prototype, либо объект задачи сборки брелока при перечислении /build.

Запрос

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

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

Ответ (Список задач прототипа)

[
  {
    "id": "018a210d-8ba4-705c-b111-1f1776f7f578",
    "type": "creative-lab-keychain-prototype",
    "name": "",
    "status": "SUCCEEDED",
    "progress": 100,
    "created_at": 1729123456000,
    "started_at": 1729123460000,
    "finished_at": 1729123486000,
    "expires_at": 1729382686000,
    "preceding_tasks": 0,
    "task_error": null,
    "consumed_credits": 6,
    "image_urls": [
      "https://assets.meshy.ai/***/concept.png?Expires=***"
    ]
  }
]

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

Объект задачи прототипа брелока — это рабочая единица, за которой Meshy следит для создания цветного концептуального изображения из исходной фотографии. Результат этого этапа связывается с этапом сборки через input_task_id.

Свойства

  • Name
    id
    Type
    string
    Description

    Уникальный идентификатор задачи. Хотя мы используем k-сортируемый UUID для идентификаторов задач как деталь реализации, вы не должны делать никаких предположений о формате id.

  • Name
    type
    Type
    string
    Description

    Тип задачи. Значение — creative-lab-keychain-prototype.

  • Name
    name
    Type
    string
    Description

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

  • Name
    status
    Type
    string
    Description

    Статус задачи. Возможные значения: PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

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

  • Name
    created_at
    Type
    timestamp
    Description

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

  • Name
    started_at
    Type
    timestamp
    Description

    Временная метка начала выполнения задачи в миллисекундах. Если задача еще не начата, это свойство будет 0.

  • Name
    finished_at
    Type
    timestamp
    Description

    Временная метка завершения задачи в миллисекундах. Если задача еще не завершена, это свойство будет 0.

  • Name
    expires_at
    Type
    timestamp
    Description

    Временная метка истечения результата задачи в миллисекундах.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Количество предшествующих задач.

  • Name
    task_error
    Type
    object
    Description

    Детали ошибки для неудавшихся задач. См. Ошибки для полной справки по объекту task_error.

  • Name
    consumed_credits
    Type
    integer
    Description

    Количество кредитов, потребленных этой задачей. Присутствует, когда статус задачи — PENDING, IN_PROGRESS или SUCCEEDED. Возвращает 0 для задач со статусом FAILED (кредиты возвращаются при неудаче).

  • Name
    image_urls
    Type
    array of strings
    Description

    Скачиваемые URL-адреса для кандидатов концептуальных изображений, созданных этой задачей прототипа. В настоящее время API всегда возвращает ровно одного кандидата; поле является массивом, чтобы будущие версии могли отображать нескольких кандидатов без нарушения совместимости.

Пример объекта задачи прототипа брелока

{
  "id": "018a210d-8ba4-705c-b111-1f1776f7f578",
  "type": "creative-lab-keychain-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1729123456000,
  "started_at": 1729123460000,
  "finished_at": 1729123486000,
  "expires_at": 1729382686000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 6,
  "image_urls": [
    "https://assets.meshy.ai/***/concept.png?Expires=***"
  ]
}

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

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

Свойства

  • Name
    id
    Type
    string
    Description

    Уникальный идентификатор задачи.

  • Name
    type
    Type
    string
    Description

    Тип задачи. Значение — creative-lab-keychain-build.

  • Name
    name
    Type
    string
    Description

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

  • Name
    status
    Type
    string
    Description

    Статус задачи. Возможные значения: PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

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

  • Name
    created_at
    Type
    timestamp
    Description

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

  • Name
    started_at
    Type
    timestamp
    Description

    Временная метка начала выполнения задачи в миллисекундах.

  • Name
    finished_at
    Type
    timestamp
    Description

    Временная метка завершения задачи в миллисекундах.

  • Name
    expires_at
    Type
    timestamp
    Description

    Временная метка истечения результата задачи в миллисекундах.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Количество предшествующих задач. Имеет значение только при статусе PENDING.

  • Name
    task_error
    Type
    object
    Description

    Подробности ошибки для неудачных задач. См. Ошибки для полной справки по объекту task_error.

  • Name
    consumed_credits
    Type
    integer
    Description

    Количество кредитов, потребленных этой задачей. Возвращает 0 для задач со статусом FAILED (кредиты возвращаются в случае неудачи).

  • Name
    model_urls
    Type
    object
    Description

    Скачиваемые URL для сгенерированного артефакта, сгруппированные по имени артефакта. Всегда содержит ровно одну запись — формат, запрошенный через output.format запроса сборки. Ключ соответствует запрошенному формату:

    • Name
      glb
      Type
      string
      Description

      Скачиваемый URL для файла GLB. Присутствует, когда output.format был glb (по умолчанию).

    • Name
      obj
      Type
      string
      Description

      Скачиваемый URL для zip-архива, содержащего model.obj, model.mtl и texture.png. Присутствует, когда output.format был obj.

    • Name
      bundle_zip
      Type
      string
      Description

      Скачиваемый URL для zip-архива всех артефактов, которые генерирует генератор. Присутствует, когда output.format был zip.

Пример объекта задачи сборки брелока

{
  "id": "019c320e-9a8f-7a1c-9c11-2a1876f8a9bb",
  "type": "creative-lab-keychain-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1729123500000,
  "started_at": 1729123510000,
  "finished_at": 1729123535000,
  "expires_at": 1729382735000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 20,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c320e-9a8f-7a1c-9c11-2a1876f8a9bb/output/model.glb?Expires=***"
  }
}