Generating renders
Two task families on one workflow. Beautifier renders the product alone on a background; tryon puts it on a model. Both return a task you poll or subscribe to.
Every task shares the same shape: the same authentication, the same lifecycle queued → running → succeeded | failed, the same delivery contract. Pick the endpoint by what you want back.
Beautifier
POST/v1/tasks/beautifier
A clean render of the product alone on a chosen background. subtype selects the flow.
| Subtype | Inputs |
|---|---|
clothing |
style is required: ghost (invisible mannequin) or flatlay. angle_shot names which uploaded view to render from (front or back). |
shoes |
style is forbidden. angle_shot is the desired output view from the shoes catalogue. The product needs at least one user-uploaded photo. |
headwear |
Same shape as shoes, with the headwear angle catalogue. |
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" } }'background is a slug from the backgrounds catalogue, shared by every beautifier subtype. Hex-coded slugs include the leading # and are case-insensitive. The full galleries of backgrounds, angle shots and styles are in the API reference.
Tryon
POST/v1/tasks/tryon
The product worn by a model, on a scene of your choice. Tryon has a single flow: the product’s own type drives the worker, so there is no 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", "styling_product_ids": ["01HX5K2MZ7A3Q4FBNDC0EVDXPN"], "background": "park", "angle_shot": "full_body_relaxed_symmetric", "look_at_camera": true } ] }'| Input | Meaning |
|---|---|
product_id |
The main garment. Must be yours and have at least one user-uploaded photo. |
model_id |
A model from GET /v1/models: Veeton-curated public models and models generated by your organization share one id space. Treat ids as opaque. |
styling_product_ids |
Up to 10 more products composed onto the same model (main is a top, stylings are pants and shoes). Cannot include the main product. |
background |
A slug from the tryon catalogue: every beautifier category plus indoor and outdoor scenes. |
angle_shot |
A slug from the angle-shots catalogue. Your organization’s custom angle shots are accepted too. |
look_at_camera |
Default true. false makes the model look away. |
The body is always an array of 1 to 20 inputs and the response is always { "tasks": Task[] }, one task per input in submission order.
Consistency groups
Inputs that share the same model_id, product_id and styling_product_ids are dispatched together as a consistency group: identity and styling are computed once and reused, so the outputs look like the same shoot. Vary angle_shot, background or look_at_camera across the entries of one request to get coherent variants. Separate requests do not share a group.
Validation
If any input fails validation the whole request is refused with 400 and every bad input listed, so you never retry-and-bisect.
{ "errors": [ { "input_index": 1, "type": "not_found", "code": "model_not_found", "param": "model_id", "message": "Model 01HX… was not found." } ]}Reading a task
GET/v1/tasks/{task_id}
{ "id": "01HX5K2MZ7A3Q4FBNDC0EVDXY2", "type": "tryon", "subtype": null, "status": "succeeded", "product_id": "01HX5K2MZ7A3Q4FBNDC0EVDXY1", "output_image": { "id": "01HX…", "url": "https://…signed…", "url_expires_at": "2026-09-03T15:32:00Z" }, "failure_reason": null, "started_at": "2026-09-03T14:30:12Z", "finished_at": "2026-09-03T14:31:40Z", "created_at": "2026-09-03T14:30:09Z"}output_image is set once the task has succeeded. Its id is an image id: use it with GET /v1/images/{id} for a fresh URL, and it is what the export lists under the product with role: beautifier or tryon.
GET/v1/tasks lists your tasks newest first with status, type, subtype and product_id filters. Use it for reconciliation after webhook downtime; the canonical “tell me when it finishes” channel is a webhook.
Billing
Each task consumes credits from your subscription when it is created. A request without an active subscription or with insufficient credits is refused with 402 payment_required and nothing is queued. A task that fails to dispatch is marked failed and refunded.