lowpoly wordt op 30 okt 2026 uitgefaseerd. Stap vóór deze datums over op een ander model om fouten bij verzoeken te voorkomen. Alle afschaffingen bekijken

Creative Lab Keycap API

Zet in twee fasen een foto om in een volledig gekleurde, aangepaste keycap voor een mechanisch toetsenbord. Een prototype-taak genereert op basis van de foto een afbeelding van de voltooide keycap. Een build-taak zet die afbeelding om in een getextureerd 3D-keycapmodel. Hierbij wordt de ID van de prototype-taak gebruikt als input_task_id en de kandidaat-ID van de afbeelding als candidate_id.

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

Beide POST-endpoints vereisen een betaald abonnement. Een verzoek vanuit een gratis account retourneert 402.


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

Een Keycap-prototypetaak aanmaken

Genereert één afbeelding van de voltooide keycap op basis van een foto. Het veld image_urls van de taak bevat de afbeelding, en candidate_ids bevat de bijbehorende ID, met telkens één item. Als het ontwerp je niet bevalt, maak dan een nieuwe prototypetaak aan. Meshy rekent voor elke prototypetaak afzonderlijk credits aan.

Om de 3D-keycap te bouwen, geef je de ID van deze taak door aan de build-endpoint als input_task_id, met het item uit candidate_ids als candidate_id. Zie Het Keycap-prototypetaakobject voor de velden van de taak.

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

Parameters

  • Name
    image_url
    Type
    string
    Verplicht
    Description

    De foto die moet worden omgezet in een keycap-ontwerp, als een openbare URL of een data-URI (data:image/jpeg;base64,<your base64-encoded image data>).

    De afbeelding moet een JPG-, JPEG-, PNG- of WebP-bestand zijn van maximaal 20 MB (20.000.000 bytes). Elke zijde moet minstens 32 pixels zijn, en de afbeelding mag in totaal maximaal 178.956.970 pixels bevatten. Een afbeelding buiten deze limieten geeft 400 terug.

    Meshy detecteert het formaat op basis van de afbeeldingsgegevens, niet op basis van de bestandsextensie in de URL. Een URL zonder extensie werkt, en Meshy volgt HTTP-omleidingen. Meshy past de EXIF-oriëntatie toe, zodat een gedraaide telefoonfoto er uitziet zoals bedoeld.

    Een data-URI moet base64-gecodeerd zijn met een afbeeldingstype, zoals data:image/png;base64,..., en de gedecodeerde afbeelding moet JPEG, PNG of WebP zijn. De limiet van 20 MB geldt voor de gedecodeerde afbeelding, dus de base64-tekst kan ongeveer een derde groter zijn.

  • Name
    name
    Type
    string
    Description

    Een naam voor de taak, tot 100 tekens. Deze komt terug in het veld name van de taak. Een langere naam geeft 400 terug.

  • Name
    remove_background
    Type
    boolean
    standaard false
    Description

    Of de achtergrond uit de prototypeafbeelding moet worden verwijderd. true geeft een transparante RGBA-PNG terug, zodat je de keycap op elke achtergrond kunt plaatsen. Als Meshy de achtergrond niet kan verwijderen, geeft het de afbeelding mét achtergrond terug, en de taak slaagt alsnog.

    Het kopontwerp dat de build omzet naar 3D, behoudt in beide gevallen zijn achtergrond. De build schildert de keycap-basis op basis van de afbeelding in image_urls, zonder achtergrond als je true hebt meegegeven. De build geeft die afbeelding terug als process_image_urls.composite.

Retourwaarden

Het veld result bevat de ID van de nieuwe prototypetaak. Haal de taak op of stream deze totdat status SUCCEEDED is. Geef vervolgens de ID door aan de build-endpoint als input_task_id, met het item uit candidate_ids als candidate_id.

