Creative Lab — API Fidget Pixel

Trasforma una foto sorgente in una tavoletta fidget pixel-art multicolore stampabile in 3D in due fasi: prototype pixelizza la tua foto in un'immagine pixel-art, poi build campiona quell'immagine su una griglia 16×16 o 32×32 e trasforma ogni pixel in un pezzo quadrato o esagonale a incastro, fornito come un unico 3MF i cui oggetti portano i propri colori in modo che uno slicer multi-filamento stampi ogni pezzo nel colore giusto. Le due fasi sono collegate tramite 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

Creazione di un Task di Prototipo Fidget Pixel

Genera una singola immagine pixel-art dalla foto sorgente. L'ID del task restituito è quello che passerai come input_task_id all'endpoint di build. Richiama nuovamente questo endpoint per un altro tentativo se il risultato non è quello desiderato — ogni chiamata viene fatturata separatamente. Fai riferimento a L'oggetto Task di Prototipo Fidget Pixel per la struttura della risposta.

Parametri

  • Name
    image_url
    Type
    string
    Obbligatorio
    Description

    Foto sorgente che Meshy dovrà pixelizzare. Attualmente supportiamo i formati .jpg, .jpeg, .png e .webp.

    Il formato viene rilevato decodificando i dati dell'immagine, non dall'estensione del file nell'URL — un URL senza estensione, o uno che reindirizza, funziona purché i byte vengano decodificati in un formato supportato. I reindirizzamenti HTTP vengono seguiti.

    Ci sono due modi per fornire l'immagine:

    • URL accessibile pubblicamente: Un URL accessibile da internet pubblicamente.
    • Data URI: Un data URI dell'immagine codificato in base64. Esempio di data URI: data:image/jpeg;base64,<i tuoi dati immagine codificati in base64>.
  • Name
    type
    Type
    string
    Obbligatorio
    Description

    Cosa mostra la foto. Seleziona lo stile di pixelizzazione, quindi scegli con attenzione — i due producono risultati visibilmente diversi. Valori disponibili:

    • person — il soggetto è una persona (ritratto o corpo intero). Produce uno sprite pixel in stile chibi del soggetto.
    • other — qualsiasi altra cosa: animali domestici, oggetti, mascotte, loghi, paesaggi. Produce un'icona pixel in stile bead-art del soggetto.
  • Name
    name
    Type
    string
    Description

    Nome del task opzionale a scopo di visualizzazione. Massimo 100 caratteri.

Risultati restituiti

La proprietà result della risposta contiene l'id del task del task di prototipo fidget pixel appena creato. Effettua il polling dell'endpoint Recupera un Task oppure sottoscrivi lo stream finché il task non raggiunge lo stato SUCCEEDED, quindi passa quell'ID all'endpoint di build come input_task_id.

Modalità di errore

  • Name
    400 - Bad Request
    Description

    La richiesta non era accettabile. Cause comuni:

    • Parametro mancante: sono richiesti sia image_url che type.
    • Tipo non valido: type deve essere person o other.
    • Formato immagine non valido: l'image_url fornito non è in un formato supportato (.jpg, .jpeg, .png, .webp).
    • Dimensioni immagine fuori intervallo: l'immagine è troppo piccola, supera la dimensione massima del file, oppure supera il numero massimo di pixel consentito.
    • URL non raggiungibile: non è stato possibile scaricare image_url (404 o timeout).
    • Data URI non valido: la stringa base64 è malformata.
    • Contenuto segnalato: l'immagine in input è stata segnalata dalla moderation NSFW.
  • Name
    401 - Unauthorized
    Description

    Autenticazione fallita. Verifica la tua chiave API.

  • Name
    402 - Payment Required
    Description

    Crediti insufficienti per eseguire questo task, oppure la chiave API appartiene a un account con piano gratuito.

  • Name
    403 - Forbidden
    Description

    L'immagine in input è stata segnalata dalla moderation sulla proprietà intellettuale (Content flagged for intellectual property violation). Vengono bloccati solo gli account Enterprise con il filtro sulla proprietà intellettuale attivo; non viene addebitato nulla.

  • Name
    429 - Too Many Requests
    Description

    Hai superato il tuo limite di frequenza.

  • Name
    500 - Internal Server Error
    Description

    Non è stato possibile completare il controllo sulla proprietà intellettuale (Unable to perform intellectual property check, please try again). Gli account Enterprise con il filtro sulla proprietà intellettuale attivo falliscono in modalità chiusa su questo controllo; non viene addebitato nulla — riprova la richiesta.

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

