lowpoly será descontinuado a 30/10/2026. Mude de modelo antes destas datas para evitar erros nos pedidos.

API Analisar imprimibilidade

Analise um modelo 3D quanto à imprimibilidade — estanquicidade, volume, orifícios, arestas non-manifold e faces degeneradas. Opcionalmente, verifique também a espessura de parede no tamanho em que planeia imprimir.


POST/openapi/v1/print/analyze

Create an Analyze Printability Task

Este endpoint cria uma nova tarefa de análise de imprimibilidade. A tarefa avalia um modelo 3D e reporta as suas métricas de imprimibilidade.

A tarefa é executada em segundo plano. Para saber quanto tempo demora normalmente, consulte Processing Times.

Se a tarefa de entrada já tiver imprimibilidade em cache, a tarefa devolvida fica imediatamente pronta e o primeiro GET sobre ela devolverá o resultado da análise sem passar pelo worker.

Para verificar também a espessura de parede no tamanho em que planeia imprimir, envie printer_type, um tamanho de impressão, ou ambos. O resultado é devolvido em printability.thin_walls. Verificar a espessura de parede demora mais tempo, pelo que a tarefa normalmente não fica pronta de imediato, mesmo que o modelo já tenha sido analisado anteriormente.

Parâmetros

  • Name
    model_url
    Type
    string
    Obrigatório
    Description

    URL de um modelo 3D a analisar. Formatos suportados: .glb, .gltf, .obj, .fbx, .stl. Use um URL http ou https, ou um URL data: em base64 para um GLB (data:model/gltf-binary;base64,...) ou glTF (data:model/gltf+json;base64,...). Os ficheiros .obj, .fbx e .stl têm de ser enviados como um URL http ou https.

    Tamanho máximo do ficheiro: 400 MB para um URL http ou https, 100 MB para um URI data:.

    Um ficheiro GLB, glTF, FBX ou OBJ com mais de 100 MB pode ter no máximo 10.000.000 de faces. As faces são contadas como triângulos: um quadrilátero conta como 2, e uma malha desenhada mais do que uma vez conta uma vez por cópia. Acima de 100 MB, um ficheiro FBX tem de ser FBX binário 7.1 ou mais recente, e um ficheiro GLB ou glTF não pode usar compressão Draco.

    Os URLs de transferência do Meshy (assets.meshy.ai/…?Expires=…&Signature=…) são assinados e deixam de funcionar no expires_at da tarefa; voltar a obter a tarefa não os renova. Para um modelo gerado com o Meshy, envie input_task_id em vez disso. Funciona enquanto a tarefa de origem for retida (consulte Asset Retention). Para reutilizar um modelo depois disso, transfira-o antes do expires_at e envie a sua própria cópia.

  • Name
    printer_type
    Type
    string
    Description

    A impressora que planeia usar. Define a espessura de parede mínima para a verificação de espessura de parede. Por predefinição é fdm quando envia um tamanho de impressão sem este campo.

    Valores disponíveis:

    • fdm: filamento, parede mínima de 1,0 mm.
    • sla: resina, parede mínima de 0,8 mm.
    • full_color: cor completa, parede mínima de 2,0 mm.
  • Name
    intended_print_height_mm
    Type
    number
    Description

    Altura da impressão, em milímetros. Intervalo: [1, 1000]. Arredondado ao milímetro mais próximo. Apenas para entrada GLB.

  • Name
    intended_print_longest_side_mm
    Type
    number
    Description

    Comprimento do lado mais comprido da impressão, em milímetros. Intervalo: [1, 1000]. Arredondado ao milímetro mais próximo. Funciona com todos os formatos de entrada.

Retornos

A propriedade result da resposta contém o id da tarefa de análise de imprimibilidade recém-criada.

