---
title: "Create Product"
method: POST
path: "/products"
tags: ["Products"]
---

# Create Product

`POST /products`

## Request

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

Creates new Products in the merchant's Product Catalog. If a product with a value matching the `merchant_sku` already exists
the existing product will be updated with the provided attributes.

When creating new products the LF system will assign a `product_id` value for the product. Typically this
value will be `{merchant_id}-{merchant_sku}`. Given `product_id` is used as a url parameter any non url safe characters
in the `merchant_sku` will be removed. For example a merchant sku of "SKU 123/456" will be converted to a product_id of "SKU123456".
The `merchant_sku` value will remain unchanged.

The following attributes are calculated by LiftForward and are not assignable:
 `installment_price`, `installment_count`, `residual_value`, `total_over_term`, `total_payment_to_buy_out`,
 `total_payment_to_trade_in`, `installment_service_fee`, & `total_installment_service_fee`

If a merchant is looking to update only a few attributes of an existing product the Update Product endpoint is recommended.

## Request body

- PostProducts: Create Product
  - `product` object, required
    - `merchant_sku` string, required: Unique SKU identifier for the product.
    - `product_name` string, required: Display name for product.
    - `unit_retail_price` number, double: Unit retail price for the item including any typically embedded taxes and fees. Defaults to unit_sale_price if not provided.
    - `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.
    - `currency` 'USD' | 'CAD' | 'EUR' | 'GBP' | 'AUD' | 'CHF' | 'MYR', required: 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', required: 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, required: The name of the manufacturer of the product.
    - `description` string, required: Multi sentence description of the product.
    - `description_list` string[]: Array of strings containing a list of product features.
    - `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.
    - `browsable` boolean: Indicates if the product is browsable to customers.
    - `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.
    - `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.
      - `embedded_in_unit_sale_price` boolean: Indicates if the tax or fee amount was be embedded in unit_sale_price.
    - `categories` object[], required: 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` 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 `201`

Create 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)
