Cancel a Booking
Cancelling a booking marks it as no longer active while keeping the row. Use PUT /booking/{id} with canceled_at set to a timestamp.
Request
PUT /booking/{booking_id}
json
{
"canceled_at": "2026-05-12T10:00:00Z"
}Response:
json
{
"data": {
"id": "f9955a9a-bb9e-450b-8e91-09a43f0e6cd6",
"name": "Project Sync",
"description": "Weekly project sync meeting",
"bookable_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
"schedule": {
"id": "12e2a0a7-9400-43fc-9cd9-fcdddf5133df",
"start_date": "2026-07-15T08:00:00Z",
"end_date": "2026-07-15T09:00:00Z",
"pattern": { "type": "none", "interval": 1, "times": ["08:00/PT1H"] },
"time_zone": null,
"available": false
},
"checkin_id": null,
"created_by": "e992bfc1-0336-42c5-bd0a-4f4804a9fd24",
"owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "confirmed",
"reserved_at": null,
"canceled_at": "2026-05-12T10:00:00Z",
"created_at": "2026-05-11T22:45:45.228331Z",
"updated_at": "2026-05-12T10:00:00Z"
},
"request_id": "c1d2e3f4-a5b6-7890-cdef-123456789012",
"count": 1
}The booking_canceled trigger fires and any bound actions run. The row remains visible in booking queries with canceled_at set.
Deletion
To remove the booking row entirely, use DELETE /booking/{id}. This frees the time window immediately, fires the booking_deleted trigger, and excludes the row from all subsequent queries.
For recurring bookings, DELETE /booking/{id} removes the entire series. To end a series after a certain date while keeping past occurrences, use PUT /booking/{id} with an earlier schedule.end_date instead.
Errors
| Status | Cause |
|---|---|
400 Bad Request | The id in the path is not a valid UUID. |
403 Forbidden | The caller lacks write access on the booking, or the booking does not exist. |
404 Not Found | The id is valid and the access check passed but the row is gone. |
See the Booking tag for the full request and response schema.