Creative Lab — Keycap API

Ginagawang isang buong-kolor na custom na keycap ng mechanical keyboard ang isang source photo sa dalawang yugto: ang prototype ay gumagawa ng render ng disenyo ng "tapos na keycap" mula sa iyong input photo. Kapag nakumpirma na ang render na iyon, ang build ay ginagawa itong textured 3D keycap model sa isang tumatakbong proseso — white-model generation, automatic seating at cutting sa isang calibrated na default pose, buong-modelong pangkulay, at ang panghuling assembly ay lahat nagaganap sa loob ng isang build task. Ang dalawang yugto ay konektado sa pamamagitan ng input_task_id kasama ang candidate_id.

  • POST /openapi/creative-lab/keycap/v1/prototype
  • POST /openapi/creative-lab/keycap/v1/build

POST/openapi/creative-lab/keycap/v1/prototype

Gumawa ng Keycap Prototype Task

Bumuo ng isang finished-keycap na disenyong render mula sa pinagmulang larawan. Ang resulta ng task ay may dalang image_urls array (ang display render ng natapos na keycap) at katumbas na candidate_ids array; parehong may iisang entry lang. Tawagin muli ang endpoint na ito para sa ibang render kung hindi ito ang gusto mo — bawat tawag ay singil nang hiwalay. Ipasa ang candidate_id kasama ng prototype task ID papunta sa build endpoint. Sumangguni sa The Keycap Prototype Task Object para sa hugis ng response.

