# Upsert a product

Creates or updates (upserts) a product with a specified ID.

Endpoint: PUT /products/{id}
Version: latest
Security: SecretApiKey, JWT

## Path parameters

- `id` (string, required)
  ID of the resource.

## Request fields

- `name` (string, required)
  Name of the product.
  Example: Premium membership
- `unitLabel` (string)
  Unit label, such as per `seat` or per `unit`.
  Example: seat
- `description` (string | null)
  Description of the product.
- `requiresShipping` (boolean)
  Specifies if the product requires shipping. If this value is `true`, shipping calculations are applied.
  Example: false
- `options` (array)
  Names of product options. A product option is a property that distinguishes the pricing plans of a product. The value of each product option is specified in the `productOptions` field of each pricing plan. For more information, see [Plans](https://www.rebilly.com/docs/dev-docs/api/plans/).
  Example: ["region","size"]
- `taxCategoryId` (string | null)
  Tax category of the product. For a complete list of supported tax categories, see [TaxJar sales tax API reference](https://developers.taxjar.com/api/reference/#get-list-tax-categories). If none of the tax categories from the list are applicable for your product, use the general tax category `00000`.
  Example: 00000
- `accountingCode` (string | null)
  Accounting code of the product.
  Example: 4010
- `recognition` (object | null)
- `recognition.debitAccountId` (string | null)
  ID of the debit journal account.
- `recognition.creditAccountId` (string | null)
  ID of the credit journal account.
- `customFields` (object)
  Use custom fields to extend a resource scheme to include custom data that is not provided as a common field. For more information, see [Custom fields](https://www.rebilly.com/catalog/all/custom-fields).
  Example: {"foo":"bar"}

## Response 200 fields

- `id` (string)
  ID of the product.
  Example: prod_0YV7DES3WPC5J8JD8QTVNZBZNZ
- `name` (string, required)
  Name of the product.
  Example: Premium membership
- `unitLabel` (string)
  Unit label, such as per `seat` or per `unit`.
  Example: seat
- `description` (string | null)
  Description of the product.
- `requiresShipping` (boolean)
  Specifies if the product requires shipping. If this value is `true`, shipping calculations are applied.
  Example: false
- `options` (array)
  Names of product options. A product option is a property that distinguishes the pricing plans of a product. The value of each product option is specified in the `productOptions` field of each pricing plan. For more information, see [Plans](https://www.rebilly.com/docs/dev-docs/api/plans/).
  Example: ["region","size"]
- `taxCategoryId` (string | null)
  Tax category of the product. For a complete list of supported tax categories, see [TaxJar sales tax API reference](https://developers.taxjar.com/api/reference/#get-list-tax-categories). If none of the tax categories from the list are applicable for your product, use the general tax category `00000`.
  Example: 00000
- `accountingCode` (string | null)
  Accounting code of the product.
  Example: 4010
- `recognition` (object | null)
- `recognition.debitAccountId` (string | null)
  ID of the debit journal account.
- `recognition.creditAccountId` (string | null)
  ID of the credit journal account.
- `customFields` (object)
  Use custom fields to extend a resource scheme to include custom data that is not provided as a common field. For more information, see [Custom fields](https://www.rebilly.com/catalog/all/custom-fields).
  Example: {"foo":"bar"}
- `createdTime` (string)
  Date and time when the resource is created. This value is set automatically when the resource is created.
- `updatedTime` (string)
  Date and time when the resource is updated. This value is set automatically when the resource is updated.
- `_links` (array)
  Related links.
- `_links.href` (string)
  Link URL.
- `_links.rel` (string)
  Type of link.
  Enum: "self"

## Response 201 fields

- `id` (string)
  ID of the product.
  Example: prod_0YV7DES3WPC5J8JD8QTVNZBZNZ
- `name` (string, required)
  Name of the product.
  Example: Premium membership
- `unitLabel` (string)
  Unit label, such as per `seat` or per `unit`.
  Example: seat
- `description` (string | null)
  Description of the product.
- `requiresShipping` (boolean)
  Specifies if the product requires shipping. If this value is `true`, shipping calculations are applied.
  Example: false
- `options` (array)
  Names of product options. A product option is a property that distinguishes the pricing plans of a product. The value of each product option is specified in the `productOptions` field of each pricing plan. For more information, see [Plans](https://www.rebilly.com/docs/dev-docs/api/plans/).
  Example: ["region","size"]
- `taxCategoryId` (string | null)
  Tax category of the product. For a complete list of supported tax categories, see [TaxJar sales tax API reference](https://developers.taxjar.com/api/reference/#get-list-tax-categories). If none of the tax categories from the list are applicable for your product, use the general tax category `00000`.
  Example: 00000
- `accountingCode` (string | null)
  Accounting code of the product.
  Example: 4010
- `recognition` (object | null)
- `recognition.debitAccountId` (string | null)
  ID of the debit journal account.
- `recognition.creditAccountId` (string | null)
  ID of the credit journal account.
- `customFields` (object)
  Use custom fields to extend a resource scheme to include custom data that is not provided as a common field. For more information, see [Custom fields](https://www.rebilly.com/catalog/all/custom-fields).
  Example: {"foo":"bar"}
- `createdTime` (string)
  Date and time when the resource is created. This value is set automatically when the resource is created.
- `updatedTime` (string)
  Date and time when the resource is updated. This value is set automatically when the resource is updated.
- `_links` (array)
  Related links.
- `_links.href` (string)
  Link URL.
- `_links.rel` (string)
  Type of link.
  Enum: "self"

## Response 401 fields

- `status` (integer)
  HTTP status code.
- `type` (string)
  Problem type in the form of a [URI](https://tools.ietf.org/html/rfc3986) reference. It should provide human-readable documentation for the problem type. When this member is not present, its value is assumed to be "about:blank".
- `title` (string)
  Short, human-readable summary of the problem type. Other than for the purposes of localization, this should not change from occurrence to occurrence of the problem.
- `detail` (string)
  Human-readable explanation that is specific to this occurrence of the problem.
- `instance` (string)
  URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.

## Response 403 fields

- `status` (integer)
  HTTP status code.
- `error` (string)
  Message that describes why the request is forbidden. Most responses use a descriptive message, such as `Not allowed to change security settings`. If the organization requires multi-factor authentication (MFA) and MFA verification has not been completed for the session, this value is `mfa_required`. If the request sets `requireMfa` to `true` and MFA verification has not been completed for the session, this value is `mfa_required_for_caller`. If the organization restricts access to a list of IP addresses and the request comes from an IP address that is not in the list, this value is `ip_not_allowed`.
- `organizationId` (string)
  Unique organization identifier. An organization is an entity that represents a company. For more information, see [Obtain an organization ID](https://www.rebilly.com/docs/settings/organizations-and-websites/#obtain-your-organization-id-and-website-id).
  Example: org_0YVDM8RC7GDADADSBSMW124JA8
- `type` (string)
  Problem type in the form of a [URI](https://tools.ietf.org/html/rfc3986) reference. It should provide human-readable documentation for the problem type. When this member is not present, its value is assumed to be "about:blank".
- `title` (string)
  Short, human-readable summary of the problem type. Other than for the purposes of localization, this should not change from occurrence to occurrence of the problem.
- `detail` (string)
  Human-readable explanation that is specific to this occurrence of the problem.
- `instance` (string)
  URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.

## Response 422 fields

- `status` (integer)
  HTTP status code.
- `type` (string)
  Problem type in the form of a [URI](https://tools.ietf.org/html/rfc3986) reference. It should provide human-readable documentation for the problem type. When this member is not present, its value is assumed to be "about:blank".
- `title` (string)
  Short, human-readable summary of the problem type. Other than for the purposes of localization, this should not change from occurrence to occurrence of the problem.
- `detail` (string)
  Human-readable explanation that is specific to this occurrence of the problem.
- `instance` (string)
  URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.
- `invalidFields` (array)
  Invalid field details.
  Example: [{"field":"field1","message":"field1 is invalid"},{"field":"subObject.field2","message":"field2 is invalid"},{"field":"subObject.field2","message":"another error in the field2"}]
- `invalidFields.field` (string)
  Name of the field. Dot notation is used for nested object field names.
- `invalidFields.message` (string)
  Message field.

## Response 429 fields

- `type` (string)
  Problem type in the form of a [URI](https://tools.ietf.org/html/rfc3986) reference. It should provide human-readable documentation for the problem type. When this member is not present, its value is assumed to be "about:blank".
  Example: about:blank
- `title` (string)
  Short, human-readable summary of the problem type. Other than for the purposes of localization, this should not change from occurrence to occurrence of the problem.
  Example: Rate Limit Exceeded
- `status` (integer)
  HTTP status code.
- `detail` (string)
  Human-readable explanation that is specific to this occurrence of the problem.
  Example: A request cannot be executed because the user has sent too many requests within a certain period of time
- `instance` (string)
  URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.