Foutmodi

  • Name
    400 - Bad Request
    Description

    Het verzoek kan niet worden uitgevoerd. Bijvoorbeeld:

    • image_url ontbreekt.
    • De afbeelding is geen JPG-, JPEG-, PNG- of WebP-bestand.
    • De afbeelding is te klein, groter dan 20 MB, of overschrijdt het maximale aantal pixels.
    • Meshy kan de afbeelding niet downloaden, bijvoorbeeld omdat de URL 404 teruggeeft of time-out geeft.
    • De data-URI is geen geldige base64.
    • De afbeelding is gemarkeerd als NSFW.

    Het foutbericht geeft aan welk probleem er is gevonden. Herstel het verzoek en verstuur het opnieuw.

  • Name
    401 - Unauthorized
    Description

    De API-sleutel ontbreekt of is ongeldig. Controleer de Authorization-header.

  • Name
    402 - Payment Required
    Description

    Een van het volgende is van toepassing:

    • Het account heeft onvoldoende credits.
    • De API-sleutel, werkruimte of het lid heeft zijn creditlimiet bereikt.
    • Het account gebruikt het gratis abonnement.

    Controleer je credits en abonnement en probeer het opnieuw.

  • Name
    403 - Forbidden
    Description

    Je team heeft IP-filtering ingeschakeld, en Meshy heeft de afbeelding gemarkeerd vanwege intellectueel eigendom van derden. Stuur een afbeelding waarvoor je gebruiksrechten hebt.

  • Name
    429 - Too Many Requests
    Description

    Een van deze limieten is bereikt:

    • Je hebt meer verzoeken verstuurd dan je rate limit toestaat. Wacht een paar seconden en probeer het opnieuw. Zie Rate limits.
    • Er staan te veel van je taken in de wachtrij of lopen er te veel. Wacht tot er een paar zijn voltooid en probeer het opnieuw.
    • Bij een onbeperkt abonnement zonder resterende credits heb je het aantal taken bereikt dat zonder credits kan worden uitgevoerd. Wacht tot een taak is voltooid, of voeg credits toe.
  • Name
    500 - Internal Server Error
    Description

    Meshy heeft een serverfout ondervonden, bijvoorbeeld omdat contentmoderatie of de controle op intellectueel eigendom niet kon worden uitgevoerd, of omdat Meshy de afbeelding niet kon opslaan. Meshy maakt de taak niet aan en vergoedt eventueel in rekening gebrachte credits. Probeer het verzoek opnieuw.


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

Een Keycap-buildtaak maken

Genereert de getextureerde 3D-keycap op basis van een geslaagde prototypetaak en een van de kandidaten daarvan. Voor de velden hiervan, zie Het Keycap-buildtaakobject.

Eén buildtaak doorloopt elke stap. Het genereert een 3D-model op basis van het ontwerp en kleurt dit. Vervolgens plaatst en snijdt het het model op de keycapbasis in een gekalibreerde standaardpositie, zodat u dit niet handmatig hoeft aan te passen. Tot slot monteert het de keycap en exporteert het de bestanden. Een build duurt doorgaans 3 tot 7 minuten.

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

Parameters

  • Name
    input_task_id
    Type
    string
    Verplicht
    Description

    De ID van de prototypetaak die moet worden gebouwd. Dit moet een taak zijn die uw account heeft aangemaakt met POST /openapi/creative-lab/keycap/v1/prototype, met de status SUCCEEDED.

    Een ID die niet overeenkomt met een van uw Keycap-prototypetaken uit de API geeft 404 terug, inclusief een prototype dat in de web-app is gemaakt.

  • Name
    candidate_id
    Type
    string
    Verplicht
    Description

    De kandidaat die moet worden gebouwd, uit de candidate_ids-array van de prototypetaak. Een waarde die niet in die array voorkomt, geeft 400 terug.

  • Name
    name
    Type
    string
    Description

    Een naam voor de taak, tot 100 tekens. Deze komt terug in het name-veld van de taak. Een langere naam geeft 400 terug.