Mga Parameter

  • Name
    image_url
    Type
    string
    Kinakailangan
    Description

    Ang pinagmulang larawan na gagamitin ng Meshy para gawing mga imahe ng disenyo ng keycap. Sinusuportahan namin sa kasalukuyan ang mga format na .jpg, .jpeg, .png, at .webp.

    Ang format ay tinutukoy sa pamamagitan ng pag-decode sa datos ng larawan, 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. Ang EXIF orientation ay pinapantay, kaya ang isang naikot na larawan mula sa telepono ay ginagamit sa paraang tama ang pagkakalapat nito.

    Mga limitasyon: hindi bababa sa 32 pixels sa bawat gilid, hindi hihigit sa 178,956,970 pixels sa kabuuan, at hindi hihigit sa 20,000,000 bytes kapag na-download na. Para sa isang data URI, ang limitasyon ay nalalapat sa mga na-decode na byte, kaya maaaring umabot ang mismong source file sa laking iyon — ang base64 text ang mas malaki nang halos isang-katlo, na mahalaga para sa iyong request body, hindi para sa limitasyong ito. Ang isang data URI ay dapat magdeklara ng image/* content type at ;base64.

    May dalawang paraan para maglagay ng larawan:

    • Publicly accessible URL: Isang URL na naaabot mula sa pampublikong internet.
    • Data URI: Isang base64-encoded na data URI ng larawan. Halimbawa ng data URI: data:image/jpeg;base64,<your base64-encoded image data>.
  • Name
    name
    Type
    string
    Description

    Opsyonal na pangalan ng task para sa layuning display. Pinakamataas na 100 karakter.

  • Name
    remove_background
    Type
    boolean
    default false
    Description

    Kapag naka-set sa true, ang display render na ibinabalik sa image_urls ay isang transparent RGBA PNG na inalis ang background, kaya maaari mo itong i-composite sa anumang background.

    Nalalapat lamang ito sa display render. Ang candidate na ginagamit ng build endpoint ay hindi apektado, kaya magkapareho ang 3D na resulta sa alinmang paraan.

Mga Ibinabalik

Ang result property ng response ay naglalaman ng task id ng bagong ginawang keycap prototype task. I-poll ang Get a Task na endpoint o mag-subscribe sa stream hanggang maabot ng task ang SUCCEEDED, pagkatapos ay kunin ang entry mula sa candidate_ids at ipasa ito, kasama ng task ID, papunta sa build endpoint.

Mga Paraan ng Pagkabigo

  • Name
    400 - Bad Request
    Description

    Hindi katanggap-tanggap ang request. Mga karaniwang dahilan:

    • Missing parameter: Kinakailangan ang image_url.
    • Invalid image format: Ang ibinigay na image_url ay hindi isang suportadong format (.jpg, .jpeg, .png, .webp).
    • Image dimensions out of range: Masyadong maliit ang larawan, lumalampas sa pinakamataas na sukat ng file, o lumalampas sa pinakamataas na bilang ng pixel.
    • Unreachable URL: Hindi ma-download ang image_url (404 o timeout).
    • Invalid Data URI: Malformed ang base64 string.
    • Content flagged: Na-flag ang input na larawan ng NSFW moderation.
  • Name
    401 - Unauthorized
    Description

    Nabigo ang authentication. Pakisuri ang iyong API key.

  • Name
    402 - Payment Required
    Description

    Nasa free plan ang account (kinakailangan ang paid plan para makagawa ng mga task) o kulang ang credits.

  • Name
    403 - Forbidden
    Description

    Na-flag ang input na larawan ng intellectual property moderation.

  • Name
    429 - Too Many Requests
    Description

    Lumampas ka sa iyong rate limit.

  • Name
    500 - Internal Server Error
    Description

    Nagkaroon ng hindi inaasahang error sa panig ng server — halimbawa, hindi available ang serbisyo ng content-moderation, nabigo ang pag-stage ng input na larawan, o hindi nagawa ang task. Walang task na nagawa sa kasong ito, kaya ligtas ang pag-retry.

Request

POST
/openapi/creative-lab/keycap/v1/prototype
# Stage 1: generate a finished-keycap design render
curl https://api.meshy.ai/openapi/creative-lab/keycap/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>"
  }'

Response

{
  "result": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef"
}

POST/openapi/creative-lab/keycap/v1/build

Create a Keycap Build Task

Bumuo ng huling textured na 3D keycap model mula sa isang matagumpay na prototype task at isa sa mga candidate nito. Ang isang build task ay nagpapatakbo ng buong pipeline mula simula hanggang katapusan — white-model generation mula sa napiling disenyo, awtomatikong pag-upo at pag-cut sa keycap base gamit ang isang na-calibrate na default pose (walang kinakailangang interactive na pagsasaayos), full-model coloring, at panghuling assembly at export. Karaniwang tumatagal ang isang build ng 3–7 minuto, papalapit sa mas mataas na hangganan kapag maraming build ang sabay-sabay na tumatakbo. Sumangguni sa The Keycap 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 parehong OpenAPI endpoint na ito. Ang prototype ay dapat nagawa ng parehong Meshy account, dapat naabot na ang SUCCEEDED, at dapat nakagawa ng kahit isang candidate.

    Ang mga prototype task na ginawa sa pamamagitan ng webapp ay hindi tinatanggap — ang build endpoint ay tumatanggap lamang ng mga prototype task na ginawa ng POST /openapi/creative-lab/keycap/v1/prototype at tinatanggihan ang anumang ibang pinagmulan gamit ang 404.

  • Name
    candidate_id
    Type
    string
    Kinakailangan
    Description

    Ang candidate na bubuuin, kinuha mula sa candidate_ids array ng matagumpay na prototype task. Dapat kabilang ito sa task na iyon; anumang ibang halaga ay tatanggihan gamit ang 400.

  • Name
    name
    Type
    string
    Description

    Opsyonal na pangalan ng task para sa layuning pagpapakita. Maximum na 100 na character.

options

Opsyonal na pagsasaayos ng heometriya. Bawat field ay may na-calibrate na default — ipadala lamang ang mga gusto mong i-override.

  • Name
    base_model
    Type
    string
    default cherry-mx-1x1-r1
    Description

    Ang keycap base na pagbabatayan ng build. Sa kasalukuyan, ang tanging magagamit na halaga ay cherry-mx-1x1-r1 — isang standard na Cherry MX profile 1u keycap. May balak na 3–5 karagdagang mainstream na standard na sukat; hindi suportado ang mga custom na sukat.

  • Name
    head_size_mm
    Type
    number
    default 23
    Description

    Target na sukat ng inukit na ulo, sa milimetro: ang pinakamahabang dimensyon nito ay isinasukat sa halagang ito. Saklaw: [10, 40]. Ang mga halagang mas mataas sa humigit-kumulang 32.9 ay maaaring bawasan upang umangkop pa rin ang ulo sa hangganan ng protective footprint ng base, kaya maaaring mas maliit ang naihatid na pinakamahabang dimensyon kaysa sa hiniling. Ang inilapat na halaga ay hindi pa nirereflect ngayon sa task object — kung kailangan mong kumpirmahin ang aktwal na natanggap na sukat, sukatin ang bounding box ng keycap-head mesh sa na-download na modelo.

  • Name
    vertical_offset_mm
    Type
    number
    default 0
    Description

    Vertical offset na inilalapat sa ulo bago ito iupo sa base, sa milimetro. Saklaw: [-5, 5].

Mga Ibinabalik

Ang result property ng response ay naglalaman ng task id ng bagong nagawang keycap build task. I-poll ang Get a Task endpoint o mag-subscribe sa stream hanggang maabot ng task ang SUCCEEDED, pagkatapos ay i-download ang mga artifact mula sa model_urls.glb at model_urls.obj_zip.

Mga Paraan ng Pagkabigo

  • Name
    400 - Bad Request
    Description

    Hindi katanggap-tanggap ang request. Karaniwang sanhi:

    • Kulang na parameter: kinakailangan ang input_task_id at candidate_id.
    • Di-wastong UUID: Ang input_task_id ay hindi isang wastong UUID.
    • Hindi pa matagumpay ang parent: Ang tinutukoy na prototype task ay hindi pa naabot ang SUCCEEDED.
    • Walang candidate: Nagtagumpay ang prototype task ngunit walang nagawang candidate.
    • Hindi kilalang candidate: Ang candidate_id ay hindi isa sa mga candidate ng input task.
    • Options na labas sa saklaw: Isa sa mga field ng options ay lumabas sa pinapayagang saklaw o enum set nito.
  • Name
    401 - Unauthorized
    Description

    Nabigo ang authentication. Pakisuri ang iyong API key.

  • Name
    402 - Payment Required
    Description

    Nasa free plan ang account (kinakailangan ng paid plan upang makagawa ng mga task) o kulang ang credits.

  • Name
    404 - Not Found
    Description

    Ang tinutukoy na prototype task ay hindi umiiral, pag-aari ng ibang user, o ginawa sa pamamagitan ng webapp (mga prototype task lamang na nasa API mode ang maaaring kumonekta sa build).

  • Name
    429 - Too Many Requests
    Description

    Lumampas ka na sa iyong rate limit.

  • Name
    500 - Internal Server Error
    Description

    May naganap na hindi inaasahang error sa panig ng server — halimbawa, hindi available ang content-moderation service, nabigo ang pag-stage ng input image, o hindi nagawa ang task. Walang task na nagawa sa kasong ito, kaya ligtas ang muling pagsubok.

Request

POST
/openapi/creative-lab/keycap/v1/build
# Stage 2: build the chosen candidate into a 3D keycap
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "input_task_id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
    "candidate_id": "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b",
    "options": {
      "base_model": "cherry-mx-1x1-r1",
      "head_size_mm": 23,
      "vertical_offset_mm": 0
    }
  }'

Response

{
  "result": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af"
}

GET/openapi/creative-lab/keycap/v1/(prototype|build)/:id

Kunin ang Keycap Task

Kunin ang isang prototype o build task gamit ang wastong task id. Ang URL path ay dapat tumugma sa stage ng task — ang isang build task na kinuha gamit ang /prototype/:id ay magbabalik ng 404, at vice versa.

Sumangguni sa The Keycap Prototype Task Object at The Keycap Build Task Object para sa mga hugis ng response.

Mga Parameter

  • Name
    id
    Type
    path
    Description

    Natatanging identifier para sa keycap task na kukunin.

Mga Ibabalik

Ang response ay naglalaman ng keycap task object. Ang hugis nito ay depende sa stage na hiniling.

Request

GET
/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# Build
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Prototype Response

{
  "id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
  "type": "creative-lab-keycap-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142456000,
  "started_at": 1753142460000,
  "finished_at": 1753142516000,
  "expires_at": 1753401716000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 12,
  "image_urls": [
    "https://assets.meshy.ai/***/design-1.png?Expires=***"
  ],
  "candidate_ids": [
    "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
  ]
}

