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

Creative Lab — API do Fidget Pixel

Transforme uma foto de origem em um fidget board de pixel art multicolorido e imprimível em 3D em duas etapas: prototype pixeliza sua foto em uma imagem de pixel art, e então build amostra essa imagem em uma grade de 16×16 ou 32×32 e transforma cada pixel em uma peça quadrada ou hexagonal encaixável, entregue como um único 3MF cujos objetos carregam suas cores para que um fatiador multi-filamento imprima cada peça na cor correta. As duas etapas são vinculadas via input_task_id.

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

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

Create a Fidget Pixel Prototype Task

Gera uma única imagem em pixel-art a partir da foto de origem. O ID de tarefa retornado é o que você passa como input_task_id para o endpoint de build. Chame esse endpoint novamente para obter outra tentativa se o resultado não for o que você deseja — cada chamada é cobrada separadamente. Consulte The Fidget Pixel Prototype Task Object para conhecer o formato da resposta.

Parâmetros

  • Name
    image_url
    Type
    string
    Obrigatório
    Description

    Foto de origem para a Meshy pixelizar. Atualmente oferecemos suporte aos formatos .jpg, .jpeg, .png e .webp.

    Tamanho máximo do arquivo: 20 MB.

    O formato é detectado decodificando os dados da imagem, não pela extensão de arquivo da URL — uma URL sem extensão, ou uma que redireciona, funciona desde que os bytes sejam decodificados para um formato suportado. Redirecionamentos HTTP são seguidos.

    Há duas maneiras de fornecer a imagem:

    • URL publicamente acessível: Uma URL que é acessível pela internet pública.
    • Data URI: Um data URI da imagem codificado em base64. Exemplo de um Data URI: data:image/jpeg;base64,<seus dados de imagem codificados em base64>.
  • Name
    type
    Type
    string
    Obrigatório
    Description

    O que a foto mostra. Seleciona o estilo de pixelização, então escolha com cuidado — os dois produzem resultados visivelmente diferentes. Valores disponíveis:

    • person — o assunto é uma pessoa (retrato ou corpo inteiro). Produz um sprite de pixel estilo chibi do assunto.
    • other — qualquer outra coisa: animais de estimação, objetos, mascotes, logotipos, paisagens. Produz um ícone de pixel estilo bead-art do assunto.
  • Name
    name
    Type
    string
    Description

    Nome opcional da tarefa para fins de exibição. Máximo de 100 caracteres.

Retornos

A propriedade result da resposta contém o id da tarefa da tarefa de prototype de fidget pixel recém-criada. Faça polling no endpoint Get a Task ou inscreva-se no stream até que a tarefa atinja SUCCEEDED, então passe esse ID para o endpoint de build como input_task_id.

Modos de Falha

  • Name
    400 - Bad Request
    Description

    A solicitação era inaceitável. Causas comuns:

    • Parâmetro ausente: image_url e type são ambos obrigatórios.
    • Tipo inválido: type deve ser person ou other.
    • Formato de imagem inválido: O image_url fornecido não está em um formato suportado (.jpg, .jpeg, .png, .webp).
    • Dimensões de imagem fora do intervalo: A imagem é muito pequena, excede o tamanho máximo de arquivo, ou excede a contagem máxima de pixels.
    • URL inacessível: Não foi possível baixar o image_url (404 ou timeout).
    • Data URI inválido: A string base64 está malformada.
    • Conteúdo sinalizado: A imagem de entrada foi sinalizada pela moderation de NSFW.
  • Name
    401 - Unauthorized
    Description

    Falha na autenticação. Por favor, verifique sua chave de API.

  • Name
    402 - Payment Required
    Description

    Créditos insuficientes para executar esta tarefa, ou a chave de API pertence a uma conta do plano gratuito.

  • Name
    403 - Forbidden
    Description

    A imagem de entrada foi sinalizada pela moderation de propriedade intelectual (Content flagged for intellectual property violation). Apenas contas Enterprise com a filtragem de propriedade intelectual ativada são bloqueadas; nada é cobrado.

  • Name
    429 - Too Many Requests
    Description

    Você excedeu seu limite de taxa.

  • Name
    500 - Internal Server Error
    Description

    A própria verificação de propriedade intelectual não pôde ser concluída (Unable to perform intellectual property check, please try again). Contas Enterprise com a filtragem de propriedade intelectual ativada falham de forma restritiva nessa verificação; nada é cobrado — tente a solicitação novamente.

Request

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

Response

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

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

Create a Fidget Pixel Build Task

