---
title: "Creates a product"
method: POST
path: "/v2/billing/products"
tags: ["Billing"]
---

# Creates a product

`POST /v2/billing/products`

Creates a new product in the catalog.

The content field structure varies by quantity type and must include all required fields for that type:
- **Required for all types**: price, cost, taxable, billing
- **MANUAL**: quantity, productIds
- **DEVICE_COUNTS**: anyRole, groupIds, allGroups, nodeRoles (optional), productIds
- **END_USER_COUNTS**: anyRole, endUserRoles (optional), matchAllRoles, productIds
- **BACKUP_STORAGE_COUNTS**: anyRole, groupIds, allGroups, nodeRoles (optional), isStorageIncludedPerDevice, includedStorage, productIds
- **TIME_ENTRIES**: autoRoundTimeEntries, laborCodes, userRoles, onSiteMultiplier, offHoursMultiplier, remoteMultiplier, normalHoursMultiplier, scheduleTypeOffHours, scheduleTypeNormalHours, locationTypeOnSite, locationTypeRemote, includeTime, includedTimeAmountUnlimited, includedHours, unusedCarryOverUnlimited, carryOverLimit, productIds

The productUserRole field controls which technicians can use this product.

## Response `201`

Product successfully created

- object — Detailed representation of a ninja billing Product response.
  - `id` integer — Unique identifier of the product.
  - `name` string — Name of the product.
  - `description` string — Description of the product.
  - `quantityType` 'MANUAL' | 'DEVICE_COUNTS' | 'TIME_ENTRIES' | 'END_USER_COUNTS' | 'BACKUP_STORAGE_COUNTS' | 'SOFTWARE_LICENSE' — Quantity type of the product.
  - `content` object — Additional content/configuration for the product. Structure varies by quantity type.
  - `integrationSettings` object — If 3rd party integration is enabled, the settings for exporting invoices with this product.
  - `createTime` number, double — Timestamp when the product was created.
  - `updateTime` number, double — Timestamp when the product was last updated.
  - `productUserRole` object — Representation of a ninja billing product user role response.
    - `allowAllTechnicians` boolean — Whether all technicians are allowed to access this product.
    - `userRoles` object[] — Set of user roles that can access this product. Empty when allowAllTechnicians is true.
      - `id` integer — Unique identifier of the user role.
      - `name` string — Name of the user role.
  - `accountId` integer — Account ID associated with the product.
  - `group` boolean — Whether the product is a group product.
  - `taxId` integer, nullable — Tax ID associated with the product. Null if no specific tax is set.
  - `inheritTaxFromAgreement` boolean — Whether the product inherits tax from the agreement.
  - `active` boolean — Indicates if the product is active.

## Other responses

- `400` — Bad Request - Validation error
- `403` — Forbidden - Insufficient permissions
- `409` — Conflict - Product name already exists

---

[API](https://skmtc.net/ninjarmm/apis/ninjaone-public-api-2-0.md) · [All operations](https://skmtc.net/ninjarmm/apis/ninjaone-public-api-2-0/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/ninjarmm/ninjaone-public-api-2-0/revisions/753f26d46650/schema)
