Omvandla ett källfoto till en flerfärgad 3D-utskrivbar pixelkonst-fidgetbräda i
två steg: prototype pixeliserar ditt foto till en pixelkonstbild, och sedan
build samplar den bilden på ett 16×16- eller 32×32-rutnät och omvandlar varje
pixel till en hopfogande fyrkantig eller hexagonal bit, levererad som en enda 3MF-fil
vars objekt bär sina färger så att en flerfilaments-slicer skriver ut varje bit
i rätt färg. De två stegen länkas via input_task_id.
POST /openapi/creative-lab/fidget-pixel/v1/prototype
POST /openapi/creative-lab/fidget-pixel/v1/build
Båda POST-endpointerna kräver en betald prenumerationsplan. Förfrågningar
från konton med gratisplan avvisas med 402 Payment Required.
Genererar en enda pixelkonstbild från källfotot. Det returnerade task-ID:t är det du skickar som input_task_id till build-endpointen. Anropa
denna endpoint igen för ett nytt försök om resultatet inte blir vad du vill ha — varje
anrop faktureras separat. Se
The Fidget Pixel Prototype Task Object
för svarets struktur.
Parametrar
Name
image_url
Type
string
Obligatorisk
Description
Källfoto som Meshy ska pixelisera. Vi stöder för närvarande formaten .jpg, .jpeg, .png och .webp.
Formatet identifieras genom att avkoda bilddatan, inte utifrån URL:ens filändelse — en URL utan filändelse, eller en som omdirigerar, fungerar så länge byten avkodas till ett format som stöds. HTTP-omdirigeringar följs.
Det finns två sätt att ange bilden:
Offentligt tillgänglig URL: En URL som är tillgänglig från det öppna internet.
Data URI: En base64-kodad data-URI av bilden. Exempel på en data-URI: data:image/jpeg;base64,<din base64-kodade bilddata>.
Name
type
Type
string
Obligatorisk
Description
Vad fotot visar. Väljer pixeliseringsstilen, så välj medvetet — de två ger märkbart olika resultat. Tillgängliga värden:
person — motivet är en person (porträtt eller helkropp). Genererar en chibi-stiliserad pixelsprite av motivet.
other — allt annat: husdjur, föremål, maskotar, logotyper, landskap. Genererar en pärlplatte-stiliserad pixelikon av motivet.
Name
name
Type
string
Description
Valfritt tasknamn för visningsändamål. Maximalt 100 tecken.
Returvärden
Svarets egenskap result innehåller task-id för den nyskapade fidget pixel-prototyptasken. Fråga Get a Task-endpointen eller prenumerera på stream tills tasken når SUCCEEDED, och skicka sedan det ID:t till build-endpointen som input_task_id.
Felfall
Name
400 - Bad Request
Description
Begäran kunde inte accepteras. Vanliga orsaker:
Saknad parameter: Både image_url och type krävs.
Ogiltig type: type måste vara person eller other.
Ogiltigt bildformat: Den angivna image_url har inte ett format som stöds (.jpg, .jpeg, .png, .webp).
Bildmått utanför tillåtet intervall: Bilden är för liten, överskrider den maximala filstorleken eller överskrider det maximala antalet pixlar.
Onåbar URL: image_url kunde inte hämtas (404 eller timeout).
Ogiltig Data URI: Base64-strängen är felaktigt formaterad.
Innehåll flaggat: Den angivna bilden flaggades av NSFW-moderation.
Name
401 - Unauthorized
Description
Autentiseringen misslyckades. Kontrollera din API-nyckel.
Name
402 - Payment Required
Description
Otillräckligt med credits för att utföra denna task, eller så tillhör API-nyckeln ett konto med gratisplan.
Name
403 - Forbidden
Description
Den angivna bilden flaggades av moderation för immaterialrätt (Content flagged for intellectual property violation). Endast Enterprise-konton med immaterialrättsfiltrering aktiverad blockeras; ingenting debiteras.
Name
429 - Too Many Requests
Description
Du har överskridit din hastighetsgräns.
Name
500 - Internal Server Error
Description
Själva immaterialrättskontrollen kunde inte slutföras (Unable to perform intellectual property check, please try again). Enterprise-konton med immaterialrättsfiltrering aktiverad misslyckas restriktivt vid denna kontroll; ingenting debiteras — försök igen.
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" }'
Genererar de 3D-utskrivbara delarna från en lyckad prototyptask. Byggprocessen samplar prototypens pixelbaserade bild till det begärda rutnätet, kvantiserar den till högst color_count färger och genererar en sammanflätande del per rutnätscell. Leveransen är en enda 3MF-fil där varje del är ett separat objekt taggat med sin färg, redo för en slicer med flera filament. Se
The Fidget Pixel Build Task Object
för svarets format.
Parametrar
Name
input_task_id
Type
string
Obligatorisk
Description
Task-ID för en prototyptask skapad via samma OpenAPI-endpoint. Prototypen måste ha skapats av samma Meshy-konto och måste ha nått SUCCEEDED.
Prototyptasks som skapats via webbappen accepteras inte — byggendpointen accepterar endast prototyptasks som producerats av POST /openapi/creative-lab/fidget-pixel/v1/prototype och avvisar alla andra källor med 404.
Name
name
Type
string
Description
Valfritt tasknamn för visningsändamål. Maximalt 100 tecken.
options
Valfri geometri för delarna. Varje fält har ett standardvärde — skicka endast de du vill åsidosätta. Detta är samma kontroller som Creative Lab-webbappen exponerar; pluggens höjd, kapselns skala och de andra tillverkningsförinställningarna härleds från shape och piece_size_mm och exponeras inte.
Name
shape
Type
string
standard square
Description
Fotavtryck för varje del. Tillgängliga värden:
square (standard) — kvadratiska delar på ett kvadratiskt rutnät.
hex — hexagonala delar på ett hexagonalt rutnät. Hexagonala delar finns endast i 6 och 8 mm.
Name
grid_size
Type
integer
standard 32
Description
Antal delar längs varje sida av brädan. Tillgängliga värden: 16 eller 32. Ett 32-rutnät bevarar mer detalj; ett 16-rutnät innebär färre, större delar för samma motiv.
Name
piece_size_mm
Type
integer
standard 8
Description
Kantlängd för varje del, i millimeter. Tillgängliga värden: 6, 8 eller 10. Tillsammans med grid_size bestämmer detta den utskrivna brädans storlek — till exempel 32 × 8 mm ≈ 26 cm per sida. 10 är inte tillgängligt för shape: "hex" (den sluttande hexagonala ytan skapar överhäng på de flesta konsument-FDM-skrivare).
Name
color_count
Type
integer
standard 8
Description
Maximalt antal färger i paletten som bilden kvantiseras till. Intervall: [1, 8]. Varje färg blir ett filament i din slicer.
Name
piece_height_mm
Type
integer
standard 15
Description
Höjd för varje del, i millimeter. Intervall: [10, 80].
output
Valfri väljare för överföringsformat. Standardvärdet är 3mf, vilket för närvarande är det enda värdet som stöds.
Name
format
Type
string
standard 3mf
Description
Artefakt som returneras av byggprocessen. Tillgängliga värden:
3mf (standard) — returnerar en enda model.3mf under model_urls.3mf, med ett objekt per del och delens färg kopplad till varje objekt.
Returer
Svarets result-egenskap innehåller task-id för den nyligen skapade fidget pixel-byggtasken. Fråga Get a Task-endpointen eller prenumerera på strömmen tills tasken når SUCCEEDED, och ladda sedan ner artefakten från model_urls.3mf.
Felscenarier
Name
400 - Bad Request
Description
Begäran var inte godtagbar. Vanliga orsaker:
Saknad parameter: input_task_id krävs.
Ogiltig UUID: input_task_id är inte en giltig UUID.
Överordnad task ej lyckad: Den refererade prototyptasken har inte nått SUCCEEDED ännu.
Ingen kandidat: Prototyptasken lyckades men producerade ingen pixelbaserad bild; skapa en ny prototyp.
Alternativ utanför intervall: Ett av fälten i options är utanför sin tillåtna uppsättning eller intervall — till exempel options.grid_size must be 16 or 32, eller options.piece_size_mm=10 is not supported for shape=hex; hex pieces are available in 6 and 8 mm.
Format som inte stöds: output.format måste vara 3mf.
Name
401 - Unauthorized
Description
Autentiseringen misslyckades. Kontrollera din API-nyckel.
Name
402 - Payment Required
Description
Otillräckliga credits för att utföra denna task, eller så tillhör API-nyckeln ett konto med gratisplan.
Name
403 - Forbidden
Description
Den refererade prototypens bild flaggades av moderation för immateriella rättigheter. Endast Enterprise-konton med filtrering av immateriella rättigheter aktiverad blockeras; inget debiteras.
Name
404 - Not Found
Description
Den refererade prototyptasken finns inte, tillhör en annan användare eller skapades via webbappen (endast prototyptasks i API-mode kedjas vidare till bygge).
Name
429 - Too Many Requests
Description
Du har överskridit din hastighetsgräns.
Name
500 - Internal Server Error
Description
Den refererade prototypens utslag för immateriella rättigheter kunde inte fastställas (Unable to perform intellectual property check, please try again). Enterprise-konton med filtrering av immateriella rättigheter aktiverad misslyckas i stängt läge vid denna kontroll; inget debiteras — försök igen med begäran.
Hämta en prototyp- eller bygguppgift med hjälp av ett giltigt uppgifts-id. URL-sökvägen
måste matcha uppgiftens fas — en byggnadsuppgift som hämtas via
/prototype/:id returnerar 404, och vice versa.
Unik identifierare för den fidget pixel-uppgift som ska hämtas.
Returer
Svaret innehåller objektet för fidget pixel-uppgiften. Formen beror på
vilken fas som begärdes.
Felscenarier
Name
400 - Bad Request
Description
id är inte ett giltigt UUID (Invalid ID).
Name
403 - Forbidden
Description
Uppgiftens bild flaggades av moderation för immateriella rättigheter. Endast Enterprise-konton med filtrering av immateriella rättigheter aktiverad blockeras.
Name
404 - Not Found
Description
Uppgiften finns inte, tillhör en annan användare, eller dess fas matchar inte URL-sökvägen.
Name
500 - Internal Server Error
Description
Kontrollen av immateriella rättigheter kunde inte slutföras (Unable to perform intellectual property check, please try again); Enterprise-konton med filtrering av immateriella rättigheter aktiverad misslyckas i låst läge (fail closed). Försök igen med begäran.
Avbryt en fidget pixel-uppgift. Om uppgiften fortfarande är PENDING
återbetalas de credits som förbrukades vid skapandet. Uppgifter som redan
är IN_PROGRESS avbryts utan återbetalning (arbetaren kan redan hålla på
att förbruka resurser). Uppgifter som redan har nått ett slutgiltigt
tillstånd (SUCCEEDED, FAILED, CANCELED) kan inte avbrytas.
URL-sökvägen måste matcha uppgiftens steg — DELETE på
/prototype/:buildId returnerar 404.
Sökvägsparametrar
Name
id
Type
path
Description
Unik identifierare för fidget pixel-uppgiften som ska avbrytas.
Returnerar
Returnerar 204 No Content vid lyckad förfrågan med en tom brödtext.
Felscenarier
Name
400 - Bad Request
Description
Förfrågan kunde inte accepteras. Vanliga orsaker:
Ogiltigt ID: id är inte ett giltigt UUID.
Slutgiltigt tillstånd: Uppgiften är redan SUCCEEDED, FAILED eller CANCELED och kan inte avbrytas.
Name
404 - Not Found
Description
Uppgiften finns inte, tillhör en annan användare, eller dess steg matchar inte URL-sökvägen.
Streama uppdateringar i realtid för en fidget pixel-uppgift via Server-Sent Events (SSE).
URL-sökvägen måste matcha uppgiftens steg — om en ström öppnas på
/prototype/:buildId/stream skickas en enda event: error-payload med
status_code: 404 och strömmen stängs; ett felaktigt id gör detsamma med
status_code: 400 (Invalid ID).
Parametrar
Name
id
Type
path
Description
Unik identifierare för den fidget pixel-uppgift som ska strömmas.
Returer
Returnerar en ström av Fidget Pixel Prototype-
eller Fidget Pixel Build-uppgiftsobjekt som
Server-Sent Events. Varje bildruta innehåller hela uppgiftsobjektet för steget — samma form
som Get-endpointen returnerar — så medan uppgiften är PENDING eller IN_PROGRESS är
utdatafälten helt enkelt inte ifyllda ännu (null, [] eller {}) och
finished_at är null.
Hämta en paginerad lista över dina fidget pixel-uppgifter för ett enskilt steg.
URL-sökvägen väljer steget — /prototype returnerar prototyp-uppgifter;
/build returnerar byggnadsuppgifter. Uppgifter från det andra steget ingår inte
i något av svaren.
Sökvägsparametrar
Name
stage
Type
path
Obligatorisk
Description
Antingen prototype eller build. Samlingen returnerar endast uppgifter
vars steg matchar URL:en — att hämta /prototype returnerar aldrig
byggnadsuppgifter och vice versa.
Frågeparametrar
Name
page_num
Type
integer
standard 1
Description
Sidnummer för paginering.
Name
page_size
Type
integer
standard 10
Description
Gräns för sidstorlek. Maximalt tillåtet är 100 objekt.
Name
sort_by
Type
string
standard -created_at
Description
Fält att sortera efter. Tillgängliga värden:
+created_at: Sortera efter skapandetid i stigande ordning.
-created_at: Sortera efter skapandetid i fallande ordning.
Fidget Pixel Prototype-uppgiftsobjektet är en arbetsenhet som Meshy håller reda på
för att pixelisera ett källfoto till en pixelkonstbild. Resultatet av detta
steg kedjas vidare till byggsteget
via input_task_id.
Egenskaper
Name
id
Type
string
Description
Unik identifierare för uppgiften. Även om vi använder ett k-sorterbart UUID för uppgifts-id som implementationsdetalj bör du inte göra några antaganden om id:ts format.
Name
type
Type
string
Description
Uppgiftens typ. Värdet är creative-lab-fidget-pixel-prototype.
Name
name
Type
string
Description
Uppgiftsnamnet som angavs när uppgiften skapades. Tom sträng om inget namn angavs.
Name
status
Type
string
Description
Uppgiftens status. Möjliga värden är ett av PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.
Name
progress
Type
integer
Description
Uppgiftens progress. Om uppgiften inte har startat ännu kommer denna egenskap att vara 0. När uppgiften har lyckats blir den 100.
Name
created_at
Type
timestamp
Description
Tidsstämpel för när uppgiften skapades, i millisekunder.
En tidsstämpel representerar antalet millisekunder som har förflutit sedan 1 januari 1970 UTC, enligt
standarden RFC 3339.
Till exempel representeras fredagen den 1 september 2023 12:00:00 PM GMT som 1693569600000. Detta gäller
för alla tidsstämplar i Meshy API.
Name
started_at
Type
timestamp
Description
Tidsstämpel för när uppgiften startades, i millisekunder. Om uppgiften inte har startat ännu kommer denna egenskap att vara null.
Name
finished_at
Type
timestamp
Description
Tidsstämpel för när uppgiften avslutades, i millisekunder. Om uppgiften inte är avslutad ännu kommer denna egenskap att vara null.
Name
expires_at
Type
timestamp
Description
Tidsstämpel för när uppgiftens resultat upphör att gälla, i millisekunder — 3 dagar efter att uppgiften avslutades. Enterprise-konton behåller API-resultat på obestämd tid (se Tillgångslagring); för dem sätts denna tidsstämpel till omkring 100 år framåt.
Name
preceding_tasks
Type
integer
Description
Antalet föregående uppgifter.
Värdet i detta fält är endast meningsfullt om uppgiftens status är PENDING.
Name
task_error
Type
object
Description
Felinformation för misslyckade uppgifter. Se Fel för den fullständiga referensen för task_error-objektet.
Name
consumed_credits
Type
integer
Description
Antalet credits som förbrukats av denna uppgift. En uppgift som når SUCCEEDED debiteras hela beloppet för sitt steg. En uppgift som aldrig skapas (ett 4xx-fel vid förfrågningstillfället, inklusive en avvisning av moderation) debiteras inte alls. En uppgift som når FAILED returnerar 0 — avgiften återbetalas. Avbrytning via DELETE återbetalas endast medan uppgiften fortfarande är PENDING; en uppgift som redan är IN_PROGRESS förblir debiterad, eftersom arbetet redan har utförts.
Name
image_urls
Type
array of strings
Description
Nedladdningsbara URL:er för pixelkonstbilden som genererats av denna prototypuppgift. Just nu returnerar API:et alltid exakt en bild; fältet är en array så att framtida revisioner kan visa flera kandidater utan en brytande ändring. Tomt tills uppgiften når SUCCEEDED.
Dessa är signerade URL:er: hämta dem utan en Authorization-header. De förblir giltiga fram till expires_at, vilket är 3 dagar efter finished_at, och att läsa uppgiften igen inom detta tidsfönster returnerar samma URL istället för en nysignerad. Ladda ner och spara filerna själv innan dess — det finns inget sätt att förnya en utgången länk.
Fidget Pixel Build Task-objektet är en arbetsenhet som Meshy håller reda på för
att generera de utskrivbara delarna från ett lyckat prototyptask. Byggprocessen
samplar prototypens pixel-art-bild till det begärda rutnätet och publicerar
en enda färgmärkt 3MF-fil.
Egenskaper
Name
id
Type
string
Description
Unik identifierare för tasket.
Name
type
Type
string
Description
Typ av task. Värdet är creative-lab-fidget-pixel-build.
Name
name
Type
string
Description
Tasknamnet som angavs när tasket skapades. Tom sträng om inget namn angavs.
Name
status
Type
string
Description
Status för tasket. Möjliga värden är en av PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.
Name
progress
Type
integer
Description
Progress för tasket. Om tasket inte har startats ännu är denna egenskap 0. När tasket har lyckats blir den 100.
Name
created_at
Type
timestamp
Description
Tidsstämpel för när tasket skapades, i millisekunder.
Name
started_at
Type
timestamp
Description
Tidsstämpel för när tasket startades, i millisekunder. null tills tasket startar.
Name
finished_at
Type
timestamp
Description
Tidsstämpel för när tasket avslutades, i millisekunder. null tills tasket avslutas.
Name
expires_at
Type
timestamp
Description
Tidsstämpel för när taskresultatet upphör att gälla, i millisekunder — 3 dagar efter att tasket avslutades. Enterprise-konton behåller API-resultat på obestämd tid (se tillgångslagring); för dem är denna tidsstämpel satt cirka 100 år framåt.
Name
preceding_tasks
Type
integer
Description
Antalet föregående tasks. Meningsfull endast när status är PENDING.
Name
task_error
Type
object
Description
Felinformation för misslyckade tasks. Se Fel för den fullständiga referensen för task_error-objektet.
Name
consumed_credits
Type
integer
Description
Antalet credits som förbrukats av detta task. Ett task som når SUCCEEDED debiteras hela beloppet för sitt steg. Ett task som aldrig skapas (ett 4xx-fel vid begäranstillfället, inklusive en moderation-avvisning) debiteras inte alls. Ett task som når FAILED returnerar 0 — avgiften återbetalas. Avbrytande via DELETE återbetalar endast medan tasket fortfarande är PENDING; ett task som redan är IN_PROGRESS förblir debiterat, eftersom arbetet redan har utförts.
Name
model_urls
Type
object
Description
Nedladdningsbara URL:er för den genererade tillgången, sorterade efter format. Innehåller exakt en post — formatet som begärdes via build-begärans output.format. Tom tills tasket når SUCCEEDED.
Dessa är signerade URL:er: hämta dem utan en Authorization-header. De förblir giltiga fram till expires_at, vilket är 3 dagar efter finished_at, och att läsa tasket igen inom detta fönster returnerar samma URL istället för en nysignerad. Ladda ner och spara filerna själv innan dess — det finns inget sätt att uppdatera en utgången länk.
Name
3mf
Type
string
Description
Nedladdningsbar URL till 3MF-filen. Ett objekt per del, var och en märkt med sin palettfärg, så en flerfilament-slicer tilldelar filament per färg. Finns när output.format var 3mf (standardvärdet).
Det fullständiga flödet: skapa en prototyp från ett foto, pollar den tills den blir
SUCCEEDED, skapa en build från den, pollar builden tills den blir SUCCEEDED, och
ladda sedan ner 3MF-filen från model_urls.
En prototyp blir vanligtvis klar inom några minuter; en build slutförs
vanligtvis på klart mindre än en minut. I en verklig integration skulle du visa
prototypens image_urls-post för slutanvändaren och låta dem bekräfta
(eller köra om prototypen) innan du spenderar credits på builden.
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"