Creative Lab — API Fidget Pixel

Transformez une photo source en un fidget board en pixel-art multicolore imprimable en 3D en deux étapes : prototype pixélise votre photo en une image pixel-art, puis build échantillonne cette image sur une grille de 16×16 ou 32×32 et transforme chaque pixel en une pièce carrée ou hexagonale imbriquée, livrée sous forme d'un unique fichier 3MF dont les objets portent leurs couleurs afin qu'un trancheur multi-filament imprime chaque pièce dans la bonne couleur. Les deux étapes sont liées via input_task_id.

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

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

Créer une tâche de prototype Fidget Pixel

Génère une seule image pixel-art à partir de la photo source. L'ID de tâche renvoyé est celui que vous transmettez en tant que input_task_id au point de terminaison de build. Appelez à nouveau ce point de terminaison pour obtenir un autre résultat si celui-ci ne vous convient pas — chaque appel est facturé séparément. Consultez L'objet tâche de prototype Fidget Pixel pour connaître la forme de la réponse.

Paramètres

  • Name
    image_url
    Type
    string
    Requis
    Description

    Photo source que Meshy doit pixeliser. Nous prenons actuellement en charge les formats .jpg, .jpeg, .png et .webp.

    Le format est détecté en décodant les données de l'image, pas à partir de l'extension de fichier de l'URL — une URL sans extension, ou qui redirige, fonctionne tant que les octets se décodent vers un format pris en charge. Les redirections HTTP sont suivies.

    Il existe deux façons de fournir l'image :

    • URL accessible publiquement : une URL accessible depuis l'internet public.
    • Data URI : une URI de données encodée en base64 de l'image. Exemple de Data URI : data:image/jpeg;base64,<vos données d'image encodées en base64>.
  • Name
    type
    Type
    string
    Requis
    Description

    Ce que représente la photo. Sélectionne le style de pixelisation, choisissez donc délibérément — les deux produisent des résultats visiblement différents. Valeurs disponibles :

    • person — le sujet est une personne (portrait ou corps entier). Produit un sprite pixel au style chibi du sujet.
    • other — tout le reste : animaux de compagnie, objets, mascottes, logos, paysages. Produit une icône pixel au style perles du sujet.
  • Name
    name
    Type
    string
    Description

    Nom de tâche facultatif à des fins d'affichage. Maximum 100 caractères.

Retours

La propriété result de la réponse contient l'id de tâche de la nouvelle tâche de prototype fidget pixel créée. Interrogez le point de terminaison Récupérer une tâche ou abonnez-vous au flux jusqu'à ce que la tâche atteigne l'état SUCCEEDED, puis transmettez cet ID au point de terminaison de build en tant que input_task_id.

Modes d'échec

  • Name
    400 - Bad Request
    Description

    La requête était inacceptable. Causes courantes :

    • Paramètre manquant : image_url et type sont tous deux requis.
    • Type invalide : type doit être person ou other.
    • Format d'image invalide : l'image_url fournie n'est pas dans un format pris en charge (.jpg, .jpeg, .png, .webp).
    • Dimensions d'image hors limites : l'image est trop petite, dépasse la taille de fichier maximale, ou dépasse le nombre maximal de pixels.
    • URL inaccessible : l'image_url n'a pas pu être téléchargée (404 ou timeout).
    • Data URI invalide : la chaîne base64 est mal formée.
    • Contenu signalé : l'image d'entrée a été signalée par la modération NSFW.
  • Name
    401 - Unauthorized
    Description

    L'authentification a échoué. Veuillez vérifier votre clé API.

  • Name
    402 - Payment Required
    Description

    Crédits insuffisants pour effectuer cette tâche, ou la clé API appartient à un compte au forfait gratuit.

  • Name
    403 - Forbidden
    Description

    L'image d'entrée a été signalée par la modération de propriété intellectuelle (Content flagged for intellectual property violation). Seuls les comptes Enterprise avec le filtrage de propriété intellectuelle activé sont bloqués ; rien n'est facturé.

  • Name
    429 - Too Many Requests
    Description

    Vous avez dépassé votre limite de débit.

  • Name
    500 - Internal Server Error
    Description

    La vérification de propriété intellectuelle elle-même n'a pas pu être effectuée (Unable to perform intellectual property check, please try again). Les comptes Enterprise avec le filtrage de propriété intellectuelle activé échouent en mode fermé sur cette vérification ; rien n'est facturé — réessayez la requête.

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

Créer une tâche de build Fidget Pixel