Gera as peças imprimíveis em 3D a partir de uma tarefa de protótipo bem-sucedida. O build amostra a imagem em pixel art do protótipo na grade solicitada, quantiza-a para no máximo color_count cores, e gera uma peça interligada por célula da grade. O entregável é um único 3MF no qual cada peça é um objeto separado marcado com sua cor, pronto para um fatiador multifilamento. Consulte The Fidget Pixel Build Task Object para o formato da resposta.

Parâmetros

  • Name
    input_task_id
    Type
    string
    Obrigatório
    Description

    O ID da tarefa de uma tarefa de protótipo criada por meio deste mesmo endpoint OpenAPI. O protótipo deve ter sido criado pela mesma conta Meshy e deve ter alcançado SUCCEEDED.

    Tarefas de protótipo criadas por meio do webapp não são aceitas — o endpoint de build aceita apenas tarefas de protótipo produzidas por POST /openapi/creative-lab/fidget-pixel/v1/prototype e recusa qualquer outra origem com 404.

  • Name
    name
    Type
    string
    Description

    Nome opcional da tarefa para fins de exibição. Máximo de 100 caracteres.

options

Geometria opcional da peça. Todo campo possui um valor padrão — envie apenas os que deseja sobrescrever. Estes são os mesmos controles que o webapp do Creative Lab expõe; altura do pino, escala da tampa e as demais predefinições de fabricação são derivadas de shape e piece_size_mm e não são expostas.

  • Name
    shape
    Type
    string
    padrão square
    Description

    Formato de cada peça. Valores disponíveis:

    • square (padrão) — peças quadradas em uma grade quadrada.
    • hex — peças hexagonais em uma grade hexagonal. Peças hexagonais estão disponíveis apenas em 6 e 8 mm.
  • Name
    grid_size
    Type
    integer
    padrão 32
    Description

    Número de peças ao longo de cada lado do tabuleiro. Valores disponíveis: 16 ou 32. Uma grade 32 mantém mais detalhes; uma grade 16 significa peças menos numerosas e maiores para o mesmo assunto.

  • Name
    piece_size_mm
    Type
    integer
    padrão 8
    Description

    Comprimento da aresta de cada peça, em milímetros. Valores disponíveis: 6, 8, ou 10. Junto com grid_size, isso define o tamanho do tabuleiro impresso — por exemplo, 32 × 8 mm ≈ 26 cm por lado. 10 não está disponível para shape: "hex" (a face hexagonal inclinada gera balanços (overhangs) na maioria das impressoras FDM de consumo).

  • Name
    color_count
    Type
    integer
    padrão 8
    Description

    Número máximo de cores na paleta para a qual a imagem é quantizada. Intervalo: [1, 8]. Cada cor se torna um filamento no seu fatiador.

  • Name
    piece_height_mm
    Type
    integer
    padrão 15
    Description

    Altura de cada peça, em milímetros. Intervalo: [10, 80].

output

Seletor opcional de formato de transmissão. O padrão é 3mf, que atualmente é o único valor suportado.

  • Name
    format
    Type
    string
    padrão 3mf
    Description

    Artefato retornado pelo build. Valores disponíveis:

    • 3mf (padrão) — retorna um único model.3mf em model_urls.3mf, com um objeto por peça e a cor da peça anexada a cada objeto.

Retornos

A propriedade result da resposta contém o id da tarefa da tarefa de build fidget pixel recém-criada. Faça polling no endpoint Get a Task ou inscreva-se no stream até que a tarefa alcance SUCCEEDED, então faça download do artefato em model_urls.3mf.

Modos de Falha

  • Name
    400 - Bad Request
    Description

    A requisição foi inaceitável. Causas comuns:

    • Parâmetro ausente: input_task_id é obrigatório.
    • UUID inválido: O input_task_id não é um UUID válido.
    • Origem não bem-sucedida: A tarefa de protótipo referenciada ainda não alcançou SUCCEEDED.
    • Nenhum candidato: A tarefa de protótipo foi bem-sucedida, mas não produziu nenhuma imagem em pixel art; crie um novo protótipo.
    • Opções fora do intervalo: Um dos campos de options está fora do conjunto ou intervalo permitido — por exemplo options.grid_size must be 16 or 32, ou options.piece_size_mm=10 is not supported for shape=hex; hex pieces are available in 6 and 8 mm.
    • Formato não suportado: output.format deve ser 3mf.
  • Name
    401 - Unauthorized
    Description

    Falha na autenticação. Verifique sua chave de API.

  • Name
    402 - Payment Required
    Description

    Créditos insuficientes para realizar esta tarefa, ou a chave de API pertence a uma conta do plano gratuito.

  • Name
    403 - Forbidden
    Description

    A imagem do protótipo referenciado foi sinalizada pela moderation de propriedade intelectual. Apenas contas Enterprise com filtragem de propriedade intelectual habilitada são bloqueadas; nada é cobrado.

  • Name
    404 - Not Found
    Description

    A tarefa de protótipo referenciada não existe, pertence a um usuário diferente, ou foi criada por meio do webapp (apenas tarefas de protótipo em modo API se encadeiam no build).

  • Name
    429 - Too Many Requests
    Description

    Você excedeu seu limite de taxa.

  • Name
    500 - Internal Server Error
    Description

    Não foi possível estabelecer o veredito de propriedade intelectual do protótipo referenciado (Unable to perform intellectual property check, please try again). Contas Enterprise com filtragem de propriedade intelectual habilitada falham de forma fechada nesta verificação; nada é cobrado — tente a requisição novamente.

