---
title: "Creates an adhoc ticket product."
method: POST
path: "/v2/billing/ticket-products/adhoc"
tags: ["Billing"]
---

# Creates an adhoc ticket product.

`POST /v2/billing/ticket-products/adhoc`

## Request

- Base URL: `https://app.ninjarmm.com` (the document declares no server; this is the origin it was published from)
- URL: `https://app.ninjarmm.com/v2/billing/ticket-products/adhoc`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `sessionKey`
- TypeScript: <https://skmtc.dev/ninjarmm/apis/ninjaone-public-api-2-0/docs/v2/billing/ticket-products/adhoc/post.ts> (a function with typed inputs; its response is checked against the schema)

Creates a ticket product that is not associated to a product and attaches it to a ticket.

## Request body

- object: Representation of a ninja billing ticket product request.
  - `name` string, required: Ticket product name.
  - `description` string, required: Ticket product description.
  - `quantityType` 'MANUAL' | 'DEVICE_COUNTS' | 'TIME_ENTRIES' | 'END_USER_COUNTS' | 'BACKUP_STORAGE_COUNTS' | 'SOFTWARE_LICENSE', required: How the product quantity is calculated. in billing.
  - `content` object, required: Product basic information needed to its calculations.
  - `ticketId` integer, required: Ticket ID where the product is assigned.
  - `productId` integer, nullable, required: Product ID of the catalog product, if assigned.
  - `accountId` integer, required: Account ID assigned to the product.
  - `taxId` integer: Tax ID assigned to the product. If null, the product will use the agreement's tax.
  - `inheritTaxFromAgreement` boolean: Whether this product inherits its tax configuration from the agreement.
  - `productUserRole` object, nullable: Representation of a ninja billing product user role request.
    - `allowAllTechnicians` boolean, required: Whether all technicians are allowed to access this product or specific roles will be specified.
    - `userRoles` integer[], required: Set of user role IDs that can access this product. Only used when allowAllTechnicians is false.
  - `integrationSettings` object: If 3rd party integration is enabled, the settings needed to export invoices with this product.
  - `group` boolean, required: Whether the product can be built as group.

## Response `200`

Successfully created non-catalog/adhoc ticket product.

- object: Representation of a ninja billing Ticket Product.
  - `id` integer
  - `name` string
  - `description` string
  - `billingStatus` 'BILLED' | 'PENDING' | 'NOT_BILLABLE' | 'UNASSIGNED'
  - `quantityType` 'MANUAL' | 'DEVICE_COUNTS' | 'TIME_ENTRIES' | 'END_USER_COUNTS' | 'BACKUP_STORAGE_COUNTS' | 'SOFTWARE_LICENSE'
  - `content` object
  - `technician` object: Representation of a ninja billing Technician.
    - `firstName` string
    - `lastName` string
    - `id` integer
    - `email` string
    - `deleted` boolean
  - `productId` integer
  - `integrationSettings` object
  - `taxId` integer
  - `inheritTaxFromAgreement` boolean

## Other responses

- `400`: Ticket product creation request validation error
- `404`: Ticket not found
- `500`: Permission not granted

## Changes

- **2026-07-26** `753f26d46650`: 4 info
  - added the new optional request property `inheritTaxFromAgreement`
  - added the new optional request property `taxId`
  - added the optional property `inheritTaxFromAgreement` to the response with the `200` status
  - added the optional property `taxId` to the response with the `200` status
- **2026-07-12** `dec5d4ed264e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/ninjarmm/apis/ninjaone-public-api-2-0/changes/v2/billing/ticket-products/adhoc/post.md)

---

[API](https://skmtc.dev/ninjarmm/apis/ninjaone-public-api-2-0.md) - [All operations](https://skmtc.dev/ninjarmm/apis/ninjaone-public-api-2-0/llms.txt) - [OpenAPI document](https://skmtc.dev/ninjarmm/apis/ninjaone-public-api-2-0/revisions/5ce571d1bb71?raw)