Génère les pièces imprimables en 3D à partir d'une tâche de prototype réussie. Le build échantillonne l'image pixel-art du prototype sur la grille demandée, la quantifie à au plus color_count couleurs, et génère une pièce imbriquée par cellule de grille. Le livrable est un unique fichier 3MF dans lequel chaque pièce est un objet distinct étiqueté avec sa couleur, prêt pour un trancheur multi-filament. Consultez L'objet tâche de build Fidget Pixel pour la forme de la réponse.

Paramètres

  • Name
    input_task_id
    Type
    string
    Requis
    Description

    L'ID de tâche d'une tâche de prototype créée via ce même point de terminaison OpenAPI. Le prototype doit avoir été créé par le même compte Meshy et doit avoir atteint SUCCEEDED.

    Les tâches de prototype créées via l'application web ne sont pas acceptées — le point de terminaison de build accepte uniquement les tâches de prototype produites par POST /openapi/creative-lab/fidget-pixel/v1/prototype et refuse toute autre source avec 404.

  • Name
    name
    Type
    string
    Description

    Nom de tâche optionnel à des fins d'affichage. Maximum 100 caractères.

options

Géométrie de pièce optionnelle. Chaque champ a une valeur par défaut — n'envoyez que ceux que vous souhaitez remplacer. Ce sont les mêmes contrôles que ceux exposés par l'application web Creative Lab ; la hauteur du bouchon, l'échelle du capuchon et les autres préréglages de fabrication sont dérivés de shape et piece_size_mm et ne sont pas exposés.

  • Name
    shape
    Type
    string
    défaut square
    Description

    Empreinte de chaque pièce. Valeurs disponibles :

    • square (par défaut) — pièces carrées sur une grille carrée.
    • hex — pièces hexagonales sur une grille hexagonale. Les pièces hexagonales sont disponibles uniquement en 6 et 8 mm.
  • Name
    grid_size
    Type
    integer
    défaut 32
    Description

    Nombre de pièces le long de chaque côté du plateau. Valeurs disponibles : 16 ou 32. Une grille de 32 conserve plus de détails ; une grille de 16 signifie des pièces moins nombreuses et plus grandes pour le même sujet.

  • Name
    piece_size_mm
    Type
    integer
    défaut 8
    Description

    Longueur de côté de chaque pièce, en millimètres. Valeurs disponibles : 6, 8, ou 10. Combinée avec grid_size, cela définit la taille du plateau imprimé — par exemple 32 × 8 mm ≈ 26 cm par côté. 10 n'est pas disponible pour shape: "hex" (la face hexagonale inclinée forme un porte-à-faux sur la plupart des imprimantes FDM grand public).

  • Name
    color_count
    Type
    integer
    défaut 8
    Description

    Nombre maximum de couleurs dans la palette à laquelle l'image est quantifiée. Plage : [1, 8]. Chaque couleur devient un filament dans votre trancheur.

  • Name
    piece_height_mm
    Type
    integer
    défaut 15
    Description

    Hauteur de chaque pièce, en millimètres. Plage : [10, 80].

output

Sélecteur de format de sortie optionnel. Par défaut 3mf, qui est actuellement la seule valeur prise en charge.

  • Name
    format
    Type
    string
    défaut 3mf
    Description

    Artefact renvoyé par le build. Valeurs disponibles :

    • 3mf (par défaut) — renvoie un seul model.3mf sous model_urls.3mf, avec un objet par pièce et la couleur de la pièce attachée à chaque objet.

Retourne

La propriété result de la réponse contient l'id de tâche de la tâche de build Fidget Pixel nouvellement créée. Interrogez le point de terminaison Obtenir une tâche ou abonnez-vous au flux jusqu'à ce que la tâche atteigne SUCCEEDED, puis téléchargez l'artefact depuis model_urls.3mf.