Request

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

Response

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

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

Recuperar uma Tarefa do Fidget Pixel

Recupera uma tarefa de protótipo ou de build a partir de um id de tarefa válido. O caminho da URL deve corresponder ao estágio da tarefa — uma tarefa de build buscada através de /prototype/:id retorna 404, e vice-versa.

Consulte O Objeto de Tarefa de Protótipo do Fidget Pixel e O Objeto de Tarefa de Build do Fidget Pixel para os formatos de resposta.

Parâmetros

  • Name
    id
    Type
    path
    Description

    Identificador único da tarefa do fidget pixel a ser recuperada.

Retornos

A resposta contém o objeto de tarefa do fidget pixel. O formato depende de qual estágio foi solicitado.

Modos de Falha

  • Name
    400 - Bad Request
    Description

    id não é um UUID válido (Invalid ID).

  • Name
    403 - Forbidden
    Description

    A imagem da tarefa foi sinalizada pela moderação de propriedade intelectual. Apenas contas Enterprise com filtragem de propriedade intelectual ativada são bloqueadas.

  • Name
    404 - Not Found
    Description

    A tarefa não existe, pertence a um usuário diferente, ou seu estágio não corresponde ao caminho da URL.

  • Name
    500 - Internal Server Error
    Description

    A verificação de propriedade intelectual não pôde ser concluída (Unable to perform intellectual property check, please try again); contas Enterprise com filtragem de propriedade intelectual ativada falham de forma restritiva. Tente a requisição novamente.

Request

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

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

Prototype Response

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

Build Response

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

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

Excluir uma tarefa Fidget Pixel

Cancela uma tarefa fidget pixel. Se a tarefa ainda estiver PENDING, os créditos consumidos no momento da criação são reembolsados. Tarefas que já estão IN_PROGRESS são canceladas sem reembolso (o worker já pode estar consumindo recursos). Tarefas que já atingiram um estado terminal (SUCCEEDED, FAILED, CANCELED) não podem ser canceladas.

O caminho da URL deve corresponder ao estágio da tarefa — DELETE em /prototype/:buildId retorna 404.

Parâmetros de Caminho

  • Name
    id
    Type
    path
    Description

    Identificador único da tarefa fidget pixel a ser cancelada.

Retornos

Retorna 204 No Content em caso de sucesso, com corpo vazio.

Modos de Falha

  • Name
    400 - Bad Request
    Description

    A solicitação foi inaceitável. Causas comuns:

    • ID inválido: id não é um UUID válido.
    • Estado terminal: A tarefa já está SUCCEEDED, FAILED ou CANCELED e não pode ser cancelada.
  • Name
    404 - Not Found
    Description

    A tarefa não existe, pertence a um usuário diferente, ou seu estágio não corresponde ao caminho da URL.

Request

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

Response

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

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

Transmitir uma Tarefa Fidget Pixel

Transmita atualizações em tempo real de uma tarefa fidget pixel via Server-Sent Events (SSE). O caminho da URL deve corresponder ao estágio da tarefa — abrir um stream em /prototype/:buildId/stream emite um único payload event: error com status_code: 404 e encerra o stream; um id malformado faz o mesmo com status_code: 400 (Invalid ID).

Parâmetros

  • Name
    id
    Type
    path
    Description

    Identificador único da tarefa fidget pixel a ser transmitida.

Retornos

Retorna um stream de objetos de tarefa Fidget Pixel Prototype ou Fidget Pixel Build como Server-Sent Events. Cada frame carrega o objeto de tarefa completo do estágio — o mesmo formato que o endpoint Get retorna — então, 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.