options

Optionele geometrie-instellingen. Elk veld heeft een gekalibreerde standaardwaarde, dus verstuur alleen de velden die u wilt wijzigen.

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

    De keycapbasis waarop gebouwd wordt. De enige waarde is cherry-mx-1x1-r1, een standaard Cherry MX-profiel 1u keycap. Aangepaste groottes worden niet ondersteund, en elke andere waarde geeft 400 terug.

  • Name
    head_size_mm
    Type
    number
    standaard 23
    Description

    De grootte van de kop langs de langste afmeting, in millimeters, van 10 tot 40. Meshy schaalt de kop zodat de langste afmeting overeenkomt met deze waarde. Een waarde buiten het bereik geeft 400 terug.

    Bij een waarde boven ongeveer 32.9 kan Meshy de grootte verkleinen zodat de kop binnen de beschermende voetafdruklimiet van de basis past. De kop kan dan kleiner uitvallen dan gevraagd. Het taakobject geeft de door Meshy toegepaste grootte niet terug. Om dit te controleren, meet u de bounding box van de keycap-head-mesh in het model.

  • Name
    vertical_offset_mm
    Type
    number
    standaard 0
    Description

    De verticale verschuiving die op de kop wordt toegepast voordat Meshy deze op de basis plaatst, in millimeters, van -5 tot 5. Een waarde buiten het bereik geeft 400 terug.

Retourwaarden

Het result-veld bevat de ID van de nieuwe buildtaak. Haal de taak op of stream deze totdat status gelijk is aan SUCCEEDED. Download vervolgens het GLB-bestand van model_urls.glb en de OBJ-bundel van model_urls.obj_zip.

Faalmodi

  • Name
    400 - Bad Request
    Description

    Het verzoek kan niet worden uitgevoerd. Bijvoorbeeld:

    • input_task_id ontbreekt of is geen geldige taak-ID.
    • De status van de prototypetaak is niet SUCCEEDED. Als deze nog wordt uitgevoerd, wacht en probeer het opnieuw. Als deze is mislukt of geannuleerd, maak een nieuwe prototypetaak aan.
    • De prototypetaak is geslaagd maar heeft geen kandidaten. Maak een nieuwe prototypetaak aan.
    • candidate_id ontbreekt, of staat niet in de candidate_ids van de prototypetaak. Stuur een waarde uit die array.
    • Een veld in options valt buiten het bereik, of base_model is geen beschikbare waarde.

    Het foutbericht geeft aan welk probleem is gevonden.

  • Name
    401 - Unauthorized
    Description

    De API-sleutel ontbreekt of is ongeldig. Controleer de Authorization-header.

  • Name
    402 - Payment Required
    Description

    Een van het volgende is van toepassing:

    • Het account heeft niet genoeg credits.
    • De API-sleutel, werkruimte of lid heeft de creditlimiet bereikt.
    • Het account heeft een gratis abonnement.

    Controleer uw credits en abonnement, en probeer het opnieuw.

  • Name
    404 - Not Found
    Description

    input_task_id komt niet overeen met een Keycap-prototypetaak die uw account met de API heeft aangemaakt. Een prototype dat in de web-app is gemaakt, geeft eveneens 404 terug. Stuur de result-ID uit een antwoord op het aanmaken van een prototype.

  • Name
    429 - Too Many Requests
    Description

    Een van deze limieten is bereikt:

    • U hebt meer verzoeken verstuurd dan uw rate limit toestaat. Wacht een paar seconden en probeer het opnieuw. Zie Rate limits.
    • Er staan te veel van uw taken in de wachtrij of worden uitgevoerd. Wacht tot sommige zijn voltooid en probeer het opnieuw.
    • Bij een onbeperkt abonnement zonder resterende credits hebt u het aantal taken bereikt dat zonder credits kan worden uitgevoerd. Wacht tot een taak is voltooid, of voeg credits toe.
  • Name
    500 - Internal Server Error
    Description

    Meshy kon de taak niet aanmaken vanwege een serverfout. Meshy vergoedt eventueel in rekening gebrachte credits. Probeer het verzoek opnieuw.


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

