Open-source booking engine

Lock slots during live calls, not after.

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.

POST /v1/bookings
{
  "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 TTL: 2 min - auto-expires on hang-up

Sub-100ms Holds

Hold creation in under 100ms. Confirm the slot mid-sentence.

Auto-Expiring Voice TTL

Short TTL for voice calls. Abandoned calls auto-release slots.

Concurrent Call Resolution

One hold per slot. The losing caller gets a 409 to branch on.

Key Capabilities

Everything you need to handle real-world booking complexity out of the box.

01

Sub-100ms Hold Creation

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.

02

Short TTL for Voice

2-minute hold TTL for voice calls. Abandoned calls release slots automatically. No phantom bookings, no cron jobs, no manual cleanup.

03

409 Conflict with Context

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.

04

Idempotent Retries

Voice frameworks like Vapi and Retell retry on timeout. Every Floyd mutation accepts an Idempotency-Key - retries return the original response, not duplicates.

05

Concurrent Call Safety

Ten concurrent hold requests on the same slot? Row-level locking ensures exactly one succeeds. The other nine get 409s with the conflicting range.

06

Event-Driven Follow-Ups

booking.confirmed and booking.expired events fire in real-time. Send SMS confirmations, update your CRM, or sync to Google Calendar from event handlers.

Voice Agent Booking Flow

3 API calls. Hold, confirm, done.

1
Check Slots During Call
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.

2
Hold Slot (< 100ms)
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.

3
Confirm Before Hang-Up
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.

Ready to integrate?Ship bookings today

Sign up for Floyd and integrate our REST API to handle bookings in your agent framework.