lowpoly será descontinuado a 30/10/2026. Mude de modelo antes destas datas para evitar erros nos pedidos. Ver todas as descontinuações

API de Keycap do Creative Lab

Transforme uma fotografia numa keycap personalizada a cores para um teclado mecânico em duas etapas. Uma tarefa de protótipo gera uma imagem da keycap final a partir da fotografia. Uma tarefa de criação transforma essa imagem num modelo 3D texturizado de keycap. Recebe 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 requerem um plano pago. Um pedido de uma conta com plano gratuito devolve 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 fotografia. O campo image_urls da tarefa contém a imagem, e candidate_ids contém o seu ID, com uma entrada em cada. Se 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 desta tarefa para o endpoint de construção como input_task_id, com a entrada de candidate_ids como candidate_id. Para os campos da tarefa, consulte O objeto da 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 fotografia a transformar num design de keycap, como um URL público ou um data URI (data:image/jpeg;base64,<your base64-encoded image data>).

    A imagem deve ser um ficheiro JPG, JPEG, PNG ou WebP com, 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 destes limites devolve 400.

    A Meshy deteta o formato a partir dos dados da imagem, não a partir da extensão do ficheiro no URL. Um URL sem extensão funciona, e a Meshy segue redirecionamentos HTTP. A Meshy aplica a orientação EXIF, pelo que uma fotografia de telemóvel rodada sai como aparece.

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

  • Name
    name
    Type
    string
    Description

    Um nome para a tarefa, com até 100 carateres. É devolvido no campo name da tarefa. Um nome mais longo devolve 400.

  • Name
    remove_background
    Type
    boolean
    predefinição false
    Description

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

    O design da cabeça que a construção transforma em 3D mantém o seu fundo em qualquer dos casos. A construção pinta a base do keycap a partir da imagem em image_urls, sem o seu fundo se tiver enviado true. A construção devolve essa imagem como process_image_urls.composite.

Retorna

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

Modos de falha

  • Name
    400 - Bad Request
    Description

    O pedido não pode ser executado. Por exemplo:

    • image_url está em falta.
    • A imagem não é um ficheiro JPG, JPEG, PNG ou WebP.
    • A imagem é demasiado pequena, excede os 20 MB, ou excede o número máximo de pixels.
    • A Meshy não consegue transferir a imagem, por exemplo porque o URL devolve 404 ou expira o tempo de espera.
    • O data URI não é um base64 válido.
    • A imagem foi assinalada como NSFW.

    A mensagem de erro indica qual o problema encontrado. Corrija o pedido e envie-o novamente.

  • Name
    401 - Unauthorized
    Description

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

  • Name
    402 - Payment Required
    Description

    Aplica-se uma das seguintes situações:

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

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

  • Name
    403 - Forbidden
    Description

    A sua equipa tem a Filtragem de IP ativada, e a Meshy assinalou a imagem por propriedade intelectual de terceiros. Envie uma imagem que tenha o direito de utilizar.

  • Name
    429 - Too Many Requests
    Description

    Um destes limites foi atingido:

    • Enviou mais pedidos do que o seu limite de taxa permite. Aguarde alguns segundos e tente novamente. Consulte Limites de taxa.
    • Há demasiadas tarefas suas em fila de espera ou em execução. Aguarde que algumas terminem e tente novamente.
    • Num plano ilimitado sem créditos restantes, atingiu o número de tarefas que podem ser executadas sem créditos. Aguarde que uma tarefa termine, 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 que tenha cobrado. Tente novamente o pedido.


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

Criar uma tarefa de criação (build) de Keycap

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

Uma tarefa de build executa todos os passos. Gera um modelo 3D a partir do design e aplica-lhe cor. Depois, encaixa e corta o modelo na base do keycap numa pose predefinida calibrada, para que não precise de a ajustar manualmente. Por fim, monta o keycap e exporta os ficheiros. Um build demora tipicamente entre 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 construir. Tem de ser uma tarefa criada pela sua conta com POST /openapi/creative-lab/keycap/v1/prototype, com o estado SUCCEEDED.

    Um ID que não corresponda a uma das suas tarefas de protótipo de Keycap criadas através da API devolve 404, incluindo um protótipo criado na aplicação web.

  • Name
    candidate_id
    Type
    string
    Obrigatório
    Description

    O candidato a construir, do array candidate_ids da tarefa de protótipo. Um valor que não esteja presente nesse array devolve 400.

  • Name
    name
    Type
    string
    Description

    Um nome para a tarefa, até 100 caracteres. É devolvido no campo name da tarefa. Um nome mais longo devolve 400.

