---
title: "Changes to Update product"
method: PUT
path: "/api/v1/products/{id}"
---

# Changes to Update product

`PUT /api/v1/products/{id}`

> Every recorded change to this operation, newest first.

## Timeline

Changed in 14 of 110 revisions.

- **2026-04-20** `69a36036d334`: 2 info
- **2024-06-06** `8e82a2bd77e0`: 3 breaking, 56 info
- **2024-06-05** `e61df65649e2`: 3 breaking, 56 warning
- **2024-03-07** `71171a40d629`: 7 breaking, 63 info
- **2024-02-18** `88bbc1f38ff7`: 7 breaking, 64 warning
- **2024-02-10** `4ad0fff44c6c`: 5 info
- **2024-01-24** `9dab078a46b5`: 1 info
- **2024-01-20** `70cd94370516`: 1 breaking
- **2023-07-08** `627936439128`: 5 breaking
- **2023-04-29** `54497b7aa120`: 1 breaking, 2 info
- **2023-04-29** `90ed98cd9be3`: 1 breaking
- **2023-04-29** `53a4b63375d5`: 6 breaking, 8 info
- **2023-04-29** `acf2fffd6826`: 1 info
- **2023-03-19** `6890681c8503`: 29 info

## Changes

- **2026-04-20** `69a36036d334`: 2 info
  - added the new optional request property `income_account_id`
  - added the optional property `income_account_id` to the response with the `200` status
- **2024-06-06** `8e82a2bd77e0`: 3 breaking, 56 info
  - the request's body type changed from no type to `object`
  - the response's body type changed from no type to `object` for status `200`
  - the response's body type changed from no type to `object` for status `default`
  - added the new optional request property `assigned_user_id`
  - added the new optional request property `cost`
  - added the new optional request property `custom_value1`
  - added the new optional request property `custom_value2`
  - added the new optional request property `custom_value3`
  - added the new optional request property `custom_value4`
  - added the new optional request property `in_stock_quantity`
  - added the new optional request property `max_quantity`
  - added the new optional request property `notes`
  - added the new optional request property `price`
  - added the new optional request property `product_image`
  - added the new optional request property `product_key`
  - added the new optional request property `project_id`
  - added the new optional request property `quantity`
  - added the new optional request property `stock_notification`
  - added the new optional request property `stock_notification_threshold`
  - added the new optional request property `tax_id`
  - added the new optional request property `tax_name1`
  - added the new optional request property `tax_name2`
  - added the new optional request property `tax_name3`
  - added the new optional request property `tax_rate1`
  - added the new optional request property `tax_rate2`
  - added the new optional request property `tax_rate3`
  - added the new optional request property `vendor_id`
  - added the optional property `archived_at` to the response with the `200` status
  - added the optional property `assigned_user_id` to the response with the `200` status
  - added the optional property `code` to the response with the `default` status
  - added the optional property `cost` to the response with the `200` status
  - added the optional property `created_at` to the response with the `200` status
  - added the optional property `custom_value1` to the response with the `200` status
  - added the optional property `custom_value2` to the response with the `200` status
  - added the optional property `custom_value3` to the response with the `200` status
  - added the optional property `custom_value4` to the response with the `200` status
  - added the optional property `id` to the response with the `200` status
  - added the optional property `in_stock_quantity` to the response with the `200` status
  - added the optional property `is_deleted` to the response with the `200` status
  - added the optional property `max_quantity` to the response with the `200` status
  - …19 more
- **2024-06-05** `e61df65649e2`: 3 breaking, 56 warning
  - the request's body type changed from `object` to no type
  - the response's body type changed from `object` to no type for status `200`
  - the response's body type changed from `object` to no type for status `default`
  - removed the request property `assigned_user_id`
  - removed the request property `cost`
  - removed the request property `custom_value1`
  - removed the request property `custom_value2`
  - removed the request property `custom_value3`
  - removed the request property `custom_value4`
  - removed the request property `in_stock_quantity`
  - removed the request property `max_quantity`
  - removed the request property `notes`
  - removed the request property `price`
  - removed the request property `product_image`
  - removed the request property `product_key`
  - removed the request property `project_id`
  - removed the request property `quantity`
  - removed the request property `stock_notification`
  - removed the request property `stock_notification_threshold`
  - removed the request property `tax_id`
  - removed the request property `tax_name1`
  - removed the request property `tax_name2`
  - removed the request property `tax_name3`
  - removed the request property `tax_rate1`
  - removed the request property `tax_rate2`
  - removed the request property `tax_rate3`
  - removed the request property `vendor_id`
  - removed the optional property `archived_at` from the response with the `200` status
  - removed the optional property `assigned_user_id` from the response with the `200` status
  - removed the optional property `code` from the response with the `default` status
  - removed the optional property `cost` from the response with the `200` status
  - removed the optional property `created_at` from the response with the `200` status
  - removed the optional property `custom_value1` from the response with the `200` status
  - removed the optional property `custom_value2` from the response with the `200` status
  - removed the optional property `custom_value3` from the response with the `200` status
  - removed the optional property `custom_value4` from the response with the `200` status
  - removed the optional property `id` from the response with the `200` status
  - removed the optional property `in_stock_quantity` from the response with the `200` status
  - removed the optional property `is_deleted` from the response with the `200` status
  - removed the optional property `max_quantity` from the response with the `200` status
  - …19 more
