# Simple Bookings > Simple Bookings is a Danish multi-tenant appointment booking platform for therapists, clinics, and practitioners. The API powers bookings, customers, services, staff, business hours, payments (Stripe / MobilePay), GDPR self-service, and webhook integrations. Simple Bookings is operated by Beaconware ApS (CVR 25469879) under the brand "Cura AI". The marketing site is at https://simple-bookings.dk and the application runs at https://app.simple-bookings.dk. All API endpoints are mounted under `/api/` on the application host. Authentication uses Bearer JWT tokens. Two separate auth systems exist: practitioner auth (`Authorization: Bearer `, payload `{ userId, email, role }`) and client auth for the customer portal (payload `{ clientId, email, type: 'client' }`). Tokens are not interchangeable. All timestamps are ISO 8601 UTC strings in API responses (BookingDTO). All monetary amounts are integers in øre (1 DKK = 100 øre). UI language is Danish. ## Overview - [Product overview](https://simple-bookings.dk/product): What Simple Bookings does and who it is for - [Pricing & plans](https://simple-bookings.dk/product/pricing): Free, Pro, Business tiers - [About / company](https://simple-bookings.dk/about): Beaconware ApS, team, mission - [Privacy](https://simple-bookings.dk/privacy): GDPR-compliant privacy policy - [Data processing agreement](https://simple-bookings.dk/dpa): Databehandleraftale (Danish) - [Terms of service](https://simple-bookings.dk/terms): Vilkår ## Quickstart - [Beta program](https://simple-bookings.dk/beta): Join the beta and get an account - [Contact](https://simple-bookings.dk/contact): Get in touch with the team - [Waitlist](https://simple-bookings.dk/waitlist): Pro / Business waitlist - [Guides](https://simple-bookings.dk/guides): How-to guides for practitioners - [Blog](https://simple-bookings.dk/blog): Product updates and articles ## API Reference - [llms-full.txt](https://simple-bookings.dk/llms-full.txt): Full API reference inline for LLM ingestion - [API host](https://app.simple-bookings.dk/api/): Base URL for all API calls (Bearer JWT required) - [MCP server](https://www.npmjs.com/package/@simple-bookings/mcp): Official MCP server for AI agents (sb_list_bookings, sb_create_booking, etc.) ### Common resources - `GET /api/sites`: List sites accessible to the authenticated user - `GET /api/sites/:siteId/services`: List services for a site - `GET /api/sites/:siteId/staff`: List staff for a site - `GET /api/sites/:siteId/business-hours`: Site business hours - `GET /api/sites/:siteId/bookings`: List bookings (filter by date range, status) - `POST /api/sites/:siteId/bookings`: Create a booking - `PATCH /api/sites/:siteId/bookings/:id`: Update a booking - `DELETE /api/sites/:siteId/bookings/:id`: Cancel a booking - `GET /api/sites/:siteId/availability`: Compute available slots - `GET /api/customers`: Search customers (siteId-scoped) - `POST /api/payments/stripe/checkout`: Create Stripe checkout session - `POST /api/gdpr/request-access`: GDPR self-service (email magic-link required) ## Authentication - Practitioner login: `POST /api/auth/login` with `{ email, password }` returns `{ accessToken, refreshToken }` - Token refresh: `POST /api/auth/refresh` with refresh token - Google OAuth: `GET /api/auth/google` then redirect callback - 2FA / TOTP: `POST /api/totp/verify` after login when enabled - Send `Authorization: Bearer ` on every API request - SSE/EventSource endpoints accept `?token=` query param (EventSource cannot set headers) ## Webhooks - Stripe: `POST /api/payments/stripe/webhook` — Stripe event ingestion (signature-verified) - Bookings: outgoing webhooks per site can be configured for `booking.created`, `booking.updated`, `booking.cancelled` - Email inbound (Cura Hub): SES → Lambda → S3 → `/api/email/inbound` ## Conventions - All amounts are integers in **øre** (1 DKK = 100 øre) - All timestamps are ISO 8601 strings (UTC) - Booking statuses are uppercase: `CONFIRMED`, `CANCELLED`, `COMPLETED` - Validation: Zod schemas on both client and server - Errors return `{ error: string, code?: string, details?: unknown }` with appropriate 4xx / 5xx status - Rate limits apply per IP and per token; 429 responses include `Retry-After` ## Optional - [GitHub: simple-bookings-mcp](https://www.npmjs.com/package/@simple-bookings/mcp): MCP server source - [Status page](https://app.simple-bookings.dk/status): Public uptime status (when available)