API
esc

Type to search.

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.
Terminal window
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.

Terminal window
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.

400 Bad Request
{
"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}
200 OK
{
"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.