Build Response

{
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "type": "creative-lab-keycap-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142600000,
  "started_at": 1753142610000,
  "finished_at": 1753143050000,
  "expires_at": 1753402250000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 50,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
    "obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
  },
  "process_image_urls": {
    "head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***",
    "composite": "https://assets.meshy.ai/***/composite.png?Expires=***",
    "base_canvas": "https://assets.meshy.ai/***/base-canvas.png?Expires=***"
  }
}

DELETE/openapi/creative-lab/keycap/v1/(prototype|build)/:id

Delete a Keycap Task

Kanselahin ang isang keycap task. Kung ang task ay PENDING pa rin, ang mga credits na nagamit noong oras ng paggawa nito ay ire-refund. Ang mga task na IN_PROGRESS na ay kinakansela nang walang refund (maaaring nagsi- consume na ng resources ang worker). Ang mga task na nasa terminal state na (SUCCEEDED, FAILED, CANCELED) ay hindi na maaaring kanselahin.

Ang URL path ay dapat tumugma sa stage ng task — ang DELETE sa /prototype/:buildId ay magbabalik ng 404.

Path Parameters

  • Name
    id
    Type
    path
    Description

    Natatanging identifier para sa keycap task na kakanselahin.

Returns

Nagbabalik ng 204 No Content kapag matagumpay, na may walang laman na body.

