lowpoly avvecklas den 30 okt. 2026. Byt modell före dessa datum för att undvika fel i förfrågningar. Se alla utfasningar

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/prototype
  • POST /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.


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

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

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"
}

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 returnerar 400.

  • Name
    remove_background
    Type
    boolean
    standard false
    Description

    Om bakgrunden ska tas bort från prototypbilden. true returnerar 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 skickade true. Bygget returnerar den bilden som process_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_url saknas.
    • 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 404 eller 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.


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

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

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"
}

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 statusen SUCCEEDED.

    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 returnerar 400.

  • 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 returnerar 400.

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 returnerar 400.

  • Name
    head_size_mm
    Type
    number
    standard 23
    Description

    Storleken på huvudet längs dess längsta dimension, i millimeter, från 10 till 40. Meshy skalar huvudet så att dess längsta dimension matchar detta värde. Ett värde utanför intervallet returnerar 400.

    För ett värde över ungefär 32.9 kan 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ör keycap-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 -5 till 5. Ett värde utanför intervallet returnerar 400.

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.

Felscenarier

  • Name
    400 - Bad Request
    Description

    Begäran kan inte köras. Till exempel:

    • input_task_id saknas 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_id saknas, eller finns inte i prototyp-uppgiftens candidate_ids. Skicka ett värde från den arrayen.
    • Ett fält i options är utanför intervallet, eller base_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_id matchar ingen Keycap-prototypuppgift som ditt konto skapade med API:et. En prototyp skapad i webbappen returnerar också 404. Skicka result-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.


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

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

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=***"
  }
}

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. Skicka result-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 /prototype eller /build fö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.


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

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

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).

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. Skicka result-ID:t från skapandesvaret.
    • Uppgiften har redan en slutgiltig status (SUCCEEDED, FAILED eller CANCELED), 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 /prototype eller /build fö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 status innan du försöker igen.


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

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

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


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

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

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"
    ]
  }
]

Sökvägsparametrar

  • Name
    stage
    Type
    path
    Obligatorisk
    Description

    Steget som ska listas, prototype eller build.

Frågeparametrar

  • Name
    page_num
    Type
    integer
    standard 1
    Description

    Sidan som ska returneras, från 1 till 255. 0 returnerar den första sidan. Ett värde utanför 0 till 255 returnerar 400.

  • Name
    page_size
    Type
    integer
    standard 10
    Description

    Antal uppgifter per sida, upp till 100. Ett värde från 101 till 255 returnerar 100 uppgifter, och 0 använder standardvärdet. Ett värde utanför 0 till 255 returnerar 400.

  • 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 name du 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ön
    • IN_PROGRESS: genererar resultatet
    • SUCCEEDED: slutgiltig, med resultatet
    • FAILED: slutgiltig, med orsaken i task_error
    • CANCELED: slutgiltig, utan resultat
  • Name
    progress
    Type
    integer
    Description

    Procentandel av arbetet som är klart, från 0 till 100. Det är 0 tills uppgiften startar och 100 nä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. null fram tills dess.

  • Name
    finished_at
    Type
    timestamp
    Description

    Tidpunkten då uppgiften nådde en slutgiltig status, i Unix-millisekunder. null fram 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 efter created_at tills 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. 1 betyder att den startar härnäst. 0 efter att uppgiften lämnat kön, och alltid 0 i listresultat.

  • Name
    task_error
    Type
    object
    Description

    Varför uppgiften misslyckades. null om inte status är FAILED. 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 är PENDING. Om Meshy inte kan läsa debiteringen utelämnar ett get- eller stream-svar fältet, och en listbegäran returnerar 500. 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 i candidate_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 en Authorization-header. De förblir giltiga fram till expires_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 som candidate_id i 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 name du 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ön
    • IN_PROGRESS: genererar resultatet
    • SUCCEEDED: slutgiltig, med resultatet
    • FAILED: slutgiltig, med anledningen i task_error
    • CANCELED: slutgiltig, utan resultat
  • Name
    progress
    Type
    integer
    Description

    Procent av arbetet som är klart, från 0 till 100. Det är 0 tills uppgiften startar och 100 nä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. null fram tills dess.

  • Name
    finished_at
    Type
    timestamp
    Description

    Tidpunkt då uppgiften nådde en slutgiltig status, i Unix-millisekunder. null fram 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 efter created_at tills 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. 1 betyder att den startar härnäst. 0 efter att uppgiften lämnar kön, och alltid 0 i listresultat.

  • Name
    task_error
    Type
    object
    Description

    Varför uppgiften misslyckades. null om inte status är FAILED. 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 är PENDING. Om Meshy inte kan läsa debiteringen utelämnar ett get- eller stream-svar fältet, och en listbegäran returnerar 500. 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-head och keycap-base. När Meshy faller tillbaka på en mönsterfyllning för basen har modellen också ett keycap-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 tills expires_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 som model.mtl använder. Med en enfärgad bas är den enda texturen keycap-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 en Authorization-header. De förblir giltiga tills expires_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:

  1. Skapa en prototyp-task från ett foto.
  2. Hämta tasken tills dess status är SUCCEEDED.
  3. Välj en kandidat från candidate_ids.
  4. Skapa en build-task med den kandidaten.
  5. Hämta build-tasken tills dess status är SUCCEEDED.
  6. 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

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"