lowpoly será descontinuado em 30 de out. de 2026. Troque de modelo antes dessas datas para evitar erros nas solicitações. Ver todas as descontinuações

API de Keycap do Creative Lab

Transforme uma foto em uma keycap personalizada em full-color para teclado mecânico em duas etapas. Uma tarefa de protótipo gera uma imagem da keycap finalizada a partir da foto. Uma tarefa de build transforma essa imagem em um modelo 3D de keycap com textura. Ela utiliza o ID da tarefa de protótipo como input_task_id e o ID candidato da imagem como candidate_id.

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

Ambos os endpoints POST exigem um plano pago. Uma solicitação de uma conta do plano gratuito retorna 402.


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

Criar uma tarefa de protótipo de Keycap

Gera uma imagem do keycap finalizado a partir de uma foto. O campo image_urls da tarefa contém a imagem, e candidate_ids contém seu ID, com uma entrada em cada. Se você não gostar do design, crie outra tarefa de protótipo. A Meshy cobra por cada tarefa de protótipo separadamente.

Para construir o keycap em 3D, passe o ID dessa tarefa para o endpoint de build como input_task_id, com a entrada de candidate_ids como candidate_id. Para os campos da tarefa, veja O objeto de tarefa de protótipo de Keycap.

Request

POST
/openapi/creative-lab/keycap/v1/prototype
# Stage 1: generate a finished-keycap design render
curl https://api.meshy.ai/openapi/creative-lab/keycap/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>"
  }'

Response

{
  "result": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef"
}

Parâmetros

  • Name
    image_url
    Type
    string
    Obrigatório
    Description

    A foto a ser transformada em um design de keycap, como uma URL pública ou um data URI (data:image/jpeg;base64,<seus dados de imagem codificados em base64>).

    A imagem deve ser um arquivo JPG, JPEG, PNG ou WebP de no máximo 20 MB (20.000.000 bytes). Cada lado deve ter pelo menos 32 pixels, e a imagem pode ter no máximo 178.956.970 pixels no total. Uma imagem fora desses limites retorna 400.

    A Meshy detecta o formato a partir dos dados da imagem, não da extensão do arquivo na URL. Uma URL sem extensão funciona, e a Meshy segue redirecionamentos HTTP. A Meshy aplica a orientação EXIF, para que uma foto de celular rotacionada saia da forma como aparece.

    Um data URI deve ser codificado em base64 com um tipo de imagem, como data:image/png;base64,..., e a imagem decodificada deve ser JPEG, PNG ou WebP. O limite de 20 MB se aplica à imagem decodificada, então o texto em base64 pode ser cerca de um terço maior.

  • Name
    name
    Type
    string
    Description

    Um nome para a tarefa, com até 100 caracteres. Ele retorna no campo name da tarefa. Um nome mais longo retorna 400.

  • Name
    remove_background
    Type
    boolean
    padrão false
    Description

    Se o fundo deve ser removido da imagem do protótipo. true retorna um PNG RGBA transparente, para que você possa colocar o keycap em qualquer fundo. Se a Meshy não conseguir remover o fundo, ela retorna a imagem com seu fundo, e a tarefa ainda é bem-sucedida.

    O design da cabeça que o build transforma em 3D mantém seu fundo de qualquer forma. O build pinta a base do keycap a partir da imagem em image_urls, sem seu fundo se você enviou true. O build retorna essa imagem como process_image_urls.composite.

Retornos

O campo result contém o ID da nova tarefa de protótipo. Obtenha a tarefa ou transmita-a em stream até que status seja SUCCEEDED. Então, passe o ID para o endpoint de build como input_task_id, com a entrada de candidate_ids como candidate_id.