Failure Modes

  • Name
    400 - Bad Request
    Description

    Nasa terminal state na ang task at hindi na ito 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.

  • Name
    500 - Internal Server Error
    Description

    May naganap na hindi inaasahang server-side na error habang kinakansela. Maaaring nakansela na o hindi pa ang task — basahin muli ito upang kumpirmahin bago mag-retry.

Request

DELETE
/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef
curl --request DELETE \
  --url https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

// Returns 204 No Content on success (empty body).

GET/openapi/creative-lab/keycap/v1/(prototype|build)/:id/stream

Stream a Keycap Task

Nag-stream ng mga real-time update para sa isang keycap task gamit ang Server-Sent Events (SSE). Ang URL path ay dapat tumugma sa yugto (stage) ng task — ang pagbukas ng isang stream sa /prototype/:buildId/stream ay maglalabas ng isang solong event: error na payload na may status_code: 404 at isasara ang stream.

Mga Parameter

  • Name
    id
    Type
    path
    Description

    Natatanging identifier para sa keycap task na i-stream.

Ibinabalik

Nagbabalik ng stream ng Keycap Prototype o Keycap Build na task object bilang Server-Sent Events. Dala ng bawat frame ang buong task object para sa yugto — 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 napopulate (null, [] o {}) at ang finished_at ay null.

Request

GET
/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/stream
curl -N https://api.meshy.ai/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/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; fields not yet populated are null / empty.
// The PENDING frame below is abbreviated to the fields that change.
event: message
data: {
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "progress": 0,
  "status": "PENDING"
}

event: message
data: {
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "type": "creative-lab-keycap-build",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142600000,
  "started_at": 1753142610000,
  "finished_at": 1753143050000,
  "expires_at": 1753402250000,
  "task_error": null,
  "consumed_credits": 50,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
    "obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
  },
  "process_image_urls": {
    "head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***"
  }
}

GET/openapi/creative-lab/keycap/v1/(prototype|build)

List Keycap Tasks