options

Definições de geometria opcionais. Cada campo tem um valor predefinido calibrado, pelo que só precisa de enviar os campos que pretende alterar.

  • Name
    base_model
    Type
    string
    predefiniçã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 devolve 400.

  • Name
    head_size_mm
    Type
    number
    predefinição 23
    Description

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

    Para um valor acima de aproximadamente 32.9, a Meshy pode reduzir o tamanho para que a cabeça se ajuste ao limite de ocupação protegida da base. A cabeça pode então sair mais pequena do que o pedido. O objeto da tarefa não devolve o tamanho aplicado pela Meshy. Para o verificar, meça a caixa delimitadora da malha keycap-head no modelo.

  • Name
    vertical_offset_mm
    Type
    number
    predefinição 0
    Description

    O deslocamento vertical a aplicar à cabeça antes de a Meshy a encaixar na base, em milímetros, de -5 a 5. Um valor fora do intervalo devolve 400.

Retorno

O campo result contém o ID da nova tarefa de build. Obtenha a tarefa ou transmita-a em fluxo até que status seja SUCCEEDED. Depois, descarregue o ficheiro GLB a partir de model_urls.glb e o pacote OBJ a partir de model_urls.obj_zip.

Modos de falha

  • Name
    400 - Bad Request
    Description

    O pedido não pode ser executado. Por exemplo:

    • input_task_id está em falta ou não é um ID de tarefa válido.
    • O estado 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 foi bem-sucedida, mas não tem candidatos. Crie uma nova tarefa de protótipo.
    • candidate_id está em falta, ou não consta no 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 o problema encontrado.

  • Name
    401 - Unauthorized
    Description

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

  • Name
    402 - Payment Required
    Description

    Aplica-se uma das seguintes situações:

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

    Verifique os seus créditos e o seu 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 através da API. Um protótipo criado na aplicação web também devolve 404. Envie o ID result de uma resposta de criação de protótipo.

  • Name
    429 - Too Many Requests
    Description

    Um destes limites foi atingido:

    • Enviou mais pedidos do que o permitido pelo seu limite de taxa. Aguarde alguns segundos e tente novamente. Consulte Limites de taxa.
    • Demasiadas das suas tarefas estão em fila de espera ou em execução. Aguarde que algumas terminem e tente novamente.
    • Num plano ilimitado sem créditos disponíveis, atingiu o número de tarefas que podem ser executadas sem créditos. Aguarde que uma tarefa termine, ou adicione créditos.
  • Name
    500 - Internal Server Error
    Description

    A Meshy não conseguiu criar a tarefa devido a um erro do servidor. A Meshy reembolsa quaisquer créditos cobrados. Tente novamente o pedido.


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

Obter uma tarefa Keycap

Devolve uma tarefa de prototype ou de build. O caminho deve corresponder à fase da tarefa. Uma tarefa de build pedida através de /prototype/:id devolve 404, e o mesmo acontece com uma tarefa de prototype pedida através de /build/:id.

Para os campos, consulte O objeto de tarefa de prototype Keycap e O objeto de tarefa de build 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 a partir da resposta de criação.

Devolve

O objeto de tarefa de prototype ou o objeto de tarefa de build, consoante a fase indicada no caminho.

Modos de falha

  • Name
    400 - Bad Request
    Description

    id não é um ID de tarefa válido. Envie o ID result a partir da resposta de criação.

  • Name
    403 - Forbidden
    Description

    A sua equipa tem a IP Filtering ativada, e a Meshy sinalizou a imagem da tarefa de prototype por propriedade intelectual de terceiros. As tarefas de build e as equipas no plano Enterprise não recebem este erro. Crie uma tarefa de prototype a partir de uma imagem sobre a qual tem direitos de utilização.

  • Name
    404 - Not Found
    Description

    Nenhuma tarefa Keycap com este ID pertence à sua conta, ou a fase da tarefa não corresponde ao caminho. Verifique o ID e utilize /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. Tente novamente o pedido.


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

Eliminar uma tarefa Keycap

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

O caminho deve corresponder à fase da tarefa. Por exemplo, DELETE em /prototype/:id com o ID de uma tarefa de build devolve 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 cancelar.

Devolve

204 No Content com um corpo vazio.