Een Keycap-taak ophalen

Geeft een prototype- of build-taak terug. Het pad moet overeenkomen met de fase van de taak. Een build-taak die via /prototype/:id wordt opgevraagd, geeft 404 terug, en hetzelfde geldt voor een prototype-taak die via /build/:id wordt opgevraagd.

Zie voor de velden Het Keycap prototype-taakobject en Het Keycap build-taakobject.

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

Parameters

  • Name
    id
    Type
    path
    Description

    De taak-ID uit de aanmaakrespons.

Retourwaarden

Het prototype-taakobject of het build-taakobject, overeenkomend met de fase in het pad.

Foutmodi

  • Name
    400 - Bad Request
    Description

    id is geen geldige taak-ID. Stuur de result-ID uit de aanmaakrespons.

  • Name
    403 - Forbidden
    Description

    Uw team heeft IP Filtering ingeschakeld, en Meshy heeft de afbeelding van de prototype-taak gemarkeerd wegens intellectueel eigendom van derden. Build-taken en teams in het Enterprise-plan krijgen deze fout niet. Maak een prototype-taak aan met een afbeelding waarvoor u gebruiksrechten heeft.

  • Name
    404 - Not Found
    Description

    Er bestaat geen Keycap-taak met deze ID voor uw account, of de fase van de taak komt niet overeen met het pad. Controleer de ID en gebruik /prototype of /build passend bij de taak.

  • Name
    500 - Internal Server Error
    Description

    Meshy kon de controle op intellectueel eigendom niet uitvoeren. Probeer het verzoek opnieuw.


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

Een Keycap-taak verwijderen

Annuleert een Keycap-taak. Het annuleren van een PENDING-taak restitueert de credits ervan. Een IN_PROGRESS-taak wordt geannuleerd zonder restitutie, omdat een worker er al mee is begonnen. Een taak met een definitieve status (SUCCEEDED, FAILED of CANCELED) kan niet worden geannuleerd.

Het pad moet overeenkomen met de fase van de taak. Bijvoorbeeld, DELETE op /prototype/:id met het ID van een build-taak retourneert 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).

Padparameters

  • Name
    id
    Type
    path
    Description

    Het ID van de te annuleren taak.

Retourwaarden

204 No Content met een lege body.

Faalmodi

  • Name
    400 - Bad Request
    Description

    Een van het volgende is van toepassing:

    • id is geen geldig taak-ID. Stuur het result-ID uit het aanmaakantwoord.
    • De taak heeft al een definitieve status (SUCCEEDED, FAILED of CANCELED), dus kan deze niet worden geannuleerd.
  • Name
    404 - Not Found
    Description

    Er bestaat geen Keycap-taak met dit ID binnen jouw account, of de fase van de taak komt niet overeen met het pad. Controleer het ID en gebruik /prototype of /build om overeen te komen met de taak.

  • Name
    500 - Internal Server Error
    Description

    Meshy liep tegen een serverfout aan tijdens het annuleren van de taak, dus de taak is mogelijk wel of niet geannuleerd. Haal de taak op om de status ervan te controleren voordat je het opnieuw probeert.


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

Stream een Keycap-taak

Streamt de updates van een Keycap-taak als Server-Sent Events (SSE). Het pad moet overeenkomen met de fase van de taak. Zo niet, bijvoorbeeld de ID van een build-taak bij /prototype/:id/stream, dan stuurt de stream één error-event met status_code: 404 en wordt deze gesloten.

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

Parameters

  • Name
    id
    Type
    path
    Description

    De taak-ID uit de aanmaakreactie.

Retourwaarden

