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/prototypePOST /openapi/creative-lab/keycap/v1/build
Beide POST-endpoints vereisen een betaald abonnement. Een verzoek vanuit een gratis account retourneert 402.
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
# 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
400terug.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
namevan de taak. Een langere naam geeft400terug.
- Name
- remove_background
- Type
- boolean
- standaard false
- Description
Of de achtergrond uit de prototypeafbeelding moet worden verwijderd.
truegeeft 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 jetruehebt meegegeven. De build geeft die afbeelding terug alsprocess_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_urlontbreekt.- 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
404teruggeeft 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.
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
# 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 statusSUCCEEDED.Een ID die niet overeenkomt met een van uw Keycap-prototypetaken uit de API geeft
404terug, 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, geeft400terug.
- 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 geeft400terug.
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 geeft400terug.
- Name
- head_size_mm
- Type
- number
- standaard 23
- Description
De grootte van de kop langs de langste afmeting, in millimeters, van
10tot40. Meshy schaalt de kop zodat de langste afmeting overeenkomt met deze waarde. Een waarde buiten het bereik geeft400terug.Bij een waarde boven ongeveer
32.9kan 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 dekeycap-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
-5tot5. Een waarde buiten het bereik geeft400terug.
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.
Meshy exporteert het GLB-bestand en de OBJ-bundel op werkelijke schaal in millimeters. Beide gebruiken een Y-up coördinatensysteem, waarbij de voorkant van de keycap naar +Z wijst.
Faalmodi
- Name
400 - Bad Request- Description
Het verzoek kan niet worden uitgevoerd. Bijvoorbeeld:
input_task_idontbreekt 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_idontbreekt, of staat niet in decandidate_idsvan de prototypetaak. Stuur een waarde uit die array.- Een veld in
optionsvalt buiten het bereik, ofbase_modelis 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_idkomt niet overeen met een Keycap-prototypetaak die uw account met de API heeft aangemaakt. Een prototype dat in de web-app is gemaakt, geeft eveneens404terug. Stuur deresult-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.
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
# 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
idis geen geldige taak-ID. Stuur deresult-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
/prototypeof/buildpassend bij de taak.
- Name
500 - Internal Server Error- Description
Meshy kon de controle op intellectueel eigendom niet uitvoeren. Probeer het verzoek opnieuw.
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
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:
idis geen geldig taak-ID. Stuur hetresult-ID uit het aanmaakantwoord.- De taak heeft al een definitieve status (
SUCCEEDED,FAILEDofCANCELED), 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
/prototypeof/buildom 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
statuservan te controleren voordat je het opnieuw probeert.
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
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.
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
# 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,
prototypeofbuild.
Queryparameters
- Name
- page_num
- Type
- integer
- standaard 1
- Description
De pagina die moet worden geretourneerd, van
1tot255.0geeft de eerste pagina terug. Een waarde buiten0tot255geeft400terug.
- Name
- page_size
- Type
- integer
- standaard 10
- Description
Aantal taken per pagina, tot
100. Een waarde van101tot255geeft 100 taken terug, en0gebruikt de standaardwaarde. Een waarde buiten0tot255geeft400terug.
- 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
namedie 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 wachtrijIN_PROGRESS: resultaat wordt gegenereerdSUCCEEDED: definitief, met resultaatFAILED: definitief, met de reden intask_errorCANCELED: definitief, zonder resultaat
- Name
- progress
- Type
- integer
- Description
Percentage van het voltooide werk, van
0tot100. Dit is0totdat de taak start en100zodra 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.
nulltot dat moment.
- Name
- finished_at
- Type
- timestamp
- Description
Tijdstip waarop de taak een definitieve status heeft bereikt, in Unix-milliseconden.
nulltot 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 nacreated_attotdat 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
PENDINGis.1betekent dat deze als volgende start.0nadat de taak de wachtrij heeft verlaten, en altijd0in lijstresultaten.
- Name
- task_error
- Type
- object
- Description
Waarom de taak is mislukt.
nulltenzijstatusgelijk is aanFAILED. 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 dezePENDINGis. Als Meshy de kosten niet kan uitlezen, laat een get- of streamrespons dit veld weg, en retourneert een lijstaanvraag500. 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 incandidate_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 zonderAuthorization-header. Ze blijven geldig totexpires_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 alscandidate_idmee 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
namedie 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 wachtrijIN_PROGRESS: genereert het resultaatSUCCEEDED: definitief, met het resultaatFAILED: definitief, met de reden intask_errorCANCELED: definitief, zonder resultaat
- Name
- progress
- Type
- integer
- Description
Percentage van het voltooide werk, van
0tot100. Dit is0totdat de taak start en100wanneer 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.
nulltot die tijd.
- Name
- finished_at
- Type
- timestamp
- Description
Tijdstip waarop de taak een definitieve status heeft bereikt, in Unix-milliseconden.
nulltot 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 nacreated_attotdat 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
PENDINGis.1betekent dat deze als volgende start.0nadat de taak de wachtrij heeft verlaten, en altijd0in lijstresultaten.
- Name
- task_error
- Type
- object
- Description
Waarom de taak is mislukt.
nulltenzijstatusgelijk is aanFAILED. 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 dezePENDINGis. Als Meshy de kosten niet kan uitlezen, laat een get- of stream-respons dit veld weg, en retourneert een lijstverzoek500. 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-headenkeycap-base. Wanneer Meshy terugvalt op een patroonvulling voor de basis, heeft het model ook eenkeycap-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 totexpires_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 diemodel.mtlgebruikt. Bij een effen gekleurde basis is de enige textuurkeycap-head.png. Bij een gepatroneerde basis bevat het ZIP-bestand ookkeycap-base.png.
- Name
- process_image_urls
- Type
- object
- Description
Downloadlinks voor afbeeldingen van de stappen van de build, gesleuteld op type. Net als
model_urlszijn dit ondertekende URL's, dus haal ze op zonder eenAuthorization-header. Ze blijven geldig totexpires_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:
- Maak een prototype-taak aan op basis van een foto.
- Vraag de taak op totdat de
statusgelijk is aanSUCCEEDED. - Kies een kandidaat uit
candidate_ids. - Maak een build-taak aan met die kandidaat.
- Vraag de build-taak op totdat de
statusgelijk is aanSUCCEEDED. - 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
#!/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"