Creative Lab — Keycap API

Verwandeln Sie ein Ausgangsfoto in eine vollfarbige, benutzerdefinierte mechanische Tastaturtaste in zwei Phasen: Prototyp erzeugt ein "fertiges Tastenkappen"-Design-Rendering aus Ihrem Eingabefoto. Sobald Sie dieses Rendering bestätigt haben, verwandelt Bau es in ein texturiertes 3D-Tastenkappenmodell in einem einzigen Durchlauf — die Erstellung des Weißmodells, das automatische Platzieren und Schneiden in einer kalibrierten Standardpose, die vollständige Modellfärbung und die Endmontage erfolgen alle innerhalb einer Bauaufgabe. Die beiden Phasen sind über input_task_id plus candidate_id verbunden.

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

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

Erstellen einer Keycap-Prototyp-Aufgabe

Erzeugen Sie ein fertiges Keycap-Design-Rendering aus dem Ausgangsfoto. Das Ergebnis der Aufgabe enthält ein image_urls-Array (das Anzeigerendering des fertigen Keycaps) und ein paralleles candidate_ids-Array; beide enthalten einen einzelnen Eintrag. Rufen Sie diesen Endpunkt erneut auf, wenn das Ergebnis nicht Ihren Wünschen entspricht – jeder Aufruf wird separat berechnet. Übergeben Sie die candidate_id zusammen mit der Prototyp-Aufgaben-ID an den Build-Endpunkt. Weitere Informationen zur Antwortstruktur finden Sie unter Das Keycap-Prototyp-Aufgabenobjekt.