Een stream van prototype- of build-taakobjecten. Elk event bevat het volledige taakobject, zoals Een Keycap-taak ophalen dit retourneert. Zolang de taak PENDING of IN_PROGRESS is, zijn de uitvoervelden nog leeg (null, [] of {}), en is finished_at gelijk aan null.

Als IP-filtering het resultaat van de taak blokkeert, stuurt de stream in plaats daarvan één error-event, met de status_code die een get-verzoek zou retourneren.


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

List Keycap-taken

Geeft uw Keycap-taken van één fase terug, één pagina per keer. Het pad bepaalt de fase. /prototype geeft alleen prototype-taken terug, en /build geeft alleen build-taken terug.

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

Padparameters

  • Name
    stage
    Type
    path
    Verplicht
    Description

    De fase die moet worden weergegeven, prototype of build.

Queryparameters

  • Name
    page_num
    Type
    integer
    standaard 1
    Description

    De pagina die moet worden geretourneerd, van 1 tot 255. 0 geeft de eerste pagina terug. Een waarde buiten 0 tot 255 geeft 400 terug.

  • Name
    page_size
    Type
    integer
    standaard 10
    Description

    Aantal taken per pagina, tot 100. Een waarde van 101 tot 255 geeft 100 taken terug, en 0 gebruikt de standaardwaarde. Een waarde buiten 0 tot 255 geeft 400 terug.

  • Name
    sort_by
    Type
    string
    standaard -created_at
    Description

    De sorteervolgorde.

    Beschikbare waarden:

    • -created_at: nieuwste eerst
    • +created_at: oudste eerst

Retourneert

Een array van prototype-taakobjecten of build-taakobjecten, overeenkomend met de fase in het pad.


Het Keycap-prototype-taakobject

Een prototype-taak genereert één afbeelding van de voltooide keycap op basis van een foto. Om het ontwerp om te zetten in een 3D-keycap, geef je de ID van de taak door aan de build endpoint als input_task_id, met het bijbehorende candidate_ids-item als candidate_id.

Eigenschappen

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

    De taak-ID. Vertrouw niet op het formaat ervan.

  • Name
    type
    Type
    string
    Description

    Het taaktype, altijd creative-lab-keycap-prototype.

  • Name
    name
    Type
    string
    Description

    De name die je hebt opgegeven bij het aanmaken van de taak, of "" als je er geen hebt opgegeven.

  • Name
    status
    Type
    string
    Description

    De status van de taak.

    Beschikbare waarden:

    • PENDING: wacht in de wachtrij
    • IN_PROGRESS: resultaat wordt gegenereerd
    • SUCCEEDED: definitief, met resultaat
    • FAILED: definitief, met de reden in task_error
    • CANCELED: definitief, zonder resultaat
  • Name
    progress
    Type
    integer
    Description

    Percentage van het voltooide werk, van 0 tot 100. Dit is 0 totdat de taak start en 100 zodra deze slaagt.

  • Name
    created_at
    Type
    timestamp
    Description

    Tijdstip waarop de taak is aangemaakt, in Unix-milliseconden.

  • Name
    started_at
    Type
    timestamp
    Description

    Tijdstip waarop een worker de taak is gestart, in Unix-milliseconden. null tot dat moment.

  • Name
    finished_at
    Type
    timestamp
    Description

    Tijdstip waarop de taak een definitieve status heeft bereikt, in Unix-milliseconden. null tot dat moment.

  • Name
    expires_at
    Type
    timestamp
    Description

    Tijdstip waarop het resultaat van de taak verloopt, in Unix-milliseconden. Dit is 3 dagen na finished_at, of 3 dagen na created_at totdat de taak is voltooid. Voor Enterprise-accounts, die API-resultaten onbeperkt bewaren, is dit ongeveer 100 jaar later. Zie Asset-retentie.

  • Name
    preceding_tasks
    Type
    integer
    Description

    De positie van de taak in de wachtrij terwijl deze PENDING is. 1 betekent dat deze als volgende start. 0 nadat de taak de wachtrij heeft verlaten, en altijd 0 in lijstresultaten.

  • Name
    task_error
    Type
    object
    Description

    Waarom de taak is mislukt. null tenzij status gelijk is aan FAILED. Zie Fouten.

  • Name
    consumed_credits
    Type
    integer
    Description

    Aantal credits dat voor de taak in rekening is gebracht, na eventuele terugbetaling. Voor een aanvraag die een fout retourneert, worden geen kosten in rekening gebracht. Een mislukte taak heeft de waarde 0, omdat Meshy deze terugbetaalt. Annuleren leidt alleen tot terugbetaling van een taak terwijl deze PENDING is. Als Meshy de kosten niet kan uitlezen, laat een get- of streamrespons dit veld weg, en retourneert een lijstaanvraag 500. Probeer het verzoek in dat geval opnieuw.

  • Name
    image_urls
    Type
    array of strings
    Description

    Downloadlink(en) voor de afbeelding van de voltooide keycap. De array bevat één URL zodra de taak is geslaagd, en is daarvoor leeg. image_urls[i] toont de kandidaat in candidate_ids[i].

    Deze URL's zijn bedoeld voor weergave. De build endpoint neemt een item uit candidate_ids, geen URL. Het zijn ondertekende URL's, dus haal ze op zonder Authorization-header. Ze blijven geldig tot expires_at, en het opnieuw ophalen van de taak levert dezelfde URL's op.

  • Name
    candidate_ids
    Type
    array of strings
    Description

    ID's van de kandidaten, in dezelfde volgorde als image_urls. Om een kandidaat te bouwen, stuur je de bijbehorende ID als candidate_id mee in het build-verzoek. Vertrouw niet op het formaat van deze ID's.