Modes d'échec

  • Name
    400 - Bad Request
    Description

    La requête était inacceptable. Causes courantes :

    • Paramètre manquant : input_task_id est requis.
    • UUID invalide : input_task_id n'est pas un UUID valide.
    • Parent non réussi : La tâche de prototype référencée n'a pas encore atteint SUCCEEDED.
    • Aucun candidat : La tâche de prototype a réussi mais n'a produit aucune image pixel-art ; créez un nouveau prototype.
    • Options hors limites : Un des champs options est en dehors de son ensemble ou de sa plage autorisée — par exemple options.grid_size must be 16 or 32, ou options.piece_size_mm=10 is not supported for shape=hex; hex pieces are available in 6 and 8 mm.
    • Format non pris en charge : output.format doit être 3mf.
  • Name
    401 - Unauthorized
    Description

    L'authentification a échoué. Veuillez vérifier votre clé API.

  • Name
    402 - Payment Required
    Description

    Crédits insuffisants pour effectuer cette tâche, ou la clé API appartient à un compte de plan gratuit.

  • Name
    403 - Forbidden
    Description

    L'image du prototype référencé a été signalée par la moderation de propriété intellectuelle. Seuls les comptes Enterprise avec le filtrage de propriété intellectuelle activé sont bloqués ; aucun montant n'est débité.

  • Name
    404 - Not Found
    Description

    La tâche de prototype référencée n'existe pas, appartient à un autre utilisateur, ou a été créée via l'application web (seules les tâches de prototype en mode API s'enchaînent vers le build).

  • Name
    429 - Too Many Requests
    Description

    Vous avez dépassé votre limite de débit.

  • Name
    500 - Internal Server Error
    Description

    Le verdict de propriété intellectuelle du prototype référencé n'a pas pu être établi (Unable to perform intellectual property check, please try again). Les comptes Enterprise avec le filtrage de propriété intellectuelle activé échouent de manière fermée sur cette vérification ; aucun montant n'est débité — réessayez la requête.

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

Récupérer une tâche Fidget Pixel

Récupère une tâche de prototype ou de build à partir d'un id de tâche valide. Le chemin de l'URL doit correspondre à l'étape de la tâche — une tâche de build récupérée via /prototype/:id renvoie 404, et vice versa.

Consultez L'objet de tâche de prototype Fidget Pixel et L'objet de tâche de build Fidget Pixel pour connaître les formats de réponse.

Paramètres

  • Name
    id
    Type
    path
    Description

    Identifiant unique de la tâche fidget pixel à récupérer.

Retours

La réponse contient l'objet de tâche fidget pixel. Sa forme dépend de l'étape demandée.

Modes d'échec

  • Name
    400 - Bad Request
    Description

    id n'est pas un UUID valide (Invalid ID).

  • Name
    403 - Forbidden
    Description

    L'image de la tâche a été signalée par la modération de propriété intellectuelle. Seuls les comptes Enterprise ayant activé le filtrage de propriété intellectuelle sont bloqués.

  • Name
    404 - Not Found
    Description

    La tâche n'existe pas, appartient à un autre utilisateur, ou son étape ne correspond pas au chemin de l'URL.

  • Name
    500 - Internal Server Error
    Description

    La vérification de propriété intellectuelle n'a pas pu être effectuée (Unable to perform intellectual property check, please try again) ; les comptes Enterprise ayant activé le filtrage de propriété intellectuelle échouent par défaut de manière restrictive. Réessayez la requête.

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

Supprimer une tâche Fidget Pixel

Annule une tâche fidget pixel. Si la tâche est encore PENDING, les crédits consommés au moment de la création sont remboursés. Les tâches déjà IN_PROGRESS sont annulées sans remboursement (le worker est peut-être déjà en train de consommer des ressources). Les tâches ayant déjà atteint un état terminal (SUCCEEDED, FAILED, CANCELED) ne peuvent pas être annulées.

Le chemin de l'URL doit correspondre à l'étape de la tâche — un DELETE sur /prototype/:buildId renvoie 404.

Paramètres de chemin

  • Name
    id
    Type
    path
    Description

    Identifiant unique de la tâche fidget pixel à annuler.

Retours

Renvoie 204 No Content en cas de succès avec un corps vide.

Modes d'échec

  • Name
    400 - Bad Request
    Description

    La requête était inacceptable. Causes courantes :

    • ID invalide : id n'est pas un UUID valide.
    • État terminal : La tâche est déjà SUCCEEDED, FAILED ou CANCELED et ne peut pas être annulée.
  • Name
    404 - Not Found
    Description

    La tâche n'existe pas, appartient à un autre utilisateur, ou son étape ne correspond pas au chemin de l'URL.

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

Diffuser un flux d'une tâche Fidget Pixel

Diffusez en temps réel les mises à jour d'une tâche fidget pixel via Server-Sent Events (SSE). Le chemin de l'URL doit correspondre à l'étape de la tâche — ouvrir un flux à /prototype/:buildId/stream émet une seule charge utile event: error avec status_code: 404 et ferme le flux ; un id malformé produit le même résultat avec status_code: 400 (Invalid ID).

Paramètres

  • Name
    id
    Type
    path
    Description

    Identifiant unique de la tâche fidget pixel à diffuser.

Retours

Retourne un flux d'objets de tâche Fidget Pixel Prototype ou Fidget Pixel Build sous forme de Server-Sent Events. Chaque trame transporte l'objet de tâche complet pour l'étape en cours — la même forme que celle renvoyée par le point de terminaison Get — donc tant que la tâche est en PENDING ou IN_PROGRESS, les champs de sortie ne sont simplement pas encore renseignés (null, [] ou {}) et finished_at vaut 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)

Lister les tâches Fidget Pixel

Récupère une liste paginée de vos tâches fidget pixel pour une seule étape. Le chemin de l'URL sélectionne l'étape — /prototype renvoie les tâches de prototype ; /build renvoie les tâches de build. Les tâches de l'autre étape ne sont incluses dans aucune des deux réponses.

Paramètres de chemin

  • Name
    stage
    Type
    path
    Requis
    Description

    Soit prototype soit build. La collection ne renvoie que les tâches dont l'étape correspond à l'URL — récupérer /prototype ne renvoie jamais de tâches de build, et vice versa.

Paramètres de requête

  • Name
    page_num
    Type
    integer
    défaut 1
    Description

    Numéro de page pour la pagination.

  • Name
    page_size
    Type
    integer
    défaut 10
    Description

    Limite de taille de page. Le maximum autorisé est de 100 éléments.

  • Name
    sort_by
    Type
    string
    défaut -created_at
    Description

    Champ selon lequel trier. Valeurs disponibles :

    • +created_at : Trier par date de création par ordre croissant.
    • -created_at : Trier par date de création par ordre décroissant.

Retour

Renvoie une liste paginée de l'objet de tâche spécifique à l'étape — soit l'objet de tâche prototype fidget pixel lors du listing de /prototype, soit l'objet de tâche build fidget pixel lors du listing de /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=***"
    ]
  }
]

