Open-source booking engine

Ship AI booking without building a scheduling engine.

Your agent holds a slot while the user decides, then confirms or releases it. Floyd gives you atomic holds, 409 conflict detection, and idempotent retries. You write conversation logic - Floyd prevents double-bookings.

POST /v1/bookings
Idempotency-Key: key_abc123
{
  "serviceId": "svc_consult",
  "resourceId": "rsc_advisor_1",
  "startTime": "2026-03-01T09:00:00Z",
  "endTime": "2026-03-01T09:30:00Z"
}
→ 201
{
  "id": "bkg_abc123",
  "status": "hold",
  "expiresAt": "2026-03-01T09:05:00Z"
}
// concurrent request → 409 Conflict

Atomic Holds with TTL

Hold a slot while the user decides. Conflicts return 409. Abandoned holds auto-expire.

Idempotent Retries

Every mutation accepts an Idempotency-Key. Retries return the original response.

409 Conflict Detection

Row-level locking ensures one hold per slot. Concurrent agents get a 409.

Key Capabilities

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

01

Two-Phase Booking

Hold a slot with a configurable TTL, then confirm or let expire. Matches the natural rhythm of agent conversations where users take time to decide.

02

409 Conflict Detection

PostgreSQL row-level locking ensures one hold per time range. Concurrent agents get a 409 with the conflicting allocation - branch to alternatives programmatically.

03

Idempotent Mutations

Every mutation accepts an Idempotency-Key. Agent frameworks retry freely - Floyd returns the original response, no duplicates.

04

Policy-Driven Availability

Business hours, buffer times, lead time, grid alignment, and duration constraints are all enforced by the policy. Your agent code stays simple.

05

Immutable Policy Versions

Policy updates create new versions. In-flight bookings reference their original version - no inconsistent behavior during rollouts.

06

Webhook Events

Subscribe to booking.confirmed, booking.canceled, and booking.expired. HMAC-SHA256 signed payloads with exponential backoff retries.

AI Agent Booking Flow

3 API calls. Hold, confirm, done.

1
Check Available Slots
POST /v1/services/{id}/availability/slots

{
  "startTime": "2026-03-01T00:00:00Z",
  "endTime": "2026-03-01T23:59:59Z",
  "durationMs": 1800000
}
{ "slots": [{ "startTime": "09:00", "endTime": "09:30" }, ...] }

Returns slots satisfying all policy constraints.

2
Hold a Slot
POST /v1/bookings

{
  "serviceId": "svc_consultation",
  "resourceId": "rsc_advisor_1",
  "startTime": "2026-03-01T09:00:00Z",
  "endTime": "2026-03-01T09:30:00Z"
}
{ "id": "bkg_abc123", "status": "hold", "expiresAt": "..." }

Row-level lock acquired. Concurrent requests get 409.

3
Confirm Booking
POST /v1/bookings/bkg_abc123/confirm
{ "id": "bkg_abc123", "status": "confirmed" }

booking.confirmed event fires to your 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.