Creative Lab — Fidget Pixel API

Verwandeln Sie ein Ausgangsfoto in zwei Stufen in ein mehrfarbiges, 3D-druckbares Pixel-Art-Fidget-Board: Prototype pixeliert Ihr Foto zu einem Pixel-Art-Bild, dann tastet Build dieses Bild auf ein 16×16- oder 32×32-Raster ab und wandelt jeden Pixel in ein ineinandergreifendes quadratisches oder sechseckiges Teil um, ausgeliefert als einzelne 3MF-Datei, deren Objekte ihre Farben tragen, sodass ein Multifilament-Slicer jedes Teil in der richtigen Farbe druckt. Die beiden Stufen sind über input_task_id verknüpft.

  • POST /openapi/creative-lab/fidget-pixel/v1/prototype
  • POST /openapi/creative-lab/fidget-pixel/v1/build

POST/openapi/creative-lab/fidget-pixel/v1/prototype

Erstellen einer Fidget Pixel Prototype Task

Erzeugt ein einzelnes Pixel-Art-Bild aus dem Quellfoto. Die zurückgegebene Task-ID wird als input_task_id an den Build-Endpunkt übergeben. Rufen Sie diesen Endpunkt erneut auf, um einen weiteren Versuch zu erhalten, falls das Ergebnis nicht Ihren Vorstellungen entspricht – jeder Aufruf wird separat abgerechnet. Für die Form der Antwort siehe Das Fidget Pixel Prototype Task Objekt.

Parameter

  • Name
    image_url
    Type
    string
    Erforderlich
    Description

    Quellfoto, das Meshy pixeln soll. Wir unterstützen derzeit die Formate .jpg, .jpeg, .png und .webp.

    Das Format wird durch das Dekodieren der Bilddaten ermittelt, nicht anhand der Dateiendung der URL – eine URL ohne Erweiterung oder eine, die weiterleitet, funktioniert, solange die Bytes zu einem unterstützten Format dekodiert werden. HTTP-Weiterleitungen werden befolgt.

    Es gibt zwei Möglichkeiten, das Bild bereitzustellen:

    • Öffentlich zugängliche URL: Eine URL, die aus dem öffentlichen Internet erreichbar ist.
    • Data URI: Ein base64-kodierter Data URI des Bildes. Beispiel für einen Data URI: data:image/jpeg;base64,<Ihre base64-kodierten Bilddaten>.
  • Name
    type
    Type
    string
    Erforderlich
    Description

    Was das Foto zeigt. Wählt den Pixelisierungsstil aus, wählen Sie also bewusst – die beiden Optionen erzeugen sichtbar unterschiedliche Ergebnisse. Verfügbare Werte:

    • person — das Motiv ist eine Person (Porträt oder Ganzkörper). Erzeugt ein Pixel-Sprite des Motivs im Chibi-Stil.
    • other — alles andere: Haustiere, Objekte, Maskottchen, Logos, Landschaften. Erzeugt ein Pixel-Icon des Motivs im Perlenkunst-Stil.
  • Name
    name
    Type
    string
    Description

    Optionaler Task-Name zu Anzeigezwecken. Maximal 100 Zeichen.

Rückgabe

Die result-Eigenschaft der Antwort enthält die Task-id der neu erstellten Fidget Pixel Prototype Task. Fragen Sie den Get a Task-Endpunkt ab oder abonnieren Sie den Stream, bis die Task den Status SUCCEEDED erreicht, und übergeben Sie diese ID dann als input_task_id an den Build-Endpunkt.