Crea un'attività di build Fidget Pixel

Genera i pezzi stampabili in 3D a partire da un'attività di prototipo riuscita. Il build campiona l'immagine pixel-art del prototipo sulla griglia richiesta, la quantizza a un massimo di color_count colori e genera un pezzo incastrabile per ogni cella della griglia. Il risultato è un unico file 3MF in cui ogni pezzo è un oggetto separato contrassegnato con il proprio colore, pronto per uno slicer multi-filamento. Consulta L'oggetto Attività di build Fidget Pixel per la forma della risposta.

Parametri

  • Name
    input_task_id
    Type
    string
    Obbligatorio
    Description

    L'ID dell'attività di un'attività di prototipo creata tramite lo stesso endpoint OpenAPI. Il prototipo deve essere stato creato dallo stesso account Meshy e deve aver raggiunto SUCCEEDED.

    Le attività di prototipo create tramite la webapp non sono accettate — l'endpoint di build accetta solo attività di prototipo prodotte da POST /openapi/creative-lab/fidget-pixel/v1/prototype e rifiuta qualsiasi altra origine con 404.

  • Name
    name
    Type
    string
    Description

    Nome facoltativo dell'attività a scopo di visualizzazione. Massimo 100 caratteri.

options

Geometria facoltativa dei pezzi. Ogni campo ha un valore predefinito — invia solo quelli che vuoi sovrascrivere. Sono gli stessi controlli esposti dalla webapp Creative Lab; l'altezza dell'innesto, la scala del tappo e le altre impostazioni predefinite di produzione sono derivate da shape e piece_size_mm e non sono esposte.

  • Name
    shape
    Type
    string
    predefinito square
    Description

    Ingombro di ciascun pezzo. Valori disponibili:

    • square (predefinito) — pezzi quadrati su una griglia quadrata.
    • hex — pezzi esagonali su una griglia esagonale. I pezzi esagonali sono disponibili solo in 6 e 8 mm.
  • Name
    grid_size
    Type
    integer
    predefinito 32
    Description

    Numero di pezzi lungo ciascun lato della tavola. Valori disponibili: 16 o 32. Una griglia 32 conserva più dettaglio; una griglia 16 significa pezzi meno numerosi e più grandi per lo stesso soggetto.

  • Name
    piece_size_mm
    Type
    integer
    predefinito 8
    Description

    Lunghezza del lato di ciascun pezzo, in millimetri. Valori disponibili: 6, 8 o 10. Insieme a grid_size questo determina la dimensione stampata della tavola — ad esempio 32 × 8 mm ≈ 26 cm per lato. 10 non è disponibile per shape: "hex" (la faccia esagonale inclinata presenta sbalzi sulla maggior parte delle stampanti FDM consumer).

  • Name
    color_count
    Type
    integer
    predefinito 8
    Description

    Numero massimo di colori nella palette a cui viene quantizzata l'immagine. Intervallo: [1, 8]. Ogni colore diventa un filamento nel tuo slicer.

  • Name
    piece_height_mm
    Type
    integer
    predefinito 15
    Description

    Altezza di ciascun pezzo, in millimetri. Intervallo: [10, 80].

output

Selettore facoltativo del formato di trasferimento. Il valore predefinito è 3mf, che al momento è l'unico valore supportato.

  • Name
    format
    Type
    string
    predefinito 3mf
    Description

    Artefatto restituito dal build. Valori disponibili:

    • 3mf (predefinito) — restituisce un singolo model.3mf sotto model_urls.3mf, con un oggetto per pezzo e il colore del pezzo associato a ciascun oggetto.

Restituisce

La proprietà result della risposta contiene l'id dell'attività della nuova attività di build fidget pixel appena creata. Interroga l'endpoint Ottieni un'attività oppure sottoscrivi lo stream finché l'attività non raggiunge SUCCEEDED, quindi scarica l'artefatto da model_urls.3mf.