Modos de Falha

  • Name
    400 - Bad Request
    Description

    O pedido foi inaceitável. Causas comuns:

    • Parâmetro em falta: nem input_task_id nem model_url foram fornecidos.
    • UUID inválido: input_task_id não é um UUID válido.
    • URL do modelo inválido: model_url está malformado, usa um esquema não suportado, ou tem uma extensão de ficheiro não suportada.
    • Ficheiro do modelo demasiado grande: o corpo de model_url excedeu os 400 MB (URL http ou https) ou os 100 MB (URI data:).
    • Demasiadas faces: model_url é um ficheiro GLB, glTF, FBX ou OBJ com mais de 100 MB e com mais de 10.000.000 de faces. Reduza o número de faces e envie o ficheiro novamente.
    • FBX ASCII com mais de 100 MB: model_url é um FBX ASCII com mais de 100 MB. Envie-o como FBX binário ou GLB.
    • Ficheiro do modelo ilegível: model_url tem mais de 100 MB e o seu cabeçalho não pode ser lido, por exemplo um GLB ou glTF comprimido com Draco, ou um FBX binário anterior à versão 7.1.
    • Cabeçalho do modelo demasiado complexo: model_url tem mais de 100 MB e o seu cabeçalho tem demasiadas malhas, nós ou registos para verificar. Reduza o número de objetos no ficheiro e envie-o novamente.
    • Não foi possível transferir o ficheiro do modelo: model_url devolveu um erro, mais frequentemente porque um URL de transferência assinado do Meshy expirou. Voltar a obter a tarefa devolve o mesmo URL com o mesmo prazo de expiração, pelo que deve enviar a sua própria cópia do ficheiro, ou usar input_task_id enquanto a tarefa de origem ainda estiver retida.
    • Tarefa não concluída com sucesso: a tarefa referenciada ainda está pendente, em curso, ou falhou.
    • Tamanho de impressão inválido: intended_print_height_mm ou intended_print_longest_side_mm está fora do intervalo [1, 1000], ou ambos foram enviados.
    • Tipo de impressora desconhecido: printer_type não é fdm, sla, nem full_color.
    • Altura num modelo que não é GLB: intended_print_height_mm foi enviado com um model_url que não é .glb. Use intended_print_longest_side_mm em vez disso.
    • Não é possível dimensionar este modelo por altura: na altura pedida (ou na predefinição de 150 mm), o lado mais comprido do modelo ficaria fora de [1, 1000] mm, o modelo é plano, ou o seu tamanho não pode ser determinado. Use intended_print_longest_side_mm em vez disso. Para um model_url .glb e para algumas tarefas input_task_id, isto só é detetado depois de a tarefa começar, e a tarefa termina com FAILED em vez disso.
    • Tamanho do STL inutilizável: printer_type foi enviado sem um tamanho, e o lado mais comprido do próprio .stl não pode ser lido ou está fora de [1, 1000] mm. Envie intended_print_longest_side_mm.
  • Name
    401 - Unauthorized
    Description

    A autenticação falhou. Verifique a sua chave de API.

  • Name
    404 - Not Found
    Description

    Causas comuns:

    • A tarefa não existe, foi eliminada, ou pertence a outro utilizador.
    • A tarefa usa um modelo anterior ao Meshy 6, ou o seu mode não produz um recurso 3D.
    • O ficheiro de modelo subjacente já não está disponível no armazenamento.
  • Name
    429 - Too Many Requests
    Description

    Excedeu a sua quota de tarefas pendentes ou o limite de taxa.

Request

POST
/openapi/v1/print/analyze
# Analyze an existing task
curl https://api.meshy.ai/openapi/v1/print/analyze \
-X POST \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
    "input_task_id": "018a210d-8ba4-705c-b111-1f1776f7f578"
  }'

# Or analyze a model URL directly
curl https://api.meshy.ai/openapi/v1/print/analyze \
-X POST \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
    "model_url": "https://example.com/model.glb"
  }'

# Also check wall thickness for a 100 mm tall SLA print
curl https://api.meshy.ai/openapi/v1/print/analyze \
-X POST \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
    "input_task_id": "018a210d-8ba4-705c-b111-1f1776f7f578",
    "printer_type": "sla",
    "intended_print_height_mm": 100
  }'

Response

{
  "result": "0193bfc5-ee4f-73f8-8525-44b398884ce9"
}

GET/openapi/v1/print/analyze/:id

Obter uma tarefa de Analisar imprimibilidade

Este endpoint obtém uma tarefa de análise de imprimibilidade através do seu ID.

Parâmetros

  • Name
    id
    Type
    path
    Description

    O ID da tarefa de análise de imprimibilidade a obter.

Devolve