Modos de falha

  • Name
    400 - Bad Request
    Description

    A requisição não pode ser executada. Por exemplo:

    • image_url está ausente.
    • A imagem não é um arquivo JPG, JPEG, PNG ou WebP.
    • A imagem é muito pequena, tem mais de 20 MB, ou excede a contagem máxima de pixels.
    • A Meshy não consegue baixar a imagem, por exemplo porque a URL retorna 404 ou expira o tempo limite.
    • O data URI não é um base64 válido.
    • A imagem foi sinalizada como NSFW.

    A mensagem de erro informa qual problema foi encontrado. Corrija a requisição e envie-a novamente.

  • Name
    401 - Unauthorized
    Description

    A chave de API está ausente ou é inválida. Verifique o cabeçalho Authorization.

  • Name
    402 - Payment Required
    Description

    Um destes se aplica:

    • A conta não tem créditos suficientes.
    • A chave de API, o espaço de trabalho ou o membro atingiu seu limite de créditos.
    • A conta está no plano gratuito.

    Verifique seus créditos e plano, depois tente novamente.

  • Name
    403 - Forbidden
    Description

    Sua equipe tem a opção IP Filtering ativada, e a Meshy sinalizou a imagem por propriedade intelectual de terceiros. Envie uma imagem que você tenha o direito de usar.

  • Name
    429 - Too Many Requests
    Description

    Um destes limites foi atingido:

    • Você enviou mais requisições do que seu limite de taxa permite. Aguarde alguns segundos e tente novamente. Veja Limites de taxa.
    • Muitas das suas tarefas estão na fila ou em execução. Aguarde algumas terminarem e tente novamente.
    • Em um plano ilimitado sem créditos restantes, você atingiu o número de tarefas que podem ser executadas sem créditos. Aguarde uma tarefa terminar, ou adicione créditos.
  • Name
    500 - Internal Server Error
    Description

    A Meshy encontrou um erro de servidor, por exemplo porque a moderação de conteúdo ou a verificação de propriedade intelectual não puderam ser executadas, ou a Meshy não conseguiu armazenar a imagem. A Meshy não cria a tarefa, e reembolsa quaisquer créditos cobrados. Tente a requisição novamente.


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

Criar uma tarefa de build de Keycap

Gera o keycap 3D texturizado a partir de uma tarefa de protótipo bem-sucedida e de um de seus candidatos. Para conhecer seus campos, consulte O objeto da tarefa de build de Keycap.

Uma tarefa de build executa todas as etapas. Ela gera um modelo 3D a partir do design e o colore. Em seguida, posiciona e corta o modelo na base do keycap em uma pose padrão calibrada, para que você não precise ajustá-la manualmente. Por fim, monta o keycap e exporta os arquivos. Um build normalmente leva de 3 a 7 minutos.

Request

POST
/openapi/creative-lab/keycap/v1/build
# Stage 2: build the chosen candidate into a 3D keycap
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "input_task_id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
    "candidate_id": "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b",
    "options": {
      "base_model": "cherry-mx-1x1-r1",
      "head_size_mm": 23,
      "vertical_offset_mm": 0
    }
  }'

Response

{
  "result": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af"
}

Parâmetros

  • Name
    input_task_id
    Type
    string
    Obrigatório
    Description

    O ID da tarefa de protótipo a ser construída. Deve ser uma tarefa criada pela sua conta com POST /openapi/creative-lab/keycap/v1/prototype, com o status SUCCEEDED.

    Um ID que não corresponda a uma das suas tarefas de protótipo de Keycap da API retorna 404, incluindo um protótipo criado no aplicativo web.

  • Name
    candidate_id
    Type
    string
    Obrigatório
    Description

    O candidato a ser construído, do array candidate_ids da tarefa de protótipo. Um valor que não esteja nesse array retorna 400.

  • Name
    name
    Type
    string
    Description

    Um nome para a tarefa, com até 100 caracteres. Ele é retornado no campo name da tarefa. Um nome mais longo retorna 400.

options

Configurações opcionais de geometria. Cada campo tem um valor padrão calibrado, então envie apenas os campos que deseja alterar.

  • Name
    base_model
    Type
    string
    padrão cherry-mx-1x1-r1
    Description

    A base de keycap sobre a qual construir. O único valor é cherry-mx-1x1-r1, um keycap padrão de perfil Cherry MX 1u. Tamanhos personalizados não são suportados, e qualquer outro valor retorna 400.

  • Name
    head_size_mm
    Type
    number
    padrão 23
    Description

    O tamanho da cabeça ao longo de sua maior dimensão, em milímetros, de 10 a 40. O Meshy escala a cabeça para que sua maior dimensão corresponda a esse valor. Um valor fora do intervalo retorna 400.

    Para um valor acima de aproximadamente 32.9, o Meshy pode reduzir o tamanho para que a cabeça se ajuste ao limite de área de proteção da base. A cabeça pode então sair menor do que o solicitado. O objeto da tarefa não retorna o tamanho que o Meshy aplicou. Para verificá-lo, meça a caixa delimitadora da malha keycap-head no modelo.

  • Name
    vertical_offset_mm
    Type
    number
    padrão 0
    Description

    O deslocamento vertical a ser aplicado à cabeça antes que o Meshy a posicione na base, em milímetros, de -5 a 5. Um valor fora do intervalo retorna 400.

