Your voice agent needs to lock a slot now - not after the call. Floyd creates atomic holds in under 100ms. Abandoned calls auto-expire, concurrent requests get 409.
{
"serviceId": "svc_reception",
"resourceId": "rsc_dr_smith",
"startTime": "2026-03-01T14:00:00Z",
"endTime": "2026-03-01T14:30:00Z"
}→ 201 (< 100ms)
{
"id": "bkg_vc_1",
"status": "hold",
"expiresAt": "2026-03-01T14:02:00Z"
}Hold creation in under 100ms. Confirm the slot mid-sentence.
Short TTL for voice calls. Abandoned calls auto-release slots.
One hold per slot. The losing caller gets a 409 to branch on.
Everything you need to handle real-world booking complexity out of the box.
Hold creation completes in under 100ms p99. Your voice agent doesn't pause - it confirms the slot mid-sentence while the database lock is acquired.
2-minute hold TTL for voice calls. Abandoned calls release slots automatically. No phantom bookings, no cron jobs, no manual cleanup.
When a slot is taken, Floyd returns the conflicting time range. Your agent immediately says 'that slot just filled - how about 2:30?' No guessing.
Voice frameworks like Vapi and Retell retry on timeout. Every Floyd mutation accepts an Idempotency-Key - retries return the original response, not duplicates.
Ten concurrent hold requests on the same slot? Row-level locking ensures exactly one succeeds. The other nine get 409s with the conflicting range.
booking.confirmed and booking.expired events fire in real-time. Send SMS confirmations, update your CRM, or sync to Google Calendar from event handlers.
3 API calls. Hold, confirm, done.
POST /v1/services/{id}/availability/slots
{
"startTime": "2026-03-01T00:00:00Z",
"endTime": "2026-03-01T23:59:59Z",
"durationMs": 1800000
}→ { "slots": [{ "startTime": "14:00", "endTime": "14:30" }, ...] }Returns available slots in a single response.
POST /v1/bookings
{
"serviceId": "svc_reception",
"resourceId": "rsc_dr_smith",
"startTime": "2026-03-01T14:00:00Z",
"endTime": "2026-03-01T14:30:00Z"
}→ { "id": "bkg_vc_1", "status": "hold", "expiresAt": "..." }Atomic hold - concurrent callers get 409.
POST /v1/bookings/bkg_vc_1/confirm→ { "id": "bkg_vc_1", "status": "confirmed" }SMS confirmation fires via event handler.
Holds expire automatically after a TTL. Conflicts are handled at the database level.