Modalità di errore

  • Name
    400 - Bad Request
    Description

    La richiesta non era accettabile. Cause comuni:

    • Parametro mancante: input_task_id è obbligatorio.
    • UUID non valido: input_task_id non è un UUID valido.
    • Genitore non riuscito: l'attività di prototipo referenziata non ha ancora raggiunto SUCCEEDED.
    • Nessun candidato: l'attività di prototipo è riuscita ma non ha prodotto alcuna immagine pixel-art; crea un nuovo prototipo.
    • Opzioni fuori intervallo: uno dei campi di options è al di fuori del suo insieme o intervallo consentito — ad esempio options.grid_size must be 16 or 32, oppure options.piece_size_mm=10 is not supported for shape=hex; hex pieces are available in 6 and 8 mm.
    • Formato non supportato: output.format deve essere 3mf.
  • Name
    401 - Unauthorized
    Description

    Autenticazione non riuscita. Controlla la tua chiave API.

  • Name
    402 - Payment Required
    Description

    Crediti insufficienti per eseguire questa attività, oppure la chiave API appartiene a un account con piano gratuito.

  • Name
    403 - Forbidden
    Description

    L'immagine del prototipo referenziato è stata segnalata dalla moderation sulla proprietà intellettuale. Vengono bloccati solo gli account Enterprise con il filtro sulla proprietà intellettuale abilitato; non viene addebitato nulla.

  • Name
    404 - Not Found
    Description

    L'attività di prototipo referenziata non esiste, appartiene a un utente diverso, oppure è stata creata tramite la webapp (solo le attività di prototipo in modalità API possono essere concatenate al build).

  • Name
    429 - Too Many Requests
    Description

    Hai superato il tuo limite di frequenza.

  • Name
    500 - Internal Server Error
    Description

    Non è stato possibile stabilire il verdetto sulla proprietà intellettuale del prototipo referenziato (Unable to perform intellectual property check, please try again). Gli account Enterprise con il filtro sulla proprietà intellettuale abilitato falliscono in modo bloccante su questo controllo; non viene addebitato nulla — riprova la richiesta.

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

Recuperare un task Fidget Pixel

Recupera un task di prototipo o di build dato un id di task valido. Il percorso URL deve corrispondere allo stadio del task — un task di build recuperato tramite /prototype/:id restituisce 404, e viceversa.

Fai riferimento a The Fidget Pixel Prototype Task Object e The Fidget Pixel Build Task Object per la struttura delle risposte.

Parametri

  • Name
    id
    Type
    path
    Description

    Identificatore univoco del task fidget pixel da recuperare.

Risultati restituiti

La risposta contiene l'oggetto task fidget pixel. La struttura dipende da quale stadio è stato richiesto.

Modalità di errore

  • Name
    400 - Bad Request
    Description

    id non è un UUID valido (Invalid ID).

  • Name
    403 - Forbidden
    Description

    L'immagine del task è stata segnalata dalla moderazione della proprietà intellettuale. Vengono bloccati solo gli account Enterprise con il filtro della proprietà intellettuale abilitato.

  • Name
    404 - Not Found
    Description

    Il task non esiste, appartiene a un altro utente, oppure il suo stadio non corrisponde al percorso URL.

  • Name
    500 - Internal Server Error
    Description

    Non è stato possibile completare il controllo della proprietà intellettuale (Unable to perform intellectual property check, please try again); gli account Enterprise con il filtro della proprietà intellettuale abilitato falliscono in modalità restrittiva. Riprova la richiesta.

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

Elimina un'attività Fidget Pixel

Annulla un'attività fidget pixel. Se l'attività è ancora PENDING, i crediti consumati al momento della creazione vengono rimborsati. Le attività già IN_PROGRESS vengono annullate senza rimborso (il worker potrebbe già consumare risorse). Le attività che hanno già raggiunto uno stato terminale (SUCCEEDED, FAILED, CANCELED) non possono essere annullate.

Il percorso URL deve corrispondere alla fase dell'attività — DELETE su /prototype/:buildId restituisce 404.

Parametri del percorso

  • Name
    id
    Type
    path
    Description

    Identificatore univoco dell'attività fidget pixel da annullare.

Restituisce

Restituisce 204 No Content in caso di successo con un corpo vuoto.

Modalità di errore

  • Name
    400 - Bad Request
    Description

    La richiesta non era accettabile. Cause comuni:

    • ID non valido: id non è un UUID valido.
    • Stato terminale: l'attività è già SUCCEEDED, FAILED o CANCELED e non può essere annullata.
  • Name
    404 - Not Found
    Description

    L'attività non esiste, appartiene a un altro utente, oppure la sua fase non corrisponde al percorso 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

Effettua lo streaming di un'attività Fidget Pixel

Effettua lo streaming di aggiornamenti in tempo reale per un'attività fidget pixel tramite Server-Sent Events (SSE). Il percorso dell'URL deve corrispondere alla fase dell'attività — aprire uno stream su /prototype/:buildId/stream emette un singolo payload event: error con status_code: 404 e chiude lo stream; un id malformato fa lo stesso con status_code: 400 (Invalid ID).

Parametri

  • Name
    id
    Type
    path
    Description

    Identificatore univoco dell'attività fidget pixel di cui effettuare lo streaming.