Retornos

O campo result contém o ID da nova tarefa de build. Obtenha a tarefa ou transmita-a via streaming até que status seja SUCCEEDED. Em seguida, baixe o arquivo GLB em model_urls.glb e o pacote OBJ em model_urls.obj_zip.

Modos de falha

  • Name
    400 - Bad Request
    Description

    A solicitação não pode ser executada. Por exemplo:

    • input_task_id está ausente ou não é um ID de tarefa válido.
    • O status da tarefa de protótipo não é SUCCEEDED. Se ainda estiver em execução, aguarde e tente novamente. Se tiver falhado ou sido cancelada, crie uma nova tarefa de protótipo.
    • A tarefa de protótipo teve sucesso, mas não possui candidatos. Crie uma nova tarefa de protótipo.
    • candidate_id está ausente ou não está em candidate_ids da tarefa de protótipo. Envie um valor desse array.
    • Um campo em options está fora do intervalo, ou base_model não é um valor disponível.

    A mensagem de erro indica qual problema foi encontrado.

  • Name
    401 - Unauthorized
    Description

    A chave de API está ausente ou é inválida. Verifique o cabeçalho Authorization.

  • Name
    402 - Payment Required
    Description

    Uma das situações a seguir se aplica:

    • A conta não tem créditos suficientes.
    • A chave de API, o espaço de trabalho ou o membro atingiu seu limite de créditos.
    • A conta está no plano gratuito.

    Verifique seus créditos e plano e tente novamente.

  • Name
    404 - Not Found
    Description

    input_task_id não corresponde a nenhuma tarefa de protótipo de Keycap criada pela sua conta via API. Um protótipo criado no aplicativo web também retorna 404. Envie o ID result de uma resposta de criação de protótipo.

  • Name
    429 - Too Many Requests
    Description

    Um dos seguintes limites foi atingido:

    • Você enviou mais solicitações do que seu limite de taxa permite. Aguarde alguns segundos e tente novamente. Consulte Limites de taxa.
    • Há muitas tarefas suas na fila ou em execução. Aguarde algumas terminarem e tente novamente.
    • Em um plano ilimitado sem créditos restantes, você atingiu o número de tarefas que podem ser executadas sem créditos. Aguarde uma tarefa terminar ou adicione créditos.
  • Name
    500 - Internal Server Error
    Description

    O Meshy não conseguiu criar a tarefa devido a um erro de servidor. O Meshy reembolsa quaisquer créditos cobrados. Tente a solicitação novamente.


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

Obter uma tarefa de Keycap

Retorna uma tarefa de protótipo ou de build. O caminho deve corresponder ao estágio da tarefa. Uma tarefa de build solicitada por meio de /prototype/:id retorna 404, e o mesmo ocorre com uma tarefa de protótipo solicitada por meio de /build/:id.

Para os campos, veja O objeto de tarefa de protótipo do Keycap e O objeto de tarefa de build do Keycap.

Request

GET
/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# Build
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Prototype Response

{
  "id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
  "type": "creative-lab-keycap-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142456000,
  "started_at": 1753142460000,
  "finished_at": 1753142516000,
  "expires_at": 1753401716000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 12,
  "image_urls": [
    "https://assets.meshy.ai/***/design-1.png?Expires=***"
  ],
  "candidate_ids": [
    "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
  ]
}

Build Response

{
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "type": "creative-lab-keycap-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142600000,
  "started_at": 1753142610000,
  "finished_at": 1753143050000,
  "expires_at": 1753402250000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 50,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
    "obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
  },
  "process_image_urls": {
    "head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***",
    "composite": "https://assets.meshy.ai/***/composite.png?Expires=***",
    "base_canvas": "https://assets.meshy.ai/***/base-canvas.png?Expires=***"
  }
}

Parâmetros

  • Name
    id
    Type
    path
    Description

    O ID da tarefa retornado na resposta de criação.

Retornos

