/
CL
clinicos
/
PawthosX.Business.API | v1
Search skmtc…
⌘K
Docs
Sign in
Sign in
APIs
Generators
Stacks
Projects
Docs
History
Schema
Sources
Subscribe
v2
latest
OpenAPI 3.1.1
2026-08-07
854
993
2.4 MB
AdminS3
Check if a bucket has CORS configured.
get
/admin/s3/buckets/{bucketName}/cors
Path parameters
bucketName
string
required
The S3 bucket name to check
Response
OK
All 854 operations
get
Check if a bucket has CORS configured.
post
Configure CORS on an S3 bucket to allow access from clinicos.vet subdomains. This should be called once per bucket, typically during tenant provisioning.
get
Lists all API keys for a tenant.
post
Creates a new API key for the tenant. IMPORTANT: The full API key is only returned once during creation. Store it securely - you cannot retrieve it again.
get
Gets details of a specific API key.
delete
Revokes an API key permanently. The key can no longer be used and cannot be reactivated.
post
Suspends an API key (temporarily disables it). The key can be reactivated later.
post
Reactivates a suspended API key.
post
Regenerates an API key (creates a new key and revokes the old one). IMPORTANT: The new API key is only returned once. Store it securely.
get
Get a paginated and filtered list of appointments
post
Create a new appointment with schedule item
get
Get a single appointment by ID with basic information
put
Update an existing appointment and optionally its schedule item
delete
Delete an appointment and its schedule item
get
Get a single appointment by ID with detailed information (vitals, forms, SOAP notes)
post
Import a historical (already-occurred) visit as a Completed appointment (ITE-260). Skips the schedule-conflict check — batch imports of past history are expected to overlap each other and existing bookings. The backing schedule item is created without a location (exempt from the overlap EXCLUDE constraint, invisible to room-scoped calendar views) and stamped CreatedBySource = "import".
get
Get discharge document for an appointment
post
Check in an appointment
post
Undo a check-in done by mistake (status: CheckedIn → Scheduled)
post
Start an appointment (move to in-progress)
post
Complete an appointment
get
Evaluate the "Missing Before Discharge" safety checklist for an appointment (PAW-628).
post
Override a required discharge-checklist item with a reason (PAW-628). Records an audit entry; the override unblocks the item for completion.
post
Cancel an appointment
post
Mark appointment as no-show
get
Get all dispensed inventory items for an appointment
get
Returns the consent audit trail for the treatment plan attached to this appointment. Returns an empty list when no plan exists. Used by the Chronicle and Schedule consent viewer modals.
patch
Update the billing status of a dispensed item
patch
Update a dispensed item's dispense type and prescription details
get
Get the previous travel destination for a staff member on a given date. Used for chaining travel appointments (use last destination as next starting point).
get
Get all appointment types
post
/appointment-types
get
List the available generated-note formats (PAW-744). Code-defined registry — the settings UI's Note Format dropdown renders whatever this returns so the FE stays dumb about format ids.
get
Get a specific appointment type by ID
put
/appointment-types/{id}
delete
/appointment-types/{id}
get
Get default services for an appointment type
post
Add a default service to an appointment type
put
Update a default service on an appointment type
delete
Delete a default service from an appointment type
get
/BillableItems
post
/BillableItems
get
/BillableItems/{id}
put
/BillableItems/{id}
delete
/BillableItems/{id}
get
Get breeds, optionally filtered by species
post
Create a new breed
get
Get a breed by ID
put
Update an existing breed
delete
Soft-delete a breed
post
/clients/export/bulk/pdf
post
/clients/export/bulk/csv
post
Download multiple patient records as a ZIP of PDFs
post
Download multiple patient records as a ZIP of CSVs
get
Get the full CareQueue state for today (or the supplied date).
patch
Persist a manual reorder of the queue. Body provides the desired top-to-bottom order of appointment ids.
get
Get all milestones for a case
post
Create a new milestone for a case
get
Get a single milestone by ID
put
Update an existing milestone
delete
Delete a milestone
post
Bulk update milestones (for reordering/status changes)
get
Get all cases for a patient
post
Create a new case
get
Get a single case by ID
put
Update an existing case
delete
Delete a case
post
Email a chat conversation
get
Whether each of the given clients has linked the pet-owner app to this clinic. Informational (drives the "App connected" badge) — 502 when Client.API is unreachable so the UI can simply hide the badges.
post
Generate an app invite token for a client. Returns a deep link and QR-encodable URL.
post
Generate an invite and send it via SMS or email through the communication workflow. Creates a thread in the clinic's chat inbox with the invite message.
post
/clients/{clientId}/export/pdf
post
/clients/{clientId}/export/email
post
/clients/{clientId}/export/csv
get
Get a paginated list of clients with optional search and sorting
post
/Clients
get
Get a client by ID
put
/Clients/{id}
delete
/Clients/{id}
get
Get all clinic configuration domains
get
Get financial settings
patch
PATCH /clinic-config/financial - Update financial settings
get
Get communications settings
patch
PATCH /clinic-config/communications - Update communications settings
get
Get inventory settings
patch
PATCH /clinic-config/inventory - Update inventory settings
get
Get diagnostics settings
patch
PATCH /clinic-config/diagnostics - Update diagnostics settings
get
Get AI settings
patch
PATCH /clinic-config/ai - Update AI settings
get
Get compliance settings
patch
PATCH /clinic-config/compliance - Update compliance settings
get
Get client app settings
patch
PATCH /clinic-config/client-app - Update client app settings
get
Get phone system settings
patch
PATCH /clinic-config/phone-system - Update phone system settings
get
Get Voice AI settings
patch
PATCH /clinic-config/voice-ai - Update Voice AI settings
get
GET /clinic-config/voice-ai/phone-number - Get the Voice AI phone number for this tenant
post
POST /clinic-config/voice-ai/phone-number - Import and assign a Voice AI phone number
delete
DELETE /clinic-config/voice-ai/phone-number - Remove the Voice AI phone number
get
Get region settings (locale, currency, units)
patch
PATCH /clinic-config/region - Update region settings
get
GET /clinic-config/prescribing-rules — read-only description of the prescribing rules the clinic's current region enforces. Drives the Governance Preview settings page (PAW-476 slice 5).
get
Get transparency page settings (public CMA-style pricing page)
patch
PATCH /clinic-config/transparency-page - Update transparency page settings
get
GET /clinic-config/client-feedback - Get NPS / client-feedback settings (PAW-469)
patch
PATCH /clinic-config/client-feedback - Update NPS / client-feedback settings (PAW-469)
get
Get clinic settings from DynamoDB profile data
patch
/clinic-settings
get
Get current user's clock status (clocked in, out, or on lunch).
post
Clock in (creates a new time entry for today).
post
Clock out (updates today's time entry with clock-out time).
post
Start lunch break.
post
End lunch break.
post
Set or update the user's clocking PIN for kiosk use.
get
Compliance dashboard rollup. Reads from the unified `compliance_events` projection (PAW-484/PAW-485). Default range when caller omits parameters is "last 30 days". The optional category filter scopes the per-category breakdown only — headline metrics always reflect the full picture in range.
get
/api/consent-documents/by-response/{responseId}
get
/api/consent-documents/{id}/pdf
get
Get all DEA controlled substance books
post
/DeaBooks
get
Get a specific DEA book by ID
patch
/DeaBooks/{id}/deactivate
patch
/DeaBooks/{id}/reactivate
get
Get entries for a DEA book with optional filters
post
/DeaBooks/{id}/entries
get
Get current container states for a DEA book
get
Get audit trail for a DEA book (for compliance export)
get
Download DEA log as PDF
post
Email DEA log as PDF attachment
get
List active diagnosis terms for a species (e.g. `?speciesCode=DOG`), ordered by body system then name so the client can group them directly.
get
Get a paginated list of discount codes with optional filters
post
/DiscountCodes
get
Get a discount code by ID
put
/DiscountCodes/{id}
delete
/DiscountCodes/{id}
get
Get a discount code by its code string
post
/DiscountCodes/{id}/validate
get
Get a paginated and filtered list of form drafts
post
Create a new form draft
get
Get a single form draft by ID
put
Update an existing form draft
delete
Delete a form draft by ID
get
Get all form drafts for a specific flow
post
Complete an intake flow by processing all drafts and creating client/patient records
get
Edge gateway polls for pending print jobs
patch
Edge gateway reports print job completion or failure
get
Edge fetches all active web-defined printers
get
Edge fetches its saved printer mappings
put
Edge saves/updates its CUPS queue mappings
post
Resend email verification to the currently authenticated user
post
Resend email verification to a specific user (admin only)
get
/Estimates
post
/Estimates
get
/Estimates/{id}
delete
Hard-delete an estimate. Allowed only when the estimate is provably inert — a EstimateStatus.Draft that has never been converted and has no line that has performed/dispensed anything. Anything with committed side effects (dispensed stock, DEA entries, a cut Rx) is refused with 409: the raw cascade delete reverses none of that, so those lines must be voided first (which restores stock, files the DEA correction, cancels the Rx). Mirrors the per-line delete guard at Task<ActionResult> EstimatesController.DeleteItemAsync(string id, string lineId).
get
Fetch the appointment's estimate, auto-creating an empty draft on first access. The estimate is the single authoring + execution surface rendered in the chronicle Services tab; a draft must exist before lines can be added.
get
List a patient's open, standalone estimates that can be linked to an appointment — i.e. pre-existing quotes (created from the client/patient record) that are not yet converted (`InvoiceId == null`), not declined, and not already tied to an appointment (`AppointmentId == null`). Drives the "Link existing estimate" picker on the Services tab.
post
Link a pre-existing open estimate to an appointment. Honors the unique index on `treatment_plans.appointment_id` (one estimate per appointment): * No estimate on the appointment yet → set AppointmentId on the chosen one. * The appointment's auto-created estimate is empty → drop it and re-point the chosen estimate (preserves the chosen estimate's identity + consent history). * The appointment's estimate already has lines → merge the chosen estimate's lines into it and remove the chosen estimate. Returns the resulting estimate the Services tab should render.
post
Convert a treatment plan to an estimate using the selected tier's quantities.
post
Revert an UNPAID invoice back to an editable estimate. Archives the bill (marks it InvoiceStatus.Superseded, keeping its lines as a read-only record), unstamps the dispense-linked transactions (so the dispenses re-appear as unbilled on the estimate), releases its appointment, reopens the source estimate to Draft, and records an ConsentEventType.InvoiceReverted consent event. Blocked once the invoice has any payment (PartiallyPaid/Paid or any non-failed Payment) — those need refund/void first. Does NOT reverse dispenses: lines stay Performed with their InventoryTransactionId on the estimate; returning stock is the separate per-line void flow. Routed under /invoices (absolute route) to match the bill it acts on; Billing-permission gated at controller level.
post
Record that the plan was presented to the client (overlay opened). Logs a PlanPresented event and bumps status to Presented. Idempotent if status is already Presented — always logs the event.
post
Record the client's acceptance of a presented plan WITHOUT converting it to an invoice. The in-visit present flow uses this: the client approves the plan (consent + optional signature + chosen tier) up front; the bill is created later by convert-to-invoice once services are performed. Sets status Accepted + tier and logs a PlanAccepted consent event; leaves the estimate un-converted (no InvoiceId).
post
Client declined the plan. Sets status to Declined and logs an event.
get
/Estimates/{id}/consent-events
get
Read-only convert-to-invoice readiness for an appointment estimate. Converting is the last step before payment, so the gate blocks while any line is still Pending or a performed take-home label hasn't been filled. Drives the Convert button's disabled state + blockers popover (mirrors the BillableItem availability pre-check). Standalone (no-appointment) estimates are always ready — the quote itself becomes the bill.
post
Add a single line (procedure / inventory / retail) to an estimate.
post
Seed the estimate's lines from its appointment type's default services. Rebuilds the retired appointment-services "populate-defaults" onto the estimate line: each active default service becomes a Pending line. The dispense fee is charged once per unique inventory item across the whole estimate (existing lines count), matching the old behaviour. No-op (ItemsAdded = 0) when the estimate has no appointment, the appointment has no type, or the type has no active default services.
put
Update a single estimate line (quantity / price / billing flag / order / tier qtys).
delete
Delete a single estimate line. Blocks when the line is performed-and-dispensed (use void).
get
Stock-only availability pre-check for a charge line on the estimate (design §5 / §9.1): are the BillableItem's components on hand at the line's quantity? Read-only — no validate-pass, no stock movement. Mirrors the invoice-side check off the same `CheckAvailabilityAsync`, so the estimate UI can flag a short charge before the user opens the perform modal.
get
List a performed charge line's take-home component dispenses (per-component disposition). A charge fans out to N component transactions; the ones dispensed take-home (DispenseType=Prescription) may have a deferred SIG. This returns each with whether its SIG/label is filled, so the UI can walk the unfilled ones through the post-dispense prescription flow and clear the SIG_REQUIRED convert block. See docs/june-updates/charge-component-disposition.md.
post
Mark an estimate line performed. For an undispensed inventory line this runs the in-visit dispense (stamping `InventoryTransactionId` on the line; no Invoice involvement until convert). Gas items have no transaction.
post
Mark an estimate line declined by the client. Drops it from billing and reassigns any dispense fee.
post
Void a performed-and-dispensed estimate line: reverse the dispense (restore the lot, write a Returned transaction, file a DEA correction for controlled substances, cancel any tied Rx), then remove the line. Falls through to a plain delete when there is no dispense to undo. Anchors entirely on the line's `InventoryTransactionId`.
get
Generate a PDF for a saved treatment plan.
post
Email the estimate PDF to the client through the unified communications inbox. Composes an Email-channel message (visible in /chat) with the rendered PDF attached, then records the presentation: Draft plans bump to Presented and a PlanPresented consent event is logged either way.
get
/exam-templates
post
/exam-templates
get
/exam-templates/{id}
put
/exam-templates/{id}
delete
/exam-templates/{id}
get
Get expenses for a date range with optional filters
post
Create a manual expense
get
Get expense by ID
put
Update an expense (only manual expenses can be updated)
delete
Delete an expense (only manual expenses can be deleted)
get
Get expense summary (totals by category) for a date range
get
Published changelog entries for the home page's Release Notes panel, newest first.
get
Mint a Featurebase identity JWT for the current user.
get
Get the complete flowboard state for today or a specific date
get
Get a single visit by appointment ID
put
Update the status of a room (Available, Needs Cleaning, Out of Service, etc.)
put
Assign a patient to a room
delete
Remove a patient from their current room
put
Queue a patient in a room's "Next Up" list
delete
Remove a patient from a room's "Next Up" queue (returns them to the waiting list)
post
Progress the current milestone to completed and start the next one
post
Start the discharge process for a patient
post
Complete the discharge process - marks patient as discharged
get
/GroupCodes
post
/GroupCodes
get
/GroupCodes/{id}
put
/GroupCodes/{id}
delete
/GroupCodes/{id}
post
Start a group visit. Creates a synthetic ScheduleItem + Appointment bound to the group, returning the appointment ID for the caller to navigate to.
get
/GroupVisits/{appointmentId}
post
/GroupVisits/{appointmentId}/soap
patch
/GroupVisits/{appointmentId}/soap/{soapId}
post
/GroupVisits/{appointmentId}/treatments
post
/GroupVisits/{appointmentId}/soap/{soapId}/exceptions
get
Get health status of all dependent services
get
Get the list of species supported by HomeAgain.
get
Get the list of colors supported by HomeAgain.
get
Get the list of breeds for a given species supported by HomeAgain.
post
Enroll a single pet microchip with HomeAgain.
get
Get XplorPay credentials status (not the actual credentials)
post
Store XplorPay credentials securely
delete
Delete XplorPay credentials
get
List all named payment terminals
post
Add or update a named payment terminal
delete
Delete a named payment terminal
get
Get Mango Voice credentials status (not the actual credentials)
post
Store Mango Voice credentials securely
delete
Delete Mango Voice credentials
get
Get Telnyx WebRTC credentials status (not the actual credentials)
post
Store Telnyx WebRTC credentials securely
delete
Delete Telnyx WebRTC credentials
get
Get HomeAgain credentials status (not the actual credentials)
post
Store HomeAgain credentials securely
delete
Delete HomeAgain credentials
post
Loads the checked-in drug-monograph fixture into the central reference DB: chunks → embeddings (OpenAI ada-002) → upsert. Idempotent and re-runnable — re-running with revised fixture text fully replaces each drug's chunks. Swap the fixture for partner-supplied data and re-hit this endpoint.
post
Send a message to a widget session (from staff via Orchestrate unified inbox)
get
Get pending inventory approvals with optional type filter
get
Get a specific inventory approval by ID
get
Get the count of pending inventory approvals
post
/InventoryApprovals/{id}/approve
post
/InventoryApprovals/{id}/reject
get
Get inventory items with optional filters
post
/Inventory
get
Get a specific inventory item by ID with stock information
put
/Inventory/{id}
post
/Inventory/batch
patch
/Inventory/{id}/units-per-container
get
Get inventory lots for an item
post
/Inventory/{id}/lots
put
/Inventory/{id}/lots/{lotId}
post
/Inventory/{id}/lots/{lotId}/adjust
get
/Inventory/{id}/lots/{lotId}/containers
post
/Inventory/{id}/lots/{lotId}/containers
patch
/Inventory/{id}/lots/{lotId}/containers/{containerId}
get
Get transaction history for an inventory item
post
/Inventory/{id}/validate-dispense
post
/Inventory/{id}/dispense
post
/Inventory/{id}/adjust
get
Get stock summary for all inventory items
get
Get items below their reorder point
get
Get lots expiring within a specified number of days
get
Get location breakdown for a specific inventory item (aggregated across all lots)
get
Get location breakdown for a specific lot
post
Transfer inventory from one location to another
get
Get all inventory locations with optional active filter
post
Create a new inventory location
get
Get a specific inventory location by ID
put
Update an existing inventory location
delete
Delete (deactivate) an inventory location
get
Get the default inventory location
post
Set a location as the default
get
Get a paginated list of estimates with optional filters
post
/Invoices
get
Clinic-wide open-invoice list (ITE-317): every bill still awaiting money — Draft, Unpaid, or PartiallyPaid — oldest first, with the remaining balance computed from recorded payments. This is the AR view /billing renders.
get
Get an estimate by ID
put
/Invoices/{id}
delete
Hard-delete an invoice. Allowed only when the invoice is provably inert — a InvoiceStatus.Draft (never sent) with no payment, no dispensed line, and not the product of a merge. Anything with committed side effects is refused with 409. An invoice that came from an estimate is refused too: use "revert to estimate" so the source estimate is returned to a clean state rather than left accepted-but-unbilled. Deleting a paid/dispensed bill would strand payments and inventory — those must be reversed through their own paths first.
get
Get the most recent estimate for an appointment
post
/Invoices/{id}/items
put
/Invoices/{id}/items/{itemId}
delete
/Invoices/{id}/items/{itemId}
post
Payment-time combination: merge two or more open, unpaid invoices belonging to the same client into one new invoice. Only bills past the estimate→invoice approval gate qualify — the merge copies their lines (dispense links carried over; dispensing and approval are untouched), re-runs the price rule engine against the combined line set, and archives the sources as Superseded with `mergedIntoInvoiceId` pointing at the new bill.
post
/Invoices/{id}/sign
post
/Invoices/{id}/issue
post
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}/send-invoice
get
Download invoice as PDF
post
/Invoices/{id}/send-receipt
post
/Invoices/{id}/apply-discount
delete
/Invoices/{id}/discounts/{appliedDiscountId}
get
Get all applied discounts for an estimate
post
Expand a group code (kit) onto the estimate as individual line items. Each component line is tagged with the originating GroupCodeId; any price rules attached to the kit are applied during the resulting recalculation.
delete
Remove every line item on the estimate that was emitted from the given group code.
post
Runs the price rule engine over a proposed set of line items without persisting. Used by the invoice grid to show rule discounts (BOGO, spend thresholds, etc.) live as the user edits, while keeping the server as the single source of truth for the math — no client-side evaluator to drift.
post
Add a dispensed inventory item to an estimate as a line item
get
Get all milestones for an appointment
post
Create a new milestone for an appointment
get
Get a single milestone by ID
put
Update an existing milestone
delete
Delete a milestone
post
Bulk update milestones (for reordering/status changes)
get
Lookup users for kiosk display. Returns only users that require time tracking.
get
Get clock status for a specific user (for kiosk display).
post
Clock in via kiosk (requires user ID + PIN).
post
Clock out via kiosk (requires user ID + PIN).
get
/LabPanels
post
/LabPanels
get
/LabPanels/{id}
put
/LabPanels/{id}
delete
/LabPanels/{id}
get
Get all lab orders with optional filtering
post
Create a new lab order
get
Get lab order stats (counts by status)
get
Get critical lab orders
get
Get labs pending review
get
Get labs for a specific patient
get
Get labs for a specific appointment
get
Get a specific lab order by ID
put
Update a lab order
delete
Delete a lab order
post
Review a lab order (mark as reviewed with result status)
post
Add a result to a lab order
delete
Delete a result from a lab order
get
Get notes for a lab order
post
Add a note to a lab order
delete
Delete a note from a lab order
get
Gets location closures for a specific date, optionally filtered by location.
post
Creates a new location closure.
post
Toggles a location closure. Creates one if it doesn't exist, deletes it if it does.
delete
Deletes a location closure by ID.
get
Get a paginated list of locations with optional filters
post
/Locations
get
Get a location by ID
put
/Locations/{id}
delete
/Locations/{id}
patch
/Locations/{id}/toggle-status
get
Get all active locations (convenience endpoint)
get
Gets operating hours for every location (used by the schedule grid so each room column can reflect its own hours). Returns a flat list across all locations; rooms with no configured hours are simply absent.
get
Gets operating hours for a location (all days).
put
Bulk upsert operating hours for a location (all 7 days at once).
put
Replace all species restrictions for a location. Pass empty array to remove all restrictions (unrestricted).
get
Get all logos for the tenant
post
Create a new logo entry and get presigned upload URL. Client should upload the file directly to S3 using the returned upload URL.
get
Get a specific logo by ID
put
Update logo metadata
delete
Delete a logo
get
Get the default logo for the tenant
post
Set a logo as the default
get
List requests. `status` filters the workflow state; `billingState=unbilled` is the "Ready to bill" pickup worklist (derived, never stored).
post
Capture a request (front desk, Inventory permission). Nothing billable is created; the request lands in the provider's approve queue. OTC items auto-approve and rest at Approved until pickup.
get
/medication-requests/{id}
post
Approve (provider with Dispense permission + the primary-provider flag). For Rx this authors the Prescription, routes it, and creates the request's own quote estimate with its Pending line (one estimate per request).
post
Deny (provider gate mirrors approve). Terminal; nothing billable exists.
post
Cancel from Requested or Approved (a cancel after dispense is a void on the estimate line instead). Declines the pending quote line and cancels the Rx.
post
Dispense an Approved request from inventory at pickup (Dispense permission). Runs the shared dispense engine and fulfills the request's own Pending line; works for both Rx and phoned-in OTC requests.
get
Mentor summary for the current user. Returns null Data if they aren't mentoring anyone.
get
Mentor summary for any mentor in the tenant. Manager-only.
get
Mentor's clinical timeline for the period. Accessible to the mentor themself or any user with UserManagement; everyone else gets 403.
get
Per-mentee performance for the given period. Accessible to the mentee's mentor or any user with UserManagement; everyone else gets 403.
get
List every user in the tenant who mentors at least one other user. Manager-only.
get
Get EBITDA summary with trend data
get
Get labor efficiency metrics by role
get
Get statistical variance alerts
get
Get schedule heatmap data (appointment density by day/hour)
get
Get AI presence/activity data
get
Get daily goal progress metrics
put
Update daily goal targets
get
Get KPI summary with sparklines
get
Get trend data for sparkline charts
get
Get P and L summary data
get
Get labor breakdown for stacked bar chart
get
Get inventory health metrics
get
Get patient funnel data
get
Get provider rankings
get
Get financial details for table view
get
Get communications metrics
get
Get dashboard summary metrics
get
Get normalized performance metrics
get
Get AI impact metrics (marketing-friendly numbers derived from real data)
get
Get top revenue-generating items (services and inventory)
get
Get revenue rankings by procedure/service category
get
Get recent patient transactions for the master grid
get
Get DVM production metrics (PAW-108, Phase 1): per-provider revenue/hours/visits and clinic totals.
get
Get the severity-weighted DVM Production signals on their own (PAW-579), for the BI Overview tab and the home page.
get
List veterinarian compensation settings (PAW-108 Phase 2). One row per primary-provider user; `IsConfigured` is false for un-modeled providers.
put
Upsert a veterinarian's compensation settings. Requires user_management permission since this controls how margin/profit numbers are reported.
get
Get service-mix buckets excluded from production-pay revenue (PAW-578): clinic-wide buckets plus per primary-provider overrides.
put
Replace the excluded-bucket set for one scope ("clinic" or a single "vet"). Requires user_management since it changes how production pay is reported.
post
AI root-cause diagnosis for one provider's DVM Production drill-down (PAW-576). POST since it may trigger an LLM call; the result is cached server-side.
get
Clinic-wide breakdown of deferred (client-declined) services by individual service over a period, weighted by frequency. Drives the BI "Deferred Services" card.
get
Drill-down list of the deferred services behind one breakdown bucket (by service key) over a period.
get
/nps/insights
get
/nps/responses
patch
/nps/responses/{id}
get
Get a list of partners with optional filters
post
/Partners
get
Get a specific partner by ID
put
/Partners/{id}
delete
/Partners/{id}
put
/Partners/{id}/access
get
/PatientGroups
post
/PatientGroups
get
/PatientGroups/by-patient/{patientId}
get
/PatientGroups/{id}
patch
/PatientGroups/{id}
post
/PatientGroups/{id}/members
delete
/PatientGroups/{id}/members/{memberId}
patch
/PatientGroups/{id}/members/{memberId}
post
/PatientGroups/{id}/members/{memberId}/promote
get
/patients/{patientId}/masses
post
/patients/{patientId}/masses
put
/patients/{patientId}/masses/{massId}
delete
/patients/{patientId}/masses/{massId}
post
/patients/{patientId}/masses/{massId}/measurements
put
/patients/{patientId}/masses/{massId}/measurements/{measurementId}
get
/patients/{patientId}/problems
post
/patients/{patientId}/problems
put
/patients/{patientId}/problems/{id}
delete
/patients/{patientId}/problems/{id}
post
Download patient record as PDF
post
Email patient record as PDF attachment
post
Download patient record as CSV
get
Get a paginated list of patients with optional filters
post
/Patients
get
Get a patient by ID
put
/Patients/{id}
delete
/Patients/{id}
get
Get the client (owner) for a patient
get
Get the contacts (people) related to a patient, with relationship type and per-patient permissions. Primary owner first. Part of the patient↔client relationship layer (PAW-626).
post
Add a non-primary contact (co-owner, emergency contact, etc.) to a patient (PAW-659/PAW-650).
post
Transfer a patient's primary ownership to another client (PAW-659). Moves a pet between clients (wrong-client correction, owner passed away, sold/rehomed). The previous owner is kept as a co-owner or removed per the request.
delete
Remove a contact from a patient. The primary owner cannot be removed — transfer ownership first.
get
Get all SOAP notes for a patient
get
Get vitals summary for a patient including latest measurements and vital types
get
Get activity timeline for a patient from the event-driven PatientActivity table
get
Get outside medications (out-of-band, e.g. filled at an online/outside pharmacy) recorded on a patient for tracking. Intentionally separate from inventory and Rx governance — there may be no matching inventory item. NOTE: the "external-medications" route (and the external_medication_requests table) are kept stable across the OutsideMedication rename — the rename freed "MedicationRequest" for the stateful request entity (docs/medication-request-lifecycle-design.md).
post
Record a new external (out-of-band) medication request on a patient. Tracking only — this never touches inventory or the Rx governance workflow.
delete
Delete an external medication request from a patient.
get
Get medication history for a patient including prescriptions and OTC dispenses
get
Get unbilled items for a patient (dispensed medications not yet on an invoice)
get
Get the deferred (client-declined) services for a patient, most-recently-declined first. Each item links back to its appointment for drill-down.
post
/Patients/{id}/deceased
get
Get a paginated list of payments with optional filters
get
Get a specific payment by ID
get
Get payment summary for an estimate
post
/Payments/cash
post
/Payments/mark-as-paid
post
/Payments/check
post
/Payments/ach
post
/Payments/card-on-file
post
/Payments/credit-debit
post
/Payments/text2pay
post
/Payments/terminal
post
Add a card on file by reading the card at the terminal and tokenizing it. Uses the gateway's token-only endpoint: the card is never authorized or charged, so — unlike a real auth — there is no hold to release afterwards and nothing to void.
post
/Payments/{id}/refund
post
Reverse a payment - tries void first (for unsettled transactions), falls back to refund. This is the recommended endpoint for canceling payments as it automatically picks the right method.
get
Get reconciliation summary for a specific date
get
Get reconciliation summaries for a date range (max 365 days)
post
/Payments/reconciliation/close
post
Close the current open batch in XplorPay, settling all unsettled transactions. This initiates the batch-out process with the payment processor.
post
Process a blind (standalone) terminal refund. This refund is not tied to a previous transaction - customer presents card at terminal. Used when the original transaction was processed elsewhere or cannot be found.
get
Get all payment tokens for a client
get
Get a specific payment token by ID
put
/PaymentTokens/{id}
delete
/PaymentTokens/{id}
post
/PaymentTokens
get
Get WebRTC credentials for Telnyx client initialization. Returns SIP credentials needed to establish WebRTC connection.
get
Get call history from the VoiceCalls table (Telnyx/Retell calls).
get
/PriceRules
post
/PriceRules
get
/PriceRules/{id}
put
/PriceRules/{id}
delete
Two-step delete. An active rule deactivates (200 with outcome "deactivated"); calling delete again on an inactive rule hard-deletes it along with its audit rows (200 with outcome "hardDeleted").
get
Aggregated activity per price rule over paid estimates: times fired, total discount given away, last fired. Restricted to paid estimates because audit rows on draft estimates are reconciled on every recalc.
get
/api/Printers
post
/api/Printers
get
/api/Printers/{id}
put
/api/Printers/{id}
delete
/api/Printers/{id}
post
/api/Printers/{id}/set-default
post
Create a print job from an uploaded PDF file (multipart/form-data)
post
Create a print job from an existing backend data source (backend generates PDF)
get
Get print job status
get
Download a PDF for browser-based viewing/printing (no print job created)
get
Get a paginated and filtered list of PTO requests
post
Create a new PTO request
get
Get a single PTO request by ID
put
Update an existing PTO request
delete
Delete a PTO request by ID
post
Resolve (approve or deny) a PTO request
get
Loads the survey form for a signed token. Returns 404 for invalid/expired tokens.
post
Submits a survey response. Returns the GoogleReviewUrl when score >= 9 and a Place ID is configured.
get
/price-list-entries
post
/price-list-entries
delete
/price-list-entries/{id}
patch
/price-list-entries/{id}
patch
/price-list-entries/reorder
get
Get a questionnaire by public token (no authentication required)
post
Submit a questionnaire response via public token (no authentication required)
get
Get SMS consent form data by magic link token
post
Submit SMS consent from magic link form
get
Get a list of purchase orders with optional filters
post
/PurchaseOrders
get
Get a specific purchase order by ID
put
/PurchaseOrders/{id}
post
/PurchaseOrders/{id}/items
delete
/PurchaseOrders/{id}/items/{itemId}
post
/PurchaseOrders/{id}/send
post
/PurchaseOrders/{id}/receive
post
/PurchaseOrders/from-import
post
/PurchaseOrders/{id}/close
post
/PurchaseOrders/{id}/cancel
get
Get all QI events with optional filtering
post
Create a new QI event
get
Get QI event stats (counts by status)
get
Get a specific QI event by ID
patch
Update QI event status
post
Resolve a QI event
get
Get notes for a QI event
post
Add a note to a QI event
delete
Delete a note from a QI event
get
Get a paginated and filtered list of questionnaire responses
post
Create a new questionnaire response
get
Get a single questionnaire response by ID
put
Update an existing questionnaire response
delete
Delete a questionnaire response
post
Create a public link for a questionnaire response
post
Sends due expiry reminders for unfilled questionnaires in the calling tenant. Driven per-tenant by Orchestrate's QuestionnaireSchedulerService.
get
Get a paginated and filtered list of questionnaires
post
Create a new questionnaire
get
Get a single questionnaire by ID
put
Update an existing questionnaire
delete
Delete a questionnaire
get
Lists automations that reference this questionnaire. Empty list if none.
get
Lightweight lookup used by Orchestrate.API to verify that a questionnaire exists and is in a state suitable for automation references (Published). Returns 404 when missing so the caller can map to a typed orphan-validation error.
post
Send a questionnaire to a client via email/SMS. Used by the unified automation action system from Orchestrate.API.
post
Manually send a questionnaire to a client via email/SMS. Used by staff from the UI (chat, client profile, patient profile).
get
/api/rabies-tags/batches
post
/api/rabies-tags/batches
put
/api/rabies-tags/batches/{id}
get
/api/rabies-tags/batches/{batchId}/next
get
Suggest the next available tag from the active batch for a location + tag type.
post
/api/rabies-tags/assign
post
/api/rabies-tags/{tagId}/void
post
/api/rabies-tags/{tagId}/replace
get
/api/rabies-tags/by-patient/{patientId}
get
/api/rabies-tags/by-vaccination/{vaccinationRecordId}
post
Create a new RDVM portal session (anonymous)
post
Register a new RDVM for a clinic
post
Send a verification code to the RDVM's email
post
Verify the 6-digit code and authenticate the RDVM
get
Get the current RDVM portal session status
get
Get all referrals created by the authenticated RDVM
post
Create a new referral
get
Get details of a specific referral
get
Get messages for a referral
post
Send a message on a referral
get
Get available appointment slots for a clinic. Same logic as the widget booking - providers are embedded in slot data.
get
Get appointment types available for RDVM referrals.
get
Get species available for RDVM referrals.
post
Start a new triage AI conversation.
post
Send a message to an existing triage conversation.
get
Get conversation history for a triage thread.
get
Get documents for a referral RDVM can see: - Documents they uploaded - Documents shared by the clinic (IsSent = true) - All documents if they have canViewRecords permission
post
Upload a document from RDVM portal
get
Download a document from RDVM portal
delete
Delete a document uploaded by the RDVM (can only delete own uploads)
patch
Update the description on a referral document (RDVM can only update their own uploads)
post
Export patient records on-demand (requires canViewRecords permission) Returns PDF directly for download, not stored as a document
get
Get a paginated and filtered list of recordings
get
Get a single recording by ID
patch
Update recording metadata
get
Get recording by appointment ID
get
Get a presigned URL for downloading recording audio
post
Explicit "Save exam" for the custom exam step (PAW-740): persists the narrative responses like the autosave PATCH, then runs the binding interpreter so bound fields emit real vitals and physical-exam findings. This is the single semantic commit point — the debounced autosave keeps persisting narrative JSON but never interprets. Binding failures never block the save; they come back as per-field results.
put
Update recording transcript status
get
Get all recurring expenses
post
Create a recurring expense
get
Get recurring expense by ID
put
Update a recurring expense
delete
Delete (deactivate) a recurring expense
get
Get the count of unread referral messages
put
/ReferralMessages/{id}/read
get
Get a list of referrals with optional filters
post
/Referrals
get
Get referral statistics
get
Get a specific referral by ID with full details
put
/Referrals/{id}
put
/Referrals/{id}/status
post
Approve a pending RDVM referral - creates Patient/Client from pending info or links to existing
post
Reject a pending RDVM referral - sets status to Cancelled and removes schedule item
get
Get messages for a specific referral
post
/Referrals/{id}/messages
get
Get all documents for a referral
post
Upload a document to a referral
delete
Delete a document
patch
Update mutable fields (description) on a referral document
get
Download a document
post
Share patient records with the RDVM by generating a PDF export
get
Get all RDVM users (referring veterinarians) who have registered for portal access
post
Approve an RDVM user's portal access request
post
Reject an RDVM user's portal access request
put
Update an RDVM user's permissions and access settings
get
Get reminders with filtering and pagination
post
Create a new reminder
get
Get a single reminder by ID
put
Update an existing reminder
delete
Delete a reminder
post
Toggle the active status of a reminder
post
Snooze a reminder until a specific date/time
post
Suppress a reminder — deliberately silence it without deactivating or completing it
post
Clear a reminder's suppression
post
Complete a reminder with explicit completion semantics (manual / outside record)
get
Get the lifecycle event history (timeline) for a reminder
get
The "Why this reminder?" debugger view: rule (current + as-emitted), trigger, timeline, and computed conflicts (PAW-624)
post
Link (or re-link) a reminder to a rule so it participates in reconciliation and auto-satisfaction
post
Fold a duplicate reminder into this one; the duplicate is removed with Merged history on both sides
get
List available reports with their parameter schemas.
get
Render a report. Remaining query parameters (period, mode, …) are passed to the report's data provider; its descriptor documents which ones it understands.
get
Get a paginated list of retail items with optional filters
post
/RetailItems
get
Get a specific retail item by ID
put
/RetailItems/{id}
delete
/RetailItems/{id}
get
Get a retail item by its barcode
post
/RetailItems/{id}/adjust
post
/RetailItems/{id}/receive
post
Transfer inventory between locations
get
Get location quantities for a retail item
get
Get transaction history for a retail item
get
Get all roles
post
Create a new role
get
Get role by ID
put
Update an existing role
delete
Delete a role
get
Get available permission groups
get
Gets room day assignments for a specific date, optionally filtered by location.
post
Creates a new room day assignment.
delete
Deletes a room day assignment by ID.
get
Get previous dispense details for auto-fill. Tries same patient first, falls back to any patient.
get
Get prescriptions with governance data
get
Get a single prescription with events
patch
Full prescription edit. Pre-Dispensed prescriptions are updated in place; Dispensed prescriptions require a `reason` and the change is recorded as an amendment. DEA-tracked field changes on a controlled substance are blocked — caller must cancel-and-recreate instead.
post
Route prescription to fulfillment method
post
Mark prescription as dispensed — a governance-status flip only, for confirming an EXTERNAL fulfillment (same-day delivery / online pharmacy / print-retail) was handed off. Moves no stock. In-house prescriptions must use `dispense-inventory`, which runs the real dispense engine; this endpoint rejects them so a status-only call can't fake an in-house dispense (no decrement, no DEA entry, no estimate-line stamp).
post
Dispense from inventory and update governance status in one operation. For in-house routed prescriptions only.
post
Send client follow-up notification
post
Close/archive prescription
post
Generate and queue an Rx label for printing
get
Render an Rx label as a PDF for browser viewing / "Save as PDF" (no print job queued).
get
Get dashboard KPIs
get
Get Rx governance settings
patch
Update Rx governance settings
get
Look up a prescription by its inventory transaction ID
patch
Update prescription instructions (dosage, frequency, duration, instructions).
get
List amendments for a prescription (newest first).
get
List all protocols
post
Create a new protocol
get
Get a single protocol by ID
delete
Delete a protocol
patch
Update a protocol
get
Get the matching protocol for a medication
post
Create a prescription for an already-dispensed transaction (post-dispense flow)
post
Create a new medication request (prescription or OTC). This is the compound walk-up operation: capture, approve, and dispense are applied in one call, each step gated by the caller's permissions (design §4). A front-desk caller with only the Inventory permission stops at Requested; a provider's submit collapses to today's one-step flow.
get
List available pharmacies
post
Create a new pharmacy
get
Get a pharmacy by ID
delete
Soft-delete (deactivate) a pharmacy. The row is retained so historical prescriptions still resolve their pharmacy; it is simply dropped from the active list.
patch
Update an existing pharmacy
get
/reports/saved
post
/reports/saved
put
/reports/saved/{id}
delete
/reports/saved/{id}
get
Render a saved report. Stored parameters are the base; query parameters override them (so a saved YTD report can be previewed as MTD without editing it).
get
Get a paginated and filtered list of schedule items
post
Create a new standalone schedule item (non-appointment)
get
Get a single schedule item by ID
put
Update an existing schedule item
delete
Delete a schedule item (only if not linked to an appointment)
post
Check for schedule conflicts before creating/updating an item. Always returns 200 with conflict details in the response body.
put
Update a single instance of a recurring schedule item. Creates an exception record that overrides the specific occurrence.
delete
Delete a single instance of a recurring schedule item. Creates a cancellation exception for the specific occurrence.
put
Update a recurring series (affects the master item and all future occurrences).
delete
Delete an entire recurring series and all its exceptions.
get
Get all service catalog items
post
/ServiceCatalog
get
Get a specific service catalog item by ID
put
/ServiceCatalog/{id}
delete
/ServiceCatalog/{id}
get
Get a paginated and filtered list of shifts
post
Create a new shift
get
Get a single shift by ID
put
Update an existing shift
delete
Delete a shift by ID
get
Get a paginated and filtered list of shift swap requests
post
Create a new shift swap request
get
Get a single shift swap request by ID
delete
Cancel a shift swap request
post
Accept a shift swap request
post
Decline a shift swap request (peer declines direct request)
post
Manager approves a shift swap awaiting approval (performs the actual shift reassignment)
post
Manager rejects a shift swap awaiting approval
get
/SlotConfigurations
post
/SlotConfigurations
get
/SlotConfigurations/{id}
put
/SlotConfigurations/{id}
delete
/SlotConfigurations/{id}
get
/SlotConfigurations/effective
get
Check if SMS consent exists for a phone number
get
Get SMS consent by ID
get
Get all SMS consents for a client
post
Record SMS consent (authenticated - for staff-assisted opt-in)
post
Generate a magic link for SMS consent collection
post
Generate a magic link and send it via email to the client
post
Revoke SMS consent
get
Get SMS consent settings for tenant
put
Update SMS consent settings for tenant
get
Get all species
post
/Species
get
Get a species by ID
put
/Species/{id}
delete
/Species/{id}
get
/Subscriptions
post
/Subscriptions
get
/Subscriptions/{id}
patch
/Subscriptions/{id}
post
/Subscriptions/{id}/pause
post
/Subscriptions/{id}/resume
post
/Subscriptions/{id}/cancel
post
/Subscriptions/{id}/charge-now
post
/SurgicalRecords
get
/SurgicalRecords/appointment/{appointmentId}
patch
/SurgicalRecords/{id}
post
/SurgicalRecords/{id}/events
put
/SurgicalRecords/{id}/events/{eventId}
delete
/SurgicalRecords/{id}/events/{eventId}
get
/api/tag-assignments
post
/api/tag-assignments
get
/api/tag-assignments/by-tag/{tagId}
delete
/api/tag-assignments/{assignmentId}
get
/api/tags
post
/api/tags
get
/api/tags/{id}
put
/api/tags/{id}
delete
/api/tags/{id}
post
/webhooks/telnyx-call-control
get
Physical output format specs (page size, margins, typography). The web editor derives its canvas sizing from these so the editor, the preview, and the printed output all share one definition.
get
The backend-owned template variable catalog: every {{token}} the render pipeline knows, with label, description, applicable template types, and the sample value previews use. The editor's variable picker and autocomplete derive from this.
post
Renders (possibly unsaved) editor sections through the real production pipeline — sample data, regional compliance blocks, QuestPDF — and returns one PNG per page. More than one page on a fixed-size label format means the content overflows the label.
get
Gets all templates for the current tenant.
post
Creates a new template.
get
Gets a specific template by ID.
put
Updates an existing template.
delete
Deletes a template.
get
Gets the default template for the current tenant.
post
Sets a template as the default for the current tenant.
get
/knowledge-documents
post
/knowledge-documents
put
/knowledge-documents/{id}
delete
/knowledge-documents/{id}
get
Get a paginated and filtered list of time entries
post
Create a new time entry
get
Get a single time entry by ID
put
Update an existing time entry
delete
Delete a time entry by ID
get
/public/transparency/clinics/{clinicId}/overview
get
/public/transparency/clinics/{clinicId}/pricing
get
/public/transparency/clinics/{clinicId}/policies
get
Get a paginated and filtered list of users
post
Create a new user in Firebase and the database
get
Get the current authenticated user's profile
post
Record a login for the current user (updates LastLoginAt)
get
Get a user by ID (admin/authorized access)
put
Update an existing user's profile
delete
Soft delete a user (marks as inactive)
post
Invite a new user via email (user sets their own password)
get
Get primary providers sorted by display order (for schedule team view)
get
Get prescribers (users whose role can prescribe) sorted by display order. Populates the Prescribing DVM dropdown on medication request flows.
post
Resend invite email to a user
get
/api/Vaccinations/by-patient/{patientId}
get
/api/Vaccinations/by-appointment/{appointmentId}
get
Suggest the effective rabies duration (1 vs 3 years) for a dose at point-of-care.
get
Suggest the schedule stage and next-due date for a dose being administered — which dose of the series this is, and when the next one is due (generalizes the rabies 1-vs-3-year rule).
get
/api/Vaccinations/{id}
put
/api/Vaccinations/{id}
delete
/api/Vaccinations/{id}
post
/api/Vaccinations
post
Retract a dose without erasing it — the record stays on the chart, struck through, and stops counting as a valid administration. Prefer this over DELETE whenever the dose was really recorded and is being reversed; DELETE remains for removing a row that should never have existed.
post
Administer a vaccine dose — wraps dispense + VaccinationRecord enrichment + optional temp-lot + WorkTask.
post
Resolve a temporary lot by swapping its references to a real lot (existing or inline-created). Auto-completes the follow-up WorkTask.
get
List vaccination records whose underlying lot is an unresolved temporary placeholder. Drives the chronicle patient-header pill.
post
/api/vaccine-certificate-records
get
/api/vaccine-certificate-records/{id}
get
Renders the issued certificate to a PDF from its frozen snapshot.
get
/api/vaccine-certificate-records/by-vaccination/{vaccinationRecordId}
get
/api/vaccine-certificate-records/by-vaccination/{vaccinationRecordId}/current
post
/api/vaccine-certificate-records/{id}/revoke
post
Generate a batch vaccine certificate PDF and create a print job.
get
Download a batch vaccine certificate PDF for browser viewing.
get
/api/vaccine-types
post
/api/vaccine-types
get
/api/vaccine-types/{id}
put
/api/vaccine-types/{id}
delete
/api/vaccine-types/{id}
get
Get all vendors with optional active filter
post
/Vendors
get
Get a vendor by ID
put
/Vendors/{id}
delete
/Vendors/{id}
post
/Vendors/{id}/restore
get
Get recent vital measurements for a patient.
post
Record a new vital measurement for a patient. Triggers VitalsOutOfRange automation if the value is outside normal range.
get
List vital measurement types. Active-only by default (clinical pickers / the exam template palette); pass `includeInactive=true` for the management surface.
post
/api/vital-types
get
/api/vital-types/{id}
put
/api/vital-types/{id}
delete
Hard-delete a vital type. Blocked for built-in types, for any type with recorded measurements, and for any type an exam template binds — deactivate (PUT isActive=false) instead.
get
What depends on this vital type. The settings surface reads this before offering a destructive action so the admin sees "used by 2 exam templates (QA Preop, Dental COHAT)" *before* clicking, rather than a 409 after.
post
Send a message to B.O.N.D. AI assistant
get
Get the current conversation state for a session
post
Explicitly request to be connected with a human staff member
get
Check if B.O.N.D. is enabled for a clinic
get
Get widget configuration for a clinic
post
Create a new widget session (anonymous)
post
Lookup a client by email or phone (for existing client booking flow)
get
Get available appointment slots for a date
post
Create an appointment booking (anonymous with client info)
post
Send a chat message (anonymous)
get
Get chat messages for a session
post
Send verification email to client
post
Verify code from email
get
Get portal session status (is user verified?)
get
Get patient records (requires verified session)
get
Get billing information (requires verified session)
post
Create a new client (and optionally patient) from widget
get
Get portal dashboard data (requires verified session)
get
Check if SMS consent exists for a phone number
get
Get SMS consent settings for a clinic (brand name, use cases)
post
Submit SMS consent from widget
get
/api/work-item-rules
post
/api/work-item-rules
get
/api/work-item-rules/{id}
put
/api/work-item-rules/{id}
get
/api/work-item-rules/{id}/versions
get
Get all work tasks with optional filtering
post
Create a new work task
get
Get work task stats (counts by status)
get
Get tasks assigned to the current user
get
Get a specific work task by ID
put
Update a work task
delete
Delete a work task
patch
Update work task status
post
Mark a work task as complete
get
Get the lifecycle event history (timeline) for a work task
get
Get notes for a work task
post
Add a note to a work task
delete
Delete a note from a work task