Restituisce

Restituisce uno stream di oggetti attività Fidget Pixel Prototype o Fidget Pixel Build come Server-Sent Events. Ogni frame contiene l'intero oggetto attività per la fase — la stessa forma restituita dall'endpoint Get — quindi mentre l'attività è PENDING o IN_PROGRESS i campi di output semplicemente non sono ancora popolati (null, [] o {}) 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)

Elenca task Fidget Pixel

Recupera un elenco paginato dei tuoi task fidget pixel per una singola fase. Il percorso URL seleziona la fase — /prototype restituisce i task di prototipo; /build restituisce i task di build. I task dell'altra fase non sono inclusi in nessuna delle due risposte.

Parametri del percorso

  • Name
    stage
    Type
    path
    Obbligatorio
    Description

    prototype oppure build. La raccolta restituisce solo i task la cui fase corrisponde all'URL — richiedere /prototype non restituisce mai task di build e viceversa.

Parametri della query

  • Name
    page_num
    Type
    integer
    predefinito 1
    Description

    Numero di pagina per la paginazione.

  • Name
    page_size
    Type
    integer
    predefinito 10
    Description

    Limite di dimensione della pagina. Il massimo consentito è 100 elementi.

  • Name
    sort_by
    Type
    string
    predefinito -created_at
    Description

    Campo per l'ordinamento. Valori disponibili:

    • +created_at: Ordina per data di creazione in ordine crescente.
    • -created_at: Ordina per data di creazione in ordine decrescente.

Restituisce

Restituisce un elenco paginato dell'oggetto task per fase — o l'oggetto task di prototipo fidget pixel quando si elenca /prototype, oppure l'oggetto task di build fidget pixel quando si elenca /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=***"
    ]
  }
]

L'oggetto Fidget Pixel Prototype Task

L'oggetto Fidget Pixel Prototype Task è un'unità di lavoro che Meshy tiene traccia per trasformare in pixel una foto sorgente in un'immagine pixel-art. L'output di questa fase viene concatenato con la fase di build tramite input_task_id.

Proprietà

  • Name
    id
    Type
    string
    Description

    Identificatore univoco del task. Sebbene come dettaglio implementativo utilizziamo un UUID k-sortable per gli id dei task, non dovresti fare alcuna assunzione sul formato dell'id.

  • Name
    type
    Type
    string
    Description

    Tipo del task. Il valore è creative-lab-fidget-pixel-prototype.

  • Name
    name
    Type
    string
    Description

    Il nome del task fornito al momento della creazione. Stringa vuota se non è stato fornito alcun nome.

  • Name
    status
    Type
    string
    Description

    Stato del task. I valori possibili sono uno tra PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    Progresso del task. Se il task non è ancora iniziato, questa proprietà sarà 0. Una volta che il task è riuscito, diventerà 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Timestamp di quando il task è stato creato, in millisecondi.

  • Name
    started_at
    Type
    timestamp
    Description

    Timestamp di quando il task è stato avviato, in millisecondi. Se il task non è ancora avviato, questa proprietà sarà null.

  • Name
    finished_at
    Type
    timestamp
    Description

    Timestamp di quando il task è terminato, in millisecondi. Se il task non è ancora terminato, questa proprietà sarà null.

  • Name
    expires_at
    Type
    timestamp
    Description

    Timestamp di quando il risultato del task scade, in millisecondi — 3 giorni dopo il termine del task. Gli account Enterprise conservano i risultati API a tempo indeterminato (vedi Conservazione degli asset); per loro questo timestamp è impostato a circa 100 anni nel futuro.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Il conteggio dei task precedenti.

  • Name
    task_error
    Type
    object
    Description

    Dettagli dell'errore per i task falliti. Vedi Errori per il riferimento completo all'oggetto task_error.

  • Name
    consumed_credits
    Type
    integer
    Description

    Il numero di crediti consumati da questo task. Un task che raggiunge SUCCEEDED viene addebitato per l'intero importo della sua fase. Un task che non viene mai creato (un 4xx al momento della richiesta, incluso un rifiuto di moderation) non viene addebitato affatto. Un task che raggiunge FAILED restituisce 0 — l'addebito viene rimborsato. Annullare tramite DELETE rimborsa solo mentre il task è ancora PENDING; un task già IN_PROGRESS rimane addebitato, perché il lavoro è già stato svolto.

  • Name
    image_urls
    Type
    array of strings
    Description

    URL scaricabili per l'immagine pixel-art generata da questo task di prototipo. Attualmente l'API restituisce sempre esattamente un'immagine; il campo è un array in modo che revisioni future possano esporre più candidati senza una modifica non retrocompatibile. Vuoto finché il task non raggiunge SUCCEEDED.

    Questi sono URL firmati: recuperali senza un header Authorization. Rimangono validi fino a expires_at, che è 3 giorni dopo finished_at, e rileggere il task all'interno di quella finestra restituisce l'URL identico anziché uno appena firmato. Scarica e archivia tu stesso i file prima di allora — non c'è modo di aggiornare un link scaduto.

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=***"
  ]
}

