Gawing multi-color na 3D-printable pixel-art fidget board ang isang source photo
sa dalawang yugto: ang prototype ay nagko-convert ng iyong larawan tuloy pixel-art
na imahe, pagkatapos ang build ay nagsa-sample ng imaheng iyon papunta sa isang 16×16 o 32×32 na grid at ginagawang
interlocking square o hexagonal piece ang bawat pixel, na inihahatid bilang iisang 3MF
kung saan taglay ng mga object nito ang kani-kanilang kulay para ang isang multi-filament slicer ay mag-print ng bawat piraso
sa tamang kulay. Ang dalawang yugtong ito ay naka-link sa pamamagitan ng input_task_id.
POST /openapi/creative-lab/fidget-pixel/v1/prototype
POST /openapi/creative-lab/fidget-pixel/v1/build
Ang parehong POST endpoints ay nangangailangan ng bayad na subscription plan. Ang mga
request mula sa mga account na nasa free-plan ay tatanggihan na may 402 Payment Required.
Gumawa ng iisang pixel-art na imahe mula sa pinagmulang larawan. Ang ibinalik na task ID ang siyang ipapasa mo bilang input_task_id sa build endpoint. Tawagin muli ang endpoint na ito para sa isa pang pagsubok kung hindi ito ang resulta na gusto mo — bawat tawag ay sinisingil nang hiwalay. Sumangguni sa
The Fidget Pixel Prototype Task Object
para sa hugis ng response.
Mga Parameter
Name
image_url
Type
string
Kinakailangan
Description
Pinagmulang larawan na i-pixelize ni Meshy. Kasalukuyan naming sinusuportahan ang mga format na .jpg, .jpeg, .png, at .webp.
Ang format ay natutukoy sa pamamagitan ng pag-decode sa data ng imahe, hindi mula sa file extension ng URL — isang URL na walang extension, o isa na nagre-redirect, ay gagana hangga't ang mga byte ay nade-decode sa isang suportadong format. Sinusunod ang mga HTTP redirect.
May dalawang paraan para maibigay ang imahe:
Publicly accessible URL: Isang URL na maaaring ma-access mula sa pampublikong internet.
Data URI: Isang base64-encoded na data URI ng imahe. Halimbawa ng data URI: data:image/jpeg;base64,<your base64-encoded image data>.
Name
type
Type
string
Kinakailangan
Description
Kung ano ang ipinapakita ng larawan. Pinipili nito ang istilo ng pixelization, kaya piliin ito nang maingat — ang dalawa ay gumagawa ng kapansin-pansing magkaibang resulta. Mga available na value:
person — ang subject ay isang tao (portrait o buong katawan). Gumagawa ng chibi-style na pixel sprite ng subject.
other — anumang iba pa: mga alagang hayop, bagay, mascot, logo, tanawin. Gumagawa ng bead-art style na pixel icon ng subject.
Name
name
Type
string
Description
Opsyonal na pangalan ng task para sa layuning ipakita. Maximum na 100 character.
Mga Ibinabalik
Ang result property ng response ay naglalaman ng task id ng bagong ginawang fidget pixel prototype task. I-poll ang Get a Task endpoint o mag-subscribe sa stream hanggang maabot ng task ang SUCCEEDED, pagkatapos ay ipasa ang ID na iyon sa build endpoint bilang input_task_id.
Mga Paraan ng Pagkabigo
Name
400 - Bad Request
Description
Hindi katanggap-tanggap ang request. Karaniwang sanhi:
Nawawalang parameter: Kapwa kinakailangan ang image_url at type.
Di-wastong type: Ang type ay dapat na person o other.
Di-wastong format ng imahe: Ang ibinigay na image_url ay hindi isang suportadong format (.jpg, .jpeg, .png, .webp).
Wala sa saklaw ang mga dimensyon ng imahe: Masyadong maliit ang imahe, lumalampas sa maximum na laki ng file, o lumalampas sa maximum na bilang ng pixel.
Hindi maabot na URL: Hindi ma-download ang image_url (404 o timeout).
Di-wastong Data URI: Malformed ang base64 string.
Na-flag na nilalaman: Ang input na imahe ay na-flag ng NSFW moderation.
Name
401 - Unauthorized
Description
Nabigo ang authentication. Pakisuri ang iyong API key.
Name
402 - Payment Required
Description
Hindi sapat na credits para gawin ang task na ito, o ang API key ay pag-aari ng isang free-plan account.
Name
403 - Forbidden
Description
Ang input na imahe ay na-flag ng intellectual property moderation (Content flagged for intellectual property violation). Tanging mga Enterprise account na may naka-enable na intellectual property filtering ang naharangan; walang sinisingil.
Name
429 - Too Many Requests
Description
Nalagpasan mo na ang iyong rate limit.
Name
500 - Internal Server Error
Description
Hindi makumpleto ang mismong pagsusuri ng intellectual property (Unable to perform intellectual property check, please try again). Ang mga Enterprise account na may naka-enable na intellectual property filtering ay nabibigo nang paksara sa pagsusuring ito; walang sinisingil — subukan muli ang request.
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" }'
Bumuo ng mga 3D-printable na piraso mula sa isang matagumpay na prototype task. Sinasampol ng build ang pixel-art na larawan ng prototype papunta sa hiniling na grid, kino-quantize ito sa hanggang color_count na mga kulay, at bumubuo ng isang interlocking na piraso bawat grid cell. Ang deliverable ay isang solong 3MF kung saan bawat piraso ay hiwalay na object na naka-tag sa kulay nito, handa na para sa isang multi-filament na slicer. Sumangguni sa
The Fidget Pixel Build Task Object
para sa hugis ng response.
Mga Parameter
Name
input_task_id
Type
string
Kinakailangan
Description
Ang task ID ng isang prototype task na ginawa sa pamamagitan ng parehong OpenAPI endpoint na ito. Dapat na ginawa ang prototype ng parehong Meshy account at dapat na naabot na ang SUCCEEDED.
Ang mga prototype task na ginawa sa pamamagitan ng webapp ay hindi tinatanggap — ang build endpoint ay tumatanggap lamang ng mga prototype task na nabuo ng POST /openapi/creative-lab/fidget-pixel/v1/prototype at tumatanggi sa anumang ibang pinagmulan na may 404.
Name
name
Type
string
Description
Opsyonal na pangalan ng task para sa layuning pagpapakita. Maximum na 100 na character.
options
Opsyonal na heometriya ng piraso. May default ang bawat field — ipadala lamang ang mga gusto mong i-override. Ito ang parehong mga kontrol na inilalantad ng Creative Lab webapp; ang plug height, cap scale, at ang iba pang manufacturing presets ay hango mula sa shape at piece_size_mm at hindi inilalantad.
Name
shape
Type
string
default square
Description
Footprint ng bawat piraso. Mga magagamit na value:
square (default) — mga parisukat na piraso sa isang parisukat na grid.
hex — mga hexagonal na piraso sa isang hexagonal na grid. Available lamang ang mga hex na piraso sa 6 at 8 mm.
Name
grid_size
Type
integer
default 32
Description
Bilang ng mga piraso sa bawat gilid ng board. Mga magagamit na value: 16 o 32. Ang 32 na grid ay nagpapanatili ng mas maraming detalye; ang 16 na grid ay nangangahulugan ng mas kaunti, mas malalaking piraso para sa parehong subject.
Name
piece_size_mm
Type
integer
default 8
Description
Haba ng gilid ng bawat piraso, sa millimeters. Mga magagamit na value: 6, 8, o 10. Kasama ng grid_size, tinatakda nito ang naka-print na laki ng board — halimbawa 32 × 8 mm ≈ 26 cm bawat gilid. Hindi available ang 10 para sa shape: "hex" (ang pahilis na hex face ay may overhang sa karamihan ng consumer FDM printer).
Name
color_count
Type
integer
default 8
Description
Maximum na bilang ng mga kulay sa palette na kino-quantize ang larawan. Saklaw: [1, 8]. Ang bawat kulay ay nagiging isang filament sa iyong slicer.
Name
piece_height_mm
Type
integer
default 15
Description
Taas ng bawat piraso, sa millimeters. Saklaw: [10, 80].
output
Opsyonal na wire-format selector. Default sa 3mf, na kasalukuyang ang tanging suportadong value.
Name
format
Type
string
default 3mf
Description
Artifact na ibinabalik ng build. Mga magagamit na value:
3mf (default) — nagbabalik ng isang solong model.3mf sa ilalim ng model_urls.3mf, na may isang object bawat piraso at ang kulay ng piraso na naka-attach sa bawat object.
Ibinabalik
Ang result property ng response ay naglalaman ng task id ng bagong ginawang fidget pixel build task. I-poll ang Get a Task endpoint o mag-subscribe sa stream hanggang sa maabot ng task ang SUCCEEDED, pagkatapos ay i-download ang artifact mula sa model_urls.3mf.
Mga Paraan ng Pagkabigo
Name
400 - Bad Request
Description
Hindi katanggap-tanggap ang request. Karaniwang mga dahilan:
Kulang na parameter: Kailangan ang input_task_id.
Hindi wastong UUID: Ang input_task_id ay hindi wastong UUID.
Hindi pa matagumpay ang parent: Ang tinutukoy na prototype task ay hindi pa umaabot sa SUCCEEDED.
Walang kandidato: Matagumpay ang prototype task ngunit hindi nakabuo ng pixel-art na larawan; gumawa ng bagong prototype.
Options wala sa saklaw: Isa sa mga field ng options ay wala sa pinapayagang set o saklaw nito — halimbawa options.grid_size must be 16 or 32, o options.piece_size_mm=10 is not supported for shape=hex; hex pieces are available in 6 and 8 mm.
Hindi suportadong format: Dapat na 3mf ang output.format.
Name
401 - Unauthorized
Description
Nabigo ang authentication. Pakisuri ang iyong API key.
Name
402 - Payment Required
Description
Hindi sapat na credits upang isagawa ang task na ito, o ang API key ay kabilang sa isang free-plan account.
Name
403 - Forbidden
Description
Na-flag ng intellectual property moderation ang larawan ng tinutukoy na prototype. Mga Enterprise account lamang na may pinaganang intellectual property filtering ang naba-block; walang sisingilin.
Name
404 - Not Found
Description
Ang tinutukoy na prototype task ay hindi umiiral, kabilang sa ibang user, o ginawa sa pamamagitan ng webapp (mga prototype task lamang sa API-mode ang maaaring i-chain sa build).
Name
429 - Too Many Requests
Description
Lumampas ka na sa iyong rate limit.
Name
500 - Internal Server Error
Description
Hindi maitatag ang intellectual property verdict ng tinutukoy na prototype (Unable to perform intellectual property check, please try again). Ang mga Enterprise account na may pinaganang intellectual property filtering ay nabigo nang naka-close sa pagsusuring ito; walang sisingilin — subukan muli ang request.
Kunin ang isang prototype o build task gamit ang isang wastong id ng task. Ang URL path
ay dapat tumugma sa yugto (stage) ng task — ang isang build task na kinuha sa pamamagitan ng
/prototype/:id ay magbabalik ng 404, at ganoon din sa kabaligtaran.
Natatanging identifier para sa fidget pixel task na kukunin.
Ibinabalik
Ang tugon ay naglalaman ng fidget pixel task object. Ang hugis nito ay nakadepende sa
kung aling yugto (stage) ang hiniling.
Mga Paraan ng Pagkabigo
Name
400 - Bad Request
Description
Ang id ay hindi wastong UUID (Invalid ID).
Name
403 - Forbidden
Description
Na-flag ng intellectual property moderation ang larawan ng task. Tanging mga Enterprise account na may pinagana ang intellectual property filtering lamang ang haharangin.
Name
404 - Not Found
Description
Hindi umiiral ang task, pag-aari ito ng ibang user, o hindi tumutugma ang yugto (stage) nito sa URL path.
Name
500 - Internal Server Error
Description
Hindi natapos ang pagsusuri ng intellectual property (Unable to perform intellectual property check, please try again); ang mga Enterprise account na may pinagana ang intellectual property filtering ay mabibigo nang sarado (fail closed). Ulitin ang kahilingan.
Kanselahin ang isang fidget pixel task. Kung ang task ay PENDING pa rin, ire-refund ang mga
credits na nagamit noong oras ng paggawa. Ang mga task na IN_PROGRESS na
ay kinakansela nang walang refund (posibleng nagagamit na ng worker ang mga
resources). Ang mga task na nakarating na sa isang terminal state
(SUCCEEDED, FAILED, CANCELED) ay hindi na maaaring kanselahin.
Dapat tumugma ang URL path sa stage ng task — kung gagamitin ang DELETE sa
/prototype/:buildId, magbabalik ito ng 404.
Path Parameters
Name
id
Type
path
Description
Natatanging identifier para sa fidget pixel task na kakanselahin.
Returns
Nagbabalik ng 204 No Content kapag matagumpay, na may walang laman na body.
Failure Modes
Name
400 - Bad Request
Description
Hindi katanggap-tanggap ang request. Mga karaniwang dahilan:
Invalid ID: Ang id ay hindi isang valid na UUID.
Terminal state: Ang task ay SUCCEEDED, FAILED, o CANCELED na at hindi na maaaring kanselahin.
Name
404 - Not Found
Description
Hindi umiiral ang task, pag-aari ito ng ibang user, o hindi tumutugma ang stage nito sa URL path.
I-stream ang mga real-time na update para sa isang fidget pixel task sa pamamagitan ng Server-Sent Events (SSE).
Ang URL path ay dapat tumugma sa yugto ng task — ang pagbukas ng isang stream sa
/prototype/:buildId/stream ay maglalabas ng iisang event: error na payload na may
status_code: 404 at isasara ang stream; ang isang maling id ay gagawa ng pareho na may
status_code: 400 (Invalid ID).
Mga Parameter
Name
id
Type
path
Description
Natatanging identifier para sa fidget pixel task na i-stream.
Ibinabalik
Nagbabalik ng stream ng mga Fidget Pixel Prototype
o Fidget Pixel Build na task object bilang
Server-Sent Events. Bawat frame ay nagdadala ng buong task object para sa yugtong iyon — ang parehong hugis
na ibinabalik ng Get endpoint — kaya habang ang task ay PENDING o IN_PROGRESS ang
mga output field ay hindi pa lamang na-populate (null, [] o {}) at
ang finished_at ay null.
Kunin ang isang paginated na listahan ng iyong mga fidget pixel task para sa isang yugto (stage).
Ang URL path ang pumipili ng yugto — ibinabalik ng /prototype ang mga prototype task;
ibinabalik ng /build ang mga build task. Ang mga task mula sa ibang yugto ay hindi
kasama sa alinmang tugon.
Path Parameters
Name
stage
Type
path
Kinakailangan
Description
Alinman sa prototype o build. Ang koleksyon ay nagbabalik lamang ng mga task
na ang yugto ay tumutugma sa URL — ang pagkuha ng /prototype ay hindi kailanman
nagbabalik ng mga build task at vice versa.
Query Parameters
Name
page_num
Type
integer
default 1
Description
Numero ng pahina para sa pagination.
Name
page_size
Type
integer
default 10
Description
Limitasyon sa laki ng pahina. Ang maximum na pinapayagan ay 100 item.
Name
sort_by
Type
string
default -created_at
Description
Field na gagamitin sa pag-uuri. Mga available na value:
+created_at: Ayusin ayon sa oras ng paglikha nang paakyat (ascending).
-created_at: Ayusin ayon sa oras ng paglikha nang pababa (descending).
Ang Fidget Pixel Prototype Task object ay isang work unit na sinusubaybayan ng Meshy
upang gawing pixel-art image ang isang source photo. Ang output ng yugtong ito
ay naka-chain sa build stage
sa pamamagitan ng input_task_id.
Mga Katangian
Name
id
Type
string
Description
Natatanging identifier para sa task. Bagaman gumagamit kami ng k-sortable UUID para sa mga task id bilang detalye ng implementasyon, hindi mo dapat ipagpalagay ang anumang bagay tungkol sa format ng id.
Name
type
Type
string
Description
Uri ng task. Ang value ay creative-lab-fidget-pixel-prototype.
Name
name
Type
string
Description
Ang pangalan ng task na ibinigay noong nilikha ang task. Empty string kung walang ibinigay na pangalan.
Name
status
Type
string
Description
Status ng task. Ang mga posibleng value ay isa sa PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.
Name
progress
Type
integer
Description
Progress ng task. Kung hindi pa nasisimulan ang task, ang property na ito ay magiging 0. Kapag nagtagumpay na ang task, ito ay magiging 100.
Name
created_at
Type
timestamp
Description
Timestamp ng kung kailan nilikha ang task, sa milliseconds.
Ang isang timestamp ay kumakatawan sa bilang ng milliseconds na lumipas simula Enero 1, 1970 UTC, alinsunod sa
RFC 3339 standard.
Halimbawa, ang Biyernes, Setyembre 1, 2023 12:00:00 PM GMT ay kinakatawan bilang 1693569600000. Ito ay
naaangkop sa lahat ng timestamp sa Meshy API.
Name
started_at
Type
timestamp
Description
Timestamp ng kung kailan sinimulan ang task, sa milliseconds. Kung hindi pa nasisimulan ang task, ang property na ito ay magiging null.
Name
finished_at
Type
timestamp
Description
Timestamp ng kung kailan natapos ang task, sa milliseconds. Kung hindi pa natatapos ang task, ang property na ito ay magiging null.
Name
expires_at
Type
timestamp
Description
Timestamp ng kung kailan mag-eexpire ang resulta ng task, sa milliseconds — 3 araw pagkatapos matapos ang task. Ang mga Enterprise account ay nagpapanatili ng mga resulta ng API nang walang hanggan (tingnan ang Asset Retention); para sa kanila, ang timestamp na ito ay itinakda nang halos 100 taon ang layo.
Name
preceding_tasks
Type
integer
Description
Ang bilang ng mga naunang task.
Ang value ng field na ito ay makabuluhan lamang kung ang status ng task ay PENDING.
Name
task_error
Type
object
Description
Detalye ng error para sa mga nabigong task. Tingnan ang Errors para sa kumpletong reference ng task_error object.
Name
consumed_credits
Type
integer
Description
Ang bilang ng credits na ginamit ng task na ito. Ang isang task na umabot sa SUCCEEDED ay sisingilin ng buong halaga para sa yugto nito. Ang isang task na hindi kailanman nalikha (isang 4xx sa oras ng request, kasama ang pagtanggi ng moderation) ay hindi sisingilin. Ang isang task na umabot sa FAILED ay nagbabalik ng 0 — nire-refund ang singil. Ang pagkansela sa pamamagitan ng DELETE ay nagre-refund lamang habang PENDING pa ang task; ang isang task na IN_PROGRESS na ay mananatiling sisingilin, dahil nagamit na ang trabaho.
Name
image_urls
Type
array of strings
Description
Mga URL na maaaring i-download para sa pixel-art image na nilikha ng prototype task na ito. Sa kasalukuyan, palaging nagbabalik ang API ng eksaktong isang imahe; ang field ay isang array upang ang mga susunod na revision ay makapaglabas ng maraming kandidato nang hindi nasisira ang compatibility. Walang laman hanggang umabot ang task sa SUCCEEDED.
Ito ay mga naka-sign na URL: kunin ang mga ito nang walangAuthorization header. Mananatili itong valid hanggang expires_at, na 3 araw pagkatapos ng finished_at, at ang pagbabasa muli sa task sa loob ng window na iyon ay magbabalik ng magkaparehong URL sa halip na bago-lang-nai-sign. I-download at i-store ang mga file sa iyong sarili bago mangyari iyon — walang paraan upang i-refresh ang isang expired na link.
Ang Fidget Pixel Build Task object ay isang work unit na sinusubaybayan ng Meshy upang
i-generate ang mga printable na piraso mula sa isang matagumpay na prototype task. Ang build
ay sumasampol sa pixel-art na imahe ng prototype papunta sa hiniling na grid at nagla-publish
ng iisang color-tagged na 3MF.
Mga Katangian
Name
id
Type
string
Description
Natatanging identifier para sa task.
Name
type
Type
string
Description
Uri ng task. Ang value ay creative-lab-fidget-pixel-build.
Name
name
Type
string
Description
Ang pangalan ng task na ibinigay noong nilikha ang task. Walang laman na string kung walang ibinigay na pangalan.
Name
status
Type
string
Description
Status ng task. Ang mga posibleng value ay isa sa PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.
Name
progress
Type
integer
Description
Progress ng task. Kung hindi pa nasisimulan ang task, ang property na ito ay magiging 0. Kapag nagtagumpay na ang task, ito ay magiging 100.
Name
created_at
Type
timestamp
Description
Timestamp kung kailan nilikha ang task, sa milliseconds.
Name
started_at
Type
timestamp
Description
Timestamp kung kailan sinimulan ang task, sa milliseconds. null hanggang magsimula ang task.
Name
finished_at
Type
timestamp
Description
Timestamp kung kailan natapos ang task, sa milliseconds. null hanggang matapos ang task.
Name
expires_at
Type
timestamp
Description
Timestamp kung kailan mag-e-expire ang resulta ng task, sa milliseconds — 3 araw pagkatapos matapos ang task. Ang mga Enterprise account ay nagpapanatili ng mga resulta ng API nang walang hanggan (tingnan ang Asset Retention); para sa kanila, ang timestamp na ito ay naka-set sa mga 100 taon mula ngayon.
Name
preceding_tasks
Type
integer
Description
Ang bilang ng mga naunang task. May kahulugan lamang kapag ang status ay PENDING.
Name
task_error
Type
object
Description
Mga detalye ng error para sa mga nabigong task. Tingnan ang Errors para sa kumpletong reference ng task_error object.
Name
consumed_credits
Type
integer
Description
Ang bilang ng credits na nagamit ng task na ito. Ang task na umabot sa SUCCEEDED ay sisingilin ng buong halaga para sa yugto nito. Ang task na hindi kailanman nalikha (isang 4xx sa oras ng request, kasama na ang pagtanggi ng moderation) ay hindi sinisingil. Ang task na umabot sa FAILED ay nagbabalik ng 0 — ang singil ay ire-refund. Ang pagkansela sa pamamagitan ng DELETE ay nagre-refund lamang habang ang task ay PENDING pa rin; ang task na IN_PROGRESS na ay mananatiling sisingilin, dahil nagamit na ang trabaho.
Name
model_urls
Type
object
Description
Mga na-download na URL para sa nagawang artifact, na naka-key ayon sa format. Naglalaman ng eksaktong isang entry — ang format na hiniling sa pamamagitan ng output.format ng build request. Walang laman hanggang umabot ang task sa SUCCEEDED.
Ang mga ito ay signed URL: kunin ang mga ito nang walangAuthorization header. Mananatili silang valid hanggang sa expires_at, na 3 araw pagkatapos ng finished_at, at ang muling pagbasa sa task sa loob ng window na iyon ay magbabalik ng eksaktong parehong URL sa halip na isang bagong-signed na URL. I-download at itago ang mga file bago mangyari iyon — walang paraan upang i-refresh ang isang na-expire na link.
Name
3mf
Type
string
Description
Na-download na URL papunta sa 3MF file. Isang object bawat piraso, bawat isa ay may tag ng kani-kaniyang palette color, kaya ang multi-filament na slicer ay nagtatalaga ng mga filament ayon sa kulay. Naroroon kapag ang output.format ay 3mf (ang default).
Ang kumpletong daloy: gumawa ng prototype mula sa isang larawan, i-poll ito hanggang
SUCCEEDED, gumawa ng build mula rito, i-poll ang build hanggang SUCCEEDED, pagkatapos
i-download ang 3MF mula sa model_urls.
Karaniwang natatapos ang isang prototype sa loob ng ilang minuto; karaniwang
natatapos ang isang build sa loob ng mas kaunti sa isang minuto. Sa isang tunay na
integrasyon, ipapakita mo ang entry na image_urls ng prototype sa end user at
hahayaan silang kumpirmahin ito (o patakbuhin muli ang prototype) bago gumastos ng
credits para sa 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"