- **2024-03-07** `71171a40d629`: 7 breaking, 63 info
  - the request's body type changed from no type to `object`
  - the response's body type changed from no type to `object` for status `200`
  - the response's body type changed from no type to `object` for status `401`
  - the response's body type changed from no type to `object` for status `403`
  - the response's body type changed from no type to `object` for status `422`
  - the response's body type changed from no type to `object` for status `429`
  - the response's body type changed from no type to `object` for status `default`
  - added the new optional request property `assigned_user_id`
  - added the new optional request property `cost`
  - added the new optional request property `custom_value1`
  - added the new optional request property `custom_value2`
  - added the new optional request property `custom_value3`
  - added the new optional request property `custom_value4`
  - added the new optional request property `in_stock_quantity`
  - added the new optional request property `max_quantity`
  - added the new optional request property `notes`
  - added the new optional request property `price`
  - added the new optional request property `product_image`
  - added the new optional request property `product_key`
  - added the new optional request property `project_id`
  - added the new optional request property `quantity`
  - added the new optional request property `stock_notification`
  - added the new optional request property `stock_notification_threshold`
  - added the new optional request property `tax_id`
  - added the new optional request property `tax_name1`
  - added the new optional request property `tax_name2`
  - added the new optional request property `tax_name3`
  - added the new optional request property `tax_rate1`
  - added the new optional request property `tax_rate2`
  - added the new optional request property `tax_rate3`
  - added the new optional request property `vendor_id`
  - added the optional property `archived_at` to the response with the `200` status
  - added the optional property `assigned_user_id` to the response with the `200` status
  - added the optional property `code` to the response with the `default` status
  - added the optional property `cost` to the response with the `200` status
  - added the optional property `created_at` to the response with the `200` status
  - added the optional property `custom_value1` to the response with the `200` status
  - added the optional property `custom_value2` to the response with the `200` status
  - added the optional property `custom_value3` to the response with the `200` status
  - added the optional property `custom_value4` to the response with the `200` status
  - …30 more
- **2024-02-18** `88bbc1f38ff7`: 7 breaking, 64 warning
  - the request's body type changed from `object` to no type
  - the response's body type changed from `object` to no type for status `200`
  - the response's body type changed from `object` to no type for status `401`
  - the response's body type changed from `object` to no type for status `403`
  - the response's body type changed from `object` to no type for status `422`
  - the response's body type changed from `object` to no type for status `429`
  - the response's body type changed from `object` to no type for status `default`
  - removed the request property `assigned_user_id`
  - removed the request property `cost`
  - removed the request property `custom_value1`
  - removed the request property `custom_value2`
  - removed the request property `custom_value3`
  - removed the request property `custom_value4`
  - removed the request property `in_stock_quantity`
  - removed the request property `max_quantity`
  - removed the request property `notes`
  - removed the request property `price`
  - removed the request property `product_image`
  - removed the request property `product_key`
  - removed the request property `project_id`
  - removed the request property `quantity`
  - removed the request property `stock_notification`
  - removed the request property `stock_notification_threshold`
  - removed the request property `tax_id`
  - removed the request property `tax_name1`
  - removed the request property `tax_name2`
  - removed the request property `tax_name3`
  - removed the request property `tax_rate1`
  - removed the request property `tax_rate2`
  - removed the request property `tax_rate3`
  - removed the request property `vendor_id`
  - removed the optional property `archived_at` from the response with the `200` status
  - removed the optional property `assigned_user_id` from the response with the `200` status
  - removed the optional property `code` from the response with the `default` status
  - removed the optional property `company_id` from the response with the `200` status
  - removed the optional property `cost` from the response with the `200` status
  - removed the optional property `created_at` from the response with the `200` status
  - removed the optional property `custom_value1` from the response with the `200` status
  - removed the optional property `custom_value2` from the response with the `200` status
  - removed the optional property `custom_value3` from the response with the `200` status
  - …31 more
