Creative Lab Keycap API
Förvandla ett foto till en helfärgad, anpassad keycap för ett mekaniskt tangentbord i två steg. En prototypuppgift genererar en bild av den färdiga keycapen utifrån fotot. En bygguppgift omvandlar den bilden till en texturerad 3D-keycapmodell. Den använder prototypuppgiftens ID som input_task_id och bildens kandidat-ID som candidate_id.
POST /openapi/creative-lab/keycap/v1/prototypePOST /openapi/creative-lab/keycap/v1/build
Båda POST-endpointerna kräver en betald plan. En förfrågan från ett konto med gratisplan returnerar 402.
Skapa en Keycap-prototyptask
Genererar en bild av den färdiga keycappen utifrån ett foto. Taskens image_urls innehåller bilden, och candidate_ids innehåller dess ID, med en post i vardera. Om du inte gillar designen kan du skapa en ny prototyptask. Meshy debiterar varje prototyptask separat.
För att bygga den 3D-keycappen skickar du denna tasks ID till build-endpointen som input_task_id, med posten från candidate_ids som candidate_id. För taskens fält, se The Keycap prototype task object.
Request
# 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"
}
Parametrar
- Name
- image_url
- Type
- string
- Obligatorisk
- Description
Fotot som ska omvandlas till en keycap-design, som en offentlig URL eller en data-URI (
data:image/jpeg;base64,<your base64-encoded image data>).Bilden måste vara en JPG-, JPEG-, PNG- eller WebP-fil på max 20 MB (20 000 000 byte). Varje sida måste vara minst 32 pixlar, och bilden kan ha totalt högst 178 956 970 pixlar. En bild utanför dessa gränser returnerar
400.Meshy identifierar formatet utifrån bilddatan, inte utifrån filändelsen i URL:en. En URL utan filändelse fungerar, och Meshy följer HTTP-omdirigeringar. Meshy tillämpar EXIF-orienteringen, så ett roterat mobilfoto kommer ut så som det ser ut.
En data-URI måste vara base64-kodad med en bildtyp, till exempel
data:image/png;base64,..., och den avkodade bilden måste vara JPEG, PNG eller WebP. 20 MB-gränsen gäller för den avkodade bilden, så base64-texten kan vara ungefär en tredjedel större.
- Name
- name
- Type
- string
- Description
Ett namn för tasken, upp till 100 tecken. Det returneras i taskens fält
name. Ett längre namn returnerar400.
- Name
- remove_background
- Type
- boolean
- standard false
- Description
Om bakgrunden ska tas bort från prototypbilden.
truereturnerar en transparent RGBA-PNG, så att du kan placera keycappen mot vilken bakgrund som helst. Om Meshy inte kan ta bort bakgrunden returneras bilden med sin bakgrund, och tasken lyckas ändå.Huvuddesignen som bygget omvandlar till 3D behåller sin bakgrund oavsett. Bygget målar keycap-basen utifrån bilden i
image_urls, utan dess bakgrund om du skickadetrue. Bygget returnerar den bilden somprocess_image_urls.composite.
Returvärden
Fältet result innehåller ID:t för den nya prototyptasken. Hämta tasken eller strömma den tills status är SUCCEEDED. Skicka sedan ID:t till build-endpointen som input_task_id, med posten från candidate_ids som candidate_id.
Felscenarier
- Name
400 - Bad Request- Description
Förfrågan kan inte köras. Till exempel:
image_urlsaknas.- Bilden är inte en JPG-, JPEG-, PNG- eller WebP-fil.
- Bilden är för liten, över 20 MB, eller över det maximala antalet pixlar.
- Meshy kan inte ladda ner bilden, till exempel för att URL:en returnerar
404eller tidsgränsen överskrids. - Data-URI:n är inte giltig base64.
- Bilden flaggades som NSFW.
Felmeddelandet anger vilket problem som hittades. Åtgärda förfrågan och skicka den igen.
- Name
401 - Unauthorized- Description
API-nyckeln saknas eller är ogiltig. Kontrollera headern
Authorization.
- Name
402 - Payment Required- Description
Något av följande gäller:
- Kontot har inte tillräckligt med credits.
- API-nyckeln, arbetsytan eller medlemmen har nått sin creditgräns.
- Kontot har en gratisplan.
Kontrollera dina credits och din plan, och försök igen.
- Name
403 - Forbidden- Description
Ditt team har IP Filtering aktiverat, och Meshy har flaggat bilden för tredjeparts immateriella rättigheter. Skicka en bild som du har rätt att använda.
- Name
429 - Too Many Requests- Description
Någon av dessa gränser nåddes:
- Du skickade fler förfrågningar än vad din hastighetsgräns tillåter. Vänta några sekunder och försök igen. Se Hastighetsgränser.
- För många av dina tasks köar eller körs. Vänta tills några är klara och försök igen.
- På en obegränsad plan utan credits kvar har du nått antalet tasks som kan köras utan credits. Vänta tills en task är klar, eller lägg till credits.
- Name
500 - Internal Server Error- Description
Meshy stötte på ett serverfel, till exempel för att innehållsmoderering eller kontrollen av immateriella rättigheter inte kunde köras, eller för att Meshy inte kunde lagra bilden. Meshy skapar inte tasken, och återbetalar eventuella credits som debiterades. Försök igen med förfrågan.
Skapa en Keycap build-uppgift
Genererar den texturerade 3D-keycapen från en lyckad prototyp-uppgift och en av dess kandidater. För dess fält, se The Keycap build task object.
En build-uppgift kör varje steg. Den genererar en 3D-modell från designen och färglägger den. Sedan placerar och skär den modellen på keycap-basen i en kalibrerad standardposition, så du behöver inte justera den för hand. Till sist monterar den keycapen och exporterar filerna. En build tar vanligtvis 3 till 7 minuter.
Request
# 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"
}
Parametrar
- Name
- input_task_id
- Type
- string
- Obligatorisk
- Description
ID:t för den prototyp-uppgift som ska byggas. Det måste vara en uppgift som ditt konto skapade med
POST /openapi/creative-lab/keycap/v1/prototype, med statusenSUCCEEDED.Ett ID som inte är en av dina Keycap-prototypuppgifter från API:et returnerar
404, inklusive en prototyp skapad i webbappen.
- Name
- candidate_id
- Type
- string
- Obligatorisk
- Description
Kandidaten som ska byggas, från prototyp-uppgiftens array
candidate_ids. Ett värde som inte finns i den arrayen returnerar400.
- Name
- name
- Type
- string
- Description
Ett namn för uppgiften, upp till 100 tecken. Det returneras i uppgiftens fält
name. Ett längre namn returnerar400.
options
Valfria geometri-inställningar. Varje fält har ett kalibrerat standardvärde, så skicka endast de fält du vill ändra.
- Name
- base_model
- Type
- string
- standard cherry-mx-1x1-r1
- Description
Keycap-basen att bygga på. Det enda värdet är
cherry-mx-1x1-r1, en standard Cherry MX-profil 1u keycap. Anpassade storlekar stöds inte, och alla andra värden returnerar400.
- Name
- head_size_mm
- Type
- number
- standard 23
- Description
Storleken på huvudet längs dess längsta dimension, i millimeter, från
10till40. Meshy skalar huvudet så att dess längsta dimension matchar detta värde. Ett värde utanför intervallet returnerar400.För ett värde över ungefär
32.9kan Meshy minska storleken så att huvudet passar basens skyddande fotavtrycksgräns. Huvudet kan då bli mindre än du begärde. Uppgiftsobjektet returnerar inte den storlek som Meshy tillämpade. För att kontrollera den, mät begränsningsrutan förkeycap-head-nätet i modellen.
- Name
- vertical_offset_mm
- Type
- number
- standard 0
- Description
Den vertikala förskjutning som ska tillämpas på huvudet innan Meshy placerar det på basen, i millimeter, från
-5till5. Ett värde utanför intervallet returnerar400.
Returer
Fältet result innehåller ID:t för den nya build-uppgiften. Hämta uppgiften eller strömma den tills status är SUCCEEDED. Ladda sedan ner GLB-filen från model_urls.glb och OBJ-paketet från model_urls.obj_zip.
Meshy exporterar GLB-filen och OBJ-paketet i verklig skala i millimeter. Båda använder ett Y-upp-koordinatsystem, med keycapens framsida vänd mot +Z.
Felscenarier
- Name
400 - Bad Request- Description
Begäran kan inte köras. Till exempel:
input_task_idsaknas eller är inte ett giltigt uppgifts-ID.- Prototyp-uppgiftens status är inte
SUCCEEDED. Om den fortfarande körs, vänta och försök igen. Om den misslyckades eller avbröts, skapa en ny prototyp-uppgift. - Prototyp-uppgiften lyckades men saknar kandidater. Skapa en ny prototyp-uppgift.
candidate_idsaknas, eller finns inte i prototyp-uppgiftenscandidate_ids. Skicka ett värde från den arrayen.- Ett fält i
optionsär utanför intervallet, ellerbase_modelär inte ett tillgängligt värde.
Felmeddelandet anger vilket problem det hittade.
- Name
401 - Unauthorized- Description
API-nyckeln saknas eller är ogiltig. Kontrollera
Authorization-huvudet.
- Name
402 - Payment Required- Description
Ett av följande gäller:
- Kontot har inte tillräckligt med credits.
- API-nyckeln, arbetsytan eller medlemmen nådde sin creditgräns.
- Kontot har en gratisplan.
Kontrollera dina credits och din plan, och försök igen.
- Name
404 - Not Found- Description
input_task_idmatchar ingen Keycap-prototypuppgift som ditt konto skapade med API:et. En prototyp skapad i webbappen returnerar också404. Skickaresult-ID:t från ett svar vid skapande av prototyp.
- Name
429 - Too Many Requests- Description
En av dessa gränser nåddes:
- Du skickade fler förfrågningar än din hastighetsgräns tillåter. Vänta några sekunder och försök igen. Se Rate limits.
- För många av dina uppgifter är köade eller körs. Vänta tills några är klara och försök igen.
- På en obegränsad plan utan kvarvarande credits har du nått antalet uppgifter som kan köras utan credits. Vänta tills en uppgift är klar, eller lägg till credits.
- Name
500 - Internal Server Error- Description
Meshy kunde inte skapa uppgiften på grund av ett serverfel. Meshy återbetalar eventuella credits som debiterades. Försök igen med begäran.
Hämta en Keycap-uppgift
Returnerar en prototyp- eller bygguppgift. Sökvägen måste matcha uppgiftens steg. En bygguppgift som begärs via /prototype/:id returnerar 404, och detsamma gäller för en prototypuppgift som begärs via /build/:id.
För fälten, se Keycap-prototypuppgiftsobjektet och Keycap-bygguppgiftsobjektet.
Request
# 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=***"
}
}
Parametrar
- Name
- id
- Type
- path
- Description
Uppgifts-ID:t från skaparsvaret.
Returnerar
Prototypuppgiftsobjektet eller bygguppgiftsobjektet, beroende på vilket steg som matchar sökvägen.
Felscenarier
- Name
400 - Bad Request- Description
idär inte ett giltigt uppgifts-ID. Skickaresult-ID:t från skaparsvaret.
- Name
403 - Forbidden- Description
Ditt team har IP Filtering aktiverat, och Meshy har flaggat prototypuppgiftens bild för tredjeparts immateriella rättigheter. Byggsuppgifter och team på Enterprise-planen får inte detta fel. Skapa en prototypuppgift från en bild du har rättigheter att använda.
- Name
404 - Not Found- Description
Ingen Keycap-uppgift med detta ID tillhör ditt konto, eller så matchar inte uppgiftens steg sökvägen. Kontrollera ID:t, och använd
/prototypeeller/buildför att matcha uppgiften.
- Name
500 - Internal Server Error- Description
Meshy kunde inte köra kontrollen av immateriella rättigheter. Försök igen med förfrågan.
Ta bort en Keycap-uppgift
Avbryter en Keycap-uppgift. Att avbryta en uppgift med status PENDING återbetalar dess credits. En uppgift med status IN_PROGRESS avbryts utan återbetalning, eftersom en worker redan har påbörjat den. En uppgift med en slutgiltig status (SUCCEEDED, FAILED eller CANCELED) kan inte avbrytas.
Sökvägen måste matcha uppgiftens steg. Till exempel returnerar DELETE på /prototype/:id med ett build-uppgifts-ID 404.
Request
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).
Sökvägsparametrar
- Name
- id
- Type
- path
- Description
ID:t för uppgiften som ska avbrytas.
Returnerar
204 No Content med en tom body.
Felscenarier
- Name
400 - Bad Request- Description
Något av följande gäller:
idär inte ett giltigt uppgifts-ID. Skickaresult-ID:t från skapandesvaret.- Uppgiften har redan en slutgiltig status (
SUCCEEDED,FAILEDellerCANCELED), så den kan inte avbrytas.
- Name
404 - Not Found- Description
Ingen Keycap-uppgift med detta ID tillhör ditt konto, eller så matchar inte uppgiftens steg sökvägen. Kontrollera ID:t och använd
/prototypeeller/buildför att matcha uppgiften.
- Name
500 - Internal Server Error- Description
Meshy stötte på ett serverfel vid avbrytandet av uppgiften, så uppgiften kan ha avbrutits eller inte. Hämta uppgiften för att kontrollera dess
statusinnan du försöker igen.
Strömma en Keycap-uppgift
Strömmar uppdateringar för en Keycap-uppgift som Server-Sent Events (SSE). Sökvägen måste matcha uppgiftens steg. Om den inte gör det, till exempel en build-uppgifts ID på /prototype/:id/stream, skickar strömmen ett error-event med status_code: 404 och stängs.
Request
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 following PENDING frame is shortened 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=***"
}
}
Parametrar
- Name
- id
- Type
- path
- Description
Uppgiftens ID från create-svaret.
Returnerar
En ström av prototype- eller build-uppgiftsobjekt. Varje event innehåller hela uppgiftsobjektet, så som Hämta en Keycap-uppgift returnerar det. Medan uppgiften är PENDING eller IN_PROGRESS är dess utdatafält fortfarande tomma (null, [] eller {}), och finished_at är null.
Om IP-filtrering blockerar uppgiftens resultat skickar strömmen ett error-event i dess ställe, med den status_code som en get-förfrågan skulle returnera.
Lista Keycap-uppgifter
Returnerar dina Keycap-uppgifter för ett steg, en sida i taget. Sökvägen väljer steget. /prototype returnerar endast prototyp-uppgifter, och /build returnerar endast build-uppgifter.
Request
# 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"
]
}
]
Sökvägsparametrar
- Name
- stage
- Type
- path
- Obligatorisk
- Description
Steget som ska listas,
prototypeellerbuild.
Frågeparametrar
- Name
- page_num
- Type
- integer
- standard 1
- Description
Sidan som ska returneras, från
1till255.0returnerar den första sidan. Ett värde utanför0till255returnerar400.
- Name
- page_size
- Type
- integer
- standard 10
- Description
Antal uppgifter per sida, upp till
100. Ett värde från101till255returnerar 100 uppgifter, och0använder standardvärdet. Ett värde utanför0till255returnerar400.
- Name
- sort_by
- Type
- string
- standard -created_at
- Description
Sorteringsordningen.
Tillgängliga värden:
-created_at: nyaste först+created_at: äldsta först
Returnerar
En array av prototyp-uppgiftsobjekt eller build-uppgiftsobjekt, matchande steget i sökvägen.
Keycap-prototyp-uppgiftsobjektet
En prototyp-uppgift genererar en bild av den färdiga keycap från ett foto. För att omvandla designen till en 3D-keycap, skicka uppgiftens ID till build-endpointen som input_task_id, med dess candidate_ids-post som candidate_id.
Egenskaper
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"
]
}
- Name
- id
- Type
- string
- Description
Uppgiftens ID. Förlita dig inte på dess format.
- Name
- type
- Type
- string
- Description
Uppgiftstypen, alltid
creative-lab-keycap-prototype.
- Name
- name
- Type
- string
- Description
Det
namedu skickade när du skapade uppgiften, eller""om du inte skickade något.
- Name
- status
- Type
- string
- Description
Uppgiftens status.
Tillgängliga värden:
PENDING: väntar i könIN_PROGRESS: genererar resultatetSUCCEEDED: slutgiltig, med resultatetFAILED: slutgiltig, med orsaken itask_errorCANCELED: slutgiltig, utan resultat
- Name
- progress
- Type
- integer
- Description
Procentandel av arbetet som är klart, från
0till100. Det är0tills uppgiften startar och100när den lyckas.
- Name
- created_at
- Type
- timestamp
- Description
Tidpunkten då uppgiften skapades, i Unix-millisekunder.
- Name
- started_at
- Type
- timestamp
- Description
Tidpunkten då en arbetare startade uppgiften, i Unix-millisekunder.
nullfram tills dess.
- Name
- finished_at
- Type
- timestamp
- Description
Tidpunkten då uppgiften nådde en slutgiltig status, i Unix-millisekunder.
nullfram tills dess.
- Name
- expires_at
- Type
- timestamp
- Description
Tidpunkten då uppgiftens resultat upphör att gälla, i Unix-millisekunder. Det är 3 dagar efter
finished_at, eller 3 dagar eftercreated_attills uppgiften är klar. För Enterprise-konton, som behåller API-resultat på obestämd tid, är det omkring 100 år senare. Se Tillgångslagring.
- Name
- preceding_tasks
- Type
- integer
- Description
Uppgiftens position i kön medan den är
PENDING.1betyder att den startar härnäst.0efter att uppgiften lämnat kön, och alltid0i listresultat.
- Name
- task_error
- Type
- object
- Description
Varför uppgiften misslyckades.
nullom intestatusärFAILED. Se Fel.
- Name
- consumed_credits
- Type
- integer
- Description
Antal credits som debiterades för uppgiften, efter eventuell återbetalning. En begäran som returnerar ett fel debiteras inte. En misslyckad uppgift är
0, eftersom Meshy återbetalar den. Avbrytning återbetalar en uppgift endast medan den ärPENDING. Om Meshy inte kan läsa debiteringen utelämnar ett get- eller stream-svar fältet, och en listbegäran returnerar500. Försök i så fall igen med begäran.
- Name
- image_urls
- Type
- array of strings
- Description
Nedladdnings-URL:er för bilden av den färdiga keycap. Arrayen har en URL efter att uppgiften lyckats, och är tom fram tills dess.
image_urls[i]visar kandidaten icandidate_ids[i].Dessa URL:er är för visning. Build-endpointen tar en post från
candidate_ids, inte en URL. De är signerade URL:er, så hämta dem utan enAuthorization-header. De förblir giltiga fram tillexpires_at, och att hämta uppgiften igen returnerar samma URL:er.
- Name
- candidate_ids
- Type
- array of strings
- Description
ID:n för kandidaterna, i samma ordning som
image_urls. För att bygga en kandidat, skicka dess ID somcandidate_idi build-begäran. Förlita dig inte på formatet av dessa ID:n.
The Keycap build task object
En build-uppgift genererar den texturerade 3D-keycappen från en lyckad prototyp-uppgift och en av dess kandidater. Den genererar 3D-modellen, färglägger den, placerar och skär till den på keycap-basen, och monterar och exporterar sedan keycappen.
Egenskaper
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=***"
}
}
- Name
- id
- Type
- string
- Description
Uppgiftens ID. Förlita dig inte på dess format.
- Name
- type
- Type
- string
- Description
Uppgiftstypen, alltid
creative-lab-keycap-build.
- Name
- name
- Type
- string
- Description
Det
namedu skickade när du skapade uppgiften, eller""om du inte skickade något.
- Name
- status
- Type
- string
- Description
Uppgiftens status.
Tillgängliga värden:
PENDING: väntar i könIN_PROGRESS: genererar resultatetSUCCEEDED: slutgiltig, med resultatetFAILED: slutgiltig, med anledningen itask_errorCANCELED: slutgiltig, utan resultat
- Name
- progress
- Type
- integer
- Description
Procent av arbetet som är klart, från
0till100. Det är0tills uppgiften startar och100när den lyckas.
- Name
- created_at
- Type
- timestamp
- Description
Tidpunkt då uppgiften skapades, i Unix-millisekunder.
- Name
- started_at
- Type
- timestamp
- Description
Tidpunkt då en arbetare startade uppgiften, i Unix-millisekunder.
nullfram tills dess.
- Name
- finished_at
- Type
- timestamp
- Description
Tidpunkt då uppgiften nådde en slutgiltig status, i Unix-millisekunder.
nullfram tills dess.
- Name
- expires_at
- Type
- timestamp
- Description
Tidpunkt då uppgiftens resultat löper ut, i Unix-millisekunder. Det är 3 dagar efter
finished_at, eller 3 dagar eftercreated_attills uppgiften är klar. För Enterprise-konton, som behåller API-resultat på obestämd tid, är det ungefär 100 år senare. Se Tillgångslagring.
- Name
- preceding_tasks
- Type
- integer
- Description
Uppgiftens position i kön medan den är
PENDING.1betyder att den startar härnäst.0efter att uppgiften lämnar kön, och alltid0i listresultat.
- Name
- task_error
- Type
- object
- Description
Varför uppgiften misslyckades.
nullom intestatusärFAILED. Se Fel.
- Name
- consumed_credits
- Type
- integer
- Description
Antal credits som debiterats för uppgiften, efter eventuell återbetalning. En begäran som returnerar ett fel debiteras inte. En misslyckad uppgift är
0, eftersom Meshy återbetalar den. Avbrytning återbetalar en uppgift endast medan den ärPENDING. Om Meshy inte kan läsa debiteringen utelämnar ett get- eller stream-svar fältet, och en listbegäran returnerar500. Försök i så fall igen med begäran.
- Name
- model_urls
- Type
- object
- Description
Nedladdnings-URL:er för 3D-modellen. Meshy exporterar GLB-filen och OBJ-paketet i verklig skala i millimeter, Y-upp, med framsidan av keycappen vänd mot +Z.
Modellen har nät som heter
keycap-headochkeycap-base. När Meshy faller tillbaka på en mönsterfyllning för basen har modellen också ettkeycap-base-interior-nät för stammens hålrum. Anta inte att modellen har exakt två nät.Dessa är signerade URL:er, så hämta dem utan en
Authorization-header. De förblir giltiga tillsexpires_at, och att hämta uppgiften igen innan dess returnerar samma URL:er. En utgången URL kan inte förnyas, så ladda ner och lagra filerna innan dess.- Name
glb- Type
- string
- Description
Nedladdnings-URL för den texturerade GLB-filen,
model.glb.
- Name
obj_zip- Type
- string
- Description
Nedladdnings-URL för OBJ-paketet, en ZIP-fil med
model.obj,model.mtl, och PNG-texturerna sommodel.mtlanvänder. Med en enfärgad bas är den enda texturenkeycap-head.png. Med en mönstrad bas har ZIP-filen ocksåkeycap-base.png.
- Name
- process_image_urls
- Type
- object
- Description
Nedladdnings-URL:er för bilder från build-uppgiftens steg, nyckelade efter typ. Precis som
model_urlsär de signerade URL:er, så hämta dem utan enAuthorization-header. De förblir giltiga tillsexpires_at, och att hämta uppgiften igen returnerar samma URL:er.Den kan ha dessa nycklar:
head_design: designbilden för den valda kandidaten, som build-uppgiften omvandlade till 3D. Alltid närvarande.composite: bilden av den färdiga keycappen för den valda kandidaten, som build-uppgiften målade basen utifrån. Kan saknas.base_canvas: den målade keycap-basen. Kan saknas.
Meshy kan lägga till nycklar, så ignorera en nyckel du inte känner igen.
Exempel på fullständigt flöde
Exemplet kör hela flödet:
- Skapa en prototyp-task från ett foto.
- Hämta tasken tills dess
statusärSUCCEEDED. - Välj en kandidat från
candidate_ids. - Skapa en build-task med den kandidaten.
- Hämta build-tasken tills dess
statusärSUCCEEDED. - Ladda ner GLB-filen och OBJ-paketet från
model_urls.
Exemplet väljer den första kandidaten. I din app bör du visa posterna i image_urls för användarna och låta dem välja. Index för en vald bild i image_urls är index för dess ID i candidate_ids.
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://...
: "${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"