Developer API
All endpoints are POST, accept and return JSON, and include a spoken-style message the assistant can read aloud. Times are Eastern (America/New_York).
…x-demo-key: <DEMO_API_KEY>Tip: for ElevenLabs tools, use the published site address as the base URL once you publish.
Test it
Runs the same booking logic as the endpoints. Keep the dashboard open in another tab to watch it update live.
/get-availabilityOpen start times on a date (plus up to 3 nearby days if full).
Fields: date (YYYY-MM-DD), duration_minutes (30/60/90), service?
{
"date": "2026-10-10",
"duration_minutes": 60,
"service": "Deep Tissue"
}{
"ok": true,
"date": "2026-10-13",
"available_times": [
{
"start_time": "2026-10-13T10:00:00",
"spoken_time": "10:00 AM"
}
],
"message": "On Tuesday, October 13, I have 10:00 AM, 10:30 AM… available for 60 minutes."
}curl
curl -X POST /get-availability \
-H "Content-Type: application/json" \
-H "x-demo-key: YOUR_DEMO_API_KEY" \
-d '{"date":"2026-10-10","duration_minutes":60,"service":"Deep Tissue"}'/create-bookingValidate rules and capacity, create the booking, log it and send the confirmation email.
Fields: client_name, phone, email, service, duration_minutes, start_time (ISO, Eastern), notes?, source (voice|chat)
{
"client_name": "Maria Santos",
"phone": "(571) 555-0142",
"email": "maria@example.com",
"service": "Deep Tissue",
"duration_minutes": 60,
"start_time": "2026-10-10T14:00",
"notes": "Prefers firm pressure",
"source": "voice"
}{
"ok": true,
"confirmation_code": "TWC-7K3M",
"booking": {
"service": "Deep Tissue",
"start_time": "2026-10-13T14:00:00",
"spoken_time": "Tuesday, October 13 at 2:00 PM"
},
"email_status": "preview_only",
"message": "You're all set, Maria. Deep Tissue for 60 minutes on Tuesday, October 13 at 2:00 PM…"
}curl
curl -X POST /create-booking \
-H "Content-Type: application/json" \
-H "x-demo-key: YOUR_DEMO_API_KEY" \
-d '{"client_name":"Maria Santos","phone":"(571) 555-0142","email":"maria@example.com","service":"Deep Tissue","duration_minutes":60,"start_time":"2026-10-10T14:00","notes":"Prefers firm pressure","source":"voice"}'/find-bookingFind upcoming confirmed bookings by code, or by phone (optionally with name).
Fields: confirmation_code? or phone? plus client_name?
{
"phone": "(571) 555-0142",
"client_name": "Maria"
}{
"ok": true,
"bookings": [
{
"confirmation_code": "TWC-7K3M",
"service": "Deep Tissue",
"spoken_time": "Tuesday, October 13 at 2:00 PM"
}
],
"message": "I found your Deep Tissue on Tuesday, October 13 at 2:00 PM…"
}curl
curl -X POST /find-booking \
-H "Content-Type: application/json" \
-H "x-demo-key: YOUR_DEMO_API_KEY" \
-d '{"phone":"(571) 555-0142","client_name":"Maria"}'/reschedule-bookingMove a booking to a new time and send an updated confirmation.
Fields: confirmation_code, new_start_time (ISO, Eastern), source
{
"confirmation_code": "TWC-7K3M",
"new_start_time": "2026-10-10T16:00",
"source": "voice"
}{
"ok": true,
"late_change": false,
"message": "Done. Your Deep Tissue is now on Tuesday, October 13 at 4:00 PM…"
}curl
curl -X POST /reschedule-booking \
-H "Content-Type: application/json" \
-H "x-demo-key: YOUR_DEMO_API_KEY" \
-d '{"confirmation_code":"TWC-7K3M","new_start_time":"2026-10-10T16:00","source":"voice"}'/cancel-bookingCancel a booking. Inside 24 hours it is flagged as a late cancellation.
Fields: confirmation_code, reason?, source
{
"confirmation_code": "TWC-7K3M",
"reason": "Schedule conflict",
"source": "voice"
}{
"ok": true,
"late_cancel": false,
"message": "Your Deep Tissue on Tuesday, October 13 at 2:00 PM is cancelled…"
}curl
curl -X POST /cancel-booking \
-H "Content-Type: application/json" \
-H "x-demo-key: YOUR_DEMO_API_KEY" \
-d '{"confirmation_code":"TWC-7K3M","reason":"Schedule conflict","source":"voice"}'Errors return ok: false with a friendly message (401 bad key, 400 bad input, 409 time taken, 422 rule violation). Example start time: 2026-10-08T18:41