O Objeto de tarefa de Analisar imprimibilidade. O campo printability é null até a tarefa atingir SUCCEEDED. Quando a espessura de parede foi verificada, printability também inclui intended_print e thin_walls.

Request

GET
/openapi/v1/print/analyze/a43b5c6d-7e8f-901a-234b-567c890d1e2f
curl https://api.meshy.ai/openapi/v1/print/analyze/a43b5c6d-7e8f-901a-234b-567c890d1e2f \
-H "Authorization: Bearer ${YOUR_API_KEY}"

Response

{
  "id": "0193bfc5-ee4f-73f8-8525-44b398884ce9",
  "type": "print-analyze",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1699999999000,
  "started_at": 1700000000000,
  "finished_at": 1700000001000,
  "expires_at": 1715725401000,
  "task_error": null,
  "printability": {
    "_version": "v1",
    "status": "warning",
    "issue_count": 1,
    "error_count": 0,
    "warning_count": 1,
    "metrics": {
      "is_watertight": true,
      "volume": 1.316167354292668,
      "non_manifold_edges": 0,
      "degenerate_faces": 43242,
      "holes": 0
    },
    "evaluated_at": 1700000001000
  },
  "consumed_credits": 0
}

Response (wall thickness checked)

{
  "id": "0193bfc5-ee4f-73f8-8525-44b398884ce9",
  "type": "print-analyze",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1699999999000,
  "started_at": 1700000000000,
  "finished_at": 1700000012000,
  "expires_at": 1715725412000,
  "task_error": null,
  "printability": {
    "_version": "v1",
    "status": "error",
    "issue_count": 2,
    "error_count": 1,
    "warning_count": 1,
    "metrics": {
      "is_watertight": true,
      "volume": 1.316167354292668,
      "non_manifold_edges": 0,
      "degenerate_faces": 43242,
      "holes": 0
    },
    "intended_print": {
      "printer_type": "sla",
      "height_mm": 100,
      "longest_side_mm": 118,
      "wall_thickness_mm": 0.8,
      "dimensions_mm": [118, 72.41, 99.87]
    },
    "thin_walls": {
      "thin_area_ratio": 0.083,
      "has_thin_walls": true,
      "status": "error"
    },
    "evaluated_at": 1700000012000
  },
  "consumed_credits": 0
}

DELETE/openapi/v1/print/analyze/:id

Eliminar uma Tarefa de Análise de Imprimibilidade

Este endpoint elimina permanentemente uma tarefa de análise de imprimibilidade e o respetivo resultado em cache. Esta ação é irreversível.

Parâmetros do Caminho

  • Name
    id
    Type
    path
    Description

    O ID da tarefa de análise de imprimibilidade a eliminar.

Estado da Tarefa

Uma tarefa que ainda esteja PENDING é eliminada e os créditos consumidos no momento da criação são reembolsados.

Uma tarefa que já esteja IN_PROGRESS não pode ser eliminada: o pedido é rejeitado com 409 Conflict e a tarefa continua a ser executada. Os créditos de uma tarefa que o worker já começou a processar não são reembolsáveis, pelo que eliminá-la a meio da execução far-lhe-ia perder tanto os créditos como o resultado. Aguarde até que atinja o estado SUCCEEDED, FAILED ou CANCELED, e só depois elimine-a.

Uma tarefa num estado terminal (SUCCEEDED, FAILED ou CANCELED) é eliminada sem reembolso.

Retorna

Retorna 200 OK em caso de sucesso, ou 409 Conflict quando a tarefa está IN_PROGRESS.

Request

DELETE
/openapi/v1/print/analyze/a43b5c6d-7e8f-901a-234b-567c890d1e2f
curl --request DELETE \
  --url https://api.meshy.ai/openapi/v1/print/analyze/a43b5c6d-7e8f-901a-234b-567c890d1e2f \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

// 200 OK on success, with an empty body.
//
// 409 Conflict when the task is IN_PROGRESS — the task is left running:
{
  "message": "Task is IN_PROGRESS and cannot be deleted. Credits for a task the worker has already started are not refundable; wait for it to reach SUCCEEDED, FAILED or CANCELED, then delete it."
}

GET/openapi/v1/print/analyze

Listar tarefas de Analisar imprimibilidade

