Bookings
Confirm or cancel a booking
Sets a booking's status to confirmed or cancelled, which is how you approve or decline pending bookings on approval pages. Confirming creates the Google Calendar event and Meet link when the page has auto_generate_meet_link and the booking has no event yet, and Google sends the guest the invite. clndr.pro doesn't send its own confirmation email for confirmations made through the API, so email the guest yourself when the page has no Meet link. Cancelling deletes the booking's Google Calendar event (Google tells the guest) and opens the slot up again. There's no status check: confirming a booking the host already declined confirms it again, so read it first if that matters. Scope: bookings:write. Keys: secret.
/bookings/{id}updateBookingAuthorizations
bearerAuthhttp (bearer)Authorization: Bearer clndr_sk_… (secret) or clndr_pk_… (publishable).
apiKeyHeaderapiKeyThe same key in a custom header, for clients that can't set Authorization.
Server
https://www.clndr.pro/api/v1Production
Path Parameters
The booking's id.
Example: c3a7e5d1-2b9f-4c6e-8a1d-7f4b0e2c9a58
Request Body
Content-Type: application/jsonrequired
Stored as cancellation_reason. Sending a status without a reason clears any earlier one.
Responses
200The updated booking.application/json
400Invalid JSON, or status isn't confirmed or cancelled.application/json
What went wrong, in plain English.
401The key is missing, unknown, revoked or expired.application/json
What went wrong, in plain English.
403The key doesn't have the scope this endpoint needs.application/json
What went wrong, in plain English.
404No booking with this id on the key's account.application/json
What went wrong, in plain English.
429Too many requests from this key in the current 60-second window.application/json
What went wrong, in plain English.
500Something failed on our side. Retry with exponential backoff.application/json
What went wrong, in plain English.
curl https://www.clndr.pro/api/v1/bookings/c3a7e5d1-2b9f-4c6e-8a1d-7f4b0e2c9a58 \
--request PATCH \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"status": "confirmed"
}'fetch('https://www.clndr.pro/api/v1/bookings/c3a7e5d1-2b9f-4c6e-8a1d-7f4b0e2c9a58', {
method: 'PATCH',
headers: {
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
status: 'confirmed'
})
})requests.patch(
"https://www.clndr.pro/api/v1/bookings/c3a7e5d1-2b9f-4c6e-8a1d-7f4b0e2c9a58",
headers={
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
},
json={
"status": "confirmed"
}
)fetch('https://www.clndr.pro/api/v1/bookings/c3a7e5d1-2b9f-4c6e-8a1d-7f4b0e2c9a58', {
method: 'PATCH',
headers: {
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
status: 'confirmed'
})
}){
"data": {
"id": "c3a7e5d1-2b9f-4c6e-8a1d-7f4b0e2c9a58",
"booking_page_id": "8b6f2c1e-4a1d-4f0b-9a63-2f0c5d7e9b14",
"user_id": "5d2e9f40-7c1b-4e8a-b0d6-3a9f1c2e8d77",
"guest_name": "Grace Hopper",
"guest_email": "grace@example.com",
"start_time": "2026-10-15T08:40:00+00:00",
"end_time": "2026-10-15T09:10:00+00:00",
"status": "confirmed",
"cancellation_reason": null,
"reminder_sent": false,
"google_meet_link": "https://meet.google.com/abc-defg-hij",
"google_calendar_event_id": "6v1m0r2k8f3t5q9b7n4c",
"google_calendar_id": "primary",
"sync_status": "synced",
"last_synced_at": "2026-10-10T12:31:07.481+00:00",
"sync_failure_reason": null,
"created_at": "2026-10-10T12:31:05.902+00:00",
"updated_at": "2026-10-10T12:31:07.481+00:00"
}
}{
"error": "`status` must be \"confirmed\" or \"cancelled\""
}{
"error": "Missing API key. Send `Authorization: Bearer <key>` or `x-clndr-key` header."
}{
"error": "API key is missing required scope(s): bookings:read"
}{
"error": "Booking not found"
}{
"error": "Rate limit exceeded. This publishable key allows 120 requests per 60s window."
}{
"error": "Failed to fetch bookings"
}