# Create a product

Creates a product.

Endpoint: POST /products
Version: latest
Security: SecretApiKey, JWT

## Request fields (application/json):

  - `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.

  - `options` (array)
    Product options such as color, size, and so forth.
Product option values are defined in plans.
For more information, see [Plans](https://www.rebilly.com/docs/dev-docs/api/plans/).

  - `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).

## Response 201 fields (application/json):

  - `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.

  - `options` (array)
    Product options such as color, size, and so forth.
Product option values are defined in plans.
For more information, see [Plans](https://www.rebilly.com/docs/dev-docs/api/plans/).

  - `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).

  - `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 (application/json):

  - `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 (application/json):

  - `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 422 fields (application/json):

  - `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.

  - `invalidFields.field` (string)
    Name of the field.
Dot notation is used for nested object field names.

  - `invalidFields.message` (string)
    Message field.

## Response 429 fields (application/json):

  - `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.