Kunin ang isang paginated na listahan ng iyong mga keycap task para sa isang solong stage. Ang URL path ang pumipili ng stage — ang /prototype ay nagbabalik ng mga prototype task; ang /build ay nagbabalik ng mga build task. Ang mga task mula sa kabilang stage ay hindi kasama sa alinmang tugon.

Path Parameters

  • Name
    stage
    Type
    path
    Kinakailangan
    Description

    prototype o build. Ang collection ay nagbabalik lamang ng mga task na ang stage ay tumutugma sa URL — ang pagkuha ng /prototype ay hinding-hindi nagbabalik ng mga build task at vice versa.

Query Parameters

  • Name
    page_num
    Type
    integer
    default 1
    Description

    Numero ng page para sa pagination.

  • Name
    page_size
    Type
    integer
    default 10
    Description

    Limitasyon sa laki ng page. Ang pinakamataas na pinapayagan ay 100 items.

  • Name
    sort_by
    Type
    string
    default -created_at
    Description

    Field na gagamiting batayan sa pag-sort. Mga available na value:

    • +created_at: Isaayos ayon sa oras ng paglikha nang ascending order.
    • -created_at: Isaayos ayon sa oras ng paglikha nang descending order.

Ibinabalik

Nagbabalik ng isang paginated na listahan ng per-stage task object — maaaring ang keycap prototype task object kapag naglilista ng /prototype o ang keycap build task object kapag naglilista ng /build.

Request

GET
/openapi/creative-lab/keycap/v1/prototype
# List prototype tasks
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype?page_size=10 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# List build tasks
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build?page_size=10 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response (List Prototype Tasks)

[
  {
    "id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
    "type": "creative-lab-keycap-prototype",
    "name": "",
    "status": "SUCCEEDED",
    "progress": 100,
    "created_at": 1753142456000,
    "started_at": 1753142460000,
    "finished_at": 1753142516000,
    "expires_at": 1753401716000,
    "preceding_tasks": 0,
    "task_error": null,
    "consumed_credits": 12,
    "image_urls": [
      "https://assets.meshy.ai/***/design-1.png?Expires=***"
    ],
    "candidate_ids": [
      "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
    ]
  }
]

Ang Keycap Prototype Task Object

Ang Keycap Prototype Task object ay isang yunit ng trabaho na sinusubaybayan ng Meshy upang makabuo ng isang finished-keycap design image mula sa isang source photo. Ang output ng yugtong ito ay ikinakabit sa the build stage sa pamamagitan ng input_task_id kasama ang candidate_id.

Mga Property

  • 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 ka dapat gumawa ng anumang palagay tungkol sa format ng id.

  • Name
    type
    Type
    string
    Description

    Uri ng task. Ang value ay creative-lab-keycap-prototype.

  • Name
    name
    Type
    string
    Description

    Ang pangalan ng task na ibinigay noong likhain ang task. Empty string kung walang pangalang ibinigay.

  • 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 nalikha ang task, sa milliseconds.

  • Name
    started_at
    Type
    timestamp
    Description

    Timestamp kung kailan sinimulan ang task, sa milliseconds. Kung hindi pa nasisimulan ang task, ang property na ito ay magiging 0.

  • Name
    finished_at
    Type
    timestamp
    Description

    Timestamp kung kailan natapos ang task, sa milliseconds. Kung hindi pa natatapos ang task, ang property na ito ay magiging 0.

  • Name
    expires_at
    Type
    timestamp
    Description

    Timestamp kung kailan mag-e-expire ang resulta ng task, sa milliseconds.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Ang bilang ng mga naunang task.

  • Name
    task_error
    Type
    object
    Description

    Mga detalye ng error para sa mga nabigong task. Tingnan ang Errors para sa buong reference ng task_error object.

  • Name
    consumed_credits
    Type
    integer
    Description

    Ang bilang ng credits na nagamit ng task na ito. Ang isang task na umabot sa SUCCEEDED ay sinisingil ng buong halaga para sa kanyang stage. Ang isang task na hindi kailanman nalikha (isang 4xx sa oras ng request, kabilang ang isang moderation rejection) ay hindi sinisingil ng anuman. Ang isang task na umabot sa FAILED ay nagbabalik ng 0 — ang singil ay ire-refund, kabilang ang isang asynchronous moderation block. Ang pagkansela sa pamamagitan ng DELETE ay nagre-refund lamang habang ang task ay PENDING pa; ang isang task na IN_PROGRESS na ay mananatiling sisingilin, dahil nagamit na ang trabaho.

  • Name
    image_urls
    Type
    array of strings
    Description

    Nada-download na URL ng finished-keycap design render — kung ano ang itsura ng candidate bilang isang tapos na keycap. May iisang entry lamang; ang image_urls[i] ay tumutugma sa candidate_ids[i]. Walang laman hanggang umabot ang task sa SUCCEEDED. Ang URL ay para lamang sa pagpapakita; ang build endpoint ay gumagamit ng candidate_ids, hindi ng mga URL na ito. Kaparehong URL lifecycle ng model_urls: naka-sign, walang Authorization header, balido hanggang expires_at, at matatag kapag binasa ulit ang task.

  • Name
    candidate_ids
    Type
    array of strings
    Description

    Mga opaque candidate identifier, kaparalel ng image_urls. Ipasa ang entry na tumutugma sa iyong napiling disenyo bilang candidate_id ng build request. Huwag gumawa ng anumang palagay tungkol sa format ng mga id na ito.

