Open-source booking engine

Ship booking features without building a booking engine.

Your platform's customers need scheduling. Floyd gives you isolated ledgers, scoped API keys, and atomic booking - integrate once, scale to many tenants.

POST /v1/ledgers
{
  "name": "Acme Salon"
}
→ 201
{
  "id": "ldg_acme_1",
  "apiKey": "sk_ldg_...",
  "isolation": "full"
}
// isolated namespace - separate resources, policies, events

Isolated Tenant Ledgers

Each customer gets an isolated ledger. No cross-tenant leakage.

Per-Tenant Policies

Ledger-scoped policies. Update one tenant without affecting others.

Scoped Event Routing

Route events per ledger to each customer's systems independently.

Key Capabilities

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

01

Ledger-Based Isolation

Each customer lives in an isolated ledger with separate resources, policies, and API keys. Isolation enforced at the API level, not the application level.

02

Scoped API Keys

Issue API keys per ledger. Each key only accesses its own tenant's resources and bookings. Revoke or rotate per customer without affecting others.

03

Immutable Policy Versions

Policy updates create new versions - in-flight bookings reference their original version. No inconsistent behavior during policy rollouts.

04

Atomic Hold-Confirm

Every tenant gets the same transactional guarantees: row-level locking, 409 conflicts, auto-expiration, and idempotency. No custom booking logic per customer.

05

Per-Tenant Events

Subscribe to events per ledger. Route booking lifecycle events to each customer's backend independently.

06

Stateless Horizontal Scaling

Floyd Engine is a single stateless process. Scale horizontally behind a load balancer - all state lives in PostgreSQL. No sticky sessions.

Multi-Tenant Booking

3 API calls. Hold, confirm, done.

1
Create Customer Ledger
POST /v1/ledgers

{
  "name": "Acme Salon"
}
{ "id": "ldg_acme_1" }

Isolated namespace for this tenant's resources and bookings.

2
Create Tenant's Policy
POST /v1/ledgers/ldg_acme_1/policies

{
  "name": "Salon Hours",
  "rules": [{
    "match": { "type": "weekly", "days": "weekdays" },
    "windows": [["09:00", "18:00"]]
  }]
}
{ "id": "pol_acme_1", "version": "pvr_001" }

Tenant-scoped policy. Other tenants unaffected.

3
Book Within Tenant
POST /v1/ledgers/ldg_acme_1/bookings

{
  "serviceId": "svc_client_a",
  "resourceId": "rsc_stylist_1",
  "startTime": "2026-03-01T09:00:00Z",
  "endTime": "2026-03-01T09:30:00Z"
}
{ "id": "bkg_plt_1", "status": "hold" }

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.