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

> ## Agent Instructions
> Setting up Context.dev for a user? Follow https://docs.context.dev/agent-quickstart.md. MCP clients sign in with OAuth and need no API key; application code reads CONTEXT_DEV_API_KEY.

# Product

> Extract product details from a product page.

Enable `formats.product` to read product details from page markup. `product.data` contains `isProductPage` and `product`; a successful non-product result has `isProductPage: false` and `product: null`.

## Request a product

<CodeGroup>
  ```typescript TypeScript theme={null}
  const page = await client.web.scrape({
    url: "https://example.com/products/travel-mug",
    formats: { product: true },
    productParams: { useAIFallback: true },
  });

  if (page.product.data?.isProductPage) {
    console.log(page.product.data.product?.name);
    console.log(page.product.data.product?.price);
  }
  ```

  ```python Python theme={null}
  page = client.web.scrape(
      url="https://example.com/products/travel-mug",
      formats={"product": True},
      product_params={"use_ai_fallback": True},
  )

  if page.product.data and page.product.data.is_product_page:
      print(page.product.data.product.name)
      print(page.product.data.product.price)
  ```

  ```ruby Ruby theme={null}
  page = client.web.scrape(
    url: "https://example.com/products/travel-mug",
    formats: {product: true},
    product_params: {use_ai_fallback: true},
  )

  if page.product.data&.is_product_page
    puts page.product.data.product.name
    puts page.product.data.product.price
  end
  ```

  ```go Go theme={null}
  page, err := client.Web.Scrape(context.Background(), contextdev.WebScrapeParams{
      URL:            "https://example.com/products/travel-mug",
      Formats:        contextdev.WebScrapeParamsFormats{Product: contextdev.Bool(true)},
      ProductParams:  contextdev.WebScrapeParamsProductParams{UseAIFallback: contextdev.Bool(true)},
  })
  if err != nil {
      panic(err)
  }

  if page.Product.Data != nil && page.Product.Data.IsProductPage {
      fmt.Println(page.Product.Data.Product.Name)
      fmt.Println(page.Product.Data.Product.Price)
  }
  ```

  ```php PHP theme={null}
  $page = $client->web->scrape(
      formats: ['product' => true],
      url: 'https://example.com/products/travel-mug',
      productParams: ['useAIFallback' => true],
  );

  if ($page->product->data?->isProductPage) {
      echo $page->product->data->product->name, PHP_EOL;
      echo $page->product->data->product->price, PHP_EOL;
  }
  ```

  ```bash cURL theme={null}
  curl https://api.context.dev/v1/web/scrape \
    -H "Authorization: Bearer $CONTEXT_DEV_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://example.com/products/travel-mug",
      "formats": { "product": true },
      "productParams": { "useAIFallback": true }
    }'
  ```
</CodeGroup>

## Fields to use

| Field                          | Meaning                                                                                                     |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------- |
| `name`, `description`, `brand` | Product identity.                                                                                           |
| `price`, `currency`            | Price and ISO 4217 currency, when available.                                                                |
| `availability`                 | Availability reported by the page. See the [reference](/api-reference/web-scraping/scrape) for enum values. |
| `images`                       | Up to seven source image URLs, main image first.                                                            |
| `variants`                     | Available variant details.                                                                                  |

Missing scalar values are `null`; missing lists are `[]`. Source images are not re-hosted.

## Enable AI fallback

```json theme={null}
{
  "url": "https://example.com/products/chair",
  "formats": {
    "product": true
  },
  "productParams": {
    "useAIFallback": true
  }
}
```

`useAIFallback` defaults to `false`. Enable it when the page lacks structured product data. If fallback fails, the product output fails and `isPartial` can be set; other outputs remain available. See [credits](/account/credits) for this option.

Product extraction uses the unfiltered page. For price updates, call Scrape for each product URL and set `maxAgeMs: 0`; [Batches](/batches/overview) supports HTML and Markdown only.
