# Product Actions API

Product actions allow you to programmatically retrieve product information.

## actions.product.getDetails()

Retrieve details of a loaded product.

### Signature

```typescript
getDetails(identifier: string): IBaseProductEventData
```

### Parameters

| Parameter    | Type   | Required | Description             |
|--------------|--------|----------|-------------------------|
| `identifier` | string | Yes      | Product UPC, SKU, or ID |

### Returns

```typescript
interface IBaseProductEventData {
  identifier: string;
  name: string;
  description: string;
  price: number;  // in cents
  selectedSize: IProductSize;
  selectedFulfillmentType: FulfillmentType;
  selectedRetailer: IRetailer;
  quantity: number;
  images: string[];
  brand: string;
  category: string;
  // ... additional fields
}
```

### Example

```javascript
const productData = window.LiquidCommerce.elements.actions.product.getDetails('00619947000020');

console.log(productData.name);        // "Premium Whiskey"
console.log(productData.price / 100); // 49.99
console.log(productData.selectedSize.name); // "750ml"
console.log(productData.quantity);     // 1
```

### Errors

**Throws `SDKError` if:**
- Identifier is empty or invalid
- Product has not been loaded yet
- Product does not exist

```javascript
try {
  const data = window.LiquidCommerce.elements.actions.product.getDetails('invalid_id');
} catch (error) {
  console.error('Product not found:', error.message);
}
```

### Use Cases

#### Display Product Info Elsewhere

```javascript
const product = window.LiquidCommerce.elements.actions.product.getDetails('00619947000020');

document.getElementById('product-name').textContent = product.name;
document.getElementById('product-price').textContent = `$${product.price / 100}`;
```

#### Sync with Analytics

```javascript
window.addEventListener('lce:actions.product_loaded', () => {
  const product = window.LiquidCommerce.elements.actions.product.getDetails('00619947000020');
  
  gtag('event', 'view_item', {
    items: [{
      item_id: product.identifier,
      item_name: product.name,
      price: product.price / 100,
      item_brand: product.brand
    }]
  });
});
```

#### Custom Product Comparison

```javascript
const product1 = window.LiquidCommerce.elements.actions.product.getDetails('00619947000020');
const product2 = window.LiquidCommerce.elements.actions.product.getDetails('08504405135');

if (product1.price < product2.price) {
  console.log(`${product1.name} is cheaper`);
}
```

---

## actions.product.getProductAvailabilityByState()

Check product availability across states.

### Signature

```typescript
getProductAvailabilityByState(
  identifiers: string[],
  state?: string
): Promise<IProductAvailabilityResponse>
```

### Parameters

| Parameter     | Type     | Required | Description                              |
|---------------|----------|----------|------------------------------------------|
| `identifiers` | string[] | Yes      | Array of product UPCs, SKUs, or IDs      |
| `state`       | string   | No       | Two-letter state code (e.g., `'NY'`)     |

### Example

```javascript
// Check availability in a specific state
const availability = await window.LiquidCommerce.elements.actions.product
  .getProductAvailabilityByState(['00619947000020', '08504405135'], 'CA');

// Check availability in the user's current state (uses address if set)
const availability = await window.LiquidCommerce.elements.actions.product
  .getProductAvailabilityByState(['00619947000020']);
```

### Errors

**Throws `SDKError` if:**
- No identifiers provided or array is empty
- API request fails

---

## Notes

- Product must be injected and loaded before calling `getDetails()`
- `getDetails()` is synchronous - returns immediately
- `getProductAvailabilityByState()` is async - returns a Promise
- Prices are always in cents (divide by 100 for dollars)
- Selected values reflect current user selection in the component

## See Also

- [Product Component Guide](../../guides/product-component.md)
- [Product Events](../../guides/events.md#product-events)
