Confirm → booking
POST /public/holds/{holdId}/confirm
Section titled “POST /public/holds/{holdId}/confirm”curl -s -X POST https://api.mrcharles.app/api/v1/public/holds/b59b9109-…/confirm \ -H 'Content-Type: application/json' \ -d '{"paymentMode":"on_site","notes":"Trio, we bring our own cymbals.","email":"marta@example.com"}'The hold must be verified.
| Field | Type | Required | Notes |
|---|---|---|---|
paymentMode | string | ✅ | card or on_site — must be in the room’s paymentModes |
notes | string | — | Up to 500 characters, shown to the studio |
email | string | — | Second contact for the receipt (useful when channel was phone) |
Response 201
Section titled “Response 201”{ "booking": { "id": "96f52eb7-3360-486a-8d04-47b1663c049d", "reference": "MC-TGRMY5", "status": "confirmed", "paymentMode": "on_site", "paymentStatus": "unpaid", "studioName": "Studio Uno", "roomName": "Rehearsal B", "guestName": "Marta Ruiz", "date": "2026-10-08", "startTime": "17:00", "endTime": "19:00", "timezone": "Europe/Madrid", "startsAt": "2026-10-08T17:00:00+02:00", "endsAt": "2026-10-08T19:00:00+02:00", "minutes": 120, "priceCents": 5000, "depositCents": 0, "currency": "EUR", "cancelNoticeHours": 24, "mayCancel": true, "notes": "Trio, we bring our own cymbals.", "paymentDueAt": null, "createdAt": "2026-10-06T12:14:28+02:00" }, "manageToken": "1000bb6057d799a44cd4efd8f8edcbf8acdf94264b8d7800ecbca85c547da3a0", "manageUrl": "https://studio-uno-madrid.sites.mrcharles.app/r/1000bb60…", "clientSecret": "pi_3Q…_secret_…"}manageTokenis shown once. Store it or hand the guestmanageUrl; we cannot recover it.clientSecretis present only whenpaymentModeiscard→ Card payments.- With
card,statusispending_paymentandpaymentDueAtis 20 minutes ahead.
Booking states
Section titled “Booking states”status | Meaning |
|---|---|
pending_payment | Card deposit not received yet; the slot is held until paymentDueAt |
confirmed | The booking is real |
completed | The session happened (set by the studio) |
cancelled | By the guest, the studio, or the system on payment timeout |
no_show | The guest did not turn up (set by the studio) |
paymentStatus | Meaning |
|---|---|
unpaid | Pay at the studio |
pending | Waiting for Stripe |
deposit_paid / paid | Money received |
refunded | The studio refunded |
Errors
Section titled “Errors”| Status | Code | Cause |
|---|---|---|
| 400 | PAYMENT_MODE_DENIED | That mode is not allowed for this room |
| 409 | HOLD_NOT_VERIFIED | Verify the code first |
| 409 | HOLD_ALREADY_CONFIRMED | A booking already exists for this hold |
| 409 | PAYMENTS_UNAVAILABLE | Card payments are not configured |
| 409 | SLOT_TAKEN | A conflicting booking appeared — restart |
| 410 | HOLD_EXPIRED | Too slow; create a new hold |
After confirming
Section titled “After confirming”The guest gets a message with the reference and the manage link. The studio gets a notification, and a reminder goes out 24 hours before the session. You do not need to send anything yourself.