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.
{
"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"}Duration, buffers, grid alignment, and hours - all in the policy layer.
Policy updates create new versions. In-flight bookings keep their original.
API, widget, and admin all book through one endpoint. No conflicts.
Everything you need to handle real-world booking complexity out of the box.
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.
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.
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.
Align appointments to 15 or 30-minute grids via policy rules. No odd start times - Floyd returns only grid-aligned availability.
Every policy update creates a new version. In-flight bookings reference their original version. Safe to update policies without breaking active reservations.
booking.confirmed, booking.canceled, and booking.expired events fire in real-time. HMAC-SHA256 signed for downstream integrations.
3 API calls. Hold, confirm, done.
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.
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.
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.