Example Keycap Prototype Task Object

{
  "id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
  "type": "creative-lab-keycap-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142456000,
  "started_at": 1753142460000,
  "finished_at": 1753142516000,
  "expires_at": 1753401716000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 12,
  "image_urls": [
    "https://assets.meshy.ai/***/design-1.png?Expires=***"
  ],
  "candidate_ids": [
    "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
  ]
}

Ang Keycap Build Task Object

Ang Keycap Build Task object ay isang work unit na sinusubaybayan ng Meshy upang buuin ang panghuling na-texture na 3D keycap mula sa isang matagumpay na prototype task at isang piniling candidate. Ang isang build ay tumatakbo sa buong pipeline — white-model generation, awtomatikong seating at cutting, coloring, assembly, at export.

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-keycap-build.

  • Name
    name
    Type
    string
    Description

    Ang pangalan ng task na ibinigay noong ginawa ang task. Blangkong 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

    Ang 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 paglikha ng task, sa milliseconds.

  • Name
    started_at
    Type
    timestamp
    Description

    Timestamp ng pagsisimula ng task, sa milliseconds.

  • Name
    finished_at
    Type
    timestamp
    Description

    Timestamp ng pagkatapos ng task, sa milliseconds.

  • Name
    expires_at
    Type
    timestamp
    Description

    Timestamp kung kailan mag-e-expire ang resulta ng task, sa milliseconds.

  • 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 buong 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 kanyang stage. Ang task na hindi kailanman nagawa (isang 4xx sa oras ng request, kabilang ang pagtanggi ng moderation) ay hindi sinisingil. Ang task na umabot sa FAILED ay nagbabalik ng 0 — ang singil ay ire-refund, kabilang ang asynchronous na moderation block. Ang pagkansela sa pamamagitan ng DELETE ay nagre-refund lamang habang ang task ay PENDING pa; ang task na IN_PROGRESS na ay mananatiling sisingilin, dahil nagamit na ang trabaho.

  • Name
    model_urls
    Type
    object
    Description

    Mga URL na maaaring i-download para sa mga nabuong model artifact. Parehong ang GLB at ang OBJ bundle ay na-export sa real-world millimeter scale, Y-up, na ang harapan ng keycap ay nakaharap sa +Z. Ang mga mesh ay pinangalanang keycap-head at keycap-base; kapag ang base ay bumalik sa isang pattern fill, isang ikatlong mesh na keycap-base-interior ay naroroon din para sa stem cavity. Huwag ipagpalagay na eksaktong dalawang mesh lamang mayroon.

    Ito ay mga signed URL: kunin ang mga ito nang walang header na Authorization. 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 nagbabalik ng eksaktong parehong URL sa halip na isang bagong signed na URL. I-download at i-store mo mismo ang mga file bago iyon — walang paraan upang i-refresh ang isang expired na link.

    • Name
      glb
      Type
      string
      Description

      Downloadable URL sa panghuling na-texture na model.glb.

    • Name
      obj_zip
      Type
      string
      Description

      Downloadable URL sa isang zip bundle na naglalaman ng model.obj, model.mtl, at ang mga texture PNG na aktwal na tinutukoy ng MTL nito. Ang isang solid-color na base ay may kasamang keycap-head.png lamang; ang isang may pattern na base ay may kasamang keycap-base.png din.

  • Name
    process_image_urls
    Type
    object
    Description

    Mga URL na maaaring i-download para sa mga intermediate na process image, naka-key ayon sa uri. Kaparehong URL lifecycle ng model_urls: signed, walang header na Authorization, valid hanggang expires_at, at stable kapag muling binasa ang task. Kasalukuyang inilalabas na mga uri:

    • head_design — ang design image ng piniling candidate na ginamit ng build (laging naroroon).
    • composite — ang finished-keycap display render ng piniling candidate (naroroon kapag available).
    • base_canvas — ang pininturahang keycap-base canvas (naroroon kapag available).

    Ituring na open-ended ang key set na ito; maaaring magdagdag ng mga bagong uri nang walang breaking change.