Fehlermodi

  • Name
    400 - Bad Request
    Description

    Die Anfrage war nicht akzeptabel. Häufige Ursachen:

    • Fehlender Parameter: image_url und type sind beide erforderlich.
    • Ungültiger type: type muss person oder other sein.
    • Ungültiges Bildformat: Die angegebene image_url hat kein unterstütztes Format (.jpg, .jpeg, .png, .webp).
    • Bildabmessungen außerhalb des zulässigen Bereichs: Das Bild ist zu klein, überschreitet die maximale Dateigröße oder überschreitet die maximale Pixelanzahl.
    • Nicht erreichbare URL: Die image_url konnte nicht heruntergeladen werden (404 oder timeout).
    • Ungültiger Data URI: Die base64-Zeichenfolge ist fehlerhaft.
    • Inhalt markiert: Das Eingabebild wurde durch die NSFW-moderation markiert.
  • Name
    401 - Unauthorized
    Description

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

  • Name
    402 - Payment Required
    Description

    Nicht genügend Credits, um diese Task auszuführen, oder der API-Schlüssel gehört zu einem Konto mit kostenlosem Plan.

  • Name
    403 - Forbidden
    Description

    Das Eingabebild wurde durch die moderation für geistiges Eigentum markiert (Content flagged for intellectual property violation). Blockiert werden nur Enterprise-Konten mit aktivierter Filterung für geistiges Eigentum; es wird nichts berechnet.

  • Name
    429 - Too Many Requests
    Description

    Sie haben Ihre Ratenbegrenzung überschritten.

  • Name
    500 - Internal Server Error
    Description

    Die Prüfung auf geistiges Eigentum selbst konnte nicht abgeschlossen werden (Unable to perform intellectual property check, please try again). Enterprise-Konten mit aktivierter Filterung für geistiges Eigentum schlagen bei dieser Prüfung im Zweifel ab; es wird nichts berechnet – wiederholen Sie die Anfrage.

Request

POST
/openapi/creative-lab/fidget-pixel/v1/prototype
# Stage 1: pixelize the source photo
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/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>",
    "type": "person"
  }'

Response

{
  "result": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7"
}

POST/openapi/creative-lab/fidget-pixel/v1/build

Erstellen einer Fidget-Pixel-Build-Aufgabe

Generiert die 3D-druckbaren Teile aus einer erfolgreich abgeschlossenen Prototyp-Aufgabe. Der Build tastet das Pixel-Art-Bild des Prototyps auf das angeforderte Raster ab, quantisiert es auf höchstens color_count Farben und erzeugt für jede Rasterzelle ein ineinandergreifendes Teil. Das Ergebnis ist eine einzelne 3MF-Datei, in der jedes Teil ein separates Objekt ist, das mit seiner Farbe getaggt ist und für einen Multi-Filament-Slicer bereitsteht. Für die Form der Antwort siehe Das Fidget-Pixel-Build-Aufgabenobjekt.

Parameter

  • Name
    input_task_id
    Type
    string
    Erforderlich
    Description

    Die Aufgaben-ID einer Prototyp-Aufgabe, die über denselben OpenAPI-Endpunkt erstellt wurde. Der Prototyp muss vom selben Meshy-Konto erstellt worden sein und den Status SUCCEEDED erreicht haben.

    Prototyp-Aufgaben, die über die Webapp erstellt wurden, werden nicht akzeptiert – der Build-Endpunkt akzeptiert nur Prototyp-Aufgaben, die von POST /openapi/creative-lab/fidget-pixel/v1/prototype erzeugt wurden, und lehnt jede andere Quelle mit 404 ab.

  • Name
    name
    Type
    string
    Description

    Optionaler Aufgabenname für Anzeigezwecke. Maximal 100 Zeichen.

options

Optionale Teile-Geometrie. Jedes Feld hat einen Standardwert – senden Sie nur die Felder, die Sie überschreiben möchten. Dies sind dieselben Regler, die die Creative-Lab-Webapp anbietet; Steckhöhe, Kappenskalierung und die übrigen Fertigungsvorgaben werden aus shape und piece_size_mm abgeleitet und sind nicht zugänglich.

  • Name
    shape
    Type
    string
    Standard square
    Description

    Grundriss jedes Teils. Verfügbare Werte:

    • square (Standard) — quadratische Teile auf einem quadratischen Raster.
    • hex — sechseckige Teile auf einem hexagonalen Raster. Hex-Teile sind nur in 6 und 8 mm verfügbar.
  • Name
    grid_size
    Type
    integer
    Standard 32
    Description

    Anzahl der Teile entlang jeder Seite des Bretts. Verfügbare Werte: 16 oder 32. Ein 32-Raster erhält mehr Details; ein 16-Raster bedeutet weniger, dafür größere Teile für dasselbe Motiv.

  • Name
    piece_size_mm
    Type
    integer
    Standard 8
    Description

    Kantenlänge jedes Teils in Millimetern. Verfügbare Werte: 6, 8 oder 10. Zusammen mit grid_size legt dies die gedruckte Brettgröße fest – zum Beispiel 32 × 8 mm ≈ 26 cm pro Seite. 10 ist bei shape: "hex" nicht verfügbar (die schräge Hex-Fläche überhängt bei den meisten FDM-Druckern für Endverbraucher).

  • Name
    color_count
    Type
    integer
    Standard 8
    Description

    Maximale Anzahl an Farben in der Palette, auf die das Bild quantisiert wird. Bereich: [1, 8]. Jede Farbe wird in Ihrem Slicer zu einem Filament.

  • Name
    piece_height_mm
    Type
    integer
    Standard 15
    Description

    Höhe jedes Teils in Millimetern. Bereich: [10, 80].

