Bookings
Advanced Booking entries (hub_bookings) with a strict status state-machine. Scopes: bookings.entries.read / bookings.entries.write / bookings.entries.delete.
Endpoints
GET /api/workspace/v1/bookings
GET /api/workspace/v1/bookings/{id}
POST /api/workspace/v1/bookings
PATCH /api/workspace/v1/bookings/{id}
POST /api/workspace/v1/bookings/{id}/status
DELETE /api/workspace/v1/bookings/{id}
POST /api/workspace/v1/bookings/{id}/restore
POST /api/workspace/v1/bookings/bulk-delete
Status values
| requested | Initial state — customer requested a slot, awaiting confirmation |
| confirmed | Slot fixed and confirmed |
| in_progress | Booking is currently taking place |
| completed | Service delivered |
| invoiced | Invoice sent — waiting on payment |
| paid | Terminal — fully paid |
| cancelled | Terminal — cancelled by customer or business |
| rescheduled | Terminal — moved to a fresh booking |
| rejected | Terminal — request declined |
| no_show | Customer did not show up |
Status transitions
The state-machine is enforced server-side. Invalid transitions return HTTP 422 with INVALID_STATE.
| From | Allowed → To |
|---|---|
| requested | confirmed, cancelled, rejected |
| confirmed | in_progress, completed, cancelled, rescheduled, no_show |
| in_progress | completed, cancelled, no_show |
| completed | invoiced, cancelled |
| invoiced | paid, cancelled |
| no_show | invoiced, completed |
| paid / cancelled / rescheduled / rejected | (terminal — no transitions) |
Create a booking
curl "https://app.staffifyai.com/api/workspace/v1/bookings" \
-X POST \
-H "Authorization: Bearer sfy_wsp_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"service_id": 12,
"customer_id": 501,
"confirmed_slot_at": "2026-09-25T09:00:00Z",
"duration_minutes": 60,
"source": "manual"
}'Change status
POST /bookings/{id}/status with a body of { "status": "confirmed" }. For cancellations you can include cancellation_reason and cancelled_by.
curl -X POST "https://app.staffifyai.com/api/workspace/v1/bookings/912/status" \
-H "Authorization: Bearer sfy_wsp_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "status": "confirmed" }'Delete / restore
Soft-delete moves a booking to a 30-day recycle bin. Requires the separate bookings.entries.delete scope.
Webhooks
booking.createdbooking.updatedbooking.status_changed(payload includes from_status + to_status)booking.deletedbooking.restoredbooking.payment.paid(auto-invoice generated after Stripe Checkout success)booking.payment.refunded(credit note issued, booking payment_status = refunded)booking.payment.failed(Stripe Checkout expired or declined)
See also
Booking customers — the customer records that bookings reference.