---
title: "Get billing information (requires verified session)"
method: GET
path: "/public/widget/portal/billing"
tags: ["Widget"]
---

# Get billing information (requires verified session)

`GET /public/widget/portal/billing`

## Request

- Base URL: `https://api.clinicos.vet/backend/business`
- URL: `https://api.clinicos.vet/backend/business/public/widget/portal/billing`
- Auth: HTTP bearer

## Query parameters

- `sessionId` string, required
- `clinicId` string, required

## Response `200`

OK

- GetBillingResponse
  - `invoices` InvoiceDto[]
    - `id` string
    - `invoiceNumber` string
    - `clientId` string, nullable
    - `clientName` string, nullable
    - `patientId` string, nullable
    - `patientName` string, nullable
    - `appointmentId` string, nullable
    - `providerMode` string
    - `invoiceProviderId` string, nullable
    - `invoiceProvider` UserSummaryDto
      - `id` string
      - `email` string
      - `firstName` string, nullable
      - `lastName` string, nullable
      - `displayName` string, nullable
      - `type` string
      - `roleId` string, nullable
      - `roleName` string, nullable
    - `status` string
    - `amountPaid` union: Money the clinic is actually holding on this bill — `PaymentLedger.TotalPaid` (originals positive, refund rows negative). Zero for a bill refunded to net zero and for one carrying only pending or failed attempts. This is what gates void / revert / delete server-side; the UI reads it so it can't drift from the guard. Note that `Status` is a stored column and can disagree — this is the money truth.
      - number, double
      - string, double
    - `hasUnresolvedPayment` boolean: A payment here is still open: either an unconfirmed gateway outcome (`RequiresReview` — the card MAY have been charged) or a gateway-accepted debit that hasn't settled yet (a Pending ACH with a TransactionId — money in flight). An unpaid Text2Pay link is NOT open; it holds nothing. Deliberately excluded from decimal InvoiceDto.AmountPaid so it never inflates a balance, but it still blocks void / revert / delete until the settlement sweep or a human resolves it.
    - `hasSourceEstimate` boolean, nullable: Whether an estimate row points at this invoice (Estimates.InvoiceId == Id), i.e. the bill was converted from an estimate and revert-to-estimate has somewhere to go. False for a bill built directly in the Payments panel — revert would 409 NO_SOURCE_ESTIMATE, so the UI hides the control and leaves void as the exit. Null when the endpoint didn't compute it (only fulfillment-mapped responses do, e.g. GET /invoices/{id}); treat null as unknown, never as "no".
    - `subTotal` union
      - number, double
      - string, double
    - `taxableSubTotal` union
      - number, double
      - string, double
    - `taxRate` union
      - number, double
      - string, double
    - `taxAmount` union
      - number, double
      - string, double
    - `taxMode` string: "us-sales-tax" or "vat" — snapshot at estimate creation.
    - `discountTotal` union
      - number, double
      - string, double
    - `orderDiscountAmount` union
      - number, double
      - string, double
    - `ruleOrderDiscountAmount` union: Order-level discount produced by the price rule engine (separate from discount codes).
      - number, double
      - string, double
    - `totalAmount` union
      - number, double
      - string, double
    - `notes` string, nullable
    - `mergedIntoInvoiceId` string, nullable: Set when this invoice was merged into a new combined invoice (it is then Superseded): the id of the successor bill.
    - `mergedIntoInvoiceNumber` string, nullable: Human-readable number of the successor combined invoice this one was merged into (set only on a Superseded source). Lets the UI link forward without a second fetch.
    - `mergedFromInvoices` MergedInvoiceRefDto[]: The source invoices this combined bill was assembled from (empty for a normal invoice). Drives the "Combined from …" provenance shown on the merged invoice.
      - `id` string
      - `invoiceNumber` string
      - `patientName` string, nullable
    - `patientShares` InvoicePatientShareDto[]: Per-pet split of a combined bill that spans several patients, one entry per pet (plus a null-patient entry for unattributed lines). Empty for a single-patient bill, whose ordinary invoice PDF already is the pet's receipt.
      - `patientId` string, nullable
      - `patientName` string, nullable
      - `lineCount` union
        - integer
        - string, int32
      - `totalAmount` union: The pet's total: its lines, its share of order discounts, and its tax.
        - number, double
        - string, double
    - `signatureData` string, nullable
    - `signedAt` string, date-time, nullable
    - `issuedAt` string, date-time, nullable: When the bill was issued (Draft → Unpaid) and its totals frozen. Null for Drafts and legacy invoices issued before the issue boundary.
    - `isOnAccount` boolean: House accounts (ITE-670): deliberately charged to the client's account.
    - `dueDate` string, date-time, nullable: Due date (issue date + terms); set by charge-to-account, null otherwise.
    - `items` 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.
    - `appliedDiscounts` AppliedDiscountDto[]
      - `id` string
      - `invoiceId` string
      - `discountPolicyId` string
      - `invoiceLineItemId` string, nullable
      - `discountCode` string
      - `discountName` string
      - `discountType` string
      - `discountValue` union
        - number, double
        - string, double
      - `calculatedAmount` union
        - number, double
        - string, double
      - `appliedBy` UserSummaryDto
        - `id` string
        - `email` string
        - `firstName` string, nullable
        - `lastName` string, nullable
        - `displayName` string, nullable
        - `type` string
        - `roleId` string, nullable
        - `roleName` string, nullable
      - `appliedAt` string, date-time
    - `appliedPriceRules` AppliedPriceRuleDto[]: Audit records of price rules that produced discounts on this estimate.
      - `id` string
      - `priceRuleId` string
      - `invoiceLineItemId` string, nullable
      - `ruleName` string
      - `ruleType` string
      - `calculatedAmount` union
        - number, double
        - string, double
      - `evaluatedAt` string, date-time
    - `createdBy` UserSummaryDto
      - `id` string
      - `email` string
      - `firstName` string, nullable
      - `lastName` string, nullable
      - `displayName` string, nullable
      - `type` string
      - `roleId` string, nullable
      - `roleName` string, nullable
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
    - `discountWarnings` string[], nullable: Set only on the convert-to-invoice response: estimate discount codes that could not be carried onto the bill (expired, usage limit, below minimum…), one message each. Null otherwise.
  - `totalBalance` union
    - number, double
    - string, double

## Other responses

- `400`: Bad Request
- `401`: Unauthorized

## Changes

- **2026-10-28** `099cf36186e0`: 3 info
  - added the optional property `invoices/items/items/items/kitInstanceId` to the response with the `200` status (media type: text/plain)
  - added the optional property `invoices/items/items/items/kitInstanceId` to the response with the `200` status (media type: application/json)
  - added the optional property `invoices/items/items/items/kitInstanceId` to the response with the `200` status (media type: text/json)
- **2026-10-21** `85ee96c0bb96`: 12 info
  - added the optional property `invoices/items/items/items/retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/brand` to the response with the `200` status (media type: text/plain)
  - added the optional property `invoices/items/items/items/retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/brand` to the response with the `200` status (media type: application/json)
  - added the optional property `invoices/items/items/items/retailItem/oneOf[#/components/schemas/RetailItemSummaryDto]/brand` to the response with the `200` status (media type: text/json)
  - added the optional property `invoices/items/items/items/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/public/widget/portal/billing/get.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)
