> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trychannel3.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Product Detail

Fetch a single product by ID with [`GET /v1/products/{product_id}`](/api-reference/v1/product-detail). This endpoint is **free** — use it to refresh prices, availability, offers, and buy links after search or lookup.

You get the full [Product](/product-model) object, including images, offers, variants, and metadata.

## Basic retrieve

Pass a product ID from search, lookup, or similar:

<CodeGroup>
  ```typescript TypeScript theme={null}
  import Channel3 from "@channel3/sdk";

  const client = new Channel3();
  const product = await client.products.retrieve("2yh8WH5");

  console.log(product.title);
  console.log(product.offers.map((o) => o.domain));
  ```

  ```python Python theme={null}
  from channel3_sdk import Channel3

  client = Channel3()
  product = client.products.retrieve("2yh8WH5")

  print(product.title)
  print([o.domain for o in product.offers])
  ```

  ```bash cURL theme={null}
  curl https://api.trychannel3.com/v1/products/2yh8WH5 \
    -H "x-api-key: $CHANNEL3_API_KEY"
  ```
</CodeGroup>

## Constrain the buy URL

When a product has offers from multiple merchants, pass `website_ids` to prefer buy URLs from specific stores. Accepts website IDs or domains (e.g. `"nike.com"`):

<CodeGroup>
  ```typescript TypeScript theme={null}
  const product = await client.products.retrieve("2yh8WH5", {
    website_ids: ["nike.com"],
  });
  ```

  ```python Python theme={null}
  product = client.products.retrieve("2yh8WH5", website_ids=["nike.com"])
  ```

  ```bash cURL theme={null}
  curl "https://api.trychannel3.com/v1/products/2yh8WH5?website_ids=nike.com" \
    -H "x-api-key: $CHANNEL3_API_KEY"
  ```
</CodeGroup>

## Locale and units

Set `language`, `country`, and `currency` so offers and prices match the shopper's market. Optionally set `length_unit` and `weight_unit` for dimensions. See [Set Locale](/guides/locale) and [Localization](/guides/localization).

<CodeGroup>
  ```typescript TypeScript theme={null}
  const product = await client.products.retrieve("2yh8WH5", {
    country: "GB",
    language: "en",
    currency: "GBP",
  });
  ```

  ```python Python theme={null}
  product = client.products.retrieve(
      "2yh8WH5",
      country="GB",
      language="en",
      currency="GBP",
  )
  ```

  ```bash cURL theme={null}
  curl "https://api.trychannel3.com/v1/products/2yh8WH5?country=GB&language=en&currency=GBP" \
    -H "x-api-key: $CHANNEL3_API_KEY"
  ```
</CodeGroup>

## Variants

To resolve a specific size/color (or other options), pass `option_<OptionName>=<Label>` query params. The response updates product fields and sets `variants.selected` to the effective selection. See [Variants](/variants).

## When to use it

* **Refresh at display time** — cache `product.id` from search, then retrieve before showing price or buy links ([Caching](/guides/caching))
* **Hydrate variant availability** — search results may omit live stock; detail fills in `available`
* **Deep links** — look up a known product ID from your app or agent state

<Cards>
  <Card title="API reference" icon="code" href="/api-reference/v1/product-detail" arrow="true">
    Full parameter list and response schema for product detail.
  </Card>

  <Card title="Product model" icon="cube" href="/product-model" arrow="true">
    Fields on the Product object returned by this endpoint.
  </Card>

  <Card title="Variants" icon="layer-group" href="/variants" arrow="true">
    Select options and read variants.selected after retrieve.
  </Card>
</Cards>