L'oggetto Fidget Pixel Build Task

L'oggetto Fidget Pixel Build Task è un'unità di lavoro che Meshy tiene traccia per generare i pezzi stampabili da un task prototipo riuscito. La build campiona l'immagine pixel-art del prototipo sulla griglia richiesta e pubblica un singolo 3MF con tag colore.

Proprietà

  • Name
    id
    Type
    string
    Description

    Identificatore univoco per il task.

  • Name
    type
    Type
    string
    Description

    Tipo del task. Il valore è creative-lab-fidget-pixel-build.

  • Name
    name
    Type
    string
    Description

    Il nome del task fornito al momento della creazione del task. Stringa vuota se non è stato fornito alcun nome.

  • Name
    status
    Type
    string
    Description

    Stato del task. I valori possibili sono uno tra PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    Progresso del task. Se il task non è ancora iniziato, questa proprietà sarà 0. Una volta che il task ha avuto successo, diventerà 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Timestamp di quando il task è stato creato, in millisecondi.

  • Name
    started_at
    Type
    timestamp
    Description

    Timestamp di quando il task è stato avviato, in millisecondi. null finché il task non inizia.

  • Name
    finished_at
    Type
    timestamp
    Description

    Timestamp di quando il task è terminato, in millisecondi. null finché il task non termina.

  • Name
    expires_at
    Type
    timestamp
    Description

    Timestamp di quando il risultato del task scade, in millisecondi — 3 giorni dopo il termine del task. Gli account Enterprise conservano i risultati API a tempo indeterminato (vedi Asset Retention); per loro questo timestamp è impostato a circa 100 anni di distanza.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Il conteggio dei task precedenti. Significativo solo quando lo status è PENDING.

  • Name
    task_error
    Type
    object
    Description

    Dettagli dell'errore per i task falliti. Vedi Errori per il riferimento completo dell'oggetto task_error.

  • Name
    consumed_credits
    Type
    integer
    Description

    Il numero di crediti consumati da questo task. Un task che raggiunge SUCCEEDED viene addebitato dell'intero importo per la sua fase. Un task che non viene mai creato (un 4xx al momento della richiesta, incluso un rifiuto di moderation) non viene affatto addebitato. Un task che raggiunge FAILED restituisce 0 — l'addebito viene rimborsato. L'annullamento tramite DELETE rimborsa solo mentre il task è ancora PENDING; un task già IN_PROGRESS rimane addebitato, poiché il lavoro è già stato speso.

  • Name
    model_urls
    Type
    object
    Description

    URL scaricabili per l'artefatto generato, indicizzati per formato. Contiene esattamente una voce — il formato richiesto tramite output.format della richiesta di build. Vuoto finché il task non raggiunge SUCCEEDED.

    Questi sono URL firmati: recuperali senza un header Authorization. Rimangono validi fino a expires_at, che corrisponde a 3 giorni dopo finished_at, e rileggere il task all'interno di questa finestra temporale restituisce lo stesso URL identico piuttosto che uno appena firmato. Scarica e conserva tu stesso i file prima di allora — non c'è modo di rinnovare un link scaduto.

    • Name
      3mf
      Type
      string
      Description

      URL scaricabile per il file 3MF. Un oggetto per pezzo, ciascuno con tag del proprio colore della palette, in modo che uno slicer multi-filamento assegni i filamenti per colore. Presente quando output.format era 3mf (il valore predefinito).

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=***"
  }
}

End-to-End Example

Il flusso completo: creare un prototipo da una foto, eseguirne il polling fino a SUCCEEDED, creare una build a partire da esso, eseguire il polling della build fino a SUCCEEDED, quindi scaricare il 3MF da model_urls.

Un prototipo di solito termina entro pochi minuti; una build in genere si completa in ben meno di un minuto. In un'integrazione reale mostreresti la voce image_urls del prototipo all'utente finale e gli permetteresti di confermare (o rieseguire il prototipo) prima di spendere crediti per la build.

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"