---
title: "Changes to Cancel a bill that should never have been billed (wrong patient, duplicate, service\n    not rendered, goodwill write-off): Status → InvoiceStatus.Void, terminal.\n    This is the exit for invoices built directly in the Payments panel, which have no\n    source estimate and therefore can't revert. A required reason lands in the payment\n    audit log. Refused once any money is attached — reverse the payments first (a Void\n    bill can never take or hold a payment). Dispensed lines do NOT block: voiding the\n    bill never returns stock (there is no reverse-dispense primitive; see\n    docs/dispensing.md §5) — stock corrections are a separate inventory adjustment.\n    Distinct from Superseded (finalized then replaced): merge and revert keep producing\n    Superseded; Void means cancelled outright.\n    Releases the bill's claims on everything upstream of it — the appointment slot, the\nsource quote's invoice_id, and the reverse dispense links — so a live quote\nstops resolving to a written-off bill. Unlike revert-to-estimate this leaves the\nquote's EstimateStatus untouched: void cancels the bill, it does not\nreopen the quote for editing."
method: POST
path: "/Invoices/{id}/void"
---

# Changes to Cancel a bill that should never have been billed (wrong patient, duplicate, service
    not rendered, goodwill write-off): Status → InvoiceStatus.Void, terminal.
    This is the exit for invoices built directly in the Payments panel, which have no
    source estimate and therefore can't revert. A required reason lands in the payment
    audit log. Refused once any money is attached — reverse the payments first (a Void
    bill can never take or hold a payment). Dispensed lines do NOT block: voiding the
    bill never returns stock (there is no reverse-dispense primitive; see
    docs/dispensing.md §5) — stock corrections are a separate inventory adjustment.
    Distinct from Superseded (finalized then replaced): merge and revert keep producing
    Superseded; Void means cancelled outright.
    Releases the bill's claims on everything upstream of it — the appointment slot, the
source quote's invoice_id, and the reverse dispense links — so a live quote
stops resolving to a written-off bill. Unlike revert-to-estimate this leaves the
quote's EstimateStatus untouched: void cancels the bill, it does not
reopen the quote for editing.

`POST /Invoices/{id}/void`

> Every recorded change to this operation, newest first.

## Timeline

Changed in 8 of 14 revisions.

- **2026-10-28** `099cf36186e0`: 3 info
- **2026-10-21** `85ee96c0bb96`: 12 info
- **2026-10-11** `f7ab358172d0`: 24 info
- **2026-10-07** `021fabd866ff`: 12 info
- **2026-09-11** `503cd0546309`: 9 info
- **2026-09-02** `061f8d95e1d1`: 3 info
- **2026-08-19** `d8d7501dde48`: 6 info
- **2026-08-07** `a905bde4e796`: 1 info

## Changes

- **2026-10-28** `099cf36186e0`: 3 info
  - added the optional property `items/items/kitInstanceId` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/kitInstanceId` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/kitInstanceId` to the response with the `200` status (media type: text/json)
- **2026-10-21** `85ee96c0bb96`: 12 info
  - added the optional property `items/items/retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/brand` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/brand` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/brand` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/vendorProductCode` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/vendorProductCode` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/vendorProductCode` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/sectionKey` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/sectionKey` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/sectionKey` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/sectionTitle` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/sectionTitle` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/sectionTitle` to the response with the `200` status (media type: text/json)
- **2026-10-11** `f7ab358172d0`: 24 info
  - added the optional property `discountWarnings` to the response with the `200` status (media type: text/plain)
  - added the optional property `discountWarnings` to the response with the `200` status (media type: application/json)
  - added the optional property `discountWarnings` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/discountSetAt` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/discountSetAt` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/discountSetAt` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/discountSetById` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/discountSetById` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/discountSetById` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/dispensedQuantity` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/dispensedQuantity` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/dispensedQuantity` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/isFlatRate` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/isFlatRate` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/isFlatRate` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/originalUnitPrice` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/originalUnitPrice` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/originalUnitPrice` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/priceOverriddenAt` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/priceOverriddenAt` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/priceOverriddenAt` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/priceOverriddenById` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/priceOverriddenById` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/priceOverriddenById` to the response with the `200` status (media type: text/json)
- **2026-10-07** `021fabd866ff`: 12 info
  - added the optional property `items/items/patientId` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/patientId` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/patientId` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/patientIdLockReason` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/patientIdLockReason` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/patientIdLockReason` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/patientIdLocked` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/patientIdLocked` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/patientIdLocked` to the response with the `200` status (media type: text/json)
  - added the optional property `patientShares` to the response with the `200` status (media type: text/plain)
  - added the optional property `patientShares` to the response with the `200` status (media type: application/json)
  - added the optional property `patientShares` to the response with the `200` status (media type: text/json)
- **2026-09-11** `503cd0546309`: 9 info
  - added the optional property `dueDate` to the response with the `200` status (media type: text/plain)
  - added the optional property `dueDate` to the response with the `200` status (media type: application/json)
  - added the optional property `dueDate` to the response with the `200` status (media type: text/json)
  - added the optional property `isOnAccount` to the response with the `200` status (media type: text/plain)
  - added the optional property `isOnAccount` to the response with the `200` status (media type: application/json)
  - added the optional property `isOnAccount` to the response with the `200` status (media type: text/json)
  - added the optional property `items/items/benefitDiscount` to the response with the `200` status (media type: text/plain)
  - added the optional property `items/items/benefitDiscount` to the response with the `200` status (media type: application/json)
  - added the optional property `items/items/benefitDiscount` to the response with the `200` status (media type: text/json)
- **2026-09-02** `061f8d95e1d1`: 3 info
  - added the optional property `hasSourceEstimate` to the response with the `200` status (media type: text/plain)
  - added the optional property `hasSourceEstimate` to the response with the `200` status (media type: application/json)
  - added the optional property `hasSourceEstimate` to the response with the `200` status (media type: text/json)
- **2026-08-19** `d8d7501dde48`: 6 info
  - added the optional property `amountPaid` to the response with the `200` status (media type: text/plain)
  - added the optional property `amountPaid` to the response with the `200` status (media type: application/json)
  - added the optional property `amountPaid` to the response with the `200` status (media type: text/json)
  - added the optional property `hasUnresolvedPayment` to the response with the `200` status (media type: text/plain)
  - added the optional property `hasUnresolvedPayment` to the response with the `200` status (media type: application/json)
  - added the optional property `hasUnresolvedPayment` to the response with the `200` status (media type: text/json)
- **2026-08-07** `a905bde4e796`: 1 info
  - endpoint added

---

[Operation](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/docs/Invoices/:id/void/post.md) - [API](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1.md) - [Page](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/changes/Invoices/:id/void/post)