Example Keycap Build Task Object

{
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "type": "creative-lab-keycap-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1753142600000,
  "started_at": 1753142610000,
  "finished_at": 1753143050000,
  "expires_at": 1753402250000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 50,
  "model_urls": {
    "glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
    "obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
  },
  "process_image_urls": {
    "head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***",
    "composite": "https://assets.meshy.ai/***/composite.png?Expires=***",
    "base_canvas": "https://assets.meshy.ai/***/base-canvas.png?Expires=***"
  }
}

End-to-End Example

Ang kumpletong daloy: gumawa ng prototype mula sa isang larawan, i-poll ito hanggang SUCCEEDED, pumili ng kandidato mula sa candidate_ids, gumawa ng build gamit ang kandidatong iyon, i-poll ang build hanggang SUCCEEDED, pagkatapos ay i-download ang GLB at ang OBJ bundle mula sa model_urls.

Pinipili ng halimbawa ang unang kandidato nang programatiko. Sa isang tunay na integrasyon, ipapakita mo ang entry ng image_urls sa end user at hahayaan silang pumili; ang napiling index ay isa-sa-isang naitutugma sa candidate_ids.

Complete flow

POST
/openapi/creative-lab/keycap/v1
#!/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://...
: "${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

BASE="https://api.meshy.ai/openapi/creative-lab/keycap/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 '{"image_url":"data:%s;base64,' "$MIME"
    base64 <"$IMAGE_PATH" | tr -d '\n'
    printf '"}'
  } >"$BODY"
else
  printf '{"image_url":"%s"}' "$IMAGE_URL" >"$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 design render
poll prototype "$PROTO_ID"

# 3. Pick a candidate (first one here; show image_urls to a user in production)
CANDIDATE_ID=$(api GET "$BASE/prototype/$PROTO_ID" | jq -r '.candidate_ids[0]')

# 4. Create the build task
jq -n --arg p "$PROTO_ID" --arg c "$CANDIDATE_ID" \
  '{input_task_id: $p, candidate_id: $c}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
  -H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')

# 5. Wait for the model (a build usually takes 3-7 minutes)
poll build "$BUILD_ID"

# 6. Download the artifacts. These are signed URLs: no Authorization header,
#    and they stay valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
  -o keycap.glb "$(jq -r '.model_urls.glb' <<<"$TASK")"
curl --silent --show-error --fail --max-time 900 \
  -o keycap-obj.zip "$(jq -r '.model_urls.obj_zip' <<<"$TASK")"
echo "Done: keycap.glb + keycap-obj.zip"