Parameter

  • Name
    image_url
    Type
    string
    Erforderlich
    Description

    Ausgangsfoto, das Meshy in Keycap-Design-Bilder umwandeln soll. Derzeit unterstützen wir die Formate .jpg, .jpeg, .png und .webp.

    Das Format wird durch Dekodieren der Bilddaten erkannt, nicht durch die Dateierweiterung der URL – eine URL ohne Erweiterung oder eine, die umleitet, funktioniert, solange die Bytes in ein unterstütztes Format dekodiert werden. HTTP-Weiterleitungen werden befolgt. Die EXIF-Ausrichtung wird normalisiert, sodass ein gedrehtes Handyfoto so verwendet wird, wie es aussieht.

    Grenzen: mindestens 32 Pixel auf jeder Seite, maximal 178,956,970 Pixel insgesamt und maximal 20,000,000 Bytes nach dem Herunterladen. Bei einer Data URI gilt das Limit für die dekodierten Bytes, sodass die Quelldatei selbst bis zu dieser Größe sein kann – der Base64-Text ist etwa ein Drittel größer, was für Ihren Anfragekörper wichtig ist, nicht für dieses Limit. Eine Data URI muss einen image/*-Inhaltstyp und ;base64 deklarieren.

    Es gibt zwei Möglichkeiten, das Bild bereitzustellen:

    • Öffentlich zugängliche URL: Eine URL, die vom öffentlichen Internet aus zugänglich ist.
    • Data URI: Eine Base64-kodierte Data URI des Bildes. Beispiel einer Data URI: data:image/jpeg;base64,<your base64-encoded image data>.
  • Name
    name
    Type
    string
    Description

    Optionaler Aufgabenname für Anzeigezwecke. Maximal 100 Zeichen.

  • Name
    remove_background
    Type
    boolean
    Standard false
    Description

    Wenn auf true gesetzt, ist das in image_urls zurückgegebene Anzeigerendering ein transparentes RGBA-PNG mit entferntem Hintergrund, sodass Sie es auf jeden Hintergrund zusammensetzen können.

    Dies gilt nur für das Anzeigerendering. Der Kandidat, den der Build-Endpunkt konsumiert, bleibt unberührt, sodass das 3D-Ergebnis in beiden Fällen identisch ist.

Rückgaben

Die result-Eigenschaft der Antwort enthält die Aufgaben-id der neu erstellten Keycap-Prototyp-Aufgabe. Überwachen Sie den Get a Task Endpunkt oder abonnieren Sie den Stream, bis die Aufgabe SUCCEEDED erreicht, und nehmen Sie dann den Eintrag aus candidate_ids und übergeben Sie ihn zusammen mit der Aufgaben-ID an den Build-Endpunkt.

Fehlermodi

  • Name
    400 - Bad Request
    Description

    Die Anfrage war nicht akzeptabel. Häufige Ursachen:

    • Fehlender Parameter: image_url ist erforderlich.
    • Ungültiges Bildformat: Die bereitgestellte image_url ist kein unterstütztes Format (.jpg, .jpeg, .png, .webp).
    • Bildabmessungen außerhalb des Bereichs: Das Bild ist zu klein, überschreitet die maximale Dateigröße oder die maximale Pixelanzahl.
    • Nicht erreichbare URL: Die image_url konnte nicht heruntergeladen werden (404 oder timeout).
    • Ungültige Data URI: Der Base64-String ist fehlerhaft.
    • Inhalt markiert: Das Eingabebild wurde durch NSFW moderation markiert.
  • Name
    401 - Unauthorized
    Description

    Authentifizierung fehlgeschlagen. Bitte überprüfen Sie Ihren API-Schlüssel.

  • Name
    402 - Payment Required
    Description

    Das Konto befindet sich im kostenlosen Plan (ein kostenpflichtiger Plan ist erforderlich, um Aufgaben zu erstellen) oder hat nicht genügend Credits.

  • Name
    403 - Forbidden
    Description

    Das Eingabebild wurde durch die moderation des geistigen Eigentums markiert.

  • Name
    429 - Too Many Requests
    Description

    Sie haben Ihre Ratenbegrenzung überschritten.

  • Name
    500 - Internal Server Error
    Description

    Ein unerwarteter serverseitiger Fehler ist aufgetreten – zum Beispiel war der Inhaltsmoderationsdienst nicht verfügbar, das Staging des Eingabebildes ist fehlgeschlagen oder die Aufgabe konnte nicht erstellt werden. In diesem Fall wird keine Aufgabe erstellt, sodass ein erneuter Versuch sicher ist.

Request

POST
/openapi/creative-lab/keycap/v1/prototype
# Stage 1: generate a finished-keycap design render
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "image_url": "<your publicly accessible image url or base64-encoded data URI>"
  }'

Response

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

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

Erstellen einer Keycap-Build-Aufgabe

Generieren Sie das endgültige 3D-Keycap-Modell mit Textur aus einer erfolgreichen Prototyp-Aufgabe und einem ihrer Kandidaten. Eine einzelne Build-Aufgabe führt die gesamte Pipeline von Anfang bis Ende aus — Weißmodell-Generierung aus dem gewählten Design, automatisches Platzieren und Schneiden auf die Keycap-Basis mit einer kalibrierten Standardpose (keine interaktive Anpassung erforderlich), vollständige Modellfärbung und endgültige Montage und Export. Ein Build dauert typischerweise 3–7 Minuten, wobei die obere Grenze erreicht wird, wenn mehrere Builds gleichzeitig ausgeführt werden. Siehe Das Keycap-Build-Aufgabenobjekt für die Antwortstruktur.

Parameter

  • Name
    input_task_id
    Type
    string
    Erforderlich
    Description

    Die Aufgaben-ID einer Prototyp-Aufgabe, die über diesen gleichen OpenAPI-Endpunkt erstellt wurde. Der Prototyp muss vom gleichen Meshy-Konto erstellt worden sein, muss SUCCEEDED erreicht haben und muss mindestens einen Kandidaten produziert haben.

    Prototyp-Aufgaben, die über die Web-App erstellt wurden, werden nicht akzeptiert — der Build-Endpunkt akzeptiert nur Prototyp-Aufgaben, die durch POST /openapi/creative-lab/keycap/v1/prototype erstellt wurden, und lehnt jede andere Quelle mit 404 ab.

  • Name
    candidate_id
    Type
    string
    Erforderlich
    Description

    Der zu bauende Kandidat, entnommen aus dem candidate_ids Array der erfolgreichen Prototyp-Aufgabe. Muss zu dieser Aufgabe gehören; jeder andere Wert wird mit 400 abgelehnt.

  • Name
    name
    Type
    string
    Description

    Optionaler Aufgabenname für Anzeigezwecke. Maximal 100 Zeichen.

options

Optionale Geometrieanpassung. Jedes Feld hat einen kalibrierten Standardwert — senden Sie nur die, die Sie überschreiben möchten.

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

    Die Keycap-Basis, auf der aufgebaut werden soll. Derzeit ist der einzige verfügbare Wert cherry-mx-1x1-r1 — ein Standard-Cherry-MX-Profil 1u-Keycap. 3–5 zusätzliche gängige Standardgrößen sind geplant; benutzerdefinierte Größen werden nicht unterstützt.

  • Name
    head_size_mm
    Type
    number
    Standard 23
    Description

    Zielgröße des skulptierten Kopfes in Millimetern: seine längste Dimension wird auf diesen Wert skaliert. Bereich: [10, 40]. Werte über etwa 32.9 können reduziert werden, damit der Kopf noch in das Schutzfußabdrucklimit der Basis passt, sodass die gelieferte längste Dimension kleiner als angefordert sein kann. Der angewendete Wert wird heute nicht im Aufgabenobjekt zurückgegeben — wenn Sie die tatsächlich erhaltene Größe bestätigen müssen, messen Sie den Begrenzungsrahmen des keycap-head Netzes im heruntergeladenen Modell.

  • Name
    vertical_offset_mm
    Type
    number
    Standard 0
    Description

    Vertikaler Versatz, der auf den Kopf angewendet wird, bevor er auf der Basis platziert wird, in Millimetern. Bereich: [-5, 5].

Rückgaben

Die result-Eigenschaft der Antwort enthält die Aufgaben-id der neu erstellten Keycap-Build-Aufgabe. Abfragen Sie den Get a Task Endpunkt oder abonnieren Sie den stream, bis die Aufgabe SUCCEEDED erreicht, und laden Sie dann die Artefakte von model_urls.glb und model_urls.obj_zip herunter.

Fehlermodi

  • Name
    400 - Bad Request
    Description

    Die Anfrage war nicht akzeptabel. Häufige Ursachen:

    • Fehlender Parameter: input_task_id und candidate_id sind erforderlich.
    • Ungültige UUID: Die input_task_id ist keine gültige UUID.
    • Elternteil nicht erfolgreich: Die referenzierte Prototyp-Aufgabe hat SUCCEEDED noch nicht erreicht.
    • Keine Kandidaten: Die Prototyp-Aufgabe war erfolgreich, hat aber keine Kandidaten produziert.
    • Unbekannter Kandidat: candidate_id ist nicht einer der Kandidaten der Eingabeaufgabe.
    • Optionen außerhalb des Bereichs: Eines der options-Felder lag außerhalb des erlaubten Bereichs oder Enum-Sets.
  • Name
    401 - Unauthorized
    Description

    Authentifizierung fehlgeschlagen. Bitte überprüfen Sie Ihren API-Schlüssel.

  • Name
    402 - Payment Required
    Description

    Das Konto befindet sich im kostenlosen Plan (ein kostenpflichtiger Plan ist erforderlich, um Aufgaben zu erstellen) oder hat nicht genügend Credits.

  • Name
    404 - Not Found
    Description

    Die referenzierte Prototyp-Aufgabe existiert nicht, gehört einem anderen Benutzer oder wurde über die Web-App erstellt (nur API-Modus-Prototyp-Aufgaben werden in den Build übernommen).

  • Name
    429 - Too Many Requests
    Description

    Sie haben Ihre Ratenbegrenzung überschritten.

  • Name
    500 - Internal Server Error
    Description

    Ein unerwarteter serverseitiger Fehler ist aufgetreten — zum Beispiel war der Inhaltsmoderationsdienst nicht verfügbar, das Staging des Eingabebildes ist fehlgeschlagen oder die Aufgabe konnte nicht erstellt werden. In diesem Fall wird keine Aufgabe erstellt, sodass ein erneuter Versuch sicher ist.

Anfrage

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

Antwort

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

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

Abrufen einer Keycap-Aufgabe

Abrufen einer Prototyp- oder Bauaufgabe mit einer gültigen Aufgaben-id. Der URL-Pfad muss der Phase der Aufgabe entsprechen — eine Bauaufgabe, die über /prototype/:id abgerufen wird, gibt 404 zurück, und umgekehrt.

Siehe Das Keycap-Prototyp-Aufgabenobjekt und Das Keycap-Bauaufgabenobjekt für Antwortstrukturen.

Parameter

  • Name
    id
    Type
    path
    Description

    Eindeutiger Bezeichner für die abzurufende Keycap-Aufgabe.

Rückgaben

Die Antwort enthält das Keycap-Aufgabenobjekt. Die Struktur hängt von der angeforderten Phase ab.

Anfrage

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

Prototyp-Antwort

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

Bau-Antwort

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

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

Löschen einer Keycap-Aufgabe

Eine Keycap-Aufgabe abbrechen. Wenn die Aufgabe noch PENDING ist, werden die beim Erstellen verbrauchten Credits zurückerstattet. Aufgaben, die bereits IN_PROGRESS sind, werden ohne Rückerstattung abgebrochen (der Arbeiter könnte bereits Ressourcen verbrauchen). Aufgaben, die bereits einen Endzustand erreicht haben (SUCCEEDED, FAILED, CANCELED), können nicht abgebrochen werden.

Der URL-Pfad muss der Phase der Aufgabe entsprechen — DELETE auf /prototype/:buildId gibt 404 zurück.

Pfadparameter

  • Name
    id
    Type
    path
    Description

    Eindeutiger Bezeichner für die abzubrechende Keycap-Aufgabe.

Rückgaben

Gibt 204 No Content bei Erfolg mit leerem Körper zurück.

Fehlermodi

  • Name
    400 - Bad Request
    Description

    Die Aufgabe befindet sich bereits in einem Endzustand und kann nicht abgebrochen werden.

  • Name
    404 - Not Found
    Description

    Die Aufgabe existiert nicht, gehört einem anderen Benutzer oder ihre Phase stimmt nicht mit dem URL-Pfad überein.

  • Name
    500 - Internal Server Error
    Description

    Ein unerwarteter serverseitiger Fehler trat beim Abbrechen auf. Die Aufgabe könnte abgebrochen worden sein oder nicht — lesen Sie sie erneut, um dies zu bestätigen, bevor Sie es erneut versuchen.

Request

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

Response

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

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

Streamen einer Keycap-Aufgabe

Streamen Sie Echtzeit-Updates für eine Keycap-Aufgabe über Server-Sent Events (SSE). Der URL-Pfad muss mit der Phase der Aufgabe übereinstimmen — das Öffnen eines Streams bei /prototype/:buildId/stream sendet ein einzelnes event: error Payload mit status_code: 404 und schließt den Stream.

Parameter

  • Name
    id
    Type
    path
    Description

    Eindeutiger Bezeichner für die Keycap-Aufgabe zum Streamen.

Rückgaben

Gibt einen Stream von Keycap Prototype oder Keycap Build Aufgabenobjekten als Server-Sent Events zurück. Für PENDING oder IN_PROGRESS Aufgaben wird der Antwortstream nur die notwendigen progress und status Felder enthalten.

Anfrage

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

Antwortstream

// 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.
// For PENDING or IN_PROGRESS tasks, the response stream will not include all fields.
event: message
data: {
  "id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
  "progress": 0,
  "status": "PENDING"
}

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

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

Liste der Keycap-Aufgaben

Abrufen einer paginierten Liste Ihrer Keycap-Aufgaben für eine einzelne Phase. Der URL-Pfad wählt die Phase aus — /prototype gibt Prototyp-Aufgaben zurück; /build gibt Build-Aufgaben zurück. Aufgaben aus der anderen Phase sind in keiner der Antworten enthalten.

Pfadparameter

  • Name
    stage
    Type
    path
    Erforderlich
    Description

    Entweder prototype oder build. Die Sammlung gibt nur Aufgaben zurück, deren Phase mit der URL übereinstimmt — das Abrufen von /prototype gibt niemals Build-Aufgaben zurück und umgekehrt.

Abfrageparameter

  • Name
    page_num
    Type
    integer
    Standard 1
    Description

    Seitennummer für die Paginierung.

  • Name
    page_size
    Type
    integer
    Standard 10
    Description

    Begrenzung der Seitengröße. Maximal erlaubt sind 100 Elemente.

  • Name
    sort_by
    Type
    string
    Standard -created_at
    Description

    Feld, nach dem sortiert werden soll. Verfügbare Werte:

    • +created_at: Sortierung nach Erstellungszeit in aufsteigender Reihenfolge.
    • -created_at: Sortierung nach Erstellungszeit in absteigender Reihenfolge.

Rückgaben

Gibt eine paginierte Liste des Aufgabenobjekts pro Phase zurück — entweder das Keycap-Prototyp-Aufgabenobjekt beim Auflisten von /prototype oder das Keycap-Build-Aufgabenobjekt beim Auflisten von /build.

Anfrage

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

Antwort (Liste der Prototyp-Aufgaben)

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

Das Keycap-Prototyp-Task-Objekt

Das Keycap-Prototyp-Task-Objekt ist eine Arbeitseinheit, die Meshy verfolgt, um ein fertiges Keycap-Designbild aus einem Ausgangsfoto zu generieren. Das Ergebnis dieser Phase wird über input_task_id plus candidate_id in die Bauphase eingebunden.

Eigenschaften

  • Name
    id
    Type
    string
    Description

    Eindeutiger Bezeichner für die Aufgabe. Obwohl wir eine k-sortierbare UUID für Task-IDs als Implementierungsdetail verwenden, sollten Sie keine Annahmen über das Format der ID machen.

  • Name
    type
    Type
    string
    Description

    Typ der Aufgabe. Der Wert ist creative-lab-keycap-prototype.

  • Name
    name
    Type
    string
    Description

    Der bei der Erstellung der Aufgabe angegebene Aufgabenname. Leerer String, wenn kein Name angegeben wurde.

  • Name
    status
    Type
    string
    Description

    Status der Aufgabe. Mögliche Werte sind einer von PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    Fortschritt der Aufgabe. Wenn die Aufgabe noch nicht gestartet wurde, ist diese Eigenschaft 0. Sobald die Aufgabe erfolgreich abgeschlossen ist, wird sie 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Zeitstempel, wann die Aufgabe erstellt wurde, in Millisekunden.

  • Name
    started_at
    Type
    timestamp
    Description

    Zeitstempel, wann die Aufgabe gestartet wurde, in Millisekunden. Wenn die Aufgabe noch nicht gestartet wurde, ist diese Eigenschaft 0.

  • Name
    finished_at
    Type
    timestamp
    Description

    Zeitstempel, wann die Aufgabe abgeschlossen wurde, in Millisekunden. Wenn die Aufgabe noch nicht abgeschlossen ist, ist diese Eigenschaft 0.

  • Name
    expires_at
    Type
    timestamp
    Description

    Zeitstempel, wann das Ergebnis der Aufgabe abläuft, in Millisekunden.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Die Anzahl der vorhergehenden Aufgaben.

  • Name
    task_error
    Type
    object
    Description

    Fehlerdetails für fehlgeschlagene Aufgaben. Siehe Fehler für die vollständige task_error-Objektreferenz.

  • Name
    consumed_credits
    Type
    integer
    Description

    Die Anzahl der von dieser Aufgabe verbrauchten Credits. Eine Aufgabe, die SUCCEEDED erreicht, wird mit dem vollen Betrag für ihre Phase belastet. Eine Aufgabe, die nie erstellt wird (ein 4xx zur Anforderungszeit, einschließlich einer Moderationsablehnung), wird überhaupt nicht belastet. Eine Aufgabe, die FAILED erreicht, gibt 0 zurück — die Gebühr wird erstattet, einschließlich einer asynchronen Moderationssperre. Eine Stornierung über DELETE wird nur erstattet, solange die Aufgabe noch PENDING ist; eine bereits IN_PROGRESS befindliche Aufgabe bleibt belastet, da die Arbeit bereits geleistet wurde.

  • Name
    image_urls
    Type
    array of strings
    Description

    Herunterladbare URL des fertigen Keycap-Design-Renderings — wie der Kandidat als fertiges Keycap aussieht. Enthält einen einzigen Eintrag; image_urls[i] entspricht candidate_ids[i]. Leer, bis die Aufgabe SUCCEEDED erreicht. Die URL dient nur zur Anzeige; der Bau-Endpunkt verbraucht candidate_ids, nicht diese URLs. Gleicher URL-Lebenszyklus wie model_urls: signiert, kein Authorization-Header, gültig bis expires_at und stabil, wenn die Aufgabe erneut gelesen wird.

  • Name
    candidate_ids
    Type
    array of strings
    Description

    Opaque Kandidatenbezeichner, parallel zu image_urls. Übergeben Sie den Eintrag, der Ihrem gewählten Design entspricht, als candidate_id der Bauanforderung. Machen Sie keine Annahmen über das Format dieser IDs.

Beispiel Keycap-Prototyp-Task-Objekt

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

Das Keycap Build Task Objekt

Das Keycap Build Task Objekt ist eine Arbeitseinheit, die Meshy verfolgt, um das endgültige texturierte 3D-Keycap aus einer erfolgreichen Prototyp-Aufgabe und einem ausgewählten Kandidaten zu generieren. Ein einzelner Build durchläuft die gesamte Pipeline — Weißmodell-Generierung, automatisches Platzieren und Schneiden, Färben, Zusammenbau und Export.

Eigenschaften

  • Name
    id
    Type
    string
    Description

    Eindeutiger Bezeichner für die Aufgabe.

  • Name
    type
    Type
    string
    Description

    Typ der Aufgabe. Der Wert ist creative-lab-keycap-build.

  • Name
    name
    Type
    string
    Description

    Der bei der Erstellung der Aufgabe angegebene Aufgabenname. Leerer String, wenn kein Name angegeben wurde.

  • Name
    status
    Type
    string
    Description

    Status der Aufgabe. Mögliche Werte sind PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    Fortschritt der Aufgabe. Wenn die Aufgabe noch nicht gestartet wurde, ist dieser Wert 0. Sobald die Aufgabe erfolgreich abgeschlossen ist, wird dieser Wert 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Zeitstempel, wann die Aufgabe erstellt wurde, in Millisekunden.

  • Name
    started_at
    Type
    timestamp
    Description

    Zeitstempel, wann die Aufgabe gestartet wurde, in Millisekunden.

  • Name
    finished_at
    Type
    timestamp
    Description

    Zeitstempel, wann die Aufgabe abgeschlossen wurde, in Millisekunden.

  • Name
    expires_at
    Type
    timestamp
    Description

    Zeitstempel, wann das Ergebnis der Aufgabe abläuft, in Millisekunden.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Die Anzahl der vorhergehenden Aufgaben. Nur sinnvoll, wenn der Status PENDING ist.

  • Name
    task_error
    Type
    object
    Description

    Fehlerdetails für fehlgeschlagene Aufgaben. Siehe Fehler für die vollständige task_error Objektreferenz.

  • Name
    consumed_credits
    Type
    integer
    Description

    Die Anzahl der von dieser Aufgabe verbrauchten Credits. Eine Aufgabe, die SUCCEEDED erreicht, wird mit dem vollen Betrag für ihre Stufe berechnet. Eine Aufgabe, die nie erstellt wird (ein 4xx zur Anforderungszeit, einschließlich einer Moderationsablehnung), wird überhaupt nicht berechnet. Eine Aufgabe, die FAILED erreicht, gibt 0 zurück — die Gebühr wird erstattet, einschließlich einer asynchronen Moderationsblockierung. Eine Stornierung über DELETE erstattet nur, solange die Aufgabe noch PENDING ist; eine Aufgabe, die bereits IN_PROGRESS ist, bleibt berechnet, da die Arbeit bereits geleistet wurde.

  • Name
    model_urls
    Type
    object
    Description

    Herunterladbare URLs für die generierten Modellartefakte. Sowohl das GLB als auch das OBJ-Bundle werden im realen Millimetermaßstab, Y-oben, mit der Vorderseite des Keycaps in Richtung +Z exportiert. Netze sind als keycap-head und keycap-base benannt; wenn die Basis auf ein Musterfüllung zurückfällt, ist ein drittes Netz keycap-base-interior für die Stielhöhle ebenfalls vorhanden. Gehen Sie nicht davon aus, dass es genau zwei Netze gibt.

    Dies sind signierte URLs: Abrufen ohne Authorization Header. Sie bleiben gültig bis expires_at, was 3 Tage nach finished_at ist, und das erneute Lesen der Aufgabe innerhalb dieses Fensters gibt die identische URL zurück, anstatt eine neu signierte. Laden Sie die Dateien selbst herunter und speichern Sie sie vor Ablauf — es gibt keine Möglichkeit, einen abgelaufenen Link zu aktualisieren.

    • Name
      glb
      Type
      string
      Description

      Herunterladbare URL zum endgültigen texturierten model.glb.

    • Name
      obj_zip
      Type
      string
      Description

      Herunterladbare URL zu einem Zip-Bundle, das model.obj, model.mtl und die Textur-PNGs enthält, auf die sich das MTL tatsächlich bezieht. Eine einfarbige Basis liefert nur keycap-head.png; eine gemusterte Basis liefert auch keycap-base.png.

  • Name
    process_image_urls
    Type
    object
    Description

    Herunterladbare URLs für Zwischenprozessbilder, nach Art sortiert. Gleicher URL-Lebenszyklus wie model_urls: signiert, kein Authorization Header, gültig bis expires_at und stabil, wenn die Aufgabe erneut gelesen wird. Derzeit ausgegebene Arten:

    • head_design — das Designbild des ausgewählten Kandidaten, das der Build verbraucht hat (immer vorhanden).
    • composite — das fertige Keycap-Display-Rendering des ausgewählten Kandidaten (vorhanden, wenn verfügbar).
    • base_canvas — die bemalte Keycap-Basis-Leinwand (vorhanden, wenn verfügbar).

    Behandeln Sie die Schlüsselsammlung als offen; neue Arten können ohne eine Breaking-Änderung hinzugefügt werden.

Beispiel Keycap Build Task Objekt

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

End-to-End Beispiel

Der komplette Ablauf: Erstellen Sie einen Prototypen aus einem Foto, warten Sie, bis er SUCCEEDED ist, wählen Sie einen Kandidaten aus candidate_ids, erstellen Sie einen Build mit diesem Kandidaten, warten Sie, bis der Build SUCCEEDED ist, und laden Sie dann das GLB und das OBJ-Paket von model_urls herunter.

Das Beispiel wählt den ersten Kandidaten programmatisch aus. In einer echten Integration würden Sie den Eintrag image_urls dem Endbenutzer anzeigen und ihn wählen lassen; der gewählte Index wird 1:1 auf candidate_ids abgebildet.

Kompletter Ablauf

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"