Zet een bronfoto in twee fasen om in een multi-kleuren 3D-printbaar
pixel-art fidgetbord: prototype pixeliseert je foto tot een pixel-art
afbeelding, waarna build die afbeelding bemonstert op een 16×16- of
32×32-raster en elke pixel omzet in een in elkaar grijpend vierkant of
zeshoekig stukje, geleverd als één enkele 3MF waarvan de objecten hun
kleuren meedragen, zodat een multi-filament slicer elk stukje in de juiste
kleur print. De twee fasen zijn gekoppeld via input_task_id.
POST /openapi/creative-lab/fidget-pixel/v1/prototype
POST /openapi/creative-lab/fidget-pixel/v1/build
Beide POST-endpoints vereisen een betaald abonnement. Verzoeken van
accounts met een gratis plan worden geweigerd met 402 Payment Required.
Genereer een enkele pixel-art afbeelding op basis van de bronfoto. De geretourneerde task-ID is wat u als input_task_id doorgeeft aan de build-endpoint. Roep deze endpoint opnieuw aan voor een nieuwe poging als het resultaat niet is wat u wilt — elke aanroep wordt afzonderlijk gefactureerd. Raadpleeg
The Fidget Pixel Prototype Task Object
voor de vorm van de response.
Parameters
Name
image_url
Type
string
Verplicht
Description
Bronfoto die Meshy moet pixelizeren. We ondersteunen momenteel de formaten .jpg, .jpeg, .png en .webp.
Het formaat wordt gedetecteerd door de afbeeldingsgegevens te decoderen, niet aan de hand van de bestandsextensie van de URL — een URL zonder extensie, of een die doorverwijst, werkt zolang de bytes decoderen naar een ondersteund formaat. HTTP-redirects worden gevolgd.
Er zijn twee manieren om de afbeelding aan te leveren:
Openbaar toegankelijke URL: Een URL die vanaf het openbare internet toegankelijk is.
Data URI: Een base64-gecodeerde data-URI van de afbeelding. Voorbeeld van een data-URI: data:image/jpeg;base64,<uw base64-gecodeerde afbeeldingsgegevens>.
Name
type
Type
string
Verplicht
Description
Wat de foto toont. Bepaalt de pixelizatiestijl, kies dus bewust — de twee opties leveren zichtbaar verschillende resultaten op. Beschikbare waarden:
person — het onderwerp is een persoon (portret of volledig lichaam). Produceert een chibi-stijl pixel-sprite van het onderwerp.
other — al het overige: huisdieren, objecten, mascottes, logo's, landschappen. Produceert een bead-art stijl pixel-icoon van het onderwerp.
Name
name
Type
string
Description
Optionele tasknaam voor weergavedoeleinden. Maximaal 100 tekens.
Returns
De result-property van de response bevat de task-id van de nieuw aangemaakte fidget pixel prototype task. Poll de Get a Task endpoint of abonneer u op de stream totdat de task de status SUCCEEDED bereikt, en geef die ID vervolgens als input_task_id door aan de build-endpoint.
Foutmodi
Name
400 - Bad Request
Description
Het verzoek was onaanvaardbaar. Veelvoorkomende oorzaken:
Ontbrekende parameter: zowel image_url als type zijn verplicht.
Ongeldig type: type moet person of other zijn.
Ongeldig afbeeldingsformaat: de opgegeven image_url heeft geen ondersteund formaat (.jpg, .jpeg, .png, .webp).
Afbeeldingsafmetingen buiten bereik: de afbeelding is te klein, overschrijdt de maximale bestandsgrootte of overschrijdt het maximale aantal pixels.
Onbereikbare URL: de image_url kon niet worden gedownload (404 of timeout).
Ongeldige Data URI: de base64-string is onjuist opgemaakt.
Content gemarkeerd: de invoerafbeelding is gemarkeerd door NSFW-moderation.
Name
401 - Unauthorized
Description
Authenticatie mislukt. Controleer uw API-sleutel.
Name
402 - Payment Required
Description
Onvoldoende credits om deze task uit te voeren, of de API-sleutel behoort tot een account met een gratis abonnement.
Name
403 - Forbidden
Description
De invoerafbeelding is gemarkeerd door moderation op intellectueel eigendom (Content flagged for intellectual property violation). Alleen Enterprise-accounts met ingeschakelde filtering op intellectueel eigendom worden geblokkeerd; er wordt niets in rekening gebracht.
Name
429 - Too Many Requests
Description
U heeft uw rate limit overschreden.
Name
500 - Internal Server Error
Description
De controle op intellectueel eigendom zelf kon niet worden voltooid (Unable to perform intellectual property check, please try again). Enterprise-accounts met ingeschakelde filtering op intellectueel eigendom falen bij deze controle op een veilige manier (fail closed); er wordt niets in rekening gebracht — probeer het verzoek opnieuw.
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" }'
Genereer de 3D-printbare onderdelen uit een geslaagde prototype-task. De
build bemonstert de pixel-art-afbeelding van het prototype op het gevraagde
raster, kwantiseert deze tot maximaal color_count kleuren en genereert per
rastercel één in elkaar grijpend onderdeel. Het resultaat is een enkel 3MF-
bestand waarin elk onderdeel een apart object is, getagd met zijn kleur,
klaar voor een multi-filament slicer. Raadpleeg
Het Fidget Pixel Build Task-object
voor de vorm van de response.
Parameters
Name
input_task_id
Type
string
Verplicht
Description
De task-ID van een prototype-task die via ditzelfde OpenAPI-endpoint is aangemaakt. Het prototype moet zijn aangemaakt door hetzelfde Meshy-account en moet SUCCEEDED hebben bereikt.
Prototype-tasks die via de webapp zijn aangemaakt, worden niet geaccepteerd — het build-endpoint accepteert alleen prototype-tasks geproduceerd door POST /openapi/creative-lab/fidget-pixel/v1/prototype en weigert elke andere bron met 404.
Name
name
Type
string
Description
Optionele tasknaam voor weergavedoeleinden. Maximaal 100 tekens.
options
Optionele geometrie van de onderdelen. Elk veld heeft een standaardwaarde — stuur alleen de velden die je wilt overschrijven. Dit zijn dezelfde instellingen die de Creative Lab-webapp blootstelt; plughoogte, kapschaal en de overige fabricagevoorinstellingen worden afgeleid van shape en piece_size_mm en worden niet blootgesteld.
Name
shape
Type
string
standaard square
Description
Voetafdruk van elk onderdeel. Beschikbare waarden:
square (standaard) — vierkante onderdelen op een vierkant raster.
hex — zeshoekige onderdelen op een zeshoekig raster. Hexagonale onderdelen zijn alleen beschikbaar in 6 en 8 mm.
Name
grid_size
Type
integer
standaard 32
Description
Aantal onderdelen langs elke zijde van het bord. Beschikbare waarden: 16 of 32. Een raster van 32 behoudt meer detail; een raster van 16 betekent minder, grotere onderdelen voor hetzelfde onderwerp.
Name
piece_size_mm
Type
integer
standaard 8
Description
Randlengte van elk onderdeel, in millimeters. Beschikbare waarden: 6, 8 of 10. Samen met grid_size bepaalt dit de geprinte bordgrootte — bijvoorbeeld 32 × 8 mm ≈ 26 cm per zijde. 10 is niet beschikbaar voor shape: "hex" (het schuine hexagonale vlak veroorzaakt overhang op de meeste consumenten-FDM-printers).
Name
color_count
Type
integer
standaard 8
Description
Maximaal aantal kleuren in het palet waartoe de afbeelding wordt gekwantiseerd. Bereik: [1, 8]. Elke kleur wordt één filament in je slicer.
Name
piece_height_mm
Type
integer
standaard 15
Description
Hoogte van elk onderdeel, in millimeters. Bereik: [10, 80].
output
Optionele selector voor het uitvoerformaat. Standaard 3mf, wat momenteel de enige ondersteunde waarde is.
Name
format
Type
string
standaard 3mf
Description
Artefact geretourneerd door de build. Beschikbare waarden:
3mf (standaard) — retourneert een enkel model.3mf onder model_urls.3mf, met één object per onderdeel en de kleur van het onderdeel gekoppeld aan elk object.
Retourneert
De result-eigenschap van de response bevat de task-id van de nieuw aangemaakte fidget pixel build task. Poll het Get a Task-endpoint of abonneer je op de stream totdat de task SUCCEEDED bereikt, download vervolgens het artefact van model_urls.3mf.
Foutmodi
Name
400 - Bad Request
Description
Het verzoek was onaanvaardbaar. Veelvoorkomende oorzaken:
Ontbrekende parameter: input_task_id is verplicht.
Ongeldige UUID: De input_task_id is geen geldige UUID.
Bovenliggende task niet geslaagd: De verwezen prototype-task heeft SUCCEEDED nog niet bereikt.
Geen kandidaat: De prototype-task is geslaagd, maar heeft geen pixel-art-afbeelding opgeleverd; maak een nieuw prototype aan.
Opties buiten bereik: Een van de options-velden valt buiten de toegestane set of het toegestane bereik — bijvoorbeeld options.grid_size must be 16 or 32, of options.piece_size_mm=10 is not supported for shape=hex; hex pieces are available in 6 and 8 mm.
Niet-ondersteund formaat: output.format moet 3mf zijn.
Name
401 - Unauthorized
Description
Authenticatie is mislukt. Controleer je API-sleutel.
Name
402 - Payment Required
Description
Onvoldoende credits om deze task uit te voeren, of de API-sleutel behoort tot een account met een gratis abonnement.
Name
403 - Forbidden
Description
De afbeelding van het verwezen prototype is gemarkeerd door moderation op intellectueel eigendom. Alleen Enterprise-accounts met ingeschakelde filtering op intellectueel eigendom worden geblokkeerd; er wordt niets in rekening gebracht.
Name
404 - Not Found
Description
De verwezen prototype-task bestaat niet, behoort tot een andere gebruiker, of is aangemaakt via de webapp (alleen prototype-tasks in API-mode kunnen worden doorgeschakeld naar build).
Name
429 - Too Many Requests
Description
Je hebt je rate limit overschreden.
Name
500 - Internal Server Error
Description
Het oordeel over intellectueel eigendom van het verwezen prototype kon niet worden vastgesteld (Unable to perform intellectual property check, please try again). Enterprise-accounts met ingeschakelde filtering op intellectueel eigendom slaan bij deze controle standaard dicht (fail closed); er wordt niets in rekening gebracht — probeer het verzoek opnieuw.
Haal een prototype- of buildtaak op aan de hand van een geldige taak-id. Het URL-pad
moet overeenkomen met de fase van de taak — een buildtaak die wordt opgehaald via
/prototype/:id retourneert 404, en omgekeerd.
Unieke identifier voor de op te halen fidget pixel-taak.
Retourwaarden
De response bevat het fidget pixel-taakobject. De vorm hangt af van
welke fase werd opgevraagd.
Faalmodi
Name
400 - Bad Request
Description
id is geen geldige UUID (Invalid ID).
Name
403 - Forbidden
Description
De afbeelding van de taak werd gemarkeerd door moderation voor intellectueel eigendom. Alleen Enterprise-accounts met filtering op intellectueel eigendom ingeschakeld worden geblokkeerd.
Name
404 - Not Found
Description
De taak bestaat niet, behoort toe aan een andere gebruiker, of de fase komt niet overeen met het URL-pad.
Name
500 - Internal Server Error
Description
De controle op intellectueel eigendom kon niet worden voltooid (Unable to perform intellectual property check, please try again); Enterprise-accounts met filtering op intellectueel eigendom ingeschakeld falen gesloten. Probeer het verzoek opnieuw.
Annuleer een fidget pixel-taak. Als de taak nog PENDING is, worden de
credits die bij het aanmaken zijn verbruikt, terugbetaald. Taken die al
IN_PROGRESS zijn, worden geannuleerd zonder terugbetaling (de worker
verbruikt mogelijk al Bronnen). Taken die al een eindstatus hebben bereikt
(SUCCEEDED, FAILED, CANCELED) kunnen niet worden geannuleerd.
Het URL-pad moet overeenkomen met de fase van de taak — DELETE op
/prototype/:buildId retourneert 404.
Padparameters
Name
id
Type
path
Description
Unieke identificatie voor de fidget pixel-taak die geannuleerd moet worden.
Retourneert
Retourneert 204 No Content bij succes met een lege body.
Foutmodi
Name
400 - Bad Request
Description
Het verzoek was onaanvaardbaar. Veelvoorkomende oorzaken:
Ongeldige ID: id is geen geldige UUID.
Eindstatus: De taak is al SUCCEEDED, FAILED of CANCELED en kan niet worden geannuleerd.
Name
404 - Not Found
Description
De taak bestaat niet, behoort toe aan een andere gebruiker, of de fase komt niet overeen met het URL-pad.
Stream realtime updates voor een fidget pixel-taak via Server-Sent Events (SSE).
Het URL-pad moet overeenkomen met de fase van de taak — het openen van een stream op
/prototype/:buildId/stream levert een enkele event: error payload op met
status_code: 404 en sluit de stream; een onjuist gevormde id doet hetzelfde met
status_code: 400 (Invalid ID).
Parameters
Name
id
Type
path
Description
Unieke identifier voor de fidget pixel-taak die gestreamd moet worden.
Retourneert
Retourneert een stream van Fidget Pixel Prototype
of Fidget Pixel Build taakobjecten als
Server-Sent Events. Elk frame bevat het volledige taakobject voor die fase — dezelfde vorm die
de Get-endpoint retourneert — dus zolang de taak PENDING of IN_PROGRESS is, zijn de
outputvelden simpelweg nog niet ingevuld (null, [] of {}) en is
finished_at gelijk aan null.
Haal een gepagineerde lijst op van uw fidget pixel-taken voor één enkele fase.
Het URL-pad bepaalt de fase — /prototype retourneert prototype-taken;
/build retourneert build-taken. Taken uit de andere fase worden in geen van
beide antwoorden opgenomen.
Padparameters
Name
stage
Type
path
Verplicht
Description
Ofwel prototype of build. De collectie retourneert alleen taken
waarvan de fase overeenkomt met de URL — het ophalen van /prototype
retourneert nooit build-taken en vice versa.
Queryparameters
Name
page_num
Type
integer
standaard 1
Description
Paginanummer voor paginering.
Name
page_size
Type
integer
standaard 10
Description
Maximum aantal items per pagina. Maximaal toegestaan is 100 items.
Name
sort_by
Type
string
standaard -created_at
Description
Veld om op te sorteren. Beschikbare waarden:
+created_at: Sorteren op aanmaaktijd in oplopende volgorde.
-created_at: Sorteren op aanmaaktijd in aflopende volgorde.
Het Fidget Pixel Prototype Task-object is een werkeenheid die Meshy bijhoudt
om een bronfoto om te zetten in een pixel-art-afbeelding. De output van
deze fase wordt via input_task_id gekoppeld aan
de build-fase.
Eigenschappen
Name
id
Type
string
Description
Unieke identifier voor de taak. Hoewel we een k-sorteerbare UUID gebruiken voor taak-id's als implementatiedetail, mag je geen aannames doen over de opmaak van de id.
Name
type
Type
string
Description
Type van de taak. De waarde is creative-lab-fidget-pixel-prototype.
Name
name
Type
string
Description
De taaknaam die is opgegeven bij het aanmaken van de taak. Lege tekenreeks als er geen naam is opgegeven.
Name
status
Type
string
Description
Status van de taak. Mogelijke waarden zijn PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.
Name
progress
Type
integer
Description
Voortgang van de taak. Als de taak nog niet is gestart, is deze eigenschap 0. Zodra de taak is geslaagd, wordt dit 100.
Name
created_at
Type
timestamp
Description
Tijdstempel van wanneer de taak is aangemaakt, in milliseconden.
Een tijdstempel geeft het aantal milliseconden weer sinds 1 januari 1970 UTC, volgens
de RFC 3339-standaard.
Zo wordt vrijdag 1 september 2023 12:00:00 PM GMT weergegeven als 1693569600000. Dit geldt
voor alle tijdstempels in Meshy API.
Name
started_at
Type
timestamp
Description
Tijdstempel van wanneer de taak is gestart, in milliseconden. Als de taak nog niet is gestart, is deze eigenschap null.
Name
finished_at
Type
timestamp
Description
Tijdstempel van wanneer de taak is voltooid, in milliseconden. Als de taak nog niet is voltooid, is deze eigenschap null.
Name
expires_at
Type
timestamp
Description
Tijdstempel van wanneer het taakresultaat verloopt, in milliseconden — 3 dagen nadat de taak is voltooid. Enterprise-accounts bewaren API-resultaten voor onbepaalde tijd (zie Asset-retentie); voor hen wordt deze tijdstempel ongeveer 100 jaar vooruit ingesteld.
Name
preceding_tasks
Type
integer
Description
Het aantal voorafgaande taken.
De waarde van dit veld is alleen relevant als de taakstatus PENDING is.
Name
task_error
Type
object
Description
Foutdetails voor mislukte taken. Zie Fouten voor de volledige referentie van het task_error-object.
Name
consumed_credits
Type
integer
Description
Het aantal credits dat door deze taak is verbruikt. Een taak die de status SUCCEEDED bereikt, wordt het volledige bedrag voor die fase in rekening gebracht. Een taak die nooit wordt aangemaakt (een 4xx bij het verzoek, inclusief een moderation-afwijzing) wordt helemaal niet in rekening gebracht. Een taak die FAILED bereikt, geeft 0 terug — het bedrag wordt terugbetaald. Annuleren via DELETE betaalt alleen terug zolang de taak nog PENDING is; een taak die al IN_PROGRESS is, blijft in rekening gebracht, omdat het werk al is uitgevoerd.
Name
image_urls
Type
array of strings
Description
Downloadbare URL's voor de pixel-art-afbeelding die door deze prototypetaak is gegenereerd. Momenteel geeft de API altijd precies één afbeelding terug; het veld is een array zodat toekomstige revisies meerdere kandidaten kunnen tonen zonder een breaking change. Leeg totdat de taak de status SUCCEEDED bereikt.
Dit zijn ondertekende URL's: haal ze op zonder een Authorization-header. Ze blijven geldig tot expires_at, dat 3 dagen na finished_at valt, en het opnieuw uitlezen van de taak binnen dat venster geeft dezelfde URL terug in plaats van een nieuw ondertekende. Download en bewaar de bestanden zelf vóór die tijd — er is geen manier om een verlopen link te vernieuwen.
Het Fidget Pixel Build Task-object is een werkeenheid die Meshy bijhoudt om
de printbare onderdelen te genereren op basis van een geslaagde prototype-task. De build
sampelt de pixel-art-afbeelding van het prototype op het gevraagde raster en publiceert
één kleurgetagd 3MF-bestand.
Eigenschappen
Name
id
Type
string
Description
Unieke identifier voor de task.
Name
type
Type
string
Description
Type van de task. De waarde is creative-lab-fidget-pixel-build.
Name
name
Type
string
Description
De taaknaam die is opgegeven bij het aanmaken van de task. Lege string als er geen naam is opgegeven.
Name
status
Type
string
Description
Status van de task. Mogelijke waarden zijn PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.
Name
progress
Type
integer
Description
Progress van de task. Als de task nog niet is gestart, is deze eigenschap 0. Zodra de task is geslaagd, wordt dit 100.
Name
created_at
Type
timestamp
Description
Tijdstempel van wanneer de task is aangemaakt, in milliseconden.
Name
started_at
Type
timestamp
Description
Tijdstempel van wanneer de task is gestart, in milliseconden. null totdat de task start.
Name
finished_at
Type
timestamp
Description
Tijdstempel van wanneer de task is voltooid, in milliseconden. null totdat de task voltooid is.
Name
expires_at
Type
timestamp
Description
Tijdstempel van wanneer het taakresultaat verloopt, in milliseconden — 3 dagen nadat de task is voltooid. Enterprise-accounts bewaren API-resultaten onbeperkt (zie Asset-retentie); voor hen wordt deze tijdstempel ongeveer 100 jaar vooruit ingesteld.
Name
preceding_tasks
Type
integer
Description
Het aantal voorafgaande tasks. Alleen relevant wanneer de status PENDING is.
Name
task_error
Type
object
Description
Foutdetails voor mislukte tasks. Zie Fouten voor de volledige referentie van het task_error-object.
Name
consumed_credits
Type
integer
Description
Het aantal credits dat door deze task is verbruikt. Een task die SUCCEEDED bereikt, wordt het volledige bedrag voor die fase in rekening gebracht. Een task die nooit wordt aangemaakt (een 4xx bij het verzoek, inclusief een moderation-afwijzing) wordt helemaal niet in rekening gebracht. Een task die FAILED bereikt, geeft 0 terug — het bedrag wordt terugbetaald. Annuleren via DELETE betaalt alleen terug zolang de task nog PENDING is; een task die al IN_PROGRESS is, blijft in rekening gebracht, omdat het werk al is verricht.
Name
model_urls
Type
object
Description
Downloadbare URL's voor het gegenereerde asset, gesleuteld op formaat. Bevat precies één item — het formaat dat is opgegeven via output.format van het build-verzoek. Leeg totdat de task SUCCEEDED bereikt.
Dit zijn ondertekende URL's: haal ze op zonder een Authorization-header. Ze blijven geldig tot expires_at, wat 3 dagen na finished_at is, en het opnieuw uitlezen van de task binnen dat venster geeft dezelfde URL terug in plaats van een nieuw ondertekende. Download en bewaar de bestanden zelf vóór die tijd — er is geen manier om een verlopen link te vernieuwen.
Name
3mf
Type
string
Description
Downloadbare URL naar het 3MF-bestand. Eén object per onderdeel, elk getagd met zijn paletkleur, zodat een multi-filament slicer per kleur filamenten toewijst. Aanwezig wanneer output.format3mf was (de standaardwaarde).
De volledige flow: een prototype maken van een foto, dit pollen tot
SUCCEEDED, er een build van maken, de build pollen tot SUCCEEDED, en
vervolgens de 3MF downloaden via model_urls.
Een prototype is meestal binnen enkele minuten klaar; een build wordt
doorgaans in ruim onder een minuut voltooid. In een echte integratie zou
je het image_urls-item van het prototype aan de eindgebruiker tonen en
deze laten bevestigen (of het prototype opnieuw laten uitvoeren) voordat
credits worden besteed aan de 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"