Skip to content

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

StatusCause
400 Bad RequestThe id in the path is not a valid UUID.
403 ForbiddenThe caller lacks write access on the booking, or the booking does not exist.
404 Not FoundThe id is valid and the access check passed but the row is gone.

See the Booking tag for the full request and response schema.