Creative Lab Fidget Pixel API
แปลงรูปภาพให้เป็นแผ่นฟิดเจ็ตแบบพิกเซลอาร์ตหลายสีที่พิมพ์ 3 มิติได้ ผ่านสองขั้นตอน งาน prototype จะแปลงรูปภาพให้เป็นภาพพิกเซลอาร์ต ส่วนงาน build จะแปลงภาพนั้นให้เป็นชิ้นส่วนที่ประกอบเข้าด้วยกันได้ในไฟล์ 3MF ไฟล์เดียว โดยใช้ ID ของงาน prototype เป็น input_task_id
POST /openapi/creative-lab/fidget-pixel/v1/prototypePOST /openapi/creative-lab/fidget-pixel/v1/build
endpoint แบบ POST ทั้งสองตัวต้องใช้แพลนแบบชำระเงิน คำขอจากบัญชีแพลนฟรีจะได้รับผลลัพธ์เป็น 402
สร้างงาน prototype ของ Fidget Pixel
สร้างภาพพิกเซลอาร์ตหนึ่งภาพจากรูปถ่าย เพื่อสร้างชิ้นส่วน ให้ส่ง ID ของงานนี้ไปยัง build endpoint ในชื่อ input_task_id สำหรับฟิลด์ของงาน ดูที่ The Fidget Pixel prototype task object
หากคุณไม่ชอบภาพที่ได้ ให้สร้างงาน prototype ใหม่อีกครั้ง แต่ละงานจะถูกคิดเครดิตแยกกัน
Request
# Stage 1: pixelize the source photo
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype \
-X POST \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
"image_url": "<your publicly accessible image url or base64-encoded data URI>",
"type": "person"
}'
Response
{
"result": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7"
}
พารามิเตอร์
- Name
- image_url
- Type
- string
- จำเป็น
- Description
รูปถ่ายที่จะแปลงเป็นพิกเซลอาร์ต ในรูปแบบ URL สาธารณะ หรือ data URI (
data:image/jpeg;base64,<your base64-encoded image data>)รูปภาพต้องเป็นไฟล์ JPG, JPEG, PNG หรือ WebP ที่มีขนาดไม่เกิน 20 MB Meshy จะตรวจจับรูปแบบไฟล์จากข้อมูลภาพ ไม่ใช่จากนามสกุลไฟล์ใน URL URL ที่ไม่มีนามสกุลก็ใช้งานได้ และ Meshy จะติดตามการเปลี่ยนเส้นทาง (redirect)
- Name
- type
- Type
- string
- จำเป็น
- Description
สิ่งที่ปรากฏในรูปถ่าย ซึ่งจะกำหนดสไตล์ของพิกเซลอาร์ต ทั้งสองสไตล์มีความแตกต่างกันอย่างชัดเจน ค่าอื่นใดนอกเหนือจากนี้จะคืนค่า
400ค่าที่ใช้ได้:
person: บุคคล ในรูปถ่ายแบบครึ่งตัวหรือเต็มตัว Meshy จะวาดสไปรต์พิกเซลสไตล์ชิบิother: วัตถุอื่นใด เช่น สัตว์เลี้ยง สิ่งของ มาสคอต โลโก้ หรือภูมิทัศน์ Meshy จะวาดไอคอนพิกเซลสไตล์บีดอาร์ต
- Name
- name
- Type
- string
- Description
ชื่อสำหรับงาน ยาวได้สูงสุด 100 ตัวอักษร ชื่อนี้จะถูกส่งกลับมาในฟิลด์
nameของงาน ชื่อที่ยาวเกินไปจะคืนค่า400
ค่าที่ส่งกลับ
ฟิลด์ result จะเก็บ ID ของงาน prototype ใหม่ ดึงข้อมูลงาน หรือ สตรีมข้อมูลงาน จนกว่า status จะเป็น SUCCEEDED จากนั้นจึงส่ง ID ไปยัง build endpoint ในชื่อ input_task_id
รูปแบบความล้มเหลว
- Name
400 - Bad Request- Description
คำขอนี้ไม่สามารถทำงานได้ ตัวอย่างเช่น:
- ไม่มี
image_urlหรือtype typeไม่ใช่personหรือother- รูปภาพไม่ใช่ไฟล์ JPG, JPEG, PNG หรือ WebP
- รูปภาพมีขนาดเล็กเกินไป เกิน 20 MB หรือเกินจำนวนพิกเซลสูงสุด
- Meshy ไม่สามารถดาวน์โหลดรูปภาพได้ เช่น เพราะ URL คืนค่า
404หรือหมดเวลา - data URI ไม่ใช่ base64 ที่ถูกต้อง
- รูปภาพถูกตั้งค่าสถานะว่าเป็นเนื้อหาไม่เหมาะสม (NSFW)
ข้อความแสดงข้อผิดพลาดจะระบุว่าพบปัญหาใด แก้ไขคำขอแล้วส่งอีกครั้ง
- ไม่มี
- Name
401 - Unauthorized- Description
API คีย์หายไปหรือไม่ถูกต้อง ตรวจสอบส่วนหัว
Authorization
- Name
402 - Payment Required- Description
เงื่อนไขอย่างใดอย่างหนึ่งต่อไปนี้เป็นจริง:
- บัญชีมีเครดิตไม่เพียงพอ
- API คีย์ พื้นที่ทำงาน หรือสมาชิกถึงขีดจำกัดเครดิตแล้ว
- บัญชีอยู่บนแผนฟรี
ตรวจสอบเครดิตและแผนของคุณ แล้วลองใหม่
- Name
403 - Forbidden- Description
ทีมของคุณเปิดใช้งาน IP Filtering และ Meshy ตั้งค่าสถานะรูปภาพนี้ว่าเกี่ยวข้องกับทรัพย์สินทางปัญญาของบุคคลที่สาม โปรดส่งรูปภาพที่คุณมีสิทธิ์ใช้งาน
- Name
429 - Too Many Requests- Description
ถึงขีดจำกัดข้อใดข้อหนึ่งต่อไปนี้:
- คุณส่งคำขอมากกว่าที่การจำกัดอัตราของคุณอนุญาต รอสักครู่แล้วลองใหม่ ดู Rate limits
- มีงานของคุณที่อยู่ในคิวหรือกำลังทำงานมากเกินไป รอให้บางงานเสร็จสิ้นแล้วลองใหม่
- หากอยู่บนแผนไม่จำกัดแต่ไม่มีเครดิตเหลือ คุณถึงจำนวนงานสูงสุดที่สามารถทำงานได้โดยไม่ใช้เครดิตแล้ว รอให้งานเสร็จสิ้น หรือเติมเครดิต
- Name
500 - Internal Server Error- Description
Meshy พบข้อผิดพลาดของเซิร์ฟเวอร์ เช่น เนื่องจากไม่สามารถตรวจสอบทรัพย์สินทางปัญญาของรูปภาพได้ Meshy จะไม่สร้างงาน และคืนเครดิตใด ๆ ที่เรียกเก็บไปแล้ว โปรดลองคำขออีกครั้ง
สร้างงาน build ของ Fidget Pixel
สร้างชิ้นส่วนที่พิมพ์ 3 มิติได้จากงาน prototype ที่สำเร็จแล้ว Meshy จะสุ่มตัวอย่างภาพพิกเซลอาร์ตลงบนกริด และลดจำนวนสีลงเหลือไม่เกิน color_count สี แต่ละเซลล์ของตัวแบบจะกลายเป็นชิ้นส่วนที่ประกอบล็อกเข้ากันได้ และพื้นหลังจะไม่ถูกพิมพ์
ผลลัพธ์คือไฟล์ 3MF แบบหลายสีไฟล์เดียว พร้อมพิมพ์เป็นสีได้ทันที แต่ละชิ้นส่วนมีตัวสีเทาและส่วนบนเป็นสีของพิกเซลนั้น สำหรับฟิลด์ต่าง ๆ ดูที่ The Fidget Pixel build task object
Request
# Stage 2: chain build off a succeeded prototype task
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build \
-X POST \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
"input_task_id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
"options": {
"shape": "square",
"grid_size": 32,
"piece_size_mm": 8,
"color_count": 8,
"piece_height_mm": 15
},
"output": {
"format": "3mf"
}
}'
Response
{
"result": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98"
}
พารามิเตอร์
- Name
- input_task_id
- Type
- string
- จำเป็น
- Description
ID ของงาน prototype ที่จะ build ต้องเป็นงานที่บัญชีของคุณสร้างด้วย
POST /openapi/creative-lab/fidget-pixel/v1/prototypeและมีสถานะเป็นSUCCEEDEDID ที่ไม่ใช่งาน prototype ของ Fidget Pixel จาก API ของบัญชีคุณจะคืนค่า
404รวมถึง prototype ที่สร้างในเว็บแอปด้วย
- Name
- name
- Type
- string
- Description
ชื่อสำหรับงาน ได้สูงสุด 100 ตัวอักษร ชื่อนี้จะถูกส่งกลับมาในฟิลด์
nameของงาน หากชื่อยาวเกินไปจะคืนค่า400
options
การตั้งค่ารูปทรงและขนาดของชิ้นส่วน ทุกฟิลด์มีค่าเริ่มต้น ดังนั้นส่งเฉพาะฟิลด์ที่คุณต้องการเปลี่ยนเท่านั้น ค่า 0 จะใช้ค่าเริ่มต้นของฟิลด์นั้น การตั้งค่าเหล่านี้เหมือนกับในเว็บแอป Creative Lab การตั้งค่ารูปทรงอื่น ๆ ถูกกำหนดตายตัว และ Meshy จะตั้งค่าตามจาก shape และ piece_size_mm
- Name
- shape
- Type
- string
- ค่าเริ่มต้น square
- Description
รูปทรงฐานของแต่ละชิ้นส่วน ค่าอื่นใดนอกเหนือจากนี้จะคืนค่า
400ค่าที่ใช้ได้:
square: ชิ้นส่วนสี่เหลี่ยมบนกริดสี่เหลี่ยมhex: ชิ้นส่วนหกเหลี่ยมบนกริดหกเหลี่ยม โดยตั้งค่าpiece_size_mmเป็น6หรือ8
- Name
- grid_size
- Type
- integer
- ค่าเริ่มต้น 32
- Description
จำนวนเซลล์กริดตามแต่ละด้านของบอร์ด
16หรือ32ค่าอื่นใดนอกเหนือจากนี้จะคืนค่า400กริด32จะเก็บรายละเอียดได้มากกว่า ส่วนกริด16จะให้ชิ้นส่วนน้อยกว่าในขนาดเดียวกัน ทำให้บอร์ดมีความกว้างประมาณครึ่งหนึ่ง
- Name
- piece_size_mm
- Type
- integer
- ค่าเริ่มต้น 8
- Description
ความยาวขอบของแต่ละชิ้นส่วนในหน่วยมิลลิเมตร
6,8, หรือ10ค่าอื่นใดนอกเหนือจากนี้จะคืนค่า400เมื่อใช้ร่วมกับgrid_sizeจะกำหนดขนาดของบอร์ดที่พิมพ์ ตัวอย่างเช่น กริด32ของชิ้นส่วนขนาด 8 มม. จะมีขนาดประมาณ 26.5 ซม. ต่อด้าน10ใช้ไม่ได้กับhexและจะคืนค่า400เนื่องจากหน้าหกเหลี่ยมที่เอียงจะยื่นเกินในเครื่องพิมพ์ FDM สำหรับผู้บริโภคส่วนใหญ่
- Name
- color_count
- Type
- integer
- ค่าเริ่มต้น 8
- Description
จำนวนสีสูงสุดในจานสีของพิกเซลอาร์ต ตั้งแต่
1ถึง8ค่าที่อยู่นอกช่วงนี้จะคืนค่า400ในการพิมพ์ คุณจะต้องใช้เส้นพลาสติกสูงสุดcolor_countบวกหนึ่งเส้น หนึ่งเส้นต่อหนึ่งสี และอีกหนึ่งเส้นสำหรับตัวชิ้นส่วนสีเทา
- Name
- piece_height_mm
- Type
- integer
- ค่าเริ่มต้น 15
- Description
ความสูงของแต่ละชิ้นส่วนในหน่วยมิลลิเมตร ตั้งแต่
10ถึง80ค่าที่อยู่นอกช่วงนี้จะคืนค่า400
output
การตั้งค่าสำหรับไฟล์ผลลัพธ์
- Name
- format
- Type
- string
- ค่าเริ่มต้น 3mf
- Description
รูปแบบไฟล์ของผลลัพธ์ ค่าอื่นใดนอกเหนือจากนี้จะคืนค่า
400ค่าที่ใช้ได้:
3mf: ไฟล์model.3mfแบบหลายสีไฟล์เดียว ส่งกลับมาในmodel_urls.3mf
ค่าที่ส่งกลับ
ฟิลด์ result เก็บ ID ของงาน build ใหม่ รับงาน หรือ สตรีมงาน จนกว่า status จะเป็น SUCCEEDED จากนั้นดาวน์โหลดไฟล์ 3MF จาก model_urls.3mf
รูปแบบความล้มเหลว
- Name
400 - Bad Request- Description
คำขอไม่สามารถทำงานได้ ตัวอย่างเช่น:
input_task_idขาดหายไปหรือไม่ใช่ ID งานที่ถูกต้อง- สถานะของงาน prototype ไม่ใช่
SUCCEEDEDหากยังทำงานอยู่ ให้รอแล้วลองใหม่ หากล้มเหลวหรือถูกยกเลิก ให้สร้างงาน prototype ใหม่ - งาน prototype สำเร็จแล้วแต่ไม่มีภาพ ให้สร้างงาน prototype ใหม่
- ฟิลด์
optionsอยู่นอกค่าที่อนุญาต เช่นgrid_sizeที่ไม่ใช่16หรือ32 piece_size_mmเป็น10และshapeเป็นhexชิ้นส่วนหกเหลี่ยมมีเฉพาะขนาด 6 และ 8 มม. เท่านั้นoutput.formatไม่ใช่3mf
ข้อความแสดงข้อผิดพลาดจะระบุว่าพบปัญหาใด
- Name
401 - Unauthorized- Description
API คีย์ขาดหายไปหรือไม่ถูกต้อง ตรวจสอบส่วนหัว
Authorization
- Name
402 - Payment Required- Description
หนึ่งในกรณีต่อไปนี้:
- บัญชีมีเครดิตไม่เพียงพอ
- API คีย์ พื้นที่ทำงาน หรือสมาชิกถึงขีดจำกัดเครดิตแล้ว
- บัญชีอยู่ในแผนฟรี
ตรวจสอบเครดิตและแผนของคุณ แล้วลองใหม่
- Name
403 - Forbidden- Description
ทีมของคุณเปิดใช้งาน IP Filtering และ Meshy ตรวจพบว่าภาพในงาน prototype ละเมิดทรัพย์สินทางปัญญาของบุคคลที่สาม ให้สร้างงาน prototype จากภาพที่คุณมีสิทธิ์ใช้งาน
- Name
404 - Not Found- Description
input_task_idไม่ตรงกับงาน prototype ของ Fidget Pixel ใด ๆ ที่บัญชีของคุณสร้างด้วย API prototype ที่สร้างในเว็บแอปก็จะคืนค่า404เช่นกัน ให้ส่ง ID ของresultจากการตอบกลับการสร้าง prototype
- Name
429 - Too Many Requests- Description
ถึงขีดจำกัดข้อใดข้อหนึ่งต่อไปนี้:
- คุณส่งคำขอมากกว่าที่การจำกัดอัตราของคุณอนุญาต ให้รอสักครู่แล้วลองใหม่ ดู Rate limits
- มีงานของคุณที่อยู่ในคิวหรือกำลังทำงานมากเกินไป ให้รอจนกว่างานบางส่วนจะเสร็จสิ้นแล้วลองใหม่
- หากอยู่ในแผนไม่จำกัดและไม่มีเครดิตเหลือ คุณถึงจำนวนงานสูงสุดที่สามารถรันได้โดยไม่ใช้เครดิตแล้ว ให้รอจนกว่างานจะเสร็จสิ้น หรือเพิ่มเครดิต
- Name
500 - Internal Server Error- Description
Meshy พบข้อผิดพลาดของเซิร์ฟเวอร์ เช่น ไม่สามารถตรวจสอบทรัพย์สินทางปัญญาของภาพในงาน prototype ได้ Meshy จะไม่สร้างงานนี้ และคืนเครดิตใด ๆ ที่เรียกเก็บไปแล้ว ให้ลองส่งคำขอใหม่
ดึงข้อมูลงาน Fidget Pixel
ส่งคืนงาน prototype หรือ build พาธที่ใช้ต้องตรงกับขั้นตอน (stage) ของงานนั้น หากส่งคำของาน build ผ่าน /prototype/:id จะได้รับ 404 และในทำนองเดียวกัน หากส่งคำของาน prototype ผ่าน /build/:id ก็จะได้รับ 404 เช่นกัน
สำหรับฟิลด์ต่าง ๆ โปรดดู The Fidget Pixel prototype task object และ The Fidget Pixel build task object
Request
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
# Build
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Prototype Response
{
"id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
"type": "creative-lab-fidget-pixel-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001000000,
"started_at": 1757001005000,
"finished_at": 1757001178000,
"expires_at": 1757260378000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 6,
"image_urls": [
"https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
]
}
Build Response
{
"id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
"type": "creative-lab-fidget-pixel-build",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001300000,
"started_at": 1757001304000,
"finished_at": 1757001309000,
"expires_at": 1757260509000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 30,
"model_urls": {
"3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
}
}
พารามิเตอร์
- Name
- id
- Type
- path
- Description
รหัสงานจากการตอบกลับตอนสร้าง
ค่าที่ส่งคืน
prototype task object หรือ build task object ขึ้นอยู่กับขั้นตอนที่ตรงกับพาธที่ใช้
รูปแบบความล้มเหลว
- Name
400 - Bad Request- Description
idไม่ใช่รหัสงานที่ถูกต้อง ให้ส่งรหัสresultจากการตอบกลับตอนสร้าง
- Name
403 - Forbidden- Description
ทีมของคุณเปิดใช้งาน IP Filtering และ Meshy ตรวจพบว่ารูปภาพของงาน prototype มีการติดธงเรื่องทรัพย์สินทางปัญญาของบุคคลที่สาม งาน build และทีมที่ใช้แผน Enterprise จะไม่ได้รับข้อผิดพลาดนี้ ให้สร้างงาน prototype จากรูปภาพที่คุณมีสิทธิ์ใช้งาน
- Name
404 - Not Found- Description
ไม่พบงาน Fidget Pixel ที่มีรหัสนี้อยู่ในบัญชีของคุณ หรือขั้นตอนของงานไม่ตรงกับพาธที่ใช้ ตรวจสอบรหัส และใช้
/prototypeหรือ/buildให้ตรงกับงานนั้น
- Name
500 - Internal Server Error- Description
Meshy ไม่สามารถตรวจสอบทรัพย์สินทางปัญญาได้ กรุณาลองส่งคำขออีกครั้ง
ลบงาน Fidget Pixel
ยกเลิกงาน Fidget Pixel การยกเลิกงานที่มีสถานะ PENDING จะคืนเครดิตให้ ส่วนงานที่มีสถานะ IN_PROGRESS จะถูกยกเลิกโดยไม่มีการคืนเครดิต เนื่องจาก worker ได้เริ่มดำเนินการไปแล้ว งานที่มีสถานะสุดท้าย (SUCCEEDED, FAILED หรือ CANCELED) ไม่สามารถยกเลิกได้
พาธต้องตรงกับขั้นตอนของงานนั้น ตัวอย่างเช่น การเรียก DELETE ที่ /prototype/:id โดยใช้ ID ของงานในขั้นตอน build จะคืนค่า 404
Request
curl --request DELETE \
--url https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Response
// Returns 204 No Content on success (empty body).
Path parameters
- Name
- id
- Type
- path
- Description
ID ของงานที่ต้องการยกเลิก
Returns
204 No Content พร้อม body ว่างเปล่า
Failure modes
- Name
400 - Bad Request- Description
หนึ่งในกรณีต่อไปนี้:
idไม่ใช่ ID งานที่ถูกต้อง ให้ส่ง IDresultจากคำตอบของการสร้างงาน- งานนี้มีสถานะสุดท้ายอยู่แล้ว (
SUCCEEDED,FAILEDหรือCANCELED) จึงไม่สามารถยกเลิกได้
- Name
404 - Not Found- Description
ไม่มีงาน Fidget Pixel ที่มี ID นี้อยู่ในบัญชีของคุณ หรือขั้นตอนของงานไม่ตรงกับพาธที่ใช้ ตรวจสอบ ID และใช้
/prototypeหรือ/buildให้ตรงกับงานนั้น
Stream งานของ Fidget Pixel
สตรีมการอัปเดตของงาน Fidget Pixel ในรูปแบบ Server-Sent Events (SSE) พาธที่ใช้ต้องตรงกับขั้นตอนของงานนั้น ถ้าไม่ตรง เช่น ใช้ ID ของ build task ที่ /prototype/:id/stream สตรีมจะส่งอีเวนต์ error หนึ่งรายการด้วย status_code: 404 แล้วปิดการเชื่อมต่อ หาก id ไม่ใช่ task ID ที่ถูกต้อง ก็จะเกิดผลลัพธ์แบบเดียวกันแต่ด้วย status_code: 400
Request
curl -N https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/stream \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Response Stream
// Error event example (wrong stage or task not found)
event: error
data: {
"status_code": 404,
"message": "Task not found"
}
// Message event examples illustrate task progress.
// Every frame is the full task object for the stage; fields not yet populated are null / empty.
event: message
data: {
"id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
"type": "creative-lab-fidget-pixel-build",
"name": "",
"status": "PENDING",
"progress": 0,
"created_at": 1757001300000,
"started_at": null,
"finished_at": null,
"expires_at": 1757260500000,
"preceding_tasks": 2,
"task_error": null,
"consumed_credits": 30,
"model_urls": {}
}
event: message
data: {
"id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
"type": "creative-lab-fidget-pixel-build",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001300000,
"started_at": 1757001304000,
"finished_at": 1757001309000,
"expires_at": 1757260509000,
"task_error": null,
"consumed_credits": 30,
"model_urls": {
"3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
}
}
พารามิเตอร์
- Name
- id
- Type
- path
- Description
Task ID จากการตอบกลับตอนสร้างงาน
ค่าที่ส่งกลับ
สตรีมของอ็อบเจ็กต์งาน prototype หรือ build แต่ละอีเวนต์จะมีอ็อบเจ็กต์งานฉบับเต็ม เช่นเดียวกับที่ ดึงข้อมูลงานของ Fidget Pixel ส่งกลับมา ในขณะที่งานยังอยู่ในสถานะ PENDING หรือ IN_PROGRESS ฟิลด์ผลลัพธ์ของงานจะยังว่างอยู่ (null, [], หรือ {}) และ finished_at จะเป็น null
หาก IP Filtering บล็อกผลลัพธ์ของงาน สตรีมจะส่งอีเวนต์ error หนึ่งรายการแทน โดยมี status_code เดียวกับที่คำขอแบบ get จะส่งกลับ
List Fidget Pixel tasks
คืนค่างาน Fidget Pixel ของคุณในขั้นตอนใดขั้นตอนหนึ่ง ครั้งละหนึ่งหน้า พาธจะเป็นตัวกำหนดขั้นตอน /prototype จะคืนค่าเฉพาะงานในขั้นตอน prototype และ /build จะคืนค่าเฉพาะงานในขั้นตอน build
Request
# List prototype tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype?page_size=10 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
# List build tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build?page_size=10 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Response (List Prototype Tasks)
[
{
"id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
"type": "creative-lab-fidget-pixel-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001000000,
"started_at": 1757001005000,
"finished_at": 1757001178000,
"expires_at": 1757260378000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 6,
"image_urls": [
"https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
]
}
]
พารามิเตอร์พาธ (Path parameters)
- Name
- stage
- Type
- path
- จำเป็น
- Description
ขั้นตอนที่ต้องการแสดงรายการ
prototypeหรือbuild
พารามิเตอร์คิวรี (Query parameters)
- Name
- page_num
- Type
- integer
- ค่าเริ่มต้น 1
- Description
หน้าที่ต้องการคืนค่า ตั้งแต่
1ถึง255ค่า0จะคืนค่าหน้าแรก ค่าที่อยู่นอกช่วง0ถึง255จะคืนค่า400
- Name
- page_size
- Type
- integer
- ค่าเริ่มต้น 10
- Description
จำนวนงานต่อหน้า สูงสุด
100ค่าตั้งแต่101ถึง255จะคืนค่า 100 งาน และค่า0จะใช้ค่าเริ่มต้น ค่าที่อยู่นอกช่วง0ถึง255จะคืนค่า400
- Name
- sort_by
- Type
- string
- ค่าเริ่มต้น -created_at
- Description
ลำดับการเรียง
ค่าที่ใช้ได้:
-created_at: ใหม่สุดก่อน+created_at: เก่าสุดก่อน
ค่าที่คืนกลับ
อาร์เรย์ของ ออบเจ็กต์งาน prototype หรือ ออบเจ็กต์งาน build ตามขั้นตอนที่ระบุในพาธ
อ็อบเจกต์งาน prototype ของ Fidget Pixel
งาน prototype จะแปลงรูปภาพให้กลายเป็นภาพแบบพิกเซลอาร์ต (pixel-art) เพื่อแปลงภาพนั้นให้กลายเป็นชิ้นส่วนที่พิมพ์ 3 มิติได้ ให้ส่ง ID ของงานไปยัง build endpoint ในชื่อ input_task_id
คุณสมบัติ
Example Fidget Pixel Prototype Task Object
{
"id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
"type": "creative-lab-fidget-pixel-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001000000,
"started_at": 1757001005000,
"finished_at": 1757001178000,
"expires_at": 1757260378000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 6,
"image_urls": [
"https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
]
}
- Name
- id
- Type
- string
- Description
ID ของงาน อย่าอ้างอิงตามรูปแบบของมัน
- Name
- type
- Type
- string
- Description
ประเภทของงาน ซึ่งจะเป็น
creative-lab-fidget-pixel-prototypeเสมอ
- Name
- name
- Type
- string
- Description
ค่า
nameที่คุณส่งมาตอนสร้างงาน หรือ""หากคุณไม่ได้ส่งค่านี้มา
- Name
- status
- Type
- string
- Description
สถานะของงาน
ค่าที่เป็นไปได้:
PENDING: กำลังรอในคิวIN_PROGRESS: กำลังสร้างผลลัพธ์SUCCEEDED: สถานะสุดท้าย พร้อมผลลัพธ์FAILED: สถานะสุดท้าย พร้อมเหตุผลในtask_errorCANCELED: สถานะสุดท้าย โดยไม่มีผลลัพธ์
- Name
- progress
- Type
- integer
- Description
เปอร์เซ็นต์ของงานที่ทำเสร็จแล้ว ตั้งแต่
0ถึง100ค่านี้จะเป็น0จนกว่างานจะเริ่ม และเป็น100เมื่องานสำเร็จ
- Name
- created_at
- Type
- timestamp
- Description
เวลาที่สร้างงาน หน่วยเป็นมิลลิวินาทีแบบ Unix
- Name
- started_at
- Type
- timestamp
- Description
เวลาที่ worker เริ่มทำงานนี้ หน่วยเป็นมิลลิวินาทีแบบ Unix โดยจะเป็น
nullจนกว่าจะถึงเวลานั้น
- Name
- finished_at
- Type
- timestamp
- Description
เวลาที่งานถึงสถานะสุดท้าย หน่วยเป็นมิลลิวินาทีแบบ Unix โดยจะเป็น
nullจนกว่าจะถึงเวลานั้น
- Name
- expires_at
- Type
- timestamp
- Description
เวลาที่ผลลัพธ์ของงานจะหมดอายุ หน่วยเป็นมิลลิวินาทีแบบ Unix ซึ่งจะเป็น 3 วันหลังจาก
finished_atหรือ 3 วันหลังจากcreated_atจนกว่างานจะเสร็จสิ้น สำหรับบัญชี Enterprise ซึ่งจะเก็บผลลัพธ์ของ API ไว้อย่างไม่มีกำหนด ค่านี้จะเป็นประมาณ 100 ปีถัดไป ดูเพิ่มเติมที่ การเก็บรักษาแอสเซ็ต
- Name
- preceding_tasks
- Type
- integer
- Description
ตำแหน่งของงานในคิวขณะที่สถานะเป็น
PENDINGค่า1หมายความว่างานนี้จะเริ่มเป็นลำดับถัดไป และเป็น0หลังจากงานออกจากคิวแล้ว และจะเป็น0เสมอในผลลัพธ์แบบรายการ
- Name
- task_error
- Type
- object
- Description
เหตุผลที่งานล้มเหลว จะเป็น
nullยกเว้นเมื่อstatusเป็นFAILEDดูเพิ่มเติมที่ ข้อผิดพลาด
- Name
- consumed_credits
- Type
- integer
- Description
จำนวนเครดิตที่ถูกเรียกเก็บสำหรับงานนี้ หลังหักการคืนเงินใด ๆ แล้ว คำขอที่คืนค่าข้อผิดพลาดจะไม่ถูกเรียกเก็บเครดิต งานที่ล้มเหลวจะมีค่าเป็น
0เนื่องจาก Meshy จะคืนเครดิตให้ การยกเลิกงานจะคืนเครดิตให้ก็ต่อเมื่องานยังอยู่ในสถานะPENDINGเท่านั้น หาก Meshy ไม่สามารถอ่านค่าการเรียกเก็บเงินได้ การตอบกลับแบบ get หรือ stream จะไม่มีฟิลด์นี้ และคำขอแบบ list จะคืนค่า500ในกรณีนี้ ให้ลองส่งคำขอใหม่อีกครั้ง
- Name
- image_urls
- Type
- array of strings
- Description
URL สำหรับดาวน์โหลดภาพพิกเซลอาร์ต อาร์เรย์นี้จะมี URL หนึ่งรายการหลังจากงานสำเร็จ และจะว่างเปล่าจนกว่าจะถึงตอนนั้น
URL เหล่านี้ถูกเซ็นไว้ จึงสามารถดึงข้อมูลได้โดยไม่ต้องใส่ header
AuthorizationURL เหล่านี้จะใช้งานได้จนถึงexpires_atการดึงข้อมูลงานนี้อีกครั้งก่อนถึงเวลานั้นจะคืนค่า URL ชุดเดิม ไม่ใช่ URL ที่เซ็นใหม่ URL ที่หมดอายุแล้วไม่สามารถรีเฟรชได้ ดังนั้นควรดาวน์โหลดและจัดเก็บไฟล์ไว้ก่อนที่จะถึงเวลานั้น
ออบเจ็กต์ Fidget Pixel build task
build task จะสร้างชิ้นส่วนที่พิมพ์ 3 มิติได้จากงาน prototype ที่สำเร็จแล้ว Meshy จะสุ่มตัวอย่างภาพ pixel-art ลงบนกริด และส่งคืนชิ้นส่วนทั้งหมดในไฟล์ 3MF หลายสีไฟล์เดียว
พรอพเพอร์ตี้
Example Fidget Pixel Build Task Object
{
"id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
"type": "creative-lab-fidget-pixel-build",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1757001300000,
"started_at": 1757001304000,
"finished_at": 1757001309000,
"expires_at": 1757260509000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 30,
"model_urls": {
"3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
}
}
- Name
- id
- Type
- string
- Description
รหัสของ task อย่าอ้างอิงตามรูปแบบของมัน
- Name
- type
- Type
- string
- Description
ประเภทของ task ซึ่งจะเป็น
creative-lab-fidget-pixel-buildเสมอ
- Name
- name
- Type
- string
- Description
ค่า
nameที่คุณส่งมาตอนสร้าง task หรือเป็น""หากคุณไม่ได้ส่งมา
- Name
- status
- Type
- string
- Description
สถานะของ task
ค่าที่เป็นไปได้:
PENDING: กำลังรอในคิวIN_PROGRESS: กำลังสร้างผลลัพธ์SUCCEEDED: สถานะสุดท้าย พร้อมผลลัพธ์FAILED: สถานะสุดท้าย พร้อมเหตุผลในtask_errorCANCELED: สถานะสุดท้าย โดยไม่มีผลลัพธ์
- Name
- progress
- Type
- integer
- Description
เปอร์เซ็นต์ของงานที่เสร็จแล้ว ตั้งแต่
0ถึง100ค่านี้จะเป็น0จนกว่า task จะเริ่มทำงาน และเป็น100เมื่อสำเร็จ
- Name
- created_at
- Type
- timestamp
- Description
เวลาที่สร้าง task เป็นหน่วยมิลลิวินาทีแบบ Unix
- Name
- started_at
- Type
- timestamp
- Description
เวลาที่ worker เริ่มทำ task เป็นหน่วยมิลลิวินาทีแบบ Unix จะเป็น
nullจนกว่าจะเริ่ม
- Name
- finished_at
- Type
- timestamp
- Description
เวลาที่ task ถึงสถานะสุดท้าย เป็นหน่วยมิลลิวินาทีแบบ Unix จะเป็น
nullจนกว่าจะถึง
- Name
- expires_at
- Type
- timestamp
- Description
เวลาที่ผลลัพธ์ของ task จะหมดอายุ เป็นหน่วยมิลลิวินาทีแบบ Unix ค่านี้คือ 3 วันหลังจาก
finished_atหรือ 3 วันหลังจากcreated_atจนกว่า task จะเสร็จสิ้น สำหรับบัญชี Enterprise ซึ่งเก็บผลลัพธ์ของ API ไว้ตลอดไป ค่านี้จะอยู่ที่ประมาณ 100 ปีให้หลัง ดู การเก็บรักษาแอสเซ็ต
- Name
- preceding_tasks
- Type
- integer
- Description
ตำแหน่งของ task ในคิวขณะที่มีสถานะเป็น
PENDINGค่า1หมายความว่า task นี้จะเริ่มถัดไป และเป็น0หลังจาก task ออกจากคิวแล้ว และเป็น0เสมอในผลลัพธ์แบบรายการ
- Name
- task_error
- Type
- object
- Description
เหตุผลที่ task ล้มเหลว จะเป็น
nullยกเว้นเมื่อstatusเป็นFAILEDดู ข้อผิดพลาด
- Name
- consumed_credits
- Type
- integer
- Description
จำนวนเครดิตที่ถูกเรียกเก็บสำหรับ task นี้ หลังหักเงินคืนใดๆ แล้ว คำขอที่ส่งคืนข้อผิดพลาดจะไม่ถูกเรียกเก็บเครดิต task ที่ล้มเหลวจะมีค่าเป็น
0เนื่องจาก Meshy จะคืนเครดิตให้ การยกเลิกจะคืนเครดิตให้กับ task ก็ต่อเมื่อยังอยู่ในสถานะPENDINGเท่านั้น หาก Meshy ไม่สามารถอ่านค่าที่เรียกเก็บได้ การตอบกลับแบบ get หรือ stream จะไม่มีฟิลด์นี้อยู่ และคำขอแบบ list จะส่งคืน500ในกรณีนี้ ให้ลองส่งคำขออีกครั้ง
- Name
- model_urls
- Type
- object
- Description
URL สำหรับดาวน์โหลดผลลัพธ์ แบ่งตามรูปแบบไฟล์ ออบเจ็กต์นี้มีหนึ่งรายการ สำหรับ
output.formatที่คุณส่งมา และจะว่างเปล่าจนกว่า task จะสำเร็จURL เหล่านี้มีการลงนามไว้แล้ว ดังนั้นให้เรียกใช้โดยไม่ต้องใส่ header
AuthorizationURL เหล่านี้จะใช้งานได้จนถึงexpires_atการดึงข้อมูล task อีกครั้งก่อนเวลานั้นจะส่งคืน URL ชุดเดิม ไม่ใช่ URL ที่ลงนามใหม่ URL ที่หมดอายุแล้วไม่สามารถรีเฟรชได้ ดังนั้นควรดาวน์โหลดและจัดเก็บไฟล์ไว้ก่อนที่จะหมดอายุ- Name
3mf- Type
- string
- Description
URL สำหรับดาวน์โหลดไฟล์ 3MF หลายสี แต่ละชิ้นส่วนจะมีตัวเป็นสีเทาและด้านบนเป็นสีของพิกเซลนั้นๆ จะปรากฏเมื่อ
output.formatเป็น3mfซึ่งเป็นค่าเริ่มต้น
End-to-end example
สคริปต์ cURL และ Python ต่อไปนี้รันขั้นตอนทั้งหมด แต่ละสคริปต์จะสร้างงาน prototype จากรูปภาพแล้วรอให้สำเร็จ จากนั้นจะสร้างงาน build รอให้งานนั้นเสร็จ แล้วดาวน์โหลดไฟล์ 3MF จาก model_urls.3mf
สคริปต์ cURL ต้องใช้ curl และ jq ส่วนสคริปต์ Python ต้องใช้แพ็กเกจ requests หากต้องการรันสคริปต์ ให้ทำตามขั้นตอนต่อไปนี้:
- ตั้งค่า
MESHY_API_KEYเป็น API คีย์ของคุณ - ตั้งค่า
IMAGE_PATHเป็นพาธของรูปภาพในเครื่อง หรือตั้งค่าIMAGE_URLเป็น URL รูปภาพสาธารณะ - ไม่บังคับ: หากต้องการแปลงเป็นพิกเซลสำหรับวัตถุอื่นที่ไม่ใช่คน ให้ตั้งค่า
PIXEL_TYPEเป็นother - รันสคริปต์
งาน prototype มักจะเสร็จภายในไม่กี่นาที งาน build มักจะเสร็จภายในเวลาไม่ถึงหนึ่งนาที
ในแอปของคุณ ให้แสดงรูปภาพจาก image_urls ให้ผู้ใช้เห็นก่อนที่คุณจะสร้างงาน build หากพวกเขาไม่ชอบรูปภาพนั้น ให้สร้างงาน prototype ใหม่แทน วิธีนี้จะทำให้คุณใช้เครดิตในการ build เฉพาะกับรูปภาพที่พวกเขายอมรับเท่านั้น
Complete flow
#!/usr/bin/env bash
set -euo pipefail
# Requires curl and jq. Point IMAGE_PATH at a local photo, or IMAGE_URL at a public one:
# export MESHY_API_KEY=msy_...
# export IMAGE_PATH=./portrait.jpg # or: export IMAGE_URL=https://...
# export PIXEL_TYPE=person # or: other
: "${MESHY_API_KEY:?export MESHY_API_KEY first}"
if [[ -z "${IMAGE_PATH:-}" && -z "${IMAGE_URL:-}" ]]; then
echo "export IMAGE_PATH (local file) or IMAGE_URL (public url) first" >&2
exit 1
fi
PIXEL_TYPE=${PIXEL_TYPE:-person}
BASE="https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1"
AUTH="Authorization: Bearer $MESHY_API_KEY"
# api METHOD URL [curl args...] -> prints the response body, non-zero on failure.
# Note we do not use -f/--fail: it discards the body, and the body is the only
# place the reason appears.
api() {
local method=$1 url=$2 out http_code body
shift 2
out=$(curl --silent --show-error --max-time 60 --write-out $'\n%{http_code}' \
-X "$method" "$url" -H "$AUTH" "$@") || return 1
http_code=${out##*$'\n'}
body=${out%$'\n'*}
if ((http_code >= 400)); then
echo "HTTP $http_code for $url: $body" >&2
return 1
fi
printf '%s' "$body"
}
# Each task gets its own 40-minute budget.
poll() {
local kind=$1 id=$2 delay=5 task_status deadline
deadline=$(($(date +%s) + 2400))
while :; do
if (($(date +%s) >= deadline)); then
echo "gave up waiting for $kind $id" >&2
return 1
fi
task_status=$(api GET "$BASE/$kind/$id" | jq -r '.status')
echo "$kind: $task_status"
case "$task_status" in
SUCCEEDED) return 0 ;;
FAILED | CANCELED) return 1 ;;
esac
sleep "$delay"
delay=$((delay * 2 > 30 ? 30 : delay * 2))
done
}
# Build the request body in a file. A base64 data URI must never go on the
# command line or into an exported variable - a photo of any real size will
# exceed the OS argument limit.
BODY=$(mktemp)
trap 'rm -f "$BODY"' EXIT
if [[ -n "${IMAGE_PATH:-}" ]]; then
# Declare the real type: the API accepts JPEG, PNG and WebP.
case "$(printf '%s' "${IMAGE_PATH##*.}" | tr 'A-Z' 'a-z')" in
png) MIME=image/png ;;
webp) MIME=image/webp ;;
*) MIME=image/jpeg ;;
esac
{
printf '{"type":"%s","image_url":"data:%s;base64,' "$PIXEL_TYPE" "$MIME"
base64 <"$IMAGE_PATH" | tr -d '\n'
printf '"}'
} >"$BODY"
else
jq -n --arg t "$PIXEL_TYPE" --arg u "$IMAGE_URL" \
'{type: $t, image_url: $u}' >"$BODY"
fi
# 1. Create the prototype task
PROTO_ID=$(api POST "$BASE/prototype" \
-H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')
# 2. Wait for the pixel-art image (show image_urls[0] to a user in production)
poll prototype "$PROTO_ID"
# 3. Create the build task (defaults: square pieces, 32x32 grid, 8 mm, 8 colors, 15 mm tall)
jq -n --arg p "$PROTO_ID" \
'{input_task_id: $p, options: {shape: "square", grid_size: 32, piece_size_mm: 8, color_count: 8, piece_height_mm: 15}, output: {format: "3mf"}}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
-H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')
# 4. Wait for the pieces
poll build "$BUILD_ID"
# 5. Download the 3MF. This is a signed URL: no Authorization header,
# and it stays valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
-o fidget-pixel.3mf "$(jq -r '.model_urls["3mf"]' <<<"$TASK")"
echo "Done: fidget-pixel.3mf"