The Try-On API graduated from alpha to v1.0.0 with this release. Everything prior was unstable and not under any compatibility commitment — every breaking change listed below was on the table during alpha. Going forward, v1 is the stable baseline; future changes will land as additions on top, or as a clearly-numbered v2 with its own migration guide. If you were integrating against the alpha, see the Breaking changes page for migration recipes.Documentation Index
Fetch the complete documentation index at: https://docs.genlook.app/docs/llms.txt
Use this file to discover all available pages before exploring further.
1.1.0 — 2026-05-14
Added
- Per-call retention on
POST /images/uploadandPOST /try-on. New optionalretentionDaysbody field (one of1,3,7) overrides the account-level customer-retention window for that single upload. Omitting the field keeps today’s behaviour. - Customer identifier on uploads.
POST /images/uploadnow accepts an optionalcustomerIdbody field. When set, the upload is tracked server-side so it can later be wiped by the new GDPR endpoint.POST /try-onalready acceptedcustomerId; same semantics now apply for both endpoints. - GDPR delete endpoint —
DELETE /tryon/v1/customers/:customerId. Deletes every customer-image and result image stored under the givencustomerId, anonymizes the corresponding generation rows, and removes upload tracking metadata. Idempotent, returns204 No Content. See Delete Customer Data. PRODUCT_IMAGE_FETCH_FAILEDerror code. When the AI pipeline can’t download a product image URL during processing, the generation transitions toFAILEDwitherrorCode: "PRODUCT_IMAGE_FETCH_FAILED"onGET /generations/:id. Mirrors the synchronousCUSTOMER_IMAGE_FETCH_FAILED400 already raised byPOST /try-on.errorCodeon the generation-status response.GET /generations/:idnow returns a stableerrorCodealongsideerrorMessagewhenever the failure was raised as a typed error. Switch on the code instead of parsing the message.
1.0.0 — 2026-05-12
First stable release. The surface is intentionally small: upload a customer photo, run a try-on, poll the result. Everything else (products, account management, watermark) is optional.Added
- Inline
productfield onPOST /try-on. Three usage modes in one endpoint:- Reference an existing product by
externalId. - Create or update a product inline (full payload), then run the generation.
- One-shot — omit
externalIdand the response returns a generated ID you can re-use.
- Reference an existing product by
- Customer image — three input modes on
POST /try-on:customer: { id }referencing a priorPOST /images/upload(recommended for repeat use).customer.url— server downloads on demand.customer.fileKey— multipart file inline with the request.
- Multipart product images on
POST /try-onandPOST /products. Mix URLs and uploaded files in the sameimagesarray. cropflag onPOST /tryon/v1/images/upload. Defaulttrue; passfalseto preserve original framing.useWatermarkflag onPOST /try-on. Defaulttrue; passfalseto skip the account’s watermark logo for a single generation.productExternalIdin every/try-onresponse — echoes the caller’s value for named products, returns a server-generated ID for one-shots.- Per-product stats at
GET /tryon/v1/products/:externalId/stats— totals by status and average generation time. - Product lifetime model:
- Products created via
POST /productsare kept forever by default. SetvalidForDaysto opt into a TTL. - Products created inline via
/try-onlive 15 days from last use (refreshed on every generation). - One-shot products live 7 days from last use.
- Pass
validForDays: nullon an update to opt into “kept forever” later.
- Products created via
- Partial updates on
POST /products. Send only the fields you want to change; omitted fields stay as they were. - Watermark feature — composite your brand logo onto every generation. Configure once in the dashboard; opt out per-call with
useWatermark: false. See Watermark. - Unified error responses. Every failure returns
{ code, message, status, details? }with a stablecodefrom a documented enum — switch on that instead of parsing messages. Full list at Errors.
Changed
- Single
productfield onPOST /try-onreplaces the olderproductId/externalProductIdbody field. The endpoint figures out reference vs. upsert vs. one-shot from what’s present. - Single
customerobject onPOST /try-onreplaces the oldcustomerImageIdshortcut. Exactly one ofcustomer.id,customer.url, orcustomer.fileKeymust be set. POST /productssupports partial updates. Hitting it with an existingexternalIdand only the field(s) you want to change merges over stored values.- Product responses (
POST /products,GET /products,GET /products/:externalId) return the full product shape — same fields everywhere, noproductId(callers reference byexternalId). - Product images on responses are now
{ sourceUrl, order }. For URL-sourced imagessourceUrlechoes back the URL you supplied; for multipart-uploaded images it’s an opaque internal reference you can ignore. - Consistent identifiers.
productExternalIdis now returned on every generation. The reserved prefix_anon_is used for server-generated IDs. - Concurrent identical calls are safe. Parallel inline upserts with the same content resolve to a single product — no duplicates, no race conditions.
Removed
PATCH /tryon/v1/products/:externalId. UsePOST /productswith the fields you want to change.- Generation ratings (👍 / 👎) are no longer exposed on the public API — the stats endpoint returns counts and timings only.
GET /tryon/v1/generations(paginated list). Track your own generation ids fromPOST /try-onresponses and pollGET /generations/:idfor each one.resultImageKeyhas been dropped fromGET /generations/:id. UseresultImageUrlinstead — re-fetch the endpoint when the URL expires.productIdhas been dropped fromPOST /productsresponses. Reference products byexternalId.
Deprecated
imageUrls: string[]on product upsert. Useimages: [{ url }, …]instead. The old field is still accepted in v1 and will be removed in v2.
Documentation
- New Quickstart — two-call try-on (upload → try-on) in under five minutes.
- New Full Example (Python) — ref-first / upsert-on-miss template you can copy.
- New Watermark page.
- New Breaking changes page — migration recipes for callers coming from the alpha.
Alpha
Unreleased. No version was assigned. The endpoint shapes, response fields, and product lifecycle rules churned regularly during this period. If you have an integration that talked to the alpha surface, the Breaking changes page covers everything you need to update.Versioning
The Try-On API follows semantic versioning going forward:- Patch (
1.0.x) — bug fixes and additive non-breaking changes. - Minor (
1.x.0) — new endpoints, new optional fields, new response fields. Existing requests keep working. - Major (
2.0.0+) — breaking changes. Always announced ahead of time with a parallel migration window; the old major stays available until a posted sunset date.
/tryon/v1/*. Subscribe to release notifications at support@genlook.app.