L'objet Task Fidget Pixel Prototype

L'objet Fidget Pixel Prototype Task est une unité de travail que Meshy suit pour pixéliser une photo source en une image en pixel art. Le résultat de cette étape est chaîné vers l'étape de build via input_task_id.

Propriétés

  • Name
    id
    Type
    string
    Description

    Identifiant unique de la tâche. Bien que nous utilisions un UUID k-sortable pour les identifiants de tâche comme détail d'implémentation, vous ne devez pas faire d'hypothèses sur le format de l'id.

  • Name
    type
    Type
    string
    Description

    Type de la tâche. La valeur est creative-lab-fidget-pixel-prototype.

  • Name
    name
    Type
    string
    Description

    Le nom de la tâche fourni lors de sa création. Chaîne vide si aucun nom n'a été fourni.

  • Name
    status
    Type
    string
    Description

    Statut de la tâche. Les valeurs possibles sont PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    Progression de la tâche. Si la tâche n'a pas encore commencé, cette propriété vaudra 0. Une fois la tâche réussie, elle deviendra 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Horodatage de la création de la tâche, en millisecondes.

  • Name
    started_at
    Type
    timestamp
    Description

    Horodatage du démarrage de la tâche, en millisecondes. Si la tâche n'a pas encore démarré, cette propriété sera null.

  • Name
    finished_at
    Type
    timestamp
    Description

    Horodatage de la fin de la tâche, en millisecondes. Si la tâche n'est pas encore terminée, cette propriété sera null.

  • Name
    expires_at
    Type
    timestamp
    Description

    Horodatage d'expiration du résultat de la tâche, en millisecondes — 3 jours après la fin de la tâche. Les comptes Enterprise conservent les résultats de l'API indéfiniment (voir Conservation des ressources) ; pour eux, cet horodatage est fixé à environ 100 ans.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Le nombre de tâches précédentes.

  • Name
    task_error
    Type
    object
    Description

    Détails de l'erreur pour les tâches échouées. Voir Erreurs pour la référence complète de l'objet task_error.

  • Name
    consumed_credits
    Type
    integer
    Description

    Le nombre de crédits consommés par cette tâche. Une tâche qui atteint SUCCEEDED est facturée au montant total de son étape. Une tâche qui n'est jamais créée (une erreur 4xx au moment de la requête, y compris un rejet de moderation) n'est pas facturée du tout. Une tâche qui atteint FAILED renvoie 0 — les crédits sont remboursés. L'annulation via DELETE ne rembourse que si la tâche est encore PENDING ; une tâche déjà IN_PROGRESS reste facturée, car le travail a déjà été effectué.

  • Name
    image_urls
    Type
    array of strings
    Description

    URLs téléchargeables pour l'image en pixel art générée par cette tâche de prototype. Actuellement, l'API renvoie toujours exactement une image ; le champ est un tableau afin que de futures révisions puissent proposer plusieurs candidats sans rupture de compatibilité. Vide tant que la tâche n'a pas atteint SUCCEEDED.

    Ce sont des URLs signées : récupérez-les sans en-tête Authorization. Elles restent valides jusqu'à expires_at, soit 3 jours après finished_at, et relire la tâche dans cette fenêtre renvoie l'URL identique plutôt qu'une nouvelle URL signée. Téléchargez et stockez les fichiers vous-même avant cette échéance — il n'existe aucun moyen de rafraîchir un lien expiré.

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