output

Optionaler Auswahlparameter für das Übertragungsformat. Standardmäßig 3mf, was derzeit der einzige unterstützte Wert ist.

  • Name
    format
    Type
    string
    Standard 3mf
    Description

    Vom Build zurückgegebenes Artefakt. Verfügbare Werte:

    • 3mf (Standard) — gibt eine einzelne model.3mf unter model_urls.3mf zurück, mit einem Objekt pro Teil und der jeweiligen Teilfarbe, die an jedes Objekt angehängt ist.

Rückgabewerte

Die Eigenschaft result der Antwort enthält die Aufgaben-id der neu erstellten Fidget-Pixel-Build-Aufgabe. Fragen Sie den Endpunkt Eine Aufgabe abrufen ab oder abonnieren Sie den Stream, bis die Aufgabe den Status SUCCEEDED erreicht, und laden Sie anschließend das Artefakt von model_urls.3mf herunter.

Fehlerfälle

  • Name
    400 - Bad Request
    Description

    Die Anfrage war nicht akzeptabel. Häufige Ursachen:

    • Fehlender Parameter: input_task_id ist erforderlich.
    • Ungültige UUID: input_task_id ist keine gültige UUID.
    • Übergeordnete Aufgabe nicht abgeschlossen: Die referenzierte Prototyp-Aufgabe hat den Status SUCCEEDED noch nicht erreicht.
    • Kein Kandidat: Die Prototyp-Aufgabe war erfolgreich, hat aber kein Pixel-Art-Bild erzeugt; erstellen Sie einen neuen Prototyp.
    • Optionen außerhalb des zulässigen Bereichs: Eines der options-Felder liegt außerhalb der erlaubten Menge oder des erlaubten Bereichs — zum Beispiel options.grid_size must be 16 or 32, oder options.piece_size_mm=10 is not supported for shape=hex; hex pieces are available in 6 and 8 mm.
    • Nicht unterstütztes Format: output.format muss 3mf sein.
  • Name
    401 - Unauthorized
    Description

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

  • Name
    402 - Payment Required
    Description

    Unzureichende Credits, um diese Aufgabe auszuführen, oder der API-Schlüssel gehört zu einem Konto mit kostenlosem Tarif.

  • Name
    403 - Forbidden
    Description

    Das Bild des referenzierten Prototyps wurde durch die Prüfung auf geistiges Eigentum (moderation) markiert. Blockiert werden nur Enterprise-Konten mit aktivierter Filterung geistigen Eigentums; es werden keine Credits berechnet.

  • Name
    404 - Not Found
    Description

    Die referenzierte Prototyp-Aufgabe existiert nicht, gehört einem anderen Benutzer oder wurde über die Webapp erstellt (nur im API-Modus erstellte Prototyp-Aufgaben können mit einem Build verkettet werden).

  • Name
    429 - Too Many Requests
    Description

    Sie haben Ihre Ratenbegrenzung überschritten.

  • Name
    500 - Internal Server Error
    Description

    Die Beurteilung des geistigen Eigentums des referenzierten Prototyps konnte nicht ermittelt werden (Unable to perform intellectual property check, please try again). Enterprise-Konten mit aktivierter Filterung geistigen Eigentums schlagen bei dieser Prüfung im Zweifel ab; es werden keine Credits berechnet — wiederholen Sie die Anfrage.

Request

POST
/openapi/creative-lab/fidget-pixel/v1/build
# Stage 2: chain build off a succeeded prototype task
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "input_task_id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
    "options": {
      "shape": "square",
      "grid_size": 32,
      "piece_size_mm": 8,
      "color_count": 8,
      "piece_height_mm": 15
    },
    "output": {
      "format": "3mf"
    }
  }'

Response

{
  "result": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98"
}

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

Fidget Pixel Task abrufen

Ruft einen Prototyp- oder Build-Task anhand einer gültigen Task-id ab. Der URL-Pfad muss zur Stufe des Tasks passen — ein Build-Task, der über /prototype/:id abgerufen wird, liefert 404, und umgekehrt.

Die Antwortformate finden Sie unter Das Fidget Pixel Prototyp-Task-Objekt und Das Fidget Pixel Build-Task-Objekt.

Parameter

  • Name
    id
    Type
    path
    Description

    Eindeutige Kennung des abzurufenden Fidget-Pixel-Tasks.

Rückgabewerte

Die Antwort enthält das Fidget-Pixel-Task-Objekt. Die Form hängt davon ab, welche Stufe angefordert wurde.

Fehlermodi

  • Name
    400 - Bad Request
    Description

    id ist keine gültige UUID (Invalid ID).

  • Name
    403 - Forbidden
    Description

    Das Bild des Tasks wurde von der moderation für geistiges Eigentum markiert. Nur Enterprise-Konten mit aktivierter Filterung für geistiges Eigentum werden blockiert.

  • Name
    404 - Not Found
    Description

    Der Task existiert nicht, gehört einem anderen Benutzer, oder seine Stufe stimmt nicht mit dem URL-Pfad überein.

  • Name
    500 - Internal Server Error
    Description

    Die Prüfung auf geistiges Eigentum konnte nicht abgeschlossen werden (Unable to perform intellectual property check, please try again); Enterprise-Konten mit aktivierter Filterung für geistiges Eigentum schlagen im Zweifel fehl (fail closed). Wiederholen Sie die Anfrage.

Request

GET
/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# Build
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Prototype Response

{
  "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
  "type": "creative-lab-fidget-pixel-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001000000,
  "started_at": 1757001005000,
  "finished_at": 1757001178000,
  "expires_at": 1757260378000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 6,
  "image_urls": [
    "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
  ]
}

Build Response

{
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

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

Delete a Fidget Pixel Task

Bricht eine Fidget-Pixel-Aufgabe ab. Wenn sich die Aufgabe noch im Status PENDING befindet, werden die bei der Erstellung verbrauchten Credits zurückerstattet. Aufgaben, die sich bereits IN_PROGRESS befinden, werden ohne Rückerstattung abgebrochen (der Worker verbraucht möglicherweise bereits Ressourcen). Aufgaben, die bereits einen Endzustand erreicht haben (SUCCEEDED, FAILED, CANCELED), können nicht abgebrochen werden.

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

Pfadparameter

  • Name
    id
    Type
    path
    Description

    Eindeutige Kennung der abzubrechenden Fidget-Pixel-Aufgabe.

Rückgabewerte

Gibt bei Erfolg 204 No Content mit leerem Body zurück.

Fehlermodi

  • Name
    400 - Bad Request
    Description

    Die Anfrage war nicht akzeptabel. Häufige Ursachen:

    • Ungültige ID: id ist keine gültige UUID.
    • Endzustand: Die Aufgabe befindet sich bereits im Status SUCCEEDED, FAILED oder CANCELED 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.

Request

DELETE
/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7
curl --request DELETE \
  --url https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

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

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

Fidget-Pixel-Task streamen

Streamt Echtzeit-Updates für einen Fidget-Pixel-Task über Server-Sent Events (SSE). Der URL-Pfad muss zur Phase des Tasks passen — wird ein Stream unter /prototype/:buildId/stream geöffnet, wird ein einzelner event: error-Payload mit status_code: 404 ausgegeben und der Stream geschlossen; eine fehlerhafte id verhält sich genauso, jedoch mit status_code: 400 (Invalid ID).

Parameter

  • Name
    id
    Type
    path
    Description

    Eindeutiger Bezeichner des zu streamenden Fidget-Pixel-Tasks.

Rückgabewerte

Gibt einen Stream von Fidget Pixel Prototype- oder Fidget Pixel Build-Task-Objekten als Server-Sent Events zurück. Jeder Frame enthält das vollständige Task-Objekt für die jeweilige Phase — dieselbe Struktur, die auch der Get-Endpunkt zurückgibt — solange der Task also PENDING oder IN_PROGRESS ist, sind die Ausgabefelder einfach noch nicht befüllt (null, [] oder {}) und finished_at ist null.

Request

GET
/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/stream
curl -N https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/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 for the stage; fields not yet populated are null / empty.
event: message
data: {
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "PENDING",
  "progress": 0,
  "created_at": 1757001300000,
  "started_at": null,
  "finished_at": null,
  "expires_at": 1757260500000,
  "preceding_tasks": 2,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {}
}

event: message
data: {
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

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

Fidget-Pixel-Aufgaben auflisten

Ruft eine paginierte Liste Ihrer Fidget-Pixel-Aufgaben für eine einzelne Stufe ab. Der URL-Pfad wählt die Stufe aus — /prototype liefert Prototyp-Aufgaben zurück; /build liefert Build-Aufgaben zurück. Aufgaben der jeweils anderen Stufe sind in keiner der beiden Antworten enthalten.

Pfadparameter

  • Name
    stage
    Type
    path
    Erforderlich
    Description

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

Abfrageparameter

  • Name
    page_num
    Type
    integer
    Standard 1
    Description

    Seitenzahl für die Paginierung.

  • Name
    page_size
    Type
    integer
    Standard 10
    Description

    Begrenzung der Seitengröße. Maximal zulässig sind 100 Einträge.

  • 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ückgabe

Gibt eine paginierte Liste des Aufgabenobjekts der jeweiligen Stufe zurück — entweder das Fidget-Pixel-Prototyp-Aufgabenobjekt beim Auflisten von /prototype oder das Fidget-Pixel-Build-Aufgabenobjekt beim Auflisten von /build.

Request

GET
/openapi/creative-lab/fidget-pixel/v1/prototype
# List prototype tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype?page_size=10 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# List build tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build?page_size=10 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response (List Prototype Tasks)

[
  {
    "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
    "type": "creative-lab-fidget-pixel-prototype",
    "name": "",
    "status": "SUCCEEDED",
    "progress": 100,
    "created_at": 1757001000000,
    "started_at": 1757001005000,
    "finished_at": 1757001178000,
    "expires_at": 1757260378000,
    "preceding_tasks": 0,
    "task_error": null,
    "consumed_credits": 6,
    "image_urls": [
      "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
    ]
  }
]

Das Fidget Pixel Prototype Task Object

Das Fidget Pixel Prototype Task Object ist eine Arbeitseinheit, die Meshy verwaltet, um ein Ausgangsfoto in ein Pixel-Art-Bild zu pixelieren. Die Ausgabe dieser Stufe wird über input_task_id mit der Build-Stufe verkettet.

Eigenschaften

  • Name
    id
    Type
    string
    Description

    Eindeutige Kennung für die Aufgabe. Auch wenn wir als Implementierungsdetail eine k-sortierbare UUID für Task-IDs verwenden, solltest du keine Annahmen über das Format der ID treffen.

  • Name
    type
    Type
    string
    Description

    Typ der Aufgabe. Der Wert ist creative-lab-fidget-pixel-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 dieser Wert 0. Sobald die Aufgabe erfolgreich abgeschlossen wurde, wird er 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 dieser Wert null.

  • Name
    finished_at
    Type
    timestamp
    Description

    Zeitstempel, wann die Aufgabe beendet wurde, in Millisekunden. Wenn die Aufgabe noch nicht beendet wurde, ist dieser Wert null.

  • Name
    expires_at
    Type
    timestamp
    Description

    Zeitstempel, wann das Ergebnis der Aufgabe abläuft, in Millisekunden — 3 Tage nachdem die Aufgabe beendet wurde. Enterprise-Konten behalten API-Ergebnisse unbegrenzt (siehe Aufbewahrung von Assets); für sie ist dieser Zeitstempel auf etwa 100 Jahre in der Zukunft gesetzt.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Die Anzahl der vorausgehenden Aufgaben.

  • Name
    task_error
    Type
    object
    Description

    Fehlerdetails für fehlgeschlagene Aufgaben. Siehe Fehler für die vollständige Referenz des task_error-Objekts.

  • Name
    consumed_credits
    Type
    integer
    Description

    Die Anzahl der von dieser Aufgabe verbrauchten Credits. Einer Aufgabe, die SUCCEEDED erreicht, wird der volle Betrag für ihre Stufe berechnet. Eine Aufgabe, die nie erstellt wird (ein 4xx zum Zeitpunkt der Anfrage, einschließlich einer Ablehnung durch die moderation), wird überhaupt nicht berechnet. Eine Aufgabe, die FAILED erreicht, gibt 0 zurück — die Belastung wird erstattet. Ein Abbruch per DELETE erstattet nur, solange die Aufgabe noch PENDING ist; eine bereits IN_PROGRESS befindliche Aufgabe bleibt belastet, da die Arbeit bereits aufgewendet wurde.

  • Name
    image_urls
    Type
    array of strings
    Description

    Herunterladbare URLs für das von dieser Prototyp-Aufgabe erzeugte Pixel-Art-Bild. Derzeit gibt die API immer genau ein Bild zurück; das Feld ist ein Array, damit zukünftige Überarbeitungen mehrere Kandidaten anzeigen können, ohne eine Breaking Change zu verursachen. Leer, bis die Aufgabe SUCCEEDED erreicht.

    Dies sind signierte URLs: rufe sie ohne einen Authorization-Header ab. Sie bleiben bis expires_at gültig, also 3 Tage nach finished_at, und ein erneutes Auslesen der Aufgabe innerhalb dieses Zeitfensters liefert dieselbe URL zurück, statt eine neu signierte. Lade die Dateien vorher selbst herunter und speichere sie — es gibt keine Möglichkeit, einen abgelaufenen Link zu erneuern.

Example Fidget Pixel Prototype Task Object

{
  "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
  "type": "creative-lab-fidget-pixel-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001000000,
  "started_at": 1757001005000,
  "finished_at": 1757001178000,
  "expires_at": 1757260378000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 6,
  "image_urls": [
    "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
  ]
}

Das Fidget Pixel Build Task Objekt

Das Fidget Pixel Build Task Objekt ist eine Arbeitseinheit, die Meshy verfolgt, um die druckbaren Teile aus einer erfolgreich abgeschlossenen Prototyp-Aufgabe zu generieren. Der Build tastet das Pixel-Art-Bild des Prototyps auf das angeforderte Raster ab und veröffentlicht eine einzelne farblich gekennzeichnete 3MF-Datei.

Eigenschaften

  • Name
    id
    Type
    string
    Description

    Eindeutige Kennung für die Aufgabe.

  • Name
    type
    Type
    string
    Description

    Typ der Aufgabe. Der Wert ist creative-lab-fidget-pixel-build.

  • Name
    name
    Type
    string
    Description

    Der Aufgabenname, der bei der Erstellung der Aufgabe angegeben wurde. 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 dieser Wert 0. Sobald die Aufgabe erfolgreich abgeschlossen wurde, wird er 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Zeitstempel der Erstellung der Aufgabe, in Millisekunden.

  • Name
    started_at
    Type
    timestamp
    Description

    Zeitstempel des Starts der Aufgabe, in Millisekunden. null, bis die Aufgabe startet.

  • Name
    finished_at
    Type
    timestamp
    Description

    Zeitstempel des Abschlusses der Aufgabe, in Millisekunden. null, bis die Aufgabe abgeschlossen ist.

  • Name
    expires_at
    Type
    timestamp
    Description

    Zeitstempel, wann das Ergebnis der Aufgabe abläuft, in Millisekunden — 3 Tage nach Abschluss der Aufgabe. Enterprise-Konten behalten API-Ergebnisse unbegrenzt (siehe Aufbewahrung von Assets); für sie ist dieser Zeitstempel auf etwa 100 Jahre in der Zukunft festgelegt.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Die Anzahl der vorausgehenden Aufgaben. Nur relevant, wenn der Status PENDING ist.

  • Name
    task_error
    Type
    object
    Description

    Fehlerdetails für fehlgeschlagene Aufgaben. Siehe Fehler für die vollständige Referenz des task_error-Objekts.

  • 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 belastet. Eine Aufgabe, die nie erstellt wird (ein 4xx zum Zeitpunkt der Anfrage, einschließlich einer moderation-Ablehnung), wird überhaupt nicht belastet. Eine Aufgabe, die FAILED erreicht, gibt 0 zurück — die Belastung wird erstattet. Das Abbrechen über DELETE erstattet nur, solange die Aufgabe noch PENDING ist; eine bereits IN_PROGRESS befindliche Aufgabe bleibt belastet, da die Arbeit bereits geleistet wurde.

  • Name
    model_urls
    Type
    object
    Description

    Herunterladbare URLs für das generierte Artefakt, indiziert nach Format. Enthält genau einen Eintrag — das über output.format der Build-Anfrage angeforderte Format. Leer, bis die Aufgabe SUCCEEDED erreicht.

    Dies sind signierte URLs: Rufen Sie sie ohne Authorization-Header ab. Sie bleiben gültig bis expires_at, das ist 3 Tage nach finished_at, und ein erneutes Auslesen der Aufgabe innerhalb dieses Zeitfensters liefert dieselbe URL zurück statt einer neu signierten. Laden Sie die Dateien vorher selbst herunter und speichern Sie sie — es gibt keine Möglichkeit, einen abgelaufenen Link zu erneuern.

    • Name
      3mf
      Type
      string
      Description

      Herunterladbare URL zur 3MF-Datei. Ein Objekt pro Teil, jeweils mit seiner Palettenfarbe gekennzeichnet, sodass ein Multi-Filament-Slicer Filamente pro Farbe zuweist. Vorhanden, wenn output.format 3mf war (Standardwert).

Example Fidget Pixel Build Task Object

{
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

End-to-End-Beispiel

Der vollständige Ablauf: Erstellen eines Prototyps aus einem Foto, Abfragen bis SUCCEEDED, Erstellen eines Builds daraus, Abfragen des Builds bis SUCCEEDED und anschließend Herunterladen der 3MF aus model_urls.

Ein Prototyp ist in der Regel innerhalb weniger Minuten fertig; ein Build wird typischerweise in deutlich unter einer Minute abgeschlossen. In einer echten Integration würden Sie dem Endnutzer den Eintrag image_urls des Prototyps anzeigen und ihn bestätigen lassen (oder den Prototyp erneut ausführen lassen), bevor Credits für den Build ausgegeben werden.

Complete flow

POST
/openapi/creative-lab/fidget-pixel/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://...
#   export PIXEL_TYPE=person                  # or: other
: "${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
PIXEL_TYPE=${PIXEL_TYPE:-person}

BASE="https://api.meshy.ai/openapi/creative-lab/fidget-pixel/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 '{"type":"%s","image_url":"data:%s;base64,' "$PIXEL_TYPE" "$MIME"
    base64 <"$IMAGE_PATH" | tr -d '\n'
    printf '"}'
  } >"$BODY"
else
  jq -n --arg t "$PIXEL_TYPE" --arg u "$IMAGE_URL" \
    '{type: $t, image_url: $u}' >"$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 pixel-art image (show image_urls[0] to a user in production)
poll prototype "$PROTO_ID"

# 3. Create the build task (defaults: square pieces, 32x32 grid, 8 mm, 8 colors, 15 mm tall)
jq -n --arg p "$PROTO_ID" \
  '{input_task_id: $p, options: {shape: "square", grid_size: 32, piece_size_mm: 8, color_count: 8, piece_height_mm: 15}, output: {format: "3mf"}}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
  -H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')

# 4. Wait for the pieces
poll build "$BUILD_ID"

# 5. Download the 3MF. This is a signed URL: no Authorization header,
#    and it stays valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
  -o fidget-pixel.3mf "$(jq -r '.model_urls["3mf"]' <<<"$TASK")"
echo "Done: fidget-pixel.3mf"