- **2024-02-10** `4ad0fff44c6c`: 5 info
  - added the media type `application/json` for the response with the status `401`
  - added the media type `application/json` for the response with the status `403`
  - added the media type `application/json` for the response with the status `422`
  - added the media type `application/json` for the response with the status `429`
  - added the media type `application/json` for the response with the status `default`
- **2024-01-24** `9dab078a46b5`: 1 info
  - endpoint added
- **2024-01-20** `70cd94370516`: 1 breaking
  - api path removed without deprecation
- **2023-07-08** `627936439128`: 5 breaking
  - removed the media type `application/json` for the response with the status `401`
  - removed the media type `application/json` for the response with the status `403`
  - removed the media type `application/json` for the response with the status `422`
  - removed the media type `application/json` for the response with the status `429`
  - removed the media type `application/json` for the response with the status `default`
- **2023-04-29** `54497b7aa120`: 1 breaking, 2 info
  - the response's body type changed from no type to `object` for status `429`
  - added the optional property `errors` to the response with the `429` status
  - added the optional property `message` to the response with the `429` status
- **2023-04-29** `90ed98cd9be3`: 1 breaking
  - added required request body
- **2023-04-29** `53a4b63375d5`: 6 breaking, 8 info
  - the `cost` response's property format changed from `float` to `double` for status `200`
  - the `price` response's property format changed from `float` to `double` for status `200`
  - the `quantity` response's property format changed from `float` to `double` for status `200`
  - the `tax_rate1` response's property format changed from `float` to `double` for status `200`
  - the `tax_rate2` response's property format changed from `float` to `double` for status `200`
  - the `tax_rate3` response's property format changed from `float` to `double` for status `200`
  - added the optional property `tax_id` to the response with the `200` status
  - the response optional property `archived_at` became read-only for the status `200`
  - the response optional property `company_id` became read-only for the status `200`
  - the response optional property `created_at` became read-only for the status `200`
  - the response optional property `id` became read-only for the status `200`
  - the response optional property `is_deleted` became read-only for the status `200`
  - the response optional property `updated_at` became read-only for the status `200`
  - the response optional property `user_id` became read-only for the status `200`
- **2023-04-29** `acf2fffd6826`: 1 info
  - added the non-success response with the status `429`
- **2023-03-19** `6890681c8503`: 29 info
  - added the optional property `archived_at` to the response with the `200` status
  - added the optional property `assigned_user_id` to the response with the `200` status
  - added the optional property `company_id` to the response with the `200` status
  - added the optional property `cost` to the response with the `200` status
  - added the optional property `created_at` to the response with the `200` status
  - added the optional property `custom_value1` to the response with the `200` status
  - added the optional property `custom_value2` to the response with the `200` status
  - added the optional property `custom_value3` to the response with the `200` status
  - added the optional property `custom_value4` to the response with the `200` status
  - added the optional property `in_stock_quantity` to the response with the `200` status
  - added the optional property `is_deleted` to the response with the `200` status
  - added the optional property `max_quantity` to the response with the `200` status
  - added the optional property `notes` to the response with the `200` status
  - added the optional property `price` to the response with the `200` status
  - added the optional property `product_image` to the response with the `200` status
  - added the optional property `product_key` to the response with the `200` status
  - added the optional property `project_id` to the response with the `200` status
  - added the optional property `quantity` to the response with the `200` status
  - added the optional property `stock_notification` to the response with the `200` status
  - added the optional property `stock_notification_threshold` to the response with the `200` status
  - added the optional property `tax_name1` to the response with the `200` status
  - added the optional property `tax_name2` to the response with the `200` status
  - added the optional property `tax_name3` to the response with the `200` status
  - added the optional property `tax_rate1` to the response with the `200` status
  - added the optional property `tax_rate2` to the response with the `200` status
  - added the optional property `tax_rate3` to the response with the `200` status
  - added the optional property `updated_at` to the response with the `200` status
  - added the optional property `user_id` to the response with the `200` status
  - added the optional property `vendor_id` to the response with the `200` status

---

[Operation](https://skmtc.dev/invoiceninja/apis/invoice-ninja-api-reference/docs/api/v1/products/:id/put.md) - [API](https://skmtc.dev/invoiceninja/apis/invoice-ninja-api-reference.md) - [Page](https://skmtc.dev/invoiceninja/apis/invoice-ninja-api-reference/changes/api/v1/products/:id/put)