Het Keycap build task-object

Een build task genereert de getextureerde 3D-keycap op basis van een geslaagde prototype-taak en een van de kandidaten. Het genereert het 3D-model, kleurt het, plaatst en snijdt het op de keycap-basis, en voegt de keycap vervolgens samen en exporteert deze.

Eigenschappen

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

    De task-ID. Ga niet uit van een bepaalde opmaak.

  • Name
    type
    Type
    string
    Description

    Het task-type, altijd creative-lab-keycap-build.

  • Name
    name
    Type
    string
    Description

    De name die je hebt meegestuurd bij het aanmaken van de taak, of "" als je er geen hebt meegestuurd.

  • Name
    status
    Type
    string
    Description

    De status van de taak.

    Beschikbare waarden:

    • PENDING: wacht in de wachtrij
    • IN_PROGRESS: genereert het resultaat
    • SUCCEEDED: definitief, met het resultaat
    • FAILED: definitief, met de reden in task_error
    • CANCELED: definitief, zonder resultaat
  • Name
    progress
    Type
    integer
    Description

    Percentage van het voltooide werk, van 0 tot 100. Dit is 0 totdat de taak start en 100 wanneer deze slaagt.

  • Name
    created_at
    Type
    timestamp
    Description

    Tijdstip waarop de taak is aangemaakt, in Unix-milliseconden.

  • Name
    started_at
    Type
    timestamp
    Description

    Tijdstip waarop een worker de taak heeft gestart, in Unix-milliseconden. null tot die tijd.

  • Name
    finished_at
    Type
    timestamp
    Description

    Tijdstip waarop de taak een definitieve status heeft bereikt, in Unix-milliseconden. null tot die tijd.

  • Name
    expires_at
    Type
    timestamp
    Description

    Tijdstip waarop het resultaat van de taak verloopt, in Unix-milliseconden. Dit is 3 dagen na finished_at, of 3 dagen na created_at totdat de taak voltooid is. Voor Enterprise-accounts, die API-resultaten onbeperkt bewaren, is dit ongeveer 100 jaar later. Zie Asset-retentie.

  • Name
    preceding_tasks
    Type
    integer
    Description

    De positie van de taak in de wachtrij terwijl deze PENDING is. 1 betekent dat deze als volgende start. 0 nadat de taak de wachtrij heeft verlaten, en altijd 0 in lijstresultaten.

  • Name
    task_error
    Type
    object
    Description

    Waarom de taak is mislukt. null tenzij status gelijk is aan FAILED. Zie Fouten.

  • Name
    consumed_credits
    Type
    integer
    Description

    Aantal credits dat voor de taak in rekening is gebracht, na eventuele terugbetaling. Voor een verzoek dat een fout retourneert, worden geen kosten in rekening gebracht. Een mislukte taak heeft de waarde 0, omdat Meshy deze terugbetaalt. Annuleren betaalt een taak alleen terug zolang deze PENDING is. Als Meshy de kosten niet kan uitlezen, laat een get- of stream-respons dit veld weg, en retourneert een lijstverzoek 500. Probeer het verzoek in dat geval opnieuw.

  • Name
    model_urls
    Type
    object
    Description

    Downloadlinks voor het 3D-model. Meshy exporteert het GLB-bestand en de OBJ-bundel op werkelijke schaal in millimeters, Y-up, met de voorkant van de keycap gericht naar +Z.

    Het model heeft meshes genaamd keycap-head en keycap-base. Wanneer Meshy terugvalt op een patroonvulling voor de basis, heeft het model ook een keycap-base-interior-mesh voor de stamholte. Ga er niet van uit dat het model precies twee meshes heeft.

    Dit zijn ondertekende URL's, dus haal ze op zonder een Authorization-header. Ze blijven geldig tot expires_at, en het opnieuw ophalen van de taak vóór die tijd levert dezelfde URL's op. Een verlopen URL kan niet worden vernieuwd, dus download en bewaar de bestanden voor die tijd.

    • Name
      glb
      Type
      string
      Description

      Downloadlink voor het getextureerde GLB-bestand, model.glb.

    • Name
      obj_zip
      Type
      string
      Description

      Downloadlink voor de OBJ-bundel, een ZIP-bestand met model.obj, model.mtl, en de PNG-texturen die model.mtl gebruikt. Bij een effen gekleurde basis is de enige textuur keycap-head.png. Bij een gepatroneerde basis bevat het ZIP-bestand ook keycap-base.png.

  • Name
    process_image_urls
    Type
    object
    Description

    Downloadlinks voor afbeeldingen van de stappen van de build, gesleuteld op type. Net als model_urls zijn dit ondertekende URL's, dus haal ze op zonder een Authorization-header. Ze blijven geldig tot expires_at, en het opnieuw ophalen van de taak levert dezelfde URL's op.

    Dit kan de volgende sleutels bevatten:

    • head_design: de ontwerpafbeelding van de gekozen kandidaat, die de build heeft omgezet naar 3D. Altijd aanwezig.
    • composite: de afbeelding van de voltooide keycap voor de gekozen kandidaat, waarvan de build de basis heeft geschilderd. Kan ontbreken.
    • base_canvas: de geschilderde keycap-basis. Kan ontbreken.

    Meshy kan sleutels toevoegen, dus negeer een sleutel die je niet herkent.


End-to-end voorbeeld

Dit voorbeeld doorloopt de hele flow:

  1. Maak een prototype-taak aan op basis van een foto.
  2. Vraag de taak op totdat de status gelijk is aan SUCCEEDED.
  3. Kies een kandidaat uit candidate_ids.
  4. Maak een build-taak aan met die kandidaat.
  5. Vraag de build-taak op totdat de status gelijk is aan SUCCEEDED.
  6. Download het GLB-bestand en het OBJ-bundelbestand via model_urls.

Het voorbeeld kiest de eerste kandidaat. Toon in uw app de image_urls-items aan uw gebruikers en laat hen kiezen. De index van een gekozen afbeelding in image_urls is de index van de bijbehorende ID in 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"