List Appointment Cancellation Reasons
Lists the configured reasons (and any threshold-based fee rules) available for Cancel Appointment's reason_key.
Endpoint
GET /v2/appointment-cancellation-reasons
Query Parameters
| Parameter |
Type |
Required |
Description |
page |
integer |
Yes |
1-based page number. Defaults to 1. |
page_size |
integer |
Yes |
Results per page. Defaults to 25. |
Request
curl --location '{base_url}/v2/appointment-cancellation-reasons?page=1&page_size=25' \
--header 'Authorization: Bearer JWT_TOKEN'
Response
Success Response
Code: 200 OK
{
"items": [
{
"id": "113",
"reason_key": "SICKNESS",
"reason_label": "Sickness",
"reason_type": "PATIENT_REASON",
"cancellation_fee": 0,
"fee_criteria": [
{
"name": "Less than 24 hr",
"criteria": "LESS_THAN_24_HOURS",
"fee": 50
}
]
}
],
"page": 1,
"page_size": 25,
"total": 1,
"total_pages": 1
}
Response Fields
| Field |
Type |
Description |
items |
array of object |
The page of results. See Items. |
page |
integer |
1-based page number. |
page_size |
integer |
Results per page. |
total |
integer |
Total results matching the query. |
total_pages |
integer |
Total pages available. |
Items
| Field |
Type |
Description |
id |
string |
The cancellation reason id. |
reason_key |
string |
Cancellation reason key. |
reason_label |
string |
Human-readable label for the reason. |
reason_type |
string or null |
Who the reason is attributed to. Open string — only PATIENT_REASON and DOCTOR_REASON have been observed, against too small a sample to call that exhaustive. |
cancellation_fee |
number |
Flat cancellation fee for this reason, when it doesn't use threshold-based fee_criteria instead. |
fee_criteria |
array of object |
Threshold-based fee rules for this reason (e.g. a bigger fee the closer to the appointment). Empty when the reason uses a flat cancellation_fee instead. See Fee Criteria. |
Fee Criteria
| Field |
Type |
Description |
name |
string |
A label for this fee rule. |
criteria |
string |
The notice-window threshold this fee rule applies at. Open string — LESS_THAN_12/24/48_HOURS are the only ones observed. |
fee |
number |
Fee charged at this notice-window threshold. |
Error Response
Code: 400 Bad Request
{
"code": "bad_request",
"message": "Validation failed",
"errors": [
{
"field": "patient_id",
"message": "must be a string"
}
]
}
Every error has the same shape — a machine-readable code, a message, and an errors[] array that's empty when there's nothing field-specific to report. The HTTP status is authoritative.
| Status |
code |
Meaning |
400 Bad Request |
bad_request |
The request body or parameters failed validation. errors[] names the offending fields. |
401 Unauthorized |
unauthorized |
The access token is missing, malformed or expired. |
403 Forbidden |
forbidden |
The request references a resource outside the token's organisation or clinic scope. |
404 Not Found |
not_found |
No such resource, or it's outside your scope. |
429 Too Many Requests |
rate_limited |
Rate limit exceeded. Back off and retry. |
500 Internal Server Error |
internal_error |
Unexpected server error. |
502 Bad Gateway |
upstream_error |
Upstream service failed or timed out. |
Notes
- Read-only. Shared reference data, not clinic-scoped — a reason's identity doesn't depend on which clinic is asking, the same as List Payers.
- Retired reasons are omitted; only currently-active ones are listed.