O objeto de tarefa de protótipo ou o objeto de tarefa de build, de acordo com o estágio informado no caminho.

Modos de falha

  • Name
    400 - Bad Request
    Description

    id não é um ID de tarefa válido. Envie o ID result retornado na resposta de criação.

  • Name
    403 - Forbidden
    Description

    Sua equipe está com a Filtragem de IP ativada, e a Meshy sinalizou a imagem da tarefa de protótipo por propriedade intelectual de terceiros. Tarefas de build e equipes no plano Enterprise não recebem esse erro. Crie uma tarefa de protótipo a partir de uma imagem sobre a qual você tenha os direitos de uso.

  • Name
    404 - Not Found
    Description

    Nenhuma tarefa de Keycap com esse ID pertence à sua conta, ou o estágio da tarefa não corresponde ao caminho. Verifique o ID e use /prototype ou /build de acordo com a tarefa.

  • Name
    500 - Internal Server Error
    Description

    A Meshy não conseguiu executar a verificação de propriedade intelectual. Repita a solicitação.


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

Excluir uma tarefa do Keycap

Cancela uma tarefa do Keycap. Cancelar uma tarefa PENDING reembolsa seus créditos. Uma tarefa IN_PROGRESS é cancelada sem reembolso, porque um worker já a iniciou. Uma tarefa com status final (SUCCEEDED, FAILED ou CANCELED) não pode ser cancelada.

O caminho deve corresponder ao estágio da tarefa. Por exemplo, DELETE em /prototype/:id com o ID de uma tarefa de build retorna 404.

Request

DELETE
/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef
curl --request DELETE \
  --url https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

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

Parâmetros de caminho

  • Name
    id
    Type
    path
    Description

    O ID da tarefa a ser cancelada.

Retornos

204 No Content com corpo vazio.

Modos de falha

  • Name
    400 - Bad Request
    Description

    Um dos seguintes se aplica:

    • id não é um ID de tarefa válido. Envie o ID result da resposta de criação.
    • A tarefa já tem um status final (SUCCEEDED, FAILED ou CANCELED), então não pode ser cancelada.
  • Name
    404 - Not Found
    Description

    Nenhuma tarefa do Keycap com este ID pertence à sua conta, ou o estágio da tarefa não corresponde ao caminho. Verifique o ID e use /prototype ou /build para corresponder à tarefa.

  • Name
    500 - Internal Server Error
    Description

    O Meshy encontrou um erro de servidor ao cancelar a tarefa, então a tarefa pode ou não estar cancelada. Obtenha a tarefa para verificar seu status antes de tentar novamente.


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

Transmitir uma tarefa Keycap

Transmite as atualizações de uma tarefa Keycap como Server-Sent Events (SSE). O caminho deve corresponder ao estágio da tarefa. Se não corresponder, por exemplo, o ID de uma tarefa de build em /prototype/:id/stream, o stream envia um evento error com status_code: 404 e é encerrado.

Request

GET
/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/stream
curl -N https://api.meshy.ai/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/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; fields not yet populated are null / empty.
// The following PENDING frame is shortened to the fields that change.
event: message
data: {
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "progress": 0,
  "status": "PENDING"
}

event: message
data: {
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "type": "creative-lab-keycap-build",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142600000,
  "started_at": 1753142610000,
  "finished_at": 1753143050000,
  "expires_at": 1753402250000,
  "task_error": null,
  "consumed_credits": 50,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
    "obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
  },
  "process_image_urls": {
    "head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***"
  }
}

Parâmetros

  • Name
    id
    Type
    path
    Description

    O ID da tarefa a partir da resposta de criação.

Retornos

Um stream de objetos de tarefa prototype ou build. Cada evento contém o objeto de tarefa completo, assim como Obter uma tarefa Keycap o retorna. Enquanto a tarefa estiver PENDING ou IN_PROGRESS, seus campos de saída ainda estarão vazios (null, [] ou {}), e finished_at será null.

Se a Filtragem de IP bloquear o resultado da tarefa, o stream envia, em seu lugar, um evento error com o status_code que uma requisição get retornaria.


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

Listar tarefas de Keycap

Retorna suas tarefas de Keycap de um estágio, uma página por vez. O caminho seleciona o estágio. /prototype retorna apenas tarefas de protótipo, e /build retorna apenas tarefas de build.

Request

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

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

