> ## 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.

# Products

> What a product is, and why reusing the same product ID makes try-ons faster and more consistent.

A **product** is the garment your shopper tries on: a title, a description, one or more images, and **your own ID** for it (`externalId`, usually your SKU or catalog product ID).

You never have to create products up front. The first [try-on](/docs/tryon-api/endpoints/create-try-on) that includes a product creates it. What matters is that you send the **same `externalId` every time** you try on the same garment.

## Why reuse the same ID

The first time we see a product, we analyze it: what kind of garment it is, and which image shows it best. That analysis adds a few seconds to the first try-on. It is saved on the product, so every later try-on with the same `externalId` skips it.

| | Same `externalId` every time | New product on every call |
| - | - | - |
| **Speed** | Analysis runs once, later try-ons start right away | Analysis runs on every try-on, a few seconds slower each time |
| **Request size** | Send just `{ "externalId": "shirt-42" }` | Send title, description and images every time |
| **Consistency** | Every shopper gets the same garment understanding | Each call is analyzed from scratch |
| **Insights** | Per-product try-ons and input problems in the [dashboard](https://platform.genlook.app/products) and via [product stats](/docs/tryon-api/endpoints/product-stats) | Nothing to group by |

## Three ways to send a product

| You send | What happens | Kept for |
| - | - | - |
| `{ externalId }` | Uses the product you already sent. | Resets its lifetime |
| `{ externalId, title, description, images }` | Creates the product, or updates it. | 15 days after last use |
| `{ title, description, images }` | One-shot product with a generated ID. | 7 days after last use |

Every try-on resets the product's lifetime, so products your shoppers use keep living. Products created with [`POST /products`](/docs/tryon-api/endpoints/create-product) never expire.

## The recommended pattern

Send the ID alone. If the product expired or was never sent, you get `404 PRODUCT_NOT_FOUND`: send it again in full, once.

```json First call, or after PRODUCT_NOT_FOUND theme={null}
{
  "products": [
    {
      "externalId": "shirt-42",
      "title": "Red cotton t-shirt",
      "description": "Regular fit crew neck tee, short sleeves, hip length.",
      "images": [{ "source": { "url": "https://cdn.example.com/red-tee.jpg" } }]
    }
  ],
  "person": { "image": { "source": { "id": "<imageId>" } } }
}
```

```json Every call after that theme={null}
{
  "products": [{ "externalId": "shirt-42" }],
  "person": { "image": { "source": { "id": "<imageId>" } } }
}
```

The [full example](/docs/tryon-api/full-example) shows this fallback in Python, and the [SDK](/docs/tryon-api/sdk) handles it with a `ProductNotFoundError`.

<Tip>
  Resending the full product with the same content is fine: the saved analysis is kept. It only runs again when the
  **title, description or images change**.
</Tip>

## Choosing the ID

* **Use an ID that never changes** for the garment: your SKU or product ID. Don't add timestamps or random values.
* **One ID per look.** If colours have their own photos, give each colour its own ID (`shirt-42-red`, `shirt-42-blue`). Switching images under one ID replaces the product and runs the analysis again.
* **The ID is yours.** It is scoped to your account and can't start with `_anon_`, which is reserved for one-shot products.

## Getting the best results

* **Send the full title and a real description** (cut, fit, length). They help the AI understand the garment.
* **Prefer image URLs to uploaded files.** URLs are fetched once and cached. Uploaded bytes travel with every call that includes them.

## Manage your products

* See every product, its try-ons and any input problems in the dashboard under [Products](https://platform.genlook.app/products).
* Register products ahead of time, or keep them forever, with [Upsert Product](/docs/tryon-api/endpoints/create-product).
* List, fetch or delete them with [List, Get & Delete Products](/docs/tryon-api/endpoints/list-products).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.