Este endpoint permite obter uma lista de tarefas de análise de imprimibilidade.

Parâmetros

Atributos opcionais

  • Name
    page_num
    Type
    integer
    Description

    Número de página para a paginação. Começa e tem como valor predefinido 1.

  • Name
    page_size
    Type
    integer
    Description

    Limite do tamanho da página. O valor predefinido é 10 itens. O máximo permitido é 100 itens.

  • Name
    sort_by
    Type
    string
    Description

    Campo pelo qual ordenar. Valores disponíveis:

    • +created_at: Ordenar por hora de criação em ordem ascendente.
    • -created_at: Ordenar por hora de criação em ordem descendente.

Devoluções

Devolve uma lista paginada de Objetos de Tarefa de Analisar imprimibilidade.

Request

GET
/openapi/v1/print/analyze
curl https://api.meshy.ai/openapi/v1/print/analyze?page_size=10 \
-H "Authorization: Bearer ${YOUR_API_KEY}"

Response

[
  {
    "id": "0193bfc5-ee4f-73f8-8525-44b398884ce9",
    "type": "print-analyze",
    "status": "SUCCEEDED",
    "progress": 100,
    "preceding_tasks": 0,
    "created_at": 1699999999000,
    "started_at": 1700000000000,
    "finished_at": 1700000001000,
    "expires_at": 1715725401000,
    "task_error": null,
    "printability": {
      "_version": "v1",
      "status": "warning",
      "issue_count": 1,
      "error_count": 0,
      "warning_count": 1,
      "metrics": {
        "is_watertight": true,
        "volume": 1.316167354292668,
        "non_manifold_edges": 0,
        "degenerate_faces": 43242,
        "holes": 0
      },
      "evaluated_at": 1700000001000
    },
    "consumed_credits": 0
  }
]

GET/openapi/v1/print/analyze/:id/stream

Transmitir uma tarefa de Analisar imprimibilidade

Este endpoint transmite atualizações em tempo real para uma tarefa de análise de imprimibilidade utilizando Server-Sent Events (SSE).

Parâmetros

  • Name
    id
    Type
    path
    Description

    Identificador único da tarefa de análise de imprimibilidade a transmitir.

Devolve

Devolve um fluxo de Objetos de Tarefa de Analisar imprimibilidade como Server-Sent Events.

Cada frame transporta o objeto de tarefa completo para a etapa em questão — a mesma forma devolvida pelo endpoint Get — pelo que, enquanto a tarefa está PENDING ou IN_PROGRESS, os campos de saída simplesmente ainda não estão preenchidos (null, [] ou {}) e finished_at é null. O bloco printability só é enviado quando a tarefa atinge o estado SUCCEEDED.

Request

GET
/openapi/v1/print/analyze/a43b5c6d-7e8f-901a-234b-567c890d1e2f/stream
curl -N https://api.meshy.ai/openapi/v1/print/analyze/a43b5c6d-7e8f-901a-234b-567c890d1e2f/stream \
-H "Authorization: Bearer ${YOUR_API_KEY}"

Response Stream

// Error event example
event: error
data: {
  "status_code": 404,
  "message": "Task not found"
}

// Message event examples illustrate task progress.
// Every frame is the full task object; fields not yet populated are null / empty.
// The PENDING frame below is abbreviated to the fields that change.
event: message
data: {
  "id": "a43b5c6d-7e8f-901a-234b-567c890d1e2f",
  "progress": 0,
  "status": "PENDING"
}

event: message
data: {
  "id": "a43b5c6d-7e8f-901a-234b-567c890d1e2f",
  "type": "print-analyze",
  "status": "SUCCEEDED",
  "progress": 100,
  "preceding_tasks": 0,
  "created_at": 1699999999000,
  "started_at": 1700000000000,
  "finished_at": 1700000001000,
  "expires_at": 1715725401000,
  "task_error": null,
  "printability": {
    "_version": "v1",
    "status": "warning",
    "issue_count": 1,
    "error_count": 0,
    "warning_count": 1,
    "metrics": {
      "is_watertight": true,
      "volume": 1.316167354292668,
      "non_manifold_edges": 0,
      "degenerate_faces": 43242,
      "holes": 0
    },
    "evaluated_at": 1700000001000
  },
  "consumed_credits": 0
}