Response (List Prototype Tasks)

[
  {
    "id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
    "type": "creative-lab-keycap-prototype",
    "name": "",
    "status": "SUCCEEDED",
    "progress": 100,
    "created_at": 1753142456000,
    "started_at": 1753142460000,
    "finished_at": 1753142516000,
    "expires_at": 1753401716000,
    "preceding_tasks": 0,
    "task_error": null,
    "consumed_credits": 12,
    "image_urls": [
      "https://assets.meshy.ai/***/design-1.png?Expires=***"
    ],
    "candidate_ids": [
      "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
    ]
  }
]

Parâmetros de caminho

  • Name
    stage
    Type
    path
    Obrigatório
    Description

    O estágio a listar, prototype ou build.

Parâmetros de consulta

  • Name
    page_num
    Type
    integer
    padrão 1
    Description

    A página a retornar, de 1 a 255. 0 retorna a primeira página. Um valor fora de 0 a 255 retorna 400.

  • Name
    page_size
    Type
    integer
    padrão 10
    Description

    Número de tarefas por página, até 100. Um valor de 101 a 255 retorna 100 tarefas, e 0 usa o padrão. Um valor fora de 0 a 255 retorna 400.

  • Name
    sort_by
    Type
    string
    padrão -created_at
    Description

    A ordem de classificação.

    Valores disponíveis:

    • -created_at: mais recentes primeiro
    • +created_at: mais antigas primeiro

Retornos

Um array de objetos de tarefa de protótipo ou objetos de tarefa de build, correspondendo ao estágio no caminho.


O objeto de tarefa de protótipo Keycap

Uma tarefa de protótipo gera uma imagem do keycap finalizado a partir de uma foto. Para transformar o design em um keycap 3D, passe o ID da tarefa para o endpoint de build como input_task_id, com sua entrada candidate_ids como candidate_id.

Propriedades

Example Keycap Prototype Task Object

{
  "id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
  "type": "creative-lab-keycap-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142456000,
  "started_at": 1753142460000,
  "finished_at": 1753142516000,
  "expires_at": 1753401716000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 12,
  "image_urls": [
    "https://assets.meshy.ai/***/design-1.png?Expires=***"
  ],
  "candidate_ids": [
    "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
  ]
}
  • Name
    id
    Type
    string
    Description

    O ID da tarefa. Não dependa do seu formato.

  • Name
    type
    Type
    string
    Description

    O tipo da tarefa, sempre creative-lab-keycap-prototype.

  • Name
    name
    Type
    string
    Description

    O name que você enviou ao criar a tarefa, ou "" se você não enviou nenhum.

  • Name
    status
    Type
    string
    Description

    O status da tarefa.

    Valores disponíveis:

    • PENDING: aguardando na fila
    • IN_PROGRESS: gerando o resultado
    • SUCCEEDED: final, com o resultado
    • FAILED: final, com o motivo em task_error
    • CANCELED: final, sem resultado
  • Name
    progress
    Type
    integer
    Description

    Porcentagem do trabalho concluído, de 0 a 100. É 0 até a tarefa começar e 100 quando ela é bem-sucedida.

  • Name
    created_at
    Type
    timestamp
    Description

    Horário em que a tarefa foi criada, em milissegundos Unix.

  • Name
    started_at
    Type
    timestamp
    Description

    Horário em que um worker iniciou a tarefa, em milissegundos Unix. null até então.

  • Name
    finished_at
    Type
    timestamp
    Description

    Horário em que a tarefa atingiu um status final, em milissegundos Unix. null até então.

  • Name
    expires_at
    Type
    timestamp
    Description

    Horário em que o resultado da tarefa expira, em milissegundos Unix. É 3 dias após finished_at, ou 3 dias após created_at até a tarefa terminar. Para contas Enterprise, que mantêm os resultados da API indefinidamente, é cerca de 100 anos depois. Veja Retenção de recursos.

  • Name
    preceding_tasks
    Type
    integer
    Description

    A posição da tarefa na fila enquanto está PENDING. 1 significa que ela começa em seguida. 0 depois que a tarefa sai da fila, e sempre 0 em resultados de listagem.

  • Name
    task_error
    Type
    object
    Description

    Por que a tarefa falhou. null a menos que status seja FAILED. Veja Erros.

  • Name
    consumed_credits
    Type
    integer
    Description

    Número de créditos cobrados pela tarefa, após qualquer reembolso. Uma requisição que retorna um erro não é cobrada. Uma tarefa que falha é 0, porque a Meshy a reembolsa. Cancelar reembolsa uma tarefa apenas enquanto ela está PENDING. Se a Meshy não conseguir ler a cobrança, uma resposta de get ou stream deixa o campo de fora, e uma requisição de listagem retorna 500. Nesse caso, tente a requisição novamente.

  • Name
    image_urls
    Type
    array of strings
    Description

    URLs de download para a imagem do keycap finalizado. O array tem uma URL depois que a tarefa é bem-sucedida, e fica vazio até então. image_urls[i] mostra o candidato em candidate_ids[i].

    Essas URLs são para exibição. O endpoint de build recebe uma entrada de candidate_ids, não uma URL. São URLs assinadas, então busque-as sem um cabeçalho Authorization. Elas permanecem válidas até expires_at, e obter a tarefa novamente retorna as mesmas URLs.

  • Name
    candidate_ids
    Type
    array of strings
    Description

    IDs dos candidatos, na mesma ordem que image_urls. Para fazer o build de um candidato, envie seu ID como candidate_id na requisição de build. Não dependa do formato desses IDs.


