---
title: "Cancel an appointment"
method: POST
path: "/Appointments/{id}/cancel"
tags: ["Appointments"]
---

# Cancel an appointment

`POST /Appointments/{id}/cancel`

## Request

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

## Path parameters

- `id` string, required

## Request body

- CancelAppointmentRequest: Request body for cancelling an appointment
  - `reason` string, nullable: Free-text note, appended to the appointment's Notes as before.
  - `cancellationReason` string, nullable: Optional structured reason (ITE-905): one of the clinic's cancellation reasons (`GET /clinic-config/appointment-reasons`), matched case-insensitively and stored in the list's spelling. Blank means none; anything off the list is a 400.

## Response `200`

OK

- AppointmentResponseDto: Full appointment response with all related data
  - `id` string
  - `scheduleItemId` string
  - `scheduleItem` ScheduleItemDto: Schedule item DTO (embedded in appointments)
    - `id` string
    - `title` string
    - `startTime` string, date-time
    - `endTime` string, date-time
    - `description` string, nullable
    - `type` string
    - `locationId` string, nullable
    - `location` LocationSummaryDto
      - `id` string
      - `name` string
      - `isActive` boolean
      - `isVehicle` boolean
      - `isPersonalVehicle` boolean
      - `kind` 'Room' | 'Cage' | 'Run' | 'Ward': What a `Location` physically is (ITE-710). Exam rooms are where appointments happen and what the flowboard room grid shows; cages, runs and wards are where a hospitalized patient lives for the length of a `HospitalStay`. The admit picker filters on this, and the flowboard keeps hospitalization locations out of its grid. Stored as text; the default keeps every pre-existing location an exam room.
    - `assignedToId` string, nullable
    - `assignedTo` UserSummaryDto
      - `id` string
      - `email` string
      - `firstName` string, nullable
      - `lastName` string, nullable
      - `displayName` string, nullable
      - `type` string
      - `roleId` string, nullable
      - `roleName` string, nullable
    - `customAttributes` string, nullable
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
  - `clientId` string
  - `client` ClientSummaryDto
    - `id` string
    - `firstName` string
    - `lastName` string
    - `email` string, nullable
    - `phoneNumber` string, nullable
  - `patientId` string, nullable: Set on patient-scoped appointments. Null on group visits — see string? AppointmentResponseDto.PatientGroupId.
  - `patient` PatientSummaryDto: Lightweight patient summary for lists and references
    - `id` string: Unique patient identifier
    - `name` string: The patient's name
    - `species` string: The species name. References a species from GET /species endpoint.
    - `speciesId` string, nullable: The species ID for programmatic lookups.
    - `breed` string: The breed name
    - `sex` string: The patient's sex
    - `dateOfBirth` string, date-time, nullable: Date of birth, if known
    - `isEstimatedAge` boolean
    - `fixed` boolean: Whether the patient is spayed/neutered
    - `treatmentAcceptanceRate` union
      - number, double
      - string, double
  - `patientGroupId` string, nullable: Set on group-visit appointment types (litter / herd). Mutually exclusive with string? AppointmentResponseDto.PatientId.
  - `patientGroup` AppointmentPatientGroupSummaryDto: Lightweight group summary for embedding in appointment responses.
    - `id` string
    - `name` string
    - `groupType` string: "Litter" or "Herd".
    - `speciesName` string, nullable
    - `headCount` union
      - integer
      - string, int32
    - `memberCount` union
      - integer
      - string, int32
  - `reasonForVisit` string
  - `notes` string, nullable
  - `status` string
  - `customAttributes` string, nullable
  - `recordingId` string, nullable
  - `createdAt` string, date-time
  - `updatedAt` string, date-time
  - `isTravelAppointment` boolean
  - `travelDestinationAddress` string, nullable
  - `travelDestinationPlaceId` string, nullable
  - `travelStartingAddress` string, nullable
  - `travelStartingPlaceId` string, nullable
  - `travelDistanceMeters` union
    - integer
    - string, int32
  - `travelDurationMinutes` union
    - integer
    - string, int32
  - `travelIsRoundTrip` boolean, nullable
  - `travelFeeAmount` union
    - number, double
    - string, double
  - `travelAccessNotes` string, nullable
  - `appointmentTypeId` string, nullable
  - `requiresSurgeryRoom` boolean: Whether this appointment type requires a surgery room.
  - `isEmergencySurgeryConversion` boolean: Whether this appointment was converted from a regular exam to emergency surgery.
  - `appointmentTypeDefaultFlowId` string, nullable: Chronicle workflow id sourced from this appointment's <see cref="!:AppointmentType" />. Null falls back to `appointment-default` at the chronicle. Denormalized at read time so the chronicle doesn't need a second appointment-type lookup.
  - `appointmentTypeExamTemplateId` string, nullable: Exam template id sourced from this appointment's <see cref="!:AppointmentType" /> (PAW-741). Resolution at the chronicle exam step: this value, else the provider's personal default, else the standard 7-system view. Denormalized at read time so the chronicle doesn't need a second appointment-type lookup.
  - `appointmentTypeAutoGenerateSoap` boolean: Auto-start SOAP generation when the treatment plan is converted to an invoice (PAW-675). Denormalized from the appointment type; true when the appointment has no type (the platform default is on).
  - `appointmentTypeAutoGenerateDischarge` boolean: Auto-start discharge generation when the SOAP note is approved (PAW-675). Denormalized from the appointment type; true when the appointment has no type (the platform default is on).
  - `careTeam` CareTeamMemberDto[], nullable: The appointment's care team (ITE-1059): the lead first (`isLead`), then the supporting members. Null — and absent from the JSON — while the `AppointmentCareTeam` flag is off.
    - `userId` string
    - `name` string
    - `role` string: A `CareTeamRole` name.
    - `isLead` boolean

## Changes

- **2026-10-07** `021fabd866ff`: 6 info
  - added the new optional request property `oneOf[#/components/schemas/CancelAppointmentRequest]/cancellationReason` (media type: application/json)
  - added the new optional request property `oneOf[#/components/schemas/CancelAppointmentRequest]/cancellationReason` (media type: text/json)
  - added the new optional request property `oneOf[#/components/schemas/CancelAppointmentRequest]/cancellationReason` (media type: application/*+json)
  - added the optional property `careTeam` to the response with the `200` status (media type: text/plain)
  - …2 more
- **2026-09-11** `503cd0546309`: 3 info
  - added the optional property `scheduleItem/location/oneOf[#/components/schemas/LocationSummaryDto]/kind` to the response with the `200` status (media type: text/plain)
  - added the optional property `scheduleItem/location/oneOf[#/components/schemas/LocationSummaryDto]/kind` to the response with the `200` status (media type: application/json)
  - added the optional property `scheduleItem/location/oneOf[#/components/schemas/LocationSummaryDto]/kind` to the response with the `200` status (media type: text/json)
- …earlier changes not shown

[Operation history](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/changes/Appointments/:id/cancel/post.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)
