Conflict-free · REST-only
For autonomous agents

Two confirmed events can never overlap. The database decides.

STRALO enforces no double-bookings with a Postgres tstzrange EXCLUDE constraint, not with application-level locking or an optimistic check-then-book window the database races through. Every confirmed row is one the schema itself admitted.

Open the quickstart →Try it without signing upRead the guaranteePasted into curl, that snippet returns a real 201.
POST/api/bookings
curl -X POST https://stralo.polsia.app/api/bookings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -d '{
    "agentId":  "<YOUR_AGENT_ID>",
    "startsAt": "2026-08-18T15:42:07.809Z",
    "endsAt":   "2026-08-18T16:42:07.809Z"
  }'

<YOUR_API_KEY> and <YOUR_AGENT_ID> come from /quickstart in one round-trip. The start/end timestamps above are computed at render time — copy them verbatim, or replace with values one to two hours from now. The same window a second time returns 409 slot_taken because the database rejects overlaps.

The guarantee

Path of the confirmation.

A booking write does not pass through optimistic checks, app-layer locks, or a distributed coordinator. It runs through POST /api/bookings, the route validates the body, and a single INSERT is handed to Postgres. The database applies the bookings_no_overlap EXCLUDE constraint at commit time. An overlap raises an exclusion violation — the route translates it to 409 slot_taken. No retry logic is in the critical section because the critical section is the database itself.

The constraint lives in src/lib/server-bookings/insert-booking.ts, minted idempotently on first insert after deploy. Partial on status = 'confirmed' so a soft-cancelled row frees the window. Half-open [) boundaries mean back-to-back bookings (end == next start) do not collide.

bookings_no_overlap
exclusion constraint · tstzrange · agent-scoped · partial
ALTER TABLE "Booking"
  ADD CONSTRAINT bookings_no_overlap
  EXCLUDE USING gist (
    "agentId" WITH =,
    tsrange("startsAt", "endsAt", '[)') WITH &&
  ) WHERE (status = 'confirmed');
A second confirmed write whose window overlaps the first raises 23P01 (exclusion_violation) — the route maps it to 409 slot_taken.
The surface

POST a window. The schema accepts or it doesn’t.

Four routes. Bearer-gated writes. JSON in, JSON out, predictable status codes. Agents compose STRALO the way they compose any other REST service — no UI conventions to translate, no redirects to follow.

  • POST/api/agentsOpen issuance — mints agent seat + plaintext API key (one-shot).
  • POST/api/bookingsConfirm an event — atomic, bearer-gated, exclusion-checked.
  • GET/api/bookingsRead confirmed + cancelled rows for the bearer.
  • DEL/api/bookings/{id}Soft-cancel an event — frees the constraint window.
Open the quickstartRead the full reference →See pricingEmail stralo@polsia.appFree is the full REST surface — two agents, unlimited bookings, same guarantee.
Where it fits

Built for workflows where the calendar is a backend.

/01

Autonomous sales pipelines

A prospecting agent and a closer hand off meetings without a human triaging a calendar. Contracts reference the same agent, the database rejects the conflicting hand-off.

/02

Multi-agent orchestration

A planner books sub-tasks into an executor swarm. Every confirmed event is a commitment a downstream agent can trust without re-checking, because the row was admitted by the database, not by last-write-wins.

/03

On-call rotation over infra calendars

Diagnostics, fan-out, and remediation agents round-robin escalation windows across shared infrastructure calendars. Conflict is impossible — every write is checked at commit time.

Questions

Two things teams ask first.

Anything else — the cohort path, recurring events, webhook fanout — goes to stralo@polsia.app.

Is there a web UI or a human login?
No. STRALO is a REST-only service. Agents register with machine-issued credentials and speak HTTP end-to-end — discovery, negotiation, confirmation, cancel. The only humans involved are the engineers running the agents.
How is the no-overlap guarantee enforced?
A Postgres EXCLUDE constraint on a tstzrange column with the && (overlap) operator, partial on status = 'confirmed'. Any insert whose window overlaps an existing confirmed event raises an exclusion violation; there is no application-layer check-then-book window for the database to race through.
Get an agent on the registry

Open /quickstart for Free, or pick a paid tier at /pricing.

Free is the full REST surface — two agents, unlimited bookings, the same overlap guarantee as every other tier. Pro ($49/month) and Swarm ($199/month) purchase a recurring Stripe subscription from the pricing page. Larger than Swarm (custom conflict policies, private webhook routing) is still cohort-based — send a short note to the team.

Start on Free →See pricing →Cohort: stralo@polsia.appOr reach the team at the same address — humans monitor it.