Same hold-then-confirm API, same atomic guarantees - running in your infrastructure. A single stateless Node.js process with PostgreSQL. No vendor lock-in, no data leaving your network.
{
"serviceId": "svc_main",
"resourceId": "rsc_provider_1",
"startTime": "2026-03-01T09:00:00Z",
"endTime": "2026-03-01T09:30:00Z"
}→ 201
{ "id": "bkg_sh_1", "status": "hold"}Fork it, modify it, run it forever. No vendor lock-in.
Read the source, run the tests, verify the logic yourself.
Your VPC, your Kubernetes, your Postgres. Nothing leaves your network.
Everything you need to handle real-world booking complexity out of the box.
Use Floyd commercially, modify the source, fork it. No proprietary dependencies, no license fees, no usage limits.
The Floyd engine is a stateless Node.js process. Scale horizontally behind a load balancer. No in-memory state, no sticky sessions.
All booking state lives in your Postgres database. Row locking + GiST index for conflict detection. Use your existing backup, replication, and monitoring.
Every mutation accepts an Idempotency-Key. Payload-bound, cached 24 hours. Safe retries across network failures.
Booking data never leaves your network. Meet HIPAA, GDPR, or any compliance requirement that prohibits third-party data processing.
Start with Floyd Cloud during development. Export your configuration and migrate to self-hosted when you're ready - same API, same behavior.
3 API calls. Hold, confirm, done.
POST https://your-floyd.internal/v1/bookings
{
"serviceId": "svc_main",
"resourceId": "rsc_provider_1",
"startTime": "2026-03-01T09:00:00Z",
"endTime": "2026-03-01T09:30:00Z"
}→ { "id": "bkg_sh_1", "status": "hold" }Header: Idempotency-Key: key_abc123
POST https://your-floyd.internal/v1/bookings
{
"serviceId": "svc_main",
"resourceId": "rsc_provider_1",
"startTime": "2026-03-01T09:00:00Z",
"endTime": "2026-03-01T09:30:00Z"
}→ { "id": "bkg_sh_1", "status": "hold" }Same Idempotency-Key → same response. No duplicate.
GET https://your-floyd.internal/v1/bookings/bkg_sh_1→ { "id": "bkg_sh_1", "status": "hold", "expiresAt": "..." }Single booking created despite two requests.
Holds expire automatically after a TTL. Conflicts are handled at the database level.