Générer des rendus
Deux familles de tâches sur un même workflow. L'Embellisseur produit génère le produit seul sur un arrière-plan ; un shooting photo le place sur un mannequin. Les deux renvoient une tâche que vous interrogez ou à laquelle vous vous abonnez.
Toutes les tâches partagent la même forme : la même authentification, le même cycle de vie queued → processing → completed | failed, le même contrat de livraison. Choisissez l’endpoint selon ce que vous souhaitez obtenir en retour.
Embellisseur produit
POST/v1/tasks/beautifier
Un rendu propre du produit seul, sur l’arrière-plan de votre choix. subtype sélectionne le flux.
| Sous-type | Entrées |
|---|---|
clothing |
style est obligatoire : ghost_mannequin (« Ghost mannequin » dans le tableau de bord) ou flatlay. angle_shot indique la vue importée à partir de laquelle générer le rendu (front ou back). |
shoes |
style est interdit. angle_shot est la vue de sortie souhaitée, issue du catalogue chaussures. Le produit doit comporter au moins une photo importée par l’utilisateur. |
headwear |
Même forme que pour les chaussures, avec le catalogue d’angles de vue des couvre-chefs. |
glasses |
Même forme que pour les chaussures, avec le catalogue d’angles de vue des lunettes. |
bags |
Même forme que pour les chaussures, avec le catalogue d’angles de vue des sacs. top_open demande une photo du sac ouvert : sans elle, la tâche échoue et n’est pas facturée. |
curl https://api.veeton.com/v1/tasks/beautifier \ -H "Authorization: Bearer $VEETON_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "subtype": "clothing", "inputs": { "product_id": "01HX5K2MZ7A3Q4FBNDC0EVDXY1", "background": "#ffffff", "angle_shot": "front", "style": "ghost_mannequin" } }'background est un slug du catalogue d’arrière-plans, commun à tous les sous-types beautifier. Les slugs hexadécimaux incluent le # initial et sont insensibles à la casse. Les galeries complètes d’arrière-plans, d’angles de vue et de styles se trouvent dans la référence de l’API.
Shooting photo
POST/v1/tasks/tryon
Le produit porté par un mannequin, dans la scène de votre choix. Un shooting photo (tryon) n’a qu’un seul flux : c’est le type du produit lui-même qui pilote le worker, il n’y a donc pas de subtype.
curl https://api.veeton.com/v1/tasks/tryon \ -H "Authorization: Bearer $VEETON_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "inputs": [ { "product_id": "01HX5K2MZ7A3Q4FBNDC0EVDXY1", "model_id": "01HX5K2MZ7A3Q4FBNDC0EVDXMD1", "outfit_product_ids": ["01HX5K2MZ7A3Q4FBNDC0EVDXPN"], "background": "park", "angle_shot": "full_body_relaxed_symmetric", "gaze": "camera" } ] }'| Entrée | Signification |
|---|---|
product_id |
Le produit principal. Il doit vous appartenir et comporter au moins une photo importée par l’utilisateur. |
model_id |
Un mannequin issu de GET /v1/models : les mannequins publics sélectionnés par Veeton et les mannequins générés par votre organisation partagent un même espace d’identifiants. Traitez les identifiants comme opaques. |
outfit_product_ids |
Les pièces de stylisme : jusqu’à 10 produits supplémentaires portés avec le produit principal (le principal est un haut, le stylisme un pantalon et des chaussures). Ne peut pas inclure le produit principal. |
background |
Un slug du catalogue du shooting photo : toutes les catégories de l’Embellisseur produit, plus des scènes d’intérieur et d’extérieur. |
angle_shot |
Un slug du catalogue d’angles de vue. Les angles de vue personnalisés de votre organisation sont également acceptés. |
gaze |
Le « Regard » du tableau de bord : auto (par défaut) garde le regard de l’angle de vue, camera fait regarder l’objectif (une vue de dos garde sa pose), away fait regarder ailleurs. |
aspect_ratio |
Le format de la sortie, largeur/hauteur : auto (par défaut) ou l’un de 1/1, 2/3, 3/4, 4/5, 9/16, 3/2, 4/3, 16/9. auto suit l’angle de vue : un angle de vue carré donne une image carrée, comme un shooting photo lancé depuis le tableau de bord avec Format sur Auto. Un format explicite le remplace et le cadrage s’y adapte. |
Le corps est toujours un tableau de 1 à 20 entrées et la réponse est toujours { "data": Task[] }, une tâche par entrée, dans l’ordre de soumission.
Groupes de cohérence
Les entrées qui partagent les mêmes model_id, product_id et outfit_product_ids sont envoyées ensemble au traitement, en tant que groupe de cohérence : l’identité et le styling sont calculés une seule fois puis réutilisés, de sorte que les sorties forment une même série. Faites varier angle_shot, background ou gaze entre les entrées d’une même requête pour obtenir des variantes cohérentes. Des requêtes distinctes ne partagent pas de groupe.
Validation
Si une seule entrée échoue à la validation, la requête entière est refusée avec un 400 et toutes les entrées invalides sont listées, afin que vous n’ayez jamais à réessayer par dichotomie.
{ "errors": [ { "input_index": 1, "type": "not_found", "code": "model_not_found", "param": "model_id", "message": "Model 01HX… was not found." } ]}Retoucher avec l’IA
POST/v1/tasks/edit
Modifiez un résultat terminé à partir d’un prompt. Indiquez l’image à retoucher et ce que vous voulez changer.
{ "inputs": { "image_id": "01HX5K2MZ7A3Q4FBNDC0EVDXIM", "prompt": "Retire le pli sur la manche gauche." }}Vous pouvez retoucher le résultat d’une tâche beautifier ou tryon terminée, ou d’une retouche terminée. Vos propres photos importées, ainsi que les résultats en cours ou en échec, sont refusés avec 422 image_not_editable.
Une retouche crée une nouvelle image avec son propre id. L’image indiquée ne change jamais, pas plus que le output_image de sa tâche. Les deux images sont listées dans GET /v1/images et dans les exports, et la nouvelle indique sa source dans edited_from_image_id. Pour suivre une chaîne de retouches, une image dont rien n’a été retouché en est la fin. Le choix de la version à publier vous appartient.
Lire une tâche
GET/v1/tasks/{task_id}
{ "id": "01HX5K2MZ7A3Q4FBNDC0EVDXY2", "type": "tryon", "subtype": null, "status": "completed", "product_id": "01HX5K2MZ7A3Q4FBNDC0EVDXY1", "inputs": { "product_id": "01HX5K2MZ7A3Q4FBNDC0EVDXY1", "background": "wood", "angle_shot": "front", "style": "ghost_mannequin" }, "output_image": { "id": "01HX…", "mime_type": "image/webp", "width": 1536, "height": 2048, "url": "https://…signed…", "url_expires_at": "2026-09-03T15:32:00Z", "created_at": "2026-09-03T14:31:40Z" }, "failure_reason": null, "started_at": "2026-09-03T14:30:12Z", "finished_at": "2026-09-03T14:31:40Z", "created_at": "2026-09-03T14:30:09Z"}inputs reprend ce avec quoi la tâche a été créée, afin qu’une tâche se comprenne seule. output_image est renseigné une fois la tâche terminée et est le même objet Image que renvoie chaque endpoint. Son id est un identifiant d’image : utilisez-le avec GET /v1/images/{id} pour obtenir une URL fraîche ; c’est aussi ce que l’export liste sous le produit avec role: beautifier ou tryon.
GET/v1/tasks liste vos tâches, des plus récentes aux plus anciennes, avec des filtres status, type, subtype et product_id. Utilisez-le pour la réconciliation après une indisponibilité de vos webhooks ; le canal canonique pour « prévenez-moi quand c’est terminé » reste le webhook.
Facturation
Chaque tâche consomme des crédits de votre abonnement au moment de sa création. Une requête sans abonnement actif ou avec un solde de crédits insuffisant est refusée avec 402 payment_required et rien n’est mis en file d’attente. Une tâche dont l’envoi au traitement échoue est marquée failed et remboursée.