Appointments
Cancel Appointment
Cancel a blood draw appointment
DELETE
/
api
/
v1
/
appointments
/
{id}
curl --request DELETE \
--url https://anivahealth.com/api/v1/appointments/c9f3e2a1-7d6b-4c5e-b3a2-1f0e9d8c7b6a \
--header 'x-api-key: YOUR_API_KEY'
curl --request DELETE \
--url https://anivahealth.com/api/v1/appointments/c9f3e2a1-7d6b-4c5e-b3a2-1f0e9d8c7b6a \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"cancellation_reason": "Patient no-show"
}'
{
"id": "c9f3e2a1-7d6b-4c5e-b3a2-1f0e9d8c7b6a",
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"location_id": "b7e2d1f5-3c4a-4e8b-a2f1-9d0c1e2f3a4b",
"scheduled_at": "2026-05-15T10:30:00Z",
"status": "cancelled",
"cancellation_reason": "Patient no-show",
"results_ready_emails": [],
"created_at": "2026-04-01T09:45:00Z",
"updated_at": "2026-04-10T12:00:00Z",
"profile": {
"id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"handle": null,
"first_name": "Maria",
"last_name": "Schmidt",
"email": "maria.schmidt@example.com",
"phone": "+4930123456789",
"sex": 2,
"date_of_birth": "1985-03-22",
"height": 168,
"weight": 65,
"language": "de",
"transactional_emails_enabled": true,
"created_at": "2026-04-01T09:14:32Z",
"updated_at": null
},
"panels": [
{
"panel_id": "f1c2d4a3-7b8e-4f2a-9c1d-2e3f4a5b6c7d",
"added_at": "2026-04-01T09:50:00Z"
}
],
"individual_biomarkers": [],
"shipments": [],
"lab_codes": []
}
{
"error": "This appointment is already cancelled with a different cancellation_reason. Re-send the recorded reason, or omit it, to read the cancelled appointment back."
}
{
"error": "Appointment not found"
}
Cancel an appointment by setting its status to
Requires the
cancelled. Only appointments that have not yet had their blood draw confirmed can be cancelled.
Cancelling an appointment that is already cancelled returns 200 with that appointment, and writes nothing — no second cancellation is recorded. The response carries Idempotent-Replayed: true so you can tell a repeat from the call that did the work. A repeat that carries a different cancellation_reason returns 409 instead: the recorded reason is never overwritten. See Idempotency.
Appointments cannot be cancelled after the blood draw has been confirmed — that returns
409 Conflict.test_sessions_schedule or test_sessions_manage scope.
Request
Path parameters
string
required
Unique identifier (UUID) of the appointment to cancel.
Body parameters
The body is optional — send no body at all to cancel without recording a reason.string
Free-text reason for the cancellation, up to 500 characters (e.g.
Patient no-show). Stored on
the appointment and returned as cancellation_reason on this and later reads.Response
On success, the API returns200 OK with the cancelled appointment and its embedded profile.
string
required
Unique appointment identifier (UUID).
string
required
UUID of the profile this appointment belongs to.
string
UUID of the test location where the draw takes place.
string
Scheduled appointment datetime as a UTC instant (ISO 8601 with
Z suffix, e.g.
2026-05-15T10:30:00Z). May be null.string
required
Appointment status. Will be
cancelled after a successful cancellation.string
Free-text reason captured when the appointment was cancelled (e.g. no-show, late cancellation,
‘Failed. Repeat required’).
null unless status is cancelled.string[]
required
Addresses that each get one email once every lab result is final, lowercased. Empty when off. See
Results-ready emails.
string
required
ISO 8601 timestamp of when the appointment was created.
string
ISO 8601 timestamp of the last update. May be
null.object
required
The patient profile associated with this appointment.
Show profile
Show profile
string
Unique profile identifier (UUID).
string
Profile handle or username. May be
null.string
First name. May be
null.string
Last name. May be
null.string
Email address. May be
null.string
Phone number in E.164 format. May be
null.integer
Biological sex per ISO/IEC 5218. May be
null.string
Date of birth in
YYYY-MM-DD format. May be null.number
Height in centimeters. May be
null.number
Weight in kilograms. May be
null.string
Preferred language (
en, de, or fi).boolean
Whether this profile receives transactional (programmatic) emails. May be
null.string
ISO 8601 timestamp of when the profile was created.
string
ISO 8601 timestamp of the last profile update. May be
null.AppointmentPanel[]
required
Panels that were attached to this appointment before cancellation. Look up panel details (name,
biomarkers) via List Panels.
Show Panel attachment fields
Show Panel attachment fields
string
Panel UUID — cross-reference against List Panels.
string
ISO 8601 timestamp the panel was first attached to this appointment.
AppointmentIndividualBiomarker[]
required
À-la-carte biomarkers attached to this appointment outside any panel (see Add Custom
Biomarkers). Cross-reference each
biomarker_id
against List Biomarkers for display data.Show Individual biomarker fields
Show Individual biomarker fields
integer
Biomarker identifier — cross-reference against
List Biomarkers.
string
ISO 8601 timestamp the biomarker was first attached to this appointment.
AppointmentShipmentLink[]
required
Shipments that were linked to this appointment before cancellation. Each
id cross-references
with Get Shipment.Show Shipment link fields
Show Shipment link fields
string
Shipment reference identifier — cross-reference against
Get Shipment.
string
ISO 8601 timestamp the shipment was first linked to this appointment.
string[]
required
Lab codes (tube barcodes) recorded for this appointment, in scan order. Empty until the blood draw
is confirmed. A venous draw carries one code printed on every tube; a pharmacy draw carries one
code per microtainer. Results and documents on Get Results reference
these codes via
lab_code.Error responses
| Status | Description |
|---|---|
400 | Invalid ID format, or a malformed body / cancellation_reason longer than 500 characters. |
403 | Forbidden — your API key does not have access to this operation or the appointment is outside your access context. |
404 | Appointment not found. |
409 | The blood draw has already been confirmed, or the appointment is already cancelled with a different reason. |
500 | Internal server error. |
curl --request DELETE \
--url https://anivahealth.com/api/v1/appointments/c9f3e2a1-7d6b-4c5e-b3a2-1f0e9d8c7b6a \
--header 'x-api-key: YOUR_API_KEY'
curl --request DELETE \
--url https://anivahealth.com/api/v1/appointments/c9f3e2a1-7d6b-4c5e-b3a2-1f0e9d8c7b6a \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"cancellation_reason": "Patient no-show"
}'
{
"id": "c9f3e2a1-7d6b-4c5e-b3a2-1f0e9d8c7b6a",
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"location_id": "b7e2d1f5-3c4a-4e8b-a2f1-9d0c1e2f3a4b",
"scheduled_at": "2026-05-15T10:30:00Z",
"status": "cancelled",
"cancellation_reason": "Patient no-show",
"results_ready_emails": [],
"created_at": "2026-04-01T09:45:00Z",
"updated_at": "2026-04-10T12:00:00Z",
"profile": {
"id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"handle": null,
"first_name": "Maria",
"last_name": "Schmidt",
"email": "maria.schmidt@example.com",
"phone": "+4930123456789",
"sex": 2,
"date_of_birth": "1985-03-22",
"height": 168,
"weight": 65,
"language": "de",
"transactional_emails_enabled": true,
"created_at": "2026-04-01T09:14:32Z",
"updated_at": null
},
"panels": [
{
"panel_id": "f1c2d4a3-7b8e-4f2a-9c1d-2e3f4a5b6c7d",
"added_at": "2026-04-01T09:50:00Z"
}
],
"individual_biomarkers": [],
"shipments": [],
"lab_codes": []
}
{
"error": "This appointment is already cancelled with a different cancellation_reason. Re-send the recorded reason, or omit it, to read the cancelled appointment back."
}
{
"error": "Appointment not found"
}
⌘I
curl --request DELETE \
--url https://anivahealth.com/api/v1/appointments/c9f3e2a1-7d6b-4c5e-b3a2-1f0e9d8c7b6a \
--header 'x-api-key: YOUR_API_KEY'
curl --request DELETE \
--url https://anivahealth.com/api/v1/appointments/c9f3e2a1-7d6b-4c5e-b3a2-1f0e9d8c7b6a \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"cancellation_reason": "Patient no-show"
}'
{
"id": "c9f3e2a1-7d6b-4c5e-b3a2-1f0e9d8c7b6a",
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"location_id": "b7e2d1f5-3c4a-4e8b-a2f1-9d0c1e2f3a4b",
"scheduled_at": "2026-05-15T10:30:00Z",
"status": "cancelled",
"cancellation_reason": "Patient no-show",
"results_ready_emails": [],
"created_at": "2026-04-01T09:45:00Z",
"updated_at": "2026-04-10T12:00:00Z",
"profile": {
"id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"handle": null,
"first_name": "Maria",
"last_name": "Schmidt",
"email": "maria.schmidt@example.com",
"phone": "+4930123456789",
"sex": 2,
"date_of_birth": "1985-03-22",
"height": 168,
"weight": 65,
"language": "de",
"transactional_emails_enabled": true,
"created_at": "2026-04-01T09:14:32Z",
"updated_at": null
},
"panels": [
{
"panel_id": "f1c2d4a3-7b8e-4f2a-9c1d-2e3f4a5b6c7d",
"added_at": "2026-04-01T09:50:00Z"
}
],
"individual_biomarkers": [],
"shipments": [],
"lab_codes": []
}
{
"error": "This appointment is already cancelled with a different cancellation_reason. Re-send the recorded reason, or omit it, to read the cancelled appointment back."
}
{
"error": "Appointment not found"
}