O objeto de tarefa de build de Keycap

Uma tarefa de build gera o keycap 3D texturizado a partir de uma tarefa de prototype bem-sucedida e de um de seus candidatos. Ela gera o modelo 3D, colore-o, encaixa e corta-o sobre a base do keycap e, em seguida, monta e exporta o keycap.

Propriedades

Example Keycap Build Task Object

{
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "type": "creative-lab-keycap-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142600000,
  "started_at": 1753142610000,
  "finished_at": 1753143050000,
  "expires_at": 1753402250000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 50,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
    "obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
  },
  "process_image_urls": {
    "head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***",
    "composite": "https://assets.meshy.ai/***/composite.png?Expires=***",
    "base_canvas": "https://assets.meshy.ai/***/base-canvas.png?Expires=***"
  }
}
  • Name
    id
    Type
    string
    Description

    O ID da tarefa. Não dependa do seu formato.

  • Name
    type
    Type
    string
    Description

    O tipo da tarefa, sempre creative-lab-keycap-build.

  • Name
    name
    Type
    string
    Description

    O name que você enviou ao criar a tarefa, ou "" se você não enviou nenhum.

  • Name
    status
    Type
    string
    Description

    O status da tarefa.

    Valores disponíveis:

    • PENDING: aguardando na fila
    • IN_PROGRESS: gerando o resultado
    • SUCCEEDED: final, com o resultado
    • FAILED: final, com o motivo em task_error
    • CANCELED: final, sem resultado
  • Name
    progress
    Type
    integer
    Description

    Porcentagem do trabalho concluído, de 0 a 100. É 0 até a tarefa iniciar e 100 quando ela é bem-sucedida.

  • Name
    created_at
    Type
    timestamp
    Description

    Horário em que a tarefa foi criada, em milissegundos Unix.

  • Name
    started_at
    Type
    timestamp
    Description

    Horário em que um worker iniciou a tarefa, em milissegundos Unix. null até então.

  • Name
    finished_at
    Type
    timestamp
    Description

    Horário em que a tarefa atingiu um status final, em milissegundos Unix. null até então.

  • Name
    expires_at
    Type
    timestamp
    Description

    Horário em que o resultado da tarefa expira, em milissegundos Unix. É 3 dias após finished_at, ou 3 dias após created_at até a tarefa terminar. Para contas Enterprise, que mantêm os resultados da API indefinidamente, é cerca de 100 anos depois. Consulte Retenção de recursos.

  • Name
    preceding_tasks
    Type
    integer
    Description

    A posição da tarefa na fila enquanto ela está PENDING. 1 significa que ela começa em seguida. 0 depois que a tarefa sai da fila, e sempre 0 em resultados de listagem.

  • Name
    task_error
    Type
    object
    Description

    Motivo da falha da tarefa. null a menos que status seja FAILED. Consulte Erros.

  • Name
    consumed_credits
    Type
    integer
    Description

    Número de créditos cobrados pela tarefa, após qualquer reembolso. Uma solicitação que retorna um erro não é cobrada. Uma tarefa com falha é 0, pois a Meshy a reembolsa. Cancelar reembolsa uma tarefa apenas enquanto ela está PENDING. Se a Meshy não conseguir ler a cobrança, uma resposta de get ou stream deixa o campo de fora, e uma solicitação de listagem retorna 500. Nesse caso, tente novamente a solicitação.

  • Name
    model_urls
    Type
    object
    Description

    URLs de download para o modelo 3D. A Meshy exporta o arquivo GLB e o pacote OBJ em escala real, em milímetros, com o eixo Y para cima e a frente do keycap voltada para +Z.

    O modelo tem malhas chamadas keycap-head e keycap-base. Quando a Meshy recorre a um preenchimento de padrão para a base, o modelo também tem uma malha keycap-base-interior para a cavidade da haste. Não presuma que o modelo tem exatamente duas malhas.

    Essas são URLs assinadas, então busque-as sem um cabeçalho Authorization. Elas permanecem válidas até expires_at, e obter a tarefa novamente antes disso retorna as mesmas URLs. Uma URL expirada não pode ser renovada, então baixe e armazene os arquivos antes disso.

    • Name
      glb
      Type
      string
      Description

      URL de download para o arquivo GLB texturizado, model.glb.

    • Name
      obj_zip
      Type
      string
      Description

      URL de download para o pacote OBJ, um arquivo ZIP com model.obj, model.mtl e as texturas PNG que model.mtl usa. Com uma base de cor sólida, a única textura é keycap-head.png. Com uma base padronizada, o arquivo ZIP também tem keycap-base.png.

  • Name
    process_image_urls
    Type
    object
    Description

    URLs de download para imagens das etapas do build, organizadas por tipo. Assim como model_urls, são URLs assinadas, então busque-as sem um cabeçalho Authorization. Elas permanecem válidas até expires_at, e obter a tarefa novamente retorna as mesmas URLs.

    Pode ter estas chaves:

    • head_design: a imagem de design do candidato escolhido, que o build transformou em 3D. Sempre presente.
    • composite: a imagem do keycap finalizado para o candidato escolhido, a partir da qual o build pintou a base. Pode estar ausente.
    • base_canvas: a base pintada do keycap. Pode estar ausente.

    A Meshy pode adicionar chaves, então ignore uma chave que você não reconheça.