O objeto Analisar imprimibilidade

  • Name
    id
    Type
    string
    Description

    Identificador único da tarefa. Embora utilizemos um UUID k-sortable para os ids de tarefas como detalhe de implementação, não deve fazer suposições sobre o formato do id.

  • Name
    type
    Type
    string
    Description

    Tipo da tarefa de análise de imprimibilidade. O valor é print-analyze.

  • Name
    status
    Type
    string
    Description

    Estado da tarefa. Os valores possíveis são PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    Progress da tarefa. Se a tarefa ainda não tiver sido iniciada, esta propriedade será 0. Assim que a tarefa for bem-sucedida, passará a ser 100.

  • Name
    preceding_tasks
    Type
    integer
    Description

    A contagem de tarefas precedentes.

  • Name
    created_at
    Type
    timestamp
    Description

    Carimbo de data/hora da criação da tarefa, em milissegundos.

  • Name
    started_at
    Type
    timestamp
    Description

    Carimbo de data/hora do início da tarefa, em milissegundos. Se a tarefa ainda não tiver sido iniciada, esta propriedade será 0.

  • Name
    finished_at
    Type
    timestamp
    Description

    Carimbo de data/hora da conclusão da tarefa, em milissegundos. Se a tarefa ainda não tiver terminado, esta propriedade será 0.

  • Name
    expires_at
    Type
    timestamp
    Description

    Carimbo de data/hora de quando o resultado da tarefa expirará do sistema, em milissegundos. 0 se a tarefa ainda não tiver terminado.

  • Name
    task_error
    Type
    object
    Description

    Informação de erro caso a tarefa tenha falhado. Esta propriedade é null se a tarefa não tiver falhado. Consulte Erros para mais detalhes.

    • Name
      message
      Type
      string
      Description

      Mensagem de erro que descreve o que correu mal.

  • Name
    printability
    Type
    object
    Description

    Resultado da avaliação de imprimibilidade. null até a tarefa atingir SUCCEEDED.

    • Name
      _version
      Type
      string
      Description

      Versão do esquema do resultado de imprimibilidade. Atualmente v1.

    • Name
      status
      Type
      string
      Description

      Estado geral. Um de:

      • healthy: sem erros e sem avisos.
      • warning: pelo menos um aviso, sem erros.
      • error: pelo menos um erro.
      • unknown: não foi possível analisar o modelo.

      Quando a espessura de parede foi verificada, este é o pior entre as verificações acima e thin_walls.status. Do pior para o melhor: error, warning, unknown, healthy.

    • Name
      issue_count
      Type
      integer
      Description

      Contagem total de problemas, igual a error_count + warning_count.

    • Name
      error_count
      Type
      integer
      Description

      Número de problemas ao nível de erro. Os erros são gerados quando o modelo não é watertight, tem volume não positivo ou tem arestas non-manifold. Quando a espessura de parede foi verificada, as paredes demasiado finas (thin_walls.status é error) contam como mais um erro.

    • Name
      warning_count
      Type
      integer
      Description

      Número de problemas ao nível de aviso. Os avisos são gerados quando o modelo contém faces degeneradas ou buracos.

    • Name
      metrics
      Type
      object
      Description

      Métricas de geometria em bruto devolvidas pelo avaliador.

      • Name
        is_watertight
        Type
        boolean
        Description

        true quando a malha não tem arestas de fronteira (ou seja, está fechada).

      • Name
        volume
        Type
        number
        Description

        Volume do modelo em metros cúbicos.

      • Name
        non_manifold_edges
        Type
        integer
        Description

        Contagem de arestas non-manifold.

      • Name
        degenerate_faces
        Type
        integer
        Description

        Contagem de faces degeneradas (faces com área zero ou inválidas).

      • Name
        holes
        Type
        integer
        Description

        Contagem de buracos (ciclos de fronteira) na malha.

    • Name
      intended_print
      Type
      object
      Description

      A impressora e o tamanho utilizados pela verificação de espessura de parede. Presente apenas quando a espessura de parede foi verificada.

      • Name
        printer_type
        Type
        string
        Description

        fdm, sla, ou full_color.

      • Name
        height_mm
        Type
        number
        Description

        A altura de impressão em milímetros, se a impressão foi dimensionada pela altura. Caso contrário, null.

      • Name
        longest_side_mm
        Type
        number
        Description

        O lado mais longo da impressão em milímetros. Quando dimensionado pela altura, é calculado a partir das proporções do modelo.

      • Name
        wall_thickness_mm
        Type
        number
        Description

        A espessura de parede mínima para printer_type, em milímetros. As paredes mais finas do que este valor são reportadas como demasiado finas.

      • Name
        dimensions_mm
        Type
        array
        Description

        A [largura, profundidade, altura] da impressão em milímetros. A altura pode diferir de height_mm por uma fração de milímetro. null para entrada que não seja GLB, ou se o tamanho do modelo não puder ser determinado.

    • Name
      thin_walls
      Type
      object
      Description

      O resultado da espessura de parede. Presente apenas quando a espessura de parede foi verificada.

      • Name
        thin_area_ratio
        Type
        number
        Description

        Percentagem da superfície, de 0 a 1, que é mais fina do que intended_print.wall_thickness_mm. null se o modelo não puder ser medido.

      • Name
        has_thin_walls
        Type
        boolean
        Description

        true se alguma parte da superfície for demasiado fina. Apenas cantos vivos podem definir este valor, pelo que deve usar status para decidir se as paredes precisam de ser engrossadas. null se o modelo não puder ser medido.

      • Name
        status
        Type
        string
        Description

        O veredito da espessura de parede. Um de:

        • healthy: 5% ou menos da superfície é demasiado fina.
        • error: mais de 5% da superfície é demasiado fina. Para engrossar as paredes, passe o id desta tarefa para Reparar imprimibilidade como input_task_id (para um model_url .stl, .fbx, ou .gltf, envie o ficheiro como model_url).
        • unknown: não foi possível medir o modelo. Se a própria verificação de espessura de parede falhar, a tarefa termina com FAILED.
    • Name
      evaluated_at
      Type
      timestamp
      Description

      Carimbo de data/hora de quando a análise foi calculada, em milissegundos desde a epoch.

  • Name
    consumed_credits
    Type
    integer
    Description

    Sempre 0. Este endpoint é gratuito.

