---
title: "PUT /Invoices/{id}/items/{itemId}"
method: PUT
path: "/Invoices/{id}/items/{itemId}"
tags: ["Invoices"]
---

# PUT /Invoices/{id}/items/{itemId}

`PUT /Invoices/{id}/items/{itemId}`

## Request

- Base URL: `https://api.clinicos.vet/backend/business`
- URL: `https://api.clinicos.vet/backend/business/Invoices/{id}/items/{itemId}`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/docs/Invoices/:id/items/:itemId/put.ts> (a function with typed inputs; its response is checked against the schema)

## Path parameters

- `id` string, required
- `itemId` string, required

## Request body

- UpdateInvoiceLineItemDto
  - `code` string, nullable
  - `description` string, nullable
  - `unitPrice` union
    - number, double
    - string, double
  - `quantity` union
    - number, double
    - string, double
  - `discount` union
    - number, double
    - string, double
  - `isTaxable` boolean, nullable
  - `vatCategory` string, nullable
  - `providerId` string, nullable
  - `notes` string, nullable
  - `displayOrder` union
    - integer
    - string, int32

## Response `200`

OK

- InvoiceLineItemDto
  - `id` string
  - `invoiceId` string
  - `serviceCatalogItemId` string, nullable
  - `retailItemId` string, nullable
  - `retailItem` RetailItemSummaryDto
    - `id` string
    - `sku` string
    - `barcode` string, nullable
    - `name` string
    - `invoiceName` string, nullable
    - `category` string
    - `unitPrice` union
      - number, double
      - string, double
    - `isTaxable` boolean
    - `isActive` boolean
    - `quantityOnHand` union
      - number, double
      - string, double
    - `isLowStock` boolean
    - `vendorId` string, nullable
    - `vendorName` string, nullable
    - `vendorProductCode` string, nullable
    - `brand` string, nullable
  - `inventoryItemId` string, nullable
  - `billableItemId` string, nullable: Source BillableItem ("Charge") when this line was added from the charge catalog.
  - `billableItemName` string, nullable: Display name of the source BillableItem (snapshot, response-only).
  - `isFulfilled` boolean: True when a BillableItem charge line has been fulfilled — its inventory components dispensed (derived from linked transactions, response-only).
  - `inventoryTransactionId` string, nullable
  - `unitCost` union
    - number, double
    - string, double
  - `code` string, nullable
  - `description` string
  - `unitPrice` union
    - number, double
    - string, double
  - `quantity` union
    - number, double
    - string, double
  - `isFlatRate` boolean: Flat-rate inventory line: billed as one administration whatever amount was given.
  - `dispensedQuantity` union: Amount given on a flat-rate line; null on per-unit lines.
    - number, double
    - string, double
  - `discount` union
    - number, double
    - string, double
  - `discountSetById` string, nullable: Audit: who last set a manual discount on this line, and when.
  - `discountSetAt` string, date-time, nullable
  - `originalUnitPrice` union: The catalog price before staff overrode `unitPrice`; null = not overridden.
    - number, double
    - string, double
  - `priceOverriddenById` string, nullable
  - `priceOverriddenAt` string, date-time, nullable
  - `appliedDiscountPolicyId` string, nullable
  - `appliedDiscountCode` string, nullable
  - `ruleDiscount` union: Discount produced by the price rule engine (separate from the manual `Discount`).
    - number, double
    - string, double
  - `benefitDiscount` union: Discount produced by the wellness-plan benefit pass (ITE-659) — a line covered by an enrolled patient's plan benefit. Server-computed on recalc; client values are ignored.
    - number, double
    - string, double
  - `dispenseFee` union
    - number, double
    - string, double
  - `lineTotal` union
    - number, double
    - string, double
  - `isTaxable` boolean
  - `vatCategory` string, nullable
  - `lineTaxAmount` union
    - number, double
    - string, double
  - `providerId` string, nullable
  - `provider` UserSummaryDto
    - `id` string
    - `email` string
    - `firstName` string, nullable
    - `lastName` string, nullable
    - `displayName` string, nullable
    - `type` string
    - `roleId` string, nullable
    - `roleName` string, nullable
  - `notes` string, nullable
  - `displayOrder` union
    - integer
    - string, int32
  - `groupCodeId` string, nullable: Kit this line came from, when emitted via GroupCode expansion.
  - `groupCodeName` string, nullable: Snapshot of the kit's display name at time of add.
  - `kitInstanceId` string, nullable: Which add of the kit this line came from (shared by that add's lines). Server-owned and read-only, like string? InvoiceLineItemDto.SectionKey: invoice saves never write it.
  - `sectionKey` string, nullable: The estimate line group this line was billed under (EstimateLineGroups), snapshotted at convert; null when ungrouped or added to the bill directly. Read-only: invoice saves ignore it. List&lt;InvoiceLineItemDto&gt; InvoiceDto.Items already comes in section order.
  - `sectionTitle` string, nullable: Heading of string? InvoiceLineItemDto.SectionKey's section.
  - `patientId` string, nullable: The pet this line is attributed to on a combined multi-pet bill (ITE-1157) — the resolved attribution, not the raw column. Set only on bills that carry `patientShares`; null there means no pet could be resolved.
  - `patientIdLocked` boolean: True when the line's pet can't be changed: it was dispensed for a pet, or a pet's plan benefit paid for it. The pet comes from that record.
  - `patientIdLockReason` string, nullable: Why bool InvoiceLineItemDto.PatientIdLocked is set, for the UI's tooltip.

## Changes

- **2026-10-28** `099cf36186e0`: 3 info
  - added the optional property `kitInstanceId` to the response with the `200` status (media type: text/plain)
  - added the optional property `kitInstanceId` to the response with the `200` status (media type: application/json)
  - added the optional property `kitInstanceId` to the response with the `200` status (media type: text/json)
- **2026-10-21** `85ee96c0bb96`: 12 info
  - added the optional property `retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/brand` to the response with the `200` status (media type: text/plain)
  - added the optional property `retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/brand` to the response with the `200` status (media type: application/json)
  - added the optional property `retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/brand` to the response with the `200` status (media type: text/json)
  - added the optional property `retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/vendorProductCode` to the response with the `200` status (media type: text/plain)
  - …8 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/changes/Invoices/:id/items/:itemId/put.md)

---

[API](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1.md) - [All operations](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/llms.txt) - [OpenAPI document](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/revisions/099cf36186e0?raw)
