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

# Get Product Details

Fetch full details for a retail product by URL or product ID, including title, brand, images, feature bullets, price in USD, and ratings. When the listed price is known, also returns an order quote: the estimated total charge includes a service fee and a tax/shipping headroom cap — the actual product charge never exceeds the cap. Ideal for: verifying a product before ordering, getting an exact charge estimate, comparing options.

Catalog action Integrations

Fetch full details for a retail product by URL or product ID, including title, brand, images, feature bullets, price in USD, and ratings. When the listed price is known, also returns an order quote: the estimated total charge includes a service fee and a tax/shipping headroom cap — the actual product charge never exceeds the cap. Ideal for: verifying a product before ordering, getting an exact charge estimate, comparing options.


## At a Glance

| Field | Value |
| --- | --- |
| Action ID | `get-product-details` |
| Category | Integrations |
| Connector | Not required |
| Requires gas | No |
| Funds movement | None declared |
| Tags | `shopping`, `products`, `details`, `quote`, `ecommerce`, `read` |

## Payload Schema

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `productUrl` | `string` | No | Product URL \(e.g. https://www.amazon.com/dp/B01N5IB20Q or https://www.walmart.com/ip/123456789\). A bare 10-character Amazon ASIN is also accepted. Provide this OR productId. |
| `productId` | `string` | No | Retailer product identifier \(Amazon ASIN or Walmart item ID\). Provide this OR productUrl. |
| `retailer` | `string` | No | Retailer for productId lookups. Default: 'amazon'. Ignored when productUrl is provided. |
| `quantity` | `number` | No | Quantity used to compute the order quote. Default: 1. |

## Result Schema

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `productId` | `string` | Yes | Retailer product identifier. |
| `retailer` | `string` | Yes | Retailer the product belongs to. |
| `title` | `string` | Yes | Product title. |
| `brand` | `string \| null` | No | Brand name, when available. |
| `mainImageUrl` | `string \| null` | No | Primary product image URL, when available. |
| `featureBullets` | `array` | Yes | Product feature bullet points \(may be empty\). |
| `priceCents` | `number \| null` | No | Listed per-unit price in integer USD cents. Null when the retailer hides the price. |
| `priceUsd` | `number \| null` | No | Listed per-unit price in USD \(2 decimal places\). Null when unavailable. |
| `stars` | `number \| null` | No | Average star rating \(0-5\), when available. |
| `reviewCount` | `number \| null` | No | Number of customer reviews, when available. |
| `productUrl` | `string` | Yes | Canonical product URL — pass to order-product. |
| `orderQuote` | `object \| null` | Yes | Estimated charge breakdown for ordering this product \(null when the listed price is unknown\). Includes the service fee and a tax/shipping headroom cap; the actual product charge never exceeds the cap. |
| `availability` | `string` | No | Machine-readable availability verdict: 'ok' = purchasable offer found; 'transient_miss' = the vendor's offer scrape came back empty \(retry — NOT proof of unavailability\); 'no_offers' = the listing has no offers at all \(possibly discontinued or a wrong/guessed product ID\); 'all_unavailable' = the listing exists but every offer is out of stock right now. |
| `note` | `string \| null` | No | Set ONLY when no purchasable offer exists: explains whether this is a transient lookup miss \(retry\), a listing with no offers at all \(possibly discontinued — or a wrong/guessed product ID; re-run search-products with fresh results\), or a listing whose offers are all out of stock. Null otherwise. |

## Examples

**Workflow node**

```json
{
  "type": "get-product-details",
  "payload": {
    "productUrl": "https://example.com/webhook",
    "retailer": "amazon",
    "quantity": 1
  },
  "children": []
}
```
  **Test with API**

```bash
curl -X POST "https://api.b3os.org/v1/actions/get-product-details/test" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "inputs": {
    "productUrl": "https://example.com/webhook",
    "retailer": "amazon",
    "quantity": 1
  }
}'
```

**Use expressions for dynamic values**

Payload fields can use workflow expressions such as `{{$trigger.body.amount}}`, `{{$nodes.fetch.result.price}}`, and `{{$props.asset}}` when the value should come from a trigger, prior node, or reusable workflow prop.