The Analyze Printability Task Object

{
  "id": "0193bfc5-ee4f-73f8-8525-44b398884ce9",
  "type": "print-analyze",
  "status": "SUCCEEDED",
  "progress": 100,
  "preceding_tasks": 0,
  "created_at": 1699999999000,
  "started_at": 1700000000000,
  "finished_at": 1700000001000,
  "expires_at": 1715725401000,
  "task_error": null,
  "printability": {
    "_version": "v1",
    "status": "warning",
    "issue_count": 1,
    "error_count": 0,
    "warning_count": 1,
    "metrics": {
      "is_watertight": true,
      "volume": 1.316167354292668,
      "non_manifold_edges": 0,
      "degenerate_faces": 43242,
      "holes": 0
    },
    "evaluated_at": 1700000001000
  },
  "consumed_credits": 0
}

The Analyze Printability Task Object (wall thickness checked)

{
  "id": "0193bfc5-ee4f-73f8-8525-44b398884ce9",
  "type": "print-analyze",
  "status": "SUCCEEDED",
  "progress": 100,
  "preceding_tasks": 0,
  "created_at": 1699999999000,
  "started_at": 1700000000000,
  "finished_at": 1700000012000,
  "expires_at": 1715725412000,
  "task_error": null,
  "printability": {
    "_version": "v1",
    "status": "error",
    "issue_count": 2,
    "error_count": 1,
    "warning_count": 1,
    "metrics": {
      "is_watertight": true,
      "volume": 1.316167354292668,
      "non_manifold_edges": 0,
      "degenerate_faces": 43242,
      "holes": 0
    },
    "intended_print": {
      "printer_type": "sla",
      "height_mm": 100,
      "longest_side_mm": 118,
      "wall_thickness_mm": 0.8,
      "dimensions_mm": [118, 72.41, 99.87]
    },
    "thin_walls": {
      "thin_area_ratio": 0.083,
      "has_thin_walls": true,
      "status": "error"
    },
    "evaluated_at": 1700000012000
  },
  "consumed_credits": 0
}