Modos de falha

  • Name
    400 - Bad Request
    Description

    Aplica-se uma destas situações:

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

    Nenhuma tarefa Keycap com este ID pertence à sua conta, ou a fase da tarefa não corresponde ao caminho. Verifique o ID e utilize /prototype ou /build para corresponder à tarefa.

  • Name
    500 - Internal Server Error
    Description

    O Meshy encontrou um erro de servidor ao cancelar a tarefa, pelo que a tarefa pode ou não estar cancelada. Obtenha a tarefa para verificar o 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 tem de corresponder à fase da tarefa. Se não corresponder, por exemplo o ID de uma tarefa build em /prototype/:id/stream, o stream envia um evento error com status_code: 404 e fecha.

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.

Retorna

Um stream de objetos de tarefa prototype ou build. Cada evento contém o objeto de tarefa completo, tal como Obter uma tarefa Keycap o devolve. Enquanto a tarefa está PENDING ou IN_PROGRESS, os seus campos de saída continuam vazios (null, [] ou {}), e finished_at é null.

Se a Filtragem de IP bloquear o resultado da tarefa, o stream envia um evento error em seu lugar, com o status_code que um pedido get devolveria.


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

Listar tarefas Keycap

Devolve as suas tarefas Keycap de uma fase, uma página de cada vez. O caminho seleciona a fase. /prototype devolve apenas tarefas de protótipo, e /build devolve apenas tarefas de construção.

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 do caminho

  • Name
    stage
    Type
    path
    Obrigatório
    Description

    A fase a listar, prototype ou build.

Parâmetros de consulta

  • Name
    page_num
    Type
    integer
    predefinição 1
    Description

    A página a devolver, de 1 a 255. 0 devolve a primeira página. Um valor fora do intervalo 0 a 255 devolve 400.

  • Name
    page_size
    Type
    integer
    predefinição 10
    Description

    Número de tarefas por página, até 100. Um valor de 101 a 255 devolve 100 tarefas, e 0 utiliza o valor predefinido. Um valor fora do intervalo 0 a 255 devolve 400.

  • Name
    sort_by
    Type
    string
    predefinição -created_at
    Description

    A ordem de ordenação.

    Valores disponíveis:

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

Devolve

Um array de objetos de tarefa de protótipo ou objetos de tarefa de construção, correspondentes à fase indicada no caminho.


O objeto de tarefa de protótipo Keycap

Uma tarefa de protótipo gera uma imagem do keycap acabado a partir de uma fotografia. Para transformar o design num keycap 3D, passe o ID da tarefa para o endpoint de build como input_task_id, com a 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 de tarefa, sempre creative-lab-keycap-prototype.

  • Name
    name
    Type
    string
    Description

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

  • Name
    status
    Type
    string
    Description

    O estado da tarefa.

    Valores disponíveis:

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

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

  • Name
    created_at
    Type
    timestamp
    Description

    Momento em que a tarefa foi criada, em milissegundos Unix.

  • Name
    started_at
    Type
    timestamp
    Description

    Momento em que um worker iniciou a tarefa, em milissegundos Unix. null até isso acontecer.

  • Name
    finished_at
    Type
    timestamp
    Description

    Momento em que a tarefa atingiu um estado final, em milissegundos Unix. null até isso acontecer.

  • Name
    expires_at
    Type
    timestamp
    Description

    Momento 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 está PENDING. 1 significa que é a próxima a começar. 0 depois de a tarefa sair da fila, e sempre 0 em resultados de listagem.

  • Name
    task_error
    Type
    object
    Description

    Motivo pelo qual a tarefa falhou. 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. Um pedido que devolve um erro não é cobrado. Uma tarefa falhada é 0, porque a Meshy a reembolsa. Cancelar só reembolsa uma tarefa enquanto esta está PENDING. Se a Meshy não conseguir ler a cobrança, uma resposta de obtenção ou de streaming omite o campo, e um pedido de listagem devolve 500. Nesse caso, tente novamente o pedido.

  • Name
    image_urls
    Type
    array of strings
    Description

    URLs de descarregamento para a imagem do keycap acabado. O array tem um URL depois de a tarefa ser bem-sucedida, e está vazio até lá. image_urls[i] mostra o candidato em candidate_ids[i].

    Estes URLs são para apresentação. O endpoint de build recebe uma entrada de candidate_ids, não um URL. São URLs assinados, por isso obtenha-os sem um cabeçalho Authorization. Mantêm-se válidos até expires_at, e obter a tarefa novamente devolve os mesmos URLs.

  • Name
    candidate_ids
    Type
    array of strings
    Description

    IDs dos candidatos, pela mesma ordem de image_urls. Para construir um candidato, envie o seu ID como candidate_id no pedido de build. Não dependa do formato destes IDs.


