Creating bookings
POST /api/v1/bookings books a guest through one of your booking links, under the same rules as its public page: availability, capacity, buffers, minimum notice, booking horizon, intake questions and approval. It never books outside those rules.
curl https://app.clearslot.eu/api/v1/bookings \
-H "Authorization: Bearer cs_live_YOUR_KEY" \
-H "Idempotency-Key: crm-order-4812" \
-H "Content-Type: application/json" \
-d '{
"bookingLinkId": "7d1f3c1e-1111-4222-8333-444455556666",
"startTime": "2026-11-03T10:00:00+02:00",
"guest": { "name": "Ada Lovelace", "email": "[email protected]" }
}'
Find bookable times first with GET /api/v1/booking-links/{bookingLinkId}/slots.
What to send
| Link type | Needs |
|---|---|
| Meeting | startTime; guestCount for group meetings |
| Service | startTime, serviceIds, optional variantIds and providerMemberId |
| Class | classSessionId |
| Resource | startTime, assetListingKey, durationMinutes |
Answer the link's intake questions in intakeAnswers, by question ID.
Guest emails
The guest gets the same emails as a booking made in the dashboard. Set "notifyGuest": false to send none. The business vouches for the guest's address, so no verification email is sent.
Consent the page would ask for
If the link shows cancellation fees, or asks the guest to let a service start within the withdrawal period, your integration must confirm the guest agreed:
"guestConsents": { "cancellationFees": true, "earlyPerformance": true }
Without it, the booking is refused with 409 conflict, reason guest_consent_required.
Refusals
| Status | Code | Meaning |
|---|---|---|
| 409 | slot_unavailable | The time is taken, outside availability, or full |
| 409 | online_payment_unsupported | The link takes online payment |
| 409 | conflict | The link is off or restricted, or a consent is missing |
| 429 | rate_limited, daily_quota_exceeded | Over 30 bookings a minute or 500 a day |
Bookings made through the API are marked "source": "api".