Docs
Quickstart
From nothing to a live endpoint in four steps. This is a starter, enough to get an operation running; the full reference lives in the console.
Four steps to a live operation
1Create your workspace
Register to get a workspace and an API token. Your first tenant is created with it.
2Declare a strategy
Set a manifest in the console. This booking strategy is enough to take appointments with deposits:
booking.strategystrategy:bookingresource:practitioner// what gets reservedgranularity:30mhorizon:60dtimezone:from_location// DST-correct per sitebuffers:{ before: 0m, after: 10m }exclusivity:postgres_gist// double-booking is impossibledeposit:25%// captured at bookingnotify:confirmremind @ -24hremind @ -2h3Call your new API
The strategy exposes real endpoints immediately. Check availability, then book:
GET · availabilitycurl https://api.prowork.dev/booking/availability \ -H "Authorization: Bearer $PROWORK_TOKEN" \ -G --data-urlencode "resource=practitioner" \ --data-urlencode "date=2026-08-25"POST · create appointmentcurl -X POST https://api.prowork.dev/booking/appointments \ -H "Authorization: Bearer $PROWORK_TOKEN" \ -H "content-type: application/json" \ -d '{ "resourceId": "prac_ava", "start": "2026-08-25T09:30:00-05:00", "client": { "name": "Sam Lee", "email": "sam@example.com" } }'4Run the console
Everything you just did is visible and editable in the console: the calendar, records, payments, and workflow runs.
Concepts
- Workspace
- Your account's top-level container. Everything you configure and every tenant lives inside it.
- Tenant
- An isolated slice of data, one per customer, location, or brand. Row-level security keeps tenants from ever seeing each other's rows.
- Strategy
- The unit you switch on: booking, storefront, records, subscriptions, forms, or workflow. Each stands up its own API and console surfaces.
- Collection
- A typed set of records with fields, relations, and policies. Records read and write across tiers atomically, with no N+1 hydration.
- Workflow
- Declarative automation run by a durable executor: it parks on events, fires timers, recovers from crashes, and compensates idempotently.
- Manifest
- The human-readable declaration of a strategy. Change it and the running backend changes, with no rebuild or redeploy.
Tenant isolation
Every request runs inside a transaction that binds app.tenant_id before it touches data. Row-level security is FORCED on every tenant table, and the app connects as a non-owner role, so a query for one tenant can never read another's rows, on the primary or a replica.
BEGIN;
SET LOCAL app.tenant_id = 'tenant_b';
-- your reads and writes, scoped to tenant_b only
COMMIT;Deploy
Run the whole kernel as one container next to Postgres and Redis, or package modules as AWS Lambdas behind API Gateway with RDS Proxy. Same configuration, either way.
services:
prowork:
image: ghcr.io/sirfitz/prowork:latest
environment:
DATABASE_URL: postgres://prowork@db/prowork
REDIS_URL: redis://cache:6379
ports: ["3000:3000"]Next
Explore the other strategies on the product page, or create your workspace and declare your first one.