O objeto da tarefa de construção do Keycap

Uma tarefa de construção gera o keycap 3D texturizado a partir de uma tarefa de protótipo bem-sucedida e de um dos seus candidatos. Gera o modelo 3D, colore-o, encaixa-o e corta-o na 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 enviou ao criar a tarefa, ou "" se não tiver enviado nenhum.

  • Name
    status
    Type
    string
    Description

    O estado da tarefa.

    Valores disponíveis:

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

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

  • Name
    created_at
    Type
    timestamp
    Description

    Hora em que a tarefa foi criada, em milissegundos Unix.

  • Name
    started_at
    Type
    timestamp
    Description

    Hora em que um worker iniciou a tarefa, em milissegundos Unix. null até isso acontecer.

  • Name
    finished_at
    Type
    timestamp
    Description

    Hora em que a tarefa atingiu um estado final, em milissegundos Unix. null até isso acontecer.

  • Name
    expires_at
    Type
    timestamp
    Description

    Hora 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 está PENDING. 1 significa que começa a seguir. 0 depois de a tarefa sair da fila, e sempre 0 em resultados de listagem.

  • Name
    task_error
    Type
    object
    Description

    Motivo pelo qual a tarefa falhou. 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. Um pedido que devolve um erro não é cobrado. Uma tarefa falhada é 0, porque a Meshy reembolsa-a. Cancelar só reembolsa uma tarefa enquanto esta está PENDING. Se a Meshy não conseguir ler a cobrança, uma resposta de obtenção ou de stream omite o campo, e um pedido de listagem devolve 500. Nesse caso, tente novamente o pedido.

  • Name
    model_urls
    Type
    object
    Description

    URLs de transferência para o modelo 3D. A Meshy exporta o ficheiro GLB e o pacote OBJ à escala real em milímetros, com o eixo Y para cima, com a frente do keycap virada 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 assuma que o modelo tem exatamente duas malhas.

    Estes são URLs assinados, pelo que deve obtê-los sem um cabeçalho Authorization. Mantêm-se válidos até expires_at, e obter a tarefa novamente antes disso devolve os mesmos URLs. Um URL expirado não pode ser renovado, pelo que deve transferir e guardar os ficheiros antes disso.

    • Name
      glb
      Type
      string
      Description

      URL de transferência para o ficheiro GLB texturizado, model.glb.

    • Name
      obj_zip
      Type
      string
      Description

      URL de transferência para o pacote OBJ, um ficheiro ZIP com model.obj, model.mtl, e as texturas PNG que model.mtl utiliza. Com uma base de cor sólida, a única textura é keycap-head.png. Com uma base com padrão, o ficheiro ZIP também tem keycap-base.png.

  • Name
    process_image_urls
    Type
    object
    Description

    URLs de transferência para imagens das etapas da construção, indexadas por tipo. Tal como model_urls, são URLs assinados, pelo que deve obtê-los sem um cabeçalho Authorization. Mantêm-se válidos até expires_at, e obter a tarefa novamente devolve os mesmos URLs.

    Pode ter estas chaves:

    • head_design: a imagem de design do candidato escolhido, que a construção transformou em 3D. Está sempre presente.
    • composite: a imagem do keycap concluído para o candidato escolhido, a partir da qual a construção pintou a base. Pode estar ausente.
    • base_canvas: a base do keycap pintada. Pode estar ausente.

    A Meshy pode adicionar chaves, pelo que deve ignorar uma chave que não reconheça.


End-to-end example

O exemplo executa todo o fluxo:

  1. Criar uma tarefa de protótipo a partir de uma fotografia.
  2. Obter a tarefa até que o seu status seja SUCCEEDED.
  3. Escolher um candidato a partir de candidate_ids.
  4. Criar uma tarefa de construção com esse candidato.
  5. Obter a tarefa de construção até que o seu status seja SUCCEEDED.
  6. Transferir o ficheiro GLB e o pacote OBJ a partir de model_urls.

O exemplo escolhe o primeiro candidato. Na sua aplicação, mostre as entradas de image_urls aos seus utilizadores 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"