Request

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

Response Stream

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

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

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

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

Listar Tarefas do Fidget Pixel

Recupere uma lista paginada das suas tarefas do fidget pixel para um único estágio. O caminho da URL seleciona o estágio — /prototype retorna tarefas de protótipo; /build retorna tarefas de build. Tarefas do outro estágio não são incluídas em nenhuma das respostas.

Parâmetros de Caminho

  • Name
    stage
    Type
    path
    Obrigatório
    Description

    prototype ou build. A coleção retorna apenas tarefas cujo estágio corresponde à URL — buscar /prototype nunca retorna tarefas de build e vice-versa.

Parâmetros de Consulta

  • Name
    page_num
    Type
    integer
    padrão 1
    Description

    Número da página para paginação.

  • Name
    page_size
    Type
    integer
    padrão 10
    Description

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

  • Name
    sort_by
    Type
    string
    padrão -created_at
    Description

    Campo para ordenação. Valores disponíveis:

    • +created_at: Ordenar pelo horário de criação em ordem crescente.
    • -created_at: Ordenar pelo horário de criação em ordem decrescente.

Retornos

Retorna uma lista paginada do objeto de tarefa por estágio — seja o objeto de tarefa de protótipo do fidget pixel ao listar /prototype ou o objeto de tarefa de build do fidget pixel ao listar /build.

Request

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

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

Response (List Prototype Tasks)

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

O Objeto de Task de Fidget Pixel Prototype

O objeto de task de Fidget Pixel Prototype é uma unidade de trabalho que a Meshy monitora para pixelizar uma foto de origem em uma imagem em pixel art. A saída dessa etapa é encadeada na etapa de build via input_task_id.

Propriedades

  • Name
    id
    Type
    string
    Description

    Identificador único da task. Embora usemos um UUID k-sortable para ids de tasks como detalhe de implementação, você não deve fazer suposições sobre o formato do id.

  • Name
    type
    Type
    string
    Description

    Tipo da task. O valor é creative-lab-fidget-pixel-prototype.

  • Name
    name
    Type
    string
    Description

    O nome da task fornecido quando ela foi criada. String vazia se nenhum nome foi fornecido.

  • Name
    status
    Type
    string
    Description

    Status da task. Os valores possíveis são um de PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    Progress da task. Se a task ainda não foi iniciada, essa propriedade será 0. Assim que a task for concluída com sucesso, ela se tornará 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Carimbo de data/hora de quando a task foi criada, em milissegundos.

  • Name
    started_at
    Type
    timestamp
    Description

    Carimbo de data/hora de quando a task foi iniciada, em milissegundos. Se a task ainda não foi iniciada, essa propriedade será null.

  • Name
    finished_at
    Type
    timestamp
    Description

    Carimbo de data/hora de quando a task foi finalizada, em milissegundos. Se a task ainda não foi finalizada, essa propriedade será null.

  • Name
    expires_at
    Type
    timestamp
    Description

    Carimbo de data/hora de quando o resultado da task expira, em milissegundos — 3 dias após a conclusão da task. Contas Enterprise mantêm os resultados da API indefinidamente (veja Retenção de Recursos); para elas, esse carimbo de data/hora é definido para cerca de 100 anos no futuro.

  • Name
    preceding_tasks
    Type
    integer
    Description

    A contagem de tasks precedentes.

  • Name
    task_error
    Type
    object
    Description

    Detalhes de erro para tasks que falharam. Veja Erros para a referência completa do objeto task_error.

  • Name
    consumed_credits
    Type
    integer
    Description

    O número de créditos consumidos por essa task. Uma task que atinge SUCCEEDED é cobrada pelo valor total de sua etapa. Uma task que nunca chega a ser criada (um 4xx no momento da solicitação, incluindo uma rejeição de moderation) não é cobrada de forma alguma. Uma task que atinge FAILED retorna 0 — a cobrança é reembolsada. Cancelar via DELETE reembolsa somente enquanto a task ainda está PENDING; uma task já IN_PROGRESS permanece cobrada, pois o trabalho já foi realizado.

  • Name
    image_urls
    Type
    array of strings
    Description

    URLs para download da imagem em pixel art gerada por essa task de prototype. Atualmente a API sempre retorna exatamente uma imagem; o campo é um array para que revisões futuras possam apresentar múltiplos candidatos sem uma alteração incompatível. Vazio até que a task atinja SUCCEEDED.

    Essas são URLs assinadas: busque-as sem um cabeçalho Authorization. Elas permanecem válidas até expires_at, que é 3 dias após finished_at, e reler a task dentro dessa janela retorna a mesma URL, em vez de uma recém-assinada. Faça o download e armazene os arquivos você mesmo antes disso — não há como atualizar um link expirado.

