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 da tarefa retornado é o que você passa como input_task_id para o endpoint de build. Chame este endpoint novamente para outra tentativa se o resultado não for o que você deseja — cada chamada é cobrada separadamente. Consulte The Fidget Pixel Prototype Task Object para o formato da resposta.

Parâmetros

  • Name
    image_url
    Type
    string
    Obrigatório
    Description

    Foto de origem para o Meshy pixelizar. Atualmente suportamos os formatos .jpg, .jpeg, .png e .webp.

    O formato é detectado ao decodificar os dados da imagem, não pela extensão do arquivo na URL — uma URL sem extensão, ou uma que redirecione, 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 a partir da internet pública.
    • Data URI: Um Data URI da imagem codificado em base64. Exemplo de um Data URI: data:image/jpeg;base64,<your base64-encoded image data>.
  • Name
    type
    Type
    string
    Obrigatório
    Description

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

    • person — o sujeito é uma pessoa (retrato ou corpo inteiro). Produz um sprite em pixel no estilo chibi do sujeito.
    • other — qualquer outra coisa: animais de estimação, objetos, mascotes, logotipos, paisagens. Produz um ícone em pixel no estilo bead-art do sujeito.
  • 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 nova tarefa de protótipo fidget pixel criada. Consulte periodicamente o endpoint Get a Task ou inscreva-se no stream até que a tarefa atinja SUCCEEDED, e então passe esse ID para o endpoint de build como input_task_id.

Modos de Falha

  • Name
    400 - Bad Request
    Description

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

    • Parâmetro ausente: image_url e type são ambos obrigatórios.
    • Type 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 da 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: O image_url não pôde ser baixado (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 realizar 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). Somente contas Enterprise com filtragem de propriedade intelectual habilitada 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 filtragem de propriedade intelectual habilitada falham de forma fechada (fail closed) nesta verificação; nada é cobrado — tente novamente a requisição.

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"