End-to-end example

O exemplo executa o fluxo completo:

  1. Criar uma tarefa de prototype a partir de uma foto.
  2. Obter a tarefa até que seu status seja SUCCEEDED.
  3. Escolher um candidato em candidate_ids.
  4. Criar uma tarefa de build com esse candidato.
  5. Obter a tarefa de build até que seu status seja SUCCEEDED.
  6. Baixar o arquivo GLB e o pacote OBJ a partir de model_urls.

O exemplo escolhe o primeiro candidato. No seu aplicativo, mostre as entradas de image_urls aos seus usuários e deixe-os escolher. O índice de uma imagem escolhida em image_urls é o índice do seu ID em candidate_ids.

Complete flow

POST
/openapi/creative-lab/keycap/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://...
: "${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

BASE="https://api.meshy.ai/openapi/creative-lab/keycap/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 '{"image_url":"data:%s;base64,' "$MIME"
    base64 <"$IMAGE_PATH" | tr -d '\n'
    printf '"}'
  } >"$BODY"
else
  printf '{"image_url":"%s"}' "$IMAGE_URL" >"$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 design render
poll prototype "$PROTO_ID"

# 3. Pick a candidate (first one here; show image_urls to a user in production)
CANDIDATE_ID=$(api GET "$BASE/prototype/$PROTO_ID" | jq -r '.candidate_ids[0]')

# 4. Create the build task
jq -n --arg p "$PROTO_ID" --arg c "$CANDIDATE_ID" \
  '{input_task_id: $p, candidate_id: $c}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
  -H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')

# 5. Wait for the model (a build usually takes 3-7 minutes)
poll build "$BUILD_ID"

# 6. Download the artifacts. These are signed URLs: no Authorization header,
#    and they stay valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
  -o keycap.glb "$(jq -r '.model_urls.glb' <<<"$TASK")"
curl --silent --show-error --fail --max-time 900 \
  -o keycap-obj.zip "$(jq -r '.model_urls.obj_zip' <<<"$TASK")"
echo "Done: keycap.glb + keycap-obj.zip"