Example Fidget Pixel Prototype Task Object

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

O Objeto de Tarefa de Build do Fidget Pixel

O Objeto de Tarefa de Build do Fidget Pixel é uma unidade de trabalho que a Meshy mantém sob controle para gerar as peças imprimíveis a partir de uma tarefa de protótipo bem-sucedida. O build amostra a imagem em pixel art do protótipo na grade solicitada e publica um único 3MF com marcação de cor.

Propriedades

  • Name
    id
    Type
    string
    Description

    Identificador único da tarefa.

  • Name
    type
    Type
    string
    Description

    Tipo da tarefa. O valor é creative-lab-fidget-pixel-build.

  • Name
    name
    Type
    string
    Description

    O nome da tarefa fornecido quando a tarefa foi criada. String vazia se nenhum nome foi fornecido.

  • Name
    status
    Type
    string
    Description

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

  • Name
    progress
    Type
    integer
    Description

    Progresso da tarefa. Se a tarefa ainda não foi iniciada, esta propriedade será 0. Assim que a tarefa for bem-sucedida, isso se tornará 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Carimbo de data/hora de quando a tarefa foi criada, em milissegundos.

  • Name
    started_at
    Type
    timestamp
    Description

    Carimbo de data/hora de quando a tarefa foi iniciada, em milissegundos. null até a tarefa começar.

  • Name
    finished_at
    Type
    timestamp
    Description

    Carimbo de data/hora de quando a tarefa foi finalizada, em milissegundos. null até a tarefa terminar.

  • Name
    expires_at
    Type
    timestamp
    Description

    Carimbo de data/hora de quando o resultado da tarefa expira, em milissegundos — 3 dias após a tarefa terminar. Contas Enterprise mantêm os resultados da API indefinidamente (veja Retenção de Recursos); para elas, esse carimbo de data/hora é definido para cerca de 100 anos no futuro.

  • Name
    preceding_tasks
    Type
    integer
    Description

    A contagem de tarefas precedentes. Significativo apenas quando o status é PENDING.

  • Name
    task_error
    Type
    object
    Description

    Detalhes do erro para tarefas com falha. Veja Erros para a referência completa do objeto task_error.

  • Name
    consumed_credits
    Type
    integer
    Description

    O número de créditos consumidos por esta tarefa. Uma tarefa que atinge SUCCEEDED é cobrada o valor integral para o seu estágio. Uma tarefa que nunca chega a ser criada (um 4xx no momento da requisição, incluindo uma rejeição de moderation) não é cobrada de forma alguma. Uma tarefa que atinge FAILED retorna 0 — a cobrança é reembolsada. Cancelar via DELETE só reembolsa enquanto a tarefa ainda está PENDING; uma tarefa já IN_PROGRESS permanece cobrada, pois o trabalho já foi gasto.

  • Name
    model_urls
    Type
    object
    Description

    URLs para download do artefato gerado, indexadas por formato. Contém exatamente uma entrada — o formato solicitado através do output.format da requisição de build. Vazio até a tarefa atingir SUCCEEDED.

    Estas são URLs assinadas: busque-as sem um cabeçalho Authorization. Elas permanecem válidas até expires_at, que é 3 dias após finished_at, e reler a tarefa dentro dessa janela retorna a mesma URL, em vez de uma recém-assinada. Baixe e armazene os arquivos você mesmo antes disso — não há como atualizar um link expirado.

    • Name
      3mf
      Type
      string
      Description

      URL para download do arquivo 3MF. Um objeto por peça, cada um marcado com sua cor da paleta, para que um fatiador multi-filamento atribua filamentos por cor. Presente quando output.format era 3mf (o padrão).

Example Fidget Pixel Build Task Object

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

Exemplo de Ponta a Ponta

O fluxo completo: criar um protótipo a partir de uma foto, consultá-lo até SUCCEEDED, criar uma construção a partir dele, consultar a construção até SUCCEEDED e, então, baixar o 3MF a partir de model_urls.

Um protótipo geralmente termina em poucos minutos; uma construção normalmente é concluída em bem menos de um minuto. Em uma integração real, você mostraria a entrada image_urls do protótipo ao usuário final e o deixaria confirmar (ou executar o protótipo novamente) antes de gastar créditos na construção.

Complete flow

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

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

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

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

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

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

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

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

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

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

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