L'objet Fidget Pixel Build Task

L'objet Fidget Pixel Build Task est une unité de travail que Meshy suit afin de générer les pièces imprimables à partir d'une tâche prototype réussie. Le build échantillonne l'image pixel-art du prototype sur la grille demandée et publie un unique 3MF avec balises de couleur.

Propriétés

  • Name
    id
    Type
    string
    Description

    Identifiant unique de la tâche.

  • Name
    type
    Type
    string
    Description

    Type de la tâche. La valeur est creative-lab-fidget-pixel-build.

  • Name
    name
    Type
    string
    Description

    Le nom de la tâche fourni lors de sa création. Chaîne vide si aucun nom n'a été fourni.

  • Name
    status
    Type
    string
    Description

    Statut de la tâche. Les valeurs possibles sont l'une des suivantes : PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    Progression de la tâche. Si la tâche n'a pas encore démarré, cette propriété vaudra 0. Une fois la tâche réussie, elle deviendra 100.

  • Name
    created_at
    Type
    timestamp
    Description

    Horodatage de la création de la tâche, en millisecondes.

  • Name
    started_at
    Type
    timestamp
    Description

    Horodatage du démarrage de la tâche, en millisecondes. null tant que la tâche n'a pas démarré.

  • Name
    finished_at
    Type
    timestamp
    Description

    Horodatage de la fin de la tâche, en millisecondes. null tant que la tâche n'est pas terminée.

  • Name
    expires_at
    Type
    timestamp
    Description

    Horodatage de l'expiration du résultat de la tâche, en millisecondes — 3 jours après la fin de la tâche. Les comptes Enterprise conservent les résultats de l'API indéfiniment (voir Conservation des ressources) ; pour eux, cet horodatage est fixé à environ 100 ans.

  • Name
    preceding_tasks
    Type
    integer
    Description

    Le nombre de tâches précédentes. Pertinent uniquement lorsque le statut est PENDING.

  • Name
    task_error
    Type
    object
    Description

    Détails d'erreur pour les tâches échouées. Voir Erreurs pour la référence complète de l'objet task_error.

  • Name
    consumed_credits
    Type
    integer
    Description

    Le nombre de crédits consommés par cette tâche. Une tâche qui atteint SUCCEEDED est facturée au montant complet correspondant à son étape. Une tâche qui n'est jamais créée (une erreur 4xx au moment de la requête, y compris un rejet par la moderation) n'est pas facturée du tout. Une tâche qui atteint FAILED renvoie 0 — le montant est remboursé. L'annulation via DELETE ne rembourse que tant que la tâche est encore PENDING ; une tâche déjà IN_PROGRESS reste facturée, car le travail a déjà été effectué.

  • Name
    model_urls
    Type
    object
    Description

    URLs téléchargeables pour la ressource générée, classées par format. Contient exactement une entrée — le format demandé via le champ output.format de la requête de build. Vide tant que la tâche n'a pas atteint SUCCEEDED.

    Ce sont des URLs signées : récupérez-les sans en-tête Authorization. Elles restent valides jusqu'à expires_at, soit 3 jours après finished_at, et relire la tâche pendant cette période renvoie l'URL identique plutôt qu'une nouvelle URL signée. Téléchargez et stockez les fichiers vous-même avant cette échéance — il n'existe aucun moyen de renouveler un lien expiré.

    • Name
      3mf
      Type
      string
      Description

      URL téléchargeable vers le fichier 3MF. Un objet par pièce, chacun étiqueté avec sa couleur de palette, de sorte qu'un trancheur multi-filament attribue les filaments par couleur. Présent lorsque output.format était 3mf (valeur par défaut).

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

Exemple de bout en bout

Le flux complet : créer un prototype à partir d'une photo, l'interroger jusqu'à SUCCEEDED, créer une construction à partir de celui-ci, interroger la construction jusqu'à SUCCEEDED, puis télécharger le 3MF depuis model_urls.

Un prototype se termine généralement en quelques minutes ; une construction se termine généralement en bien moins d'une minute. Dans une intégration réelle, vous afficheriez l'entrée image_urls du prototype à l'utilisateur final et le laisseriez confirmer (ou relancer le prototype) avant de dépenser des crédits pour la construction.

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"