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
Entrambi gli endpoint POST richiedono un piano di abbonamento a pagamento. Le richieste
provenienti da account con piano gratuito vengono rifiutate con 402 Payment Required.
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 photocurlhttps://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype \-XPOST \-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" }'
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.
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.
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.
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.
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 payloadevent: 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.
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.
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.
Un timestamp rappresenta il numero di millisecondi trascorsi dal 1° gennaio 1970 UTC, seguendo
lo standard RFC 3339.
Ad esempio, venerdì 1 settembre 2023 12:00:00 PM GMT è rappresentato come 1693569600000. Questo si applica
a tutti i timestamp in Meshy API.
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.
Il valore di questo campo è significativo solo se lo stato del task è PENDING.
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.
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).
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 bashset-euopipefail# 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:-}" ]]; thenecho"export IMAGE_PATH (local file) or IMAGE_URL (public url) first">&2exit1fiPIXEL_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 bodyshift2 out=$(curl--silent--show-error--max-time60--write-out$'\n%{http_code}' \-X"$method""$url"-H"$AUTH""$@") ||return1 http_code=${out##*$'\n'} body=${out%$'\n'*}if ((http_code >=400)); thenecho"HTTP $http_code for $url: $body">&2return1fiprintf'%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:; doif (($(date +%s) >= deadline)); thenecho"gave up waiting for $kind $id">&2return1fi task_status=$(apiGET"$BASE/$kind/$id"|jq-r'.status')echo"$kind: $task_status"case"$task_status"inSUCCEEDED)return0 ;;FAILED|CANCELED)return1 ;;esacsleep"$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"'EXITif [[ -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')"inpng) 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"elsejq-n--argt"$PIXEL_TYPE"--argu"$IMAGE_URL" \'{type: $t, image_url: $u}'>"$BODY"fi# 1. Create the prototype taskPROTO_ID=$(apiPOST"$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)pollprototype"$PROTO_ID"# 3. Create the build task (defaults: square pieces, 32x32 grid, 8 mm, 8 colors, 15 mm tall)jq-n--argp"$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=$(apiPOST"$BASE/build" \-H'Content-Type: application/json'--data-binary@"$BODY"|jq-r'.result')# 4. Wait for the piecespollbuild"$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=$(apiGET"$BASE/build/$BUILD_ID")curl--silent--show-error--fail--max-time900 \-ofidget-pixel.3mf"$(jq-r '.model_urls["3mf"]' <<<"$TASK")"echo"Done: fidget-pixel.3mf"