---
title: "Update Product"
method: PUT
path: "/products/{product_id}"
tags: ["Products"]
---

# Update Product

`PUT /products/{product_id}`

## Request

- Base URL: `https://api.liftforward.com`
- URL: `https://api.liftforward.com/products/{product_id}`
- Auth: API key in header `Api-Key`

Updates the Product identified by the `product_id` parameter with the provided attributes.

Many attributes returned by the products api are calculated by LiftForward or are used for critical operations and are not updatable.

Partial updates are supported. Only the attributes provided in the request will be updated. For example the following request will only update the `unit_sale_price` attribute of the product.
```
{
  "product": {
    "unit_sale_price": 299.99,
  }
}
```

The following request will only update the available attributes of the product.
```
{
  "product": {
    "available": false,
    "inventory_message": "This product is currently out of stock.",
    "inventory_help_message": "Please check back later for availability."
  }
}
```

Some values can be updated to null when a value if null is accepted. For example the following request will update the `cart_max_quantity` attribute to null.
```
{
  "product": {
    "cart_max_quantity": null
  }
}
```


updates to the following attributes are supported:
- `asset_url`
- `available`
- `browsable`
- `cart_max_quantity`
- `categories`
- `contract_type`
- `currency`
- `deep_link`
- `description_list`
- `description`
- `discontinued`
- `european_article_number`
- `inventory_help_message`
- `inventory_message`
- `inventory_type`
- `manufacturer_part_number`
- `manufacturer`
- `net_unit_sale_price`
- `product_name`
- `sales_taxes_and_fees`
- `unit_retail_price`
- `unit_sale_price`
- `cross_sells`

If `unit_sale_price` is updated for a product that already has tax/fee levies and `sales_taxes_and_fees` is not provided, the stored levy amounts are recalculated proportionally from the new sale price using the existing levy rates.

## Path parameters

- `product_id` string, required

## Request body

- PutProductsProductId: Update Product
  - `product` object, required
    - `product_name` string: Display name for product.
    - `unit_retail_price` number, double: Unit retail price for the item including any typically embedded taxes and fees.
    - `unit_sale_price` number, double: Unit price the item should be sold for including any discount or typically embedded taxes and fees.
    - `net_unit_sale_price` number, double: The net (excluding any taxes or fees) sale price of the product.
    - `currency` 'USD' | 'CAD' | 'EUR' | 'GBP' | 'AUD' | 'CHF' | 'MYR': ISO 4217 3 character currency code.
    - `cart_max_quantity` integer: Maximum number of these items allowed in the cart at once. Null indicates no limit.
    - `available` boolean: Indicates if the product is available for purchase.
    - `inventory_message` string: The message that is displayed on detail page next to the product. For example: “Ships today”, “Ships in 3 weeks” or “Low availability”.
    - `inventory_help_message` string: The message that is displayed to a customer when they hover over the availability help icon on product detail page. For example “Available on mm/dd/yyyy”.
    - `discontinued` boolean: true - indicates the product is no longer available for purchase in the program.\ false - indicates the product is available for purchase in the program.
    - `residual_value_category` string: The residual value category for the product, typically "{model} {processor}". Used to calculate product residual values in some programs. Accepted values are program dependent - LiftForward maintains the list for your program. A product sent with an unrecognised category is still accepted, but carries no residual value and is hidden from the storefront until the category is added.
    - `contract_type` 'FINANCING' | 'RENT' | 'SERVICE' | 'SERVICE_SUBSCRIPTION': RENT - Rental item purchased with the opportunity to upgrade.\ FINANCE - Item financed with no opportunity to upgrade. \ SERVICE - Service associated with an item.
    - `manufacturer_part_number` string: Manufacturer part number issued by the manufacturer. Either manufacturer_part_number or european_article_number is required when creating a product.
    - `european_article_number` string: EAN-13 identifier for the product. Either manufacturer_part_number or european_article_number is required when creating a product.
    - `manufacturer` string: The name of the manufacturer of the product.
    - `description` string: Multi sentence description of the product.
    - `description_list` string[]: Array of strings containing a list of product features.
    - `merchant_detail_page_url` string: The URL to the product detail page on the merchant site.
    - `product_image_url` string: The URL to the product image.
    - `browsable` boolean: Indicates if the product is browsable to customers.
    - `inventory_type` 'THRESHOLD' | 'NEVER' | 'ALWAYS' | 'CUSTOM': The type of inventory setting used for this product. \ THRESHOLD - Availability changes based on inventory levels. \ ALWAYS - Product is always available. \ NEVER - Product is never available.
    - `sales_taxes_and_fees` object[]: List of sales taxes and fees applicable to the product. Typically only applicable in markets where value added tax or ewaste fees are used.
      - `code` 'VAT', required: A code that identifies the tax or fee.
      - `amount` number, double, required: The amount of the tax or fee to be charged on this product.
    - `categories` object[]: List of categories for the product
      - `category_name` string, required: The name of the category.
    - `cross_sells` object[]: Array of cross-sell products recommended with this product. All referenced merchant_sku values must exist in the merchant's catalog. Returns 409 Conflict if any SKUs are not found.
      - `merchant_sku` string, required: Merchant SKU of the cross-sell product. Must exist in the merchant's catalog.

## Response `200`

Update Product

- ProductResponse: ProductResponse model
  - `product` ProductEntity, required
    - `product_id` string, required: Unique identifier for this Product.
    - `product_name` string, required: Display name for product.
    - `description` string, required: Multi sentence description of the product.
    - `description_list` string, required: Array of strings containing a list of product features.
    - `manufacturer` string, required: The name of the manufacturer of the product.
    - `merchant_detail_page_url` string, required: The URL to the product detail page on the merchant site.
    - `product_image_url` string, required: The URL to the product image.
    - `manufacturer_part_number` string: Manufacturer part number issued by the manufacturer. Either manufacturer_part_number or european_article_number is required when creating a product.
    - `merchant_sku` string, required: Unique SKU identifier for the product.
    - `european_article_number` string: EAN-13 identifier for the product. Either manufacturer_part_number or european_article_number is required when creating a product.
    - `unit_retail_price` number, double, required: Unit retail price for the item including any typically embedded taxes and fees.
    - `unit_sale_price` number, double, required: Unit price the item should be sold for including any discount or typically embedded taxes and fees.
    - `net_unit_sale_price` number, double, required: The net (excluding any taxes or fees) sale price of the product.
    - `residual_value` number, float, required: The amount this product is expected to be worth at then end of the term.
    - `total_over_term` number, float, required: The total amount the customer will pay over the term of the subscription if the customer choses to keep the item.
    - `total_payment_to_buy_out` number, float, required: The total amount the customer must pay before they buy out the item.
    - `total_payment_to_trade_in` number, float, required: The total amount the customer must pay before they can trade in the item.
    - `unit_installment_payment` number, float, required: Amount of each payment customer will make per unit item.
    - `installment_service_fee` number, float, required: Fee customer must pay along with the unit_installment_payment. Used only on some programs.
    - `total_installment_service_fee` number, float, required: Sum of the installment_service_fee over the term of the loan. Used only on some programs.
    - `currency` string, required: ISO 4217 3 character currency code.
    - `installment_count` integer, required: Count of installments (aka payments) for this line item.
    - `cart_max_quantity` integer: Maximum number of these items allowed in the cart at once. Null indicates no limit.
    - `inventory_type` 'THRESHOLD' | 'NEVER' | 'ALWAYS' | 'CUSTOM', required: The type of inventory setting used for this product. \ THRESHOLD - Availability changes based on inventory levels. \ ALWAYS - Product is always available. \ NEVER - Product is never available.
    - `available` boolean, required: Indicates if the product is available for purchase.
    - `browsable` boolean, required: Indicates if the product is browsable to customers.
    - `inventory_message` string: The message that is displayed on detail page next to the product. For example: “Ships today”, “Ships in 3 weeks” or “Low availability”.
    - `inventory_help_message` string: The message that is displayed to a customer when they hover over the availability help icon on product detail page. For example “Available on mm/dd/yyyy”.
    - `contract_type` 'FINANCING' | 'RENT' | 'SERVICE' | 'SERVICE_SUBSCRIPTION', required: RENT - Rental item purchased with the opportunity to upgrade.\ FINANCE - Item financed with no opportunity to upgrade. \ SERVICE - Service associated with an item.
    - `service_type` 'DIGITAL_SERVICE' | 'INSURANCE': Used only when contract_type is SERVICE. Service type indicates the type of service associated with an item. \ DIGITAL_SERVICE - Digital service product associated with an item. \ INSURANCE - Insurance service associated with an item.
    - `discontinued` boolean, required: true - indicates the product is no longer available for purchase in the program.\ false - indicates the product is available for purchase in the program.
    - `residual_value_category` string: The residual value category for the product, typically "{model} {processor}". Used to calculate product residual values in some programs. Accepted values are program dependent - LiftForward maintains the list for your program. A product sent with an unrecognised category is still accepted, but carries no residual value and is hidden from the storefront until the category is added.
    - `available_subscription_plans` SubscriptionPlanEntity[]
      - `subscription_plan_id` string, required: The unique id for this plan.
      - `program_code` string, required: The program code for the subscription plan.
      - `plan_code` string, required: A short string that identifies the type of plan independent of the installment_count.
      - `plan_name` string, required: A displayable name for this plan.
      - `plan_subtitle` string, required: Promotional copy to display for this plan.
      - `plan_summary` string, required: Longer summary description on the plan and it's benefits
      - `financing_plan_type` 'financing' | 'upgrade', required: The type of financing plan for this product.
      - `installment_count` integer, required: Count of installments (aka payments) customer must make for this item.
      - `installment_count_to_trade_in` integer, required: Count of installments (aka payments) customer must make to trade in or upgrade this item.
      - `unit_installment_payment` number, float, required: Amount of each payment customer will make for 1 item under this subscription plan.
      - `installment_payment` number, float, required: Amount of each payment customer will make for all items under this subscription plan. (Deprecated in favor of total_installment_payment)
      - `total_installment_payment` number, float, required: Amount of each payment customer will make for all items under this subscription plan. Same value as installment_payment.
      - `total_over_term` number, float, required: The total amount the customer will pay over the term of the subscription if the customer choses to keep the item.
      - `installment_service_fee` number, float, required: Fee customer must pay along with the unit_installment_payment. Used only on some programs.
      - `residual_value` number, float, required: The amount this product is expected to be worth at then end of the term. (Deprecated in favor of total_residual_value)
      - `total_residual_value` number, float, required: The amount this product is expected to be worth at the end of the term. Same value as residual_value.
      - `total_payment_to_buy_out` number, float, required: The total amount the customer must pay before they buy out the item.
      - `total_payment_to_trade_in` number, float, required: The total amount the customer must pay before they can trade in or upgrade the item.
      - `total_interest` number, float, required: The total interest the customer will pay over the term of the subscription.
      - `apr` number, float, required: The annual percentage rate (APR) for the subscription.
      - `nominal_interest_rate` number, float, required: The nominal interest rate (debit rate) for the subscription.
      - `currency` string, required: ISO 4217 3 character currency code.
    - `categories` ProductCategoryEntity[]: List of categories for the product. At least one category is required. LiftForward will provide a program specific list of values that should be used.
      - `category_name` string, required: The name of the category.
    - `cross_sells` ProductCrossSellEntity[]: Array of cross-sell products recommended with this product. All referenced merchant_sku values must exist in the merchant's catalog. Returns 409 Conflict if any SKUs are not found.
      - `merchant_sku` string, required: Merchant SKU of the cross-sell product. Must exist in the merchant's catalog.

## Other responses

- `401`: Unauthorized
- `405`: Not Allowed
- `408`: Request Time Out
- `409`: Conflict
- `500`: Internal Service Error
- `503`: Service Unavailable

---

[API](https://skmtc.dev/liftforward/apis/device-as-a-service-merchant-apis-lift-daas-service-producti.md) - [All operations](https://skmtc.dev/liftforward/apis/device-as-a-service-merchant-apis-lift-daas-service-producti/llms.txt) - [OpenAPI document](https://skmtc.dev/liftforward/apis/device-as-a-service-merchant-apis-lift-daas-service-producti/revisions/5a1383ffd271?raw)
