Open-source booking engine

Build appointment scheduling without the scheduling engine.

Providers have individual schedules, procedures need different durations, and bookings need buffer time. Model it all in Floyd's policy layer - your application code stays clean.

POST /v1/policies
{
  "name": "Dr. Chen - Consultations",
  "rules": [{
    "match": { "type": "weekly", "days": "weekdays"},
    "windows": [["09:00", "17:00"]]
  }],
  "constraints": {
    "grid": { "interval_minutes": 30 },
    "buffers": { "after": { "minutes": 15 } }
  }
}
→ 201
{ "id": "pol_abc", "version": "pvr_001"}
// immutable version - safe to update later

Declarative Scheduling Rules

Duration, buffers, grid alignment, and hours - all in the policy layer.

Immutable Policy Versions

Policy updates create new versions. In-flight bookings keep their original.

One Endpoint, All Channels

API, widget, and admin all book through one endpoint. No conflicts.

Key Capabilities

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

01

Policy-Driven Scheduling

Weekly rules define each provider's hours. Date rules handle holidays. Duration constraints, grid alignment, lead time, and buffers are all policy-level - not application code.

02

Procedure-Based Durations

Policy rules define allowed durations per service. A 30-minute slot, a 60-minute slot, a 3-hour block - Floyd enforces the constraint at query time and rejects invalid booking attempts.

03

Turnover Buffers

Configure after-buffer per service for cleanup, prep, or reset time. Buffers are subtracted from available time automatically - your availability queries return only bookable slots.

04

Grid-Aligned Scheduling

Align appointments to 15 or 30-minute grids via policy rules. No odd start times - Floyd returns only grid-aligned availability.

05

Immutable Policy Versions

Every policy update creates a new version. In-flight bookings reference their original version. Safe to update policies without breaking active reservations.

06

Webhook Events

booking.confirmed, booking.canceled, and booking.expired events fire in real-time. HMAC-SHA256 signed for downstream integrations.

Appointment Booking Flow

3 API calls. Hold, confirm, done.

1
Create Scheduling Policy
POST /v1/policies

{
  "name": "Dr. Chen - Consultations",
  "rules": [{
    "match": { "type": "weekly", "days": "weekdays" },
    "windows": [["09:00", "17:00"]]
  }],
  "constraints": {
    "duration": { "allowed": [{ "minutes": 30 }, { "hours": 1 }] },
    "grid": { "interval_minutes": 30 },
    "buffers": { "after": { "minutes": 15 } }
  }
}
{ "id": "pol_abc123", "version": "pvr_001" }

Immutable version created. Safe to update later.

2
Find Provider Availability
POST /v1/services/svc_consultation/availability/slots

{
  "startTime": "2026-03-03T08:00:00Z",
  "endTime": "2026-03-07T17:00:00Z",
  "durationMs": 3600000,
  "resourceId": "rsc_dr_chen"
}
{ "slots": [{ "startTime": "Thu 14:00" }, { "startTime": "Fri 10:00" }] }

Slots account for provider schedule, buffers, and existing bookings.

3
Hold During Verification
POST /v1/bookings

{
  "serviceId": "svc_consultation",
  "resourceId": "rsc_dr_chen",
  "startTime": "2026-03-05T14:00:00Z",
  "endTime": "2026-03-05T15:00:00Z"
}
{ "id": "bkg_apt_1", "status": "hold" }

Slot